From c5865c51ed0a052f6f1278d37de762a44d3ea35e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 12 May 2007 01:01:49 +0000 Subject: [PATCH] do it better, prevent creating new races --- openbox/event.c | 48 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index 86ea467c..2ba9c4c7 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -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: -- 2.44.0