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
This commit is contained in:
Ingo Bürk 2018-03-10 19:18:44 +01:00 committed by Michael Stapelberg
parent ec5a048792
commit 69eec7e5b2
2 changed files with 9 additions and 0 deletions

View File

@ -53,6 +53,7 @@
ConfigureNotify */ \ ConfigureNotify */ \
XCB_EVENT_MASK_POINTER_MOTION | \ XCB_EVENT_MASK_POINTER_MOTION | \
XCB_EVENT_MASK_PROPERTY_CHANGE | \ XCB_EVENT_MASK_PROPERTY_CHANGE | \
XCB_EVENT_MASK_FOCUS_CHANGE | \
XCB_EVENT_MASK_ENTER_WINDOW) XCB_EVENT_MASK_ENTER_WINDOW)
#define xmacro(atom) xcb_atom_t A_##atom; #define xmacro(atom) xcb_atom_t A_##atom;

View File

@ -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) { static void handle_focus_in(xcb_focus_in_event_t *event) {
DLOG("focus change in, for window 0x%08x\n", event->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; Con *con;
if ((con = con_by_window_id(event->event)) == NULL || con->window == NULL) if ((con = con_by_window_id(event->event)) == NULL || con->window == NULL)
return; return;