no more losing focus from wm_torture -t map_response

when a focusin comes for an invalid target, set that focus has wandered off, so
that when the focusout comes in afterwards we can react accordingly
This commit is contained in:
Dana Jansens 2007-05-13 16:39:04 +00:00
parent fd9b6a43cf
commit 2fdad9a0ff

View file

@ -356,8 +356,13 @@ static Bool event_look_for_focusin(Display *d, XEvent *e, XPointer arg)
Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg) Bool event_look_for_focusin_client(Display *d, XEvent *e, XPointer arg)
{ {
ObWindow *w;
/* It is possible to get FocusIn events or unmanaged windows, meaning
they won't be for any known client */
return e->type == FocusIn && wanted_focusevent(e, TRUE) && return e->type == FocusIn && wanted_focusevent(e, TRUE) &&
e->xfocus.window != screen_support_win; (w = g_hash_table_lookup(window_map, &e->xfocus.window)) &&
WINDOW_IS_CLIENT(w);
} }
static void print_focusevent(XEvent *e) static void print_focusevent(XEvent *e)
@ -508,7 +513,19 @@ static void event_process(const XEvent *ec, gpointer data)
if (!focus_left_screen) if (!focus_left_screen)
focus_fallback(TRUE); focus_fallback(TRUE);
} }
} else if (client && client != focus_client) { }
else if (!client) {
/* It is possible to get FocusIn events or unmanaged windows,
meaning they won't be for any known client
If this happens, set the client to NULL so we know focus
has wandered off, and we'll get a focus out for it
shortly.
*/
ob_debug_type(OB_DEBUG_FOCUS, "Focus went to an invalid target\n");
focus_set_client(NULL);
}
else if (client != focus_client) {
focus_left_screen = FALSE; focus_left_screen = FALSE;
frame_adjust_focus(client->frame, TRUE); frame_adjust_focus(client->frame, TRUE);
focus_set_client(client); focus_set_client(client);