]> Dogcows Code - chaz/openbox/commitdiff
another little focus cleanup/rearrangement, for focus going to windows that
authorDana Jansens <danakj@orodu.net>
Mon, 14 May 2007 01:06:42 +0000 (01:06 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 14 May 2007 01:06:42 +0000 (01:06 +0000)
are no longer there.

openbox/client.c
openbox/event.c

index 5ac187007019b902784cdc40e5c2dc7036911f79..b61787bcb096b0c445789bc89194593bf6d03896 100644 (file)
@@ -525,7 +525,8 @@ void client_manage(Window window)
     /* update the list hints */
     client_set_list();
 
-    ob_debug("Managed window 0x%lx (%s)\n", window, self->class);
+    ob_debug("Managed window 0x%lx plate 0x%x (%s)\n",
+             window, self->frame->plate, self->class);
 
     return;
 }
@@ -567,7 +568,8 @@ void client_unmanage(ObClient *self)
     guint j;
     GSList *it;
 
-    ob_debug("Unmanaging window: %lx (%s) (%s)\n", self->window,
+    ob_debug("Unmanaging window: 0x%x plate 0x%x (%s) (%s)\n",
+             self->window, self->frame->plate,
              self->class, self->title ? self->title : "");
 
     g_assert(self != NULL);
index c8b7e6dcce92d9bcea85815233036b40022e4501..99fa1bf95f18751aebc4ebe8396ae960584d12e9 100644 (file)
@@ -315,7 +315,7 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only)
            It's possible to get a FocusIn event for a client that was managed
            but has disappeared. Don't even parse those FocusIn events.
         */
-        {
+        if (in_client_only) {
             ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window);
             if (!w || !WINDOW_IS_CLIENT(w))
                 return FALSE;
@@ -520,6 +520,26 @@ static void event_process(const XEvent *ec, gpointer data)
                     focus_fallback(TRUE);
             }
         }
+        else if (!client)
+        {
+            XEvent ce;
+
+            ob_debug_type(OB_DEBUG_FOCUS,
+                          "Focus went to a window that is already gone\n");
+
+            /* If you send focus to a window and then it disappears, you can
+               get the FocusIn FocusOut for it, after it is unmanaged.
+            */
+            if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client,
+                              NULL))
+            {
+                XPutBackEvent(ob_display, &ce);
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  but another FocusIn is coming\n");
+            } else {
+                focus_fallback(TRUE);
+            }
+        }
         else if (client != focus_client) {
             focus_left_screen = FALSE;
             frame_adjust_focus(client->frame, TRUE);
This page took 0.029994 seconds and 4 git commands to generate.