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 guint ignore_enter_focus = 0;
|
||||||
static gboolean menu_can_hide;
|
static gboolean menu_can_hide;
|
||||||
static gboolean focus_left_screen = FALSE;
|
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;
|
static ObClient *focus_tried = NULL;
|
||||||
|
|
||||||
#ifdef USE_SM
|
#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 */
|
/* we were trying to focus this window but it's gone */
|
||||||
if (client == focus_tried) {
|
if (client == focus_tried) {
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
|
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
|
||||||
"is being unmanaged. Falling back focus again.\n");
|
"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);
|
focus_tried = focus_fallback(TRUE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case DestroyNotify:
|
case DestroyNotify:
|
||||||
ob_debug("DestroyNotify for window 0x%x\n", client->window);
|
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 */
|
/* we were trying to focus this window but it's gone */
|
||||||
if (client == focus_tried) {
|
if (client == focus_tried) {
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
|
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
|
||||||
"is being unmanaged. Falling back focus again.\n");
|
"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);
|
focus_tried = focus_fallback(TRUE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ReparentNotify:
|
case ReparentNotify:
|
||||||
/* this is when the client is first taken captive in the frame */
|
/* 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 */
|
/* we were trying to focus this window but it's gone */
|
||||||
if (client == focus_tried) {
|
if (client == focus_tried) {
|
||||||
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x but it "
|
ob_debug_type(OB_DEBUG_FOCUS, "Tried to focus window 0x%x and it "
|
||||||
"is being unmanaged. Falling back focus again.\n");
|
"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);
|
focus_tried = focus_fallback(TRUE);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case MapRequest:
|
case MapRequest:
|
||||||
ob_debug("MapRequest for 0x%lx\n", client->window);
|
ob_debug("MapRequest for 0x%lx\n", client->window);
|
||||||
|
|
Loading…
Reference in a new issue