From: Ingo Bürk Date: Sat, 10 Mar 2018 18:18:44 +0000 (+0100) Subject: Refocus focused window for FOCUS_IN events on the root window. (#3097) X-Git-Tag: 4.16~136 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=69eec7e5b2743770a502188d15e66ffc7a7067aa;p=i3%2Fi3 Refocus focused window for FOCUS_IN events on the root window. (#3097) This deals with (admittedly somewhat misbehaving) clients which use XSetInputFocus to take focus, but then don't properly restore focus. This has been observed with TK apps, but also, e.g., Steam. fixes #2722 fixes #3096 --- diff --git a/include/xcb.h b/include/xcb.h index 92be7b89..53c932bf 100644 --- a/include/xcb.h +++ b/include/xcb.h @@ -53,6 +53,7 @@ ConfigureNotify */ \ XCB_EVENT_MASK_POINTER_MOTION | \ XCB_EVENT_MASK_PROPERTY_CHANGE | \ + XCB_EVENT_MASK_FOCUS_CHANGE | \ XCB_EVENT_MASK_ENTER_WINDOW) #define xmacro(atom) xcb_atom_t A_##atom; diff --git a/src/handlers.c b/src/handlers.c index e1671c3b..50fd8566 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -1207,6 +1207,14 @@ static bool handle_clientleader_change(void *data, xcb_connection_t *conn, uint8 */ static void handle_focus_in(xcb_focus_in_event_t *event) { DLOG("focus change in, for window 0x%08x\n", event->event); + + if (event->event == root) { + DLOG("Received focus in for root window, refocusing the focused window.\n"); + con_focus(focused); + focused_id = XCB_NONE; + x_push_changes(croot); + } + Con *con; if ((con = con_by_window_id(event->event)) == NULL || con->window == NULL) return;