]> Dogcows Code - chaz/openbox/commitdiff
do it better, prevent creating new races
authorDana Jansens <danakj@orodu.net>
Sat, 12 May 2007 01:01:49 +0000 (01:01 +0000)
committerDana Jansens <danakj@orodu.net>
Sat, 12 May 2007 01:01:49 +0000 (01:01 +0000)
openbox/event.c

index 86ea467c8a70ac9070037d6a6d9404fda7ff956f..2ba9c4c7251ccb9f3e9e73cf67eb2fe04157d4a6 100644 (file)
@@ -98,6 +98,12 @@ Time event_curtime = CurrentTime;
 static guint ignore_enter_focus = 0;
 static gboolean menu_can_hide;
 static gboolean focus_left_screen = FALSE;
+/*! This variable is used for focus fallback. If we fallback to a window, we
+  set this to the window. And when focus goes somewhere after that, it will
+  be set to NULL. If between falling back to that window and something
+  getting focused, the window gets unmanaged, then if there are no incoming
+  FocusIn events, we fallback again because focus has just gotten itself lost.
+ */
 static ObClient *focus_tried = NULL;
 
 #ifdef USE_SM
@@ -1081,9 +1087,17 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         /* 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);
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
+                          "is being unmanaged:\n");
+            if (XCheckIfEvent(ob_display, &ce, look_for_focusin_client, NULL)){
+                XPutBackEvent(ob_display, &ce);
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  but another FocusIn is coming\n");
+            } else {
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  so falling back focus again.\n");
+                focus_tried = focus_fallback(TRUE);
+            }
         }
         break;
     case DestroyNotify:
@@ -1092,9 +1106,17 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         /* 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);
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
+                          "is being unmanaged:\n");
+            if (XCheckIfEvent(ob_display, &ce, look_for_focusin_client, NULL)){
+                XPutBackEvent(ob_display, &ce);
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  but another FocusIn is coming\n");
+            } else {
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  so falling back focus again.\n");
+                focus_tried = focus_fallback(TRUE);
+            }
         }
         break;
     case ReparentNotify:
@@ -1117,9 +1139,17 @@ static void event_handle_client(ObClient *client, XEvent *e)
 
         /* 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);
+            ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
+                          "is being unmanaged:\n");
+            if (XCheckIfEvent(ob_display, &ce, look_for_focusin_client, NULL)){
+                XPutBackEvent(ob_display, &ce);
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  but another FocusIn is coming\n");
+            } else {
+                ob_debug_type(OB_DEBUG_FOCUS,
+                              "  so falling back focus again.\n");
+                focus_tried = focus_fallback(TRUE);
+            }
         }
         break;
     case MapRequest:
This page took 0.030175 seconds and 4 git commands to generate.