]> Dogcows Code - chaz/openbox/blobdiff - openbox/event.c
add a window between the frame and the plate for drawing the client border. this...
[chaz/openbox] / openbox / event.c
index 401328b22895be3925e786b8fd22e9f09b6531a2..8d67ee93a6a555ae53da27a2d4704171e9711198 100644 (file)
@@ -2,7 +2,7 @@
 
    event.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -372,6 +372,9 @@ static gboolean wanted_focusevent(XEvent *e)
         /* This means focus moved from one client to another */
         if (detail == NotifyNonlinearVirtual)
             return TRUE;
+        /* This means focus had moved to our frame window and now moved off */
+        if (detail == NotifyNonlinear)
+            return TRUE;
 
         /* Otherwise.. */
         return FALSE;
@@ -391,8 +394,6 @@ static gboolean event_ignore(XEvent *e, ObClient *client)
             return TRUE;
         break;
     case FocusOut:
-        if (client == NULL)
-            return TRUE;
         if (!wanted_focusevent(e))
             return TRUE;
         break;
@@ -473,6 +474,7 @@ static void event_process(const XEvent *ec, gpointer data)
             /* nothing is focused */
             focus_set_client(NULL);
         } else if (ce.xany.window == e->xany.window) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Focus didn't go anywhere\n");
             /* If focus didn't actually move anywhere, there is nothing to do*/
             nomove = TRUE;
         } else if (ce.xfocus.detail == NotifyPointerRoot ||
@@ -731,12 +733,23 @@ static void event_handle_client(ObClient *client, XEvent *e)
             frame_adjust_state(client->frame);
             break;
         case OB_FRAME_CONTEXT_FRAME:
+            ob_debug_type(OB_DEBUG_FOCUS,
+                          "%sNotify mode %d detail %d on %lx\n",
+                          (e->type == EnterNotify ? "Enter" : "Leave"),
+                          e->xcrossing.mode,
+                          e->xcrossing.detail, (client?client->window:0));
             if (keyboard_interactively_grabbed())
                 break;
-            if (config_focus_follow && config_focus_delay)
+            if (config_focus_follow && config_focus_delay &&
+                /* leaveinferior events can happen when the mouse goes onto the
+                   window's border and then into the window before the delay
+                   is up */
+                e->xcrossing.detail != NotifyInferior)
+            {
                 ob_main_loop_timeout_remove_data(ob_main_loop,
                                                  focus_delay_func,
                                                  client, FALSE);
+            }
             break;
         default:
             break;
This page took 0.023357 seconds and 4 git commands to generate.