do it better, prevent creating new races
This commit is contained in:
parent
1d6c07c24b
commit
c5865c51ed
1 changed files with 39 additions and 9 deletions
|
@ -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,10 +1087,18 @@ 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");
|
||||
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:
|
||||
ob_debug("DestroyNotify for window 0x%x\n", client->window);
|
||||
|
@ -1092,10 +1106,18 @@ 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");
|
||||
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:
|
||||
/* this is when the client is first taken captive in the frame */
|
||||
|
@ -1117,10 +1139,18 @@ 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");
|
||||
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:
|
||||
ob_debug("MapRequest for 0x%lx\n", client->window);
|
||||
|
|
Loading…
Reference in a new issue