X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;ds=sidebyside;f=openbox%2Fevent.c;h=a2571f0e112dac34c82fca7e537b48b07d003b6b;hb=f9fe78d970fa1ef62d56160db7a82fa6948643b6;hp=e431e8f40972c47fdaad81c12f26b65b8fb63d6c;hpb=7fddf2abc2b76e511be8fc14e22c1f310efe00ef;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index e431e8f4..a2571f0e 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -313,9 +313,9 @@ static gboolean wanted_focusevent(XEvent *e, gboolean in_client_only) /* It was on a client, was it a valid one? It's possible to get a FocusIn event for a client that was managed - but has disappeared. Don't even parse those FocusIn events. + but has disappeared. */ - { + if (in_client_only) { ObWindow *w = g_hash_table_lookup(window_map, &e->xfocus.window); if (!w || !WINDOW_IS_CLIENT(w)) return FALSE; @@ -394,6 +394,9 @@ static void print_focusevent(XEvent *e) case NotifyDetailNone: detailstr="NotifyDetailNone"; break; } + if (mode == NotifyGrab || mode == NotifyUngrab) + return; + g_assert(modestr); g_assert(detailstr); ob_debug_type(OB_DEBUG_FOCUS, "Focus%s 0x%x mode=%s detail=%s\n", @@ -520,6 +523,26 @@ static void event_process(const XEvent *ec, gpointer data) focus_fallback(TRUE); } } + else if (!client) + { + XEvent ce; + + ob_debug_type(OB_DEBUG_FOCUS, + "Focus went to a window that is already gone\n"); + + /* If you send focus to a window and then it disappears, you can + get the FocusIn FocusOut for it, after it is unmanaged. + */ + if (XCheckIfEvent(ob_display, &ce, event_look_for_focusin_client, + NULL)) + { + XPutBackEvent(ob_display, &ce); + ob_debug_type(OB_DEBUG_FOCUS, + " but another FocusIn is coming\n"); + } else { + focus_fallback(TRUE); + } + } else if (client != focus_client) { focus_left_screen = FALSE; frame_adjust_focus(client->frame, TRUE); @@ -573,6 +596,8 @@ static void event_process(const XEvent *ec, gpointer data) if (client && !nomove) { frame_adjust_focus(client->frame, FALSE); + if (client == focus_client) + focus_set_client(NULL); /* focus_set_client has already been called for sure */ client_calc_layer(client); } @@ -681,7 +706,7 @@ static void event_handle_root(XEvent *e) screen_set_num_desktops(d); } else if (msgtype == prop_atoms.net_showing_desktop) { screen_show_desktop(e->xclient.data.l[0] != 0, NULL); - } else if (msgtype == prop_atoms.openbox_control) { + } else if (msgtype == prop_atoms.ob_control) { if (e->xclient.data.l[0] == 1) ob_reconfigure(); else if (e->xclient.data.l[0] == 2)