]> Dogcows Code - chaz/openbox/commitdiff
try catch weird racey corner case where we try fallback to a window but it unmaps...
authorDana Jansens <danakj@orodu.net>
Sat, 12 May 2007 00:54:44 +0000 (00:54 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 12 May 2007 00:54:44 +0000 (00:54 +0000)
openbox/event.c
openbox/focus.c
openbox/focus.h

index c07148829e99d3a76fa1dbf77769669489354221..86ea467c8a70ac9070037d6a6d9404fda7ff956f 100644 (file)
@@ -98,6 +98,7 @@ Time event_curtime = CurrentTime;
 static guint ignore_enter_focus = 0;
 static gboolean menu_can_hide;
 static gboolean focus_left_screen = FALSE;
+static ObClient *focus_tried = NULL;
 
 #ifdef USE_SM
 static void ice_handler(gint fd, gpointer conn)
@@ -498,7 +499,7 @@ static void event_process(const XEvent *ec, gpointer data)
                     focus_left_screen = FALSE;
 
                 if (!focus_left_screen)
-                    focus_fallback(TRUE);
+                    focus_tried = focus_fallback(TRUE);
             }
         } else if (client && client != focus_client) {
             focus_left_screen = FALSE;
@@ -506,6 +507,8 @@ static void event_process(const XEvent *ec, gpointer data)
             focus_set_client(client);
             client_calc_layer(client);
             client_bring_helper_windows(client);
+
+            focus_tried = NULL; /* focus isn't "trying" to go anywhere now */
         }
     } else if (e->type == FocusOut) {
         gboolean nomove = FALSE;
@@ -547,7 +550,7 @@ static void event_process(const XEvent *ec, gpointer data)
                 ob_debug_type(OB_DEBUG_FOCUS,
                               "Focus went to an unmanaged window 0x%x !\n",
                               ce.xfocus.window);
-                focus_fallback(TRUE);
+                focus_tried = focus_fallback(TRUE);
             }
         }
 
@@ -1075,10 +1078,24 @@ static void event_handle_client(ObClient *client, XEvent *e)
                  client->window, e->xunmap.event, e->xunmap.from_configure,
                  client->ignore_unmaps);
         client_unmanage(client);
+
+        /* we were trying to focus this window but it's gone */
+        if (client == focus_tried) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
+                          "is being unmanaged. Falling back focus again.\n");
+            focus_tried = focus_fallback(TRUE);
+        }
         break;
     case DestroyNotify:
         ob_debug("DestroyNotify for window 0x%x\n", client->window);
         client_unmanage(client);
+
+        /* we were trying to focus this window but it's gone */
+        if (client == focus_tried) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
+                          "is being unmanaged. Falling back focus again.\n");
+            focus_tried = focus_fallback(TRUE);
+        }
         break;
     case ReparentNotify:
         /* this is when the client is first taken captive in the frame */
@@ -1097,6 +1114,13 @@ static void event_handle_client(ObClient *client, XEvent *e)
      
         ob_debug("ReparentNotify for window 0x%x\n", client->window);
         client_unmanage(client);
+
+        /* we were trying to focus this window but it's gone */
+        if (client == focus_tried) {
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
+                          "is being unmanaged. Falling back focus again.\n");
+            focus_tried = focus_fallback(TRUE);
+        }
         break;
     case MapRequest:
         ob_debug("MapRequest for 0x%lx\n", client->window);
index a4d3f9f2d187853c211f6fb38e7f268d9e45a076..393ec98eaf0e0b3bd478df5b8b034e66c806e190 100644 (file)
@@ -255,7 +255,7 @@ ObClient* focus_fallback_target(gboolean allow_refocus, ObClient *old)
     return desktop;   
 }
 
-void focus_fallback(gboolean allow_refocus)
+ObClient* focus_fallback(gboolean allow_refocus)
 {
     ObClient *new;
     ObClient *old = focus_client;
@@ -266,8 +266,11 @@ void focus_fallback(gboolean allow_refocus)
     */
     focus_nothing();
 
-    if ((new = focus_fallback_target(allow_refocus, old)))
+    if ((new = focus_fallback_target(allow_refocus, old))) {
         client_focus(new);
+        return new;
+    } else
+        return NULL;
 }
 
 void focus_nothing()
index 1c8cb1575efec7f64a46ba50a1318a91d9dd7404..be63433868bbb0572f36fb6041a2e980ff51478f 100644 (file)
@@ -49,7 +49,7 @@ struct _ObClient* focus_fallback_target(gboolean allow_refocus,
                                         struct _ObClient *old);
 
 /*! Call this when you need to focus something! */
-void focus_fallback(gboolean allow_refocus);
+struct _ObClient* focus_fallback(gboolean allow_refocus);
 
 /*! Cycle focus amongst windows. */
 void focus_cycle(gboolean forward, gboolean all_desktops,
This page took 0.029577 seconds and 4 git commands to generate.