diff options
author | Richard Grenville <pyxlcy@gmail.com> | 2013-10-21 22:17:01 +0800 |
---|---|---|
committer | Richard Grenville <pyxlcy@gmail.com> | 2013-10-21 22:17:01 +0800 |
commit | 522923dbc7f99fe0ef4bd44c6e9f761addec9de2 (patch) | |
tree | 7a6a9ce09e030fbfbc6b4587343500b236ddcc30 | |
parent | 70dfd1f58e94ae63eb8d035a35c4002dcd5cc14a (diff) | |
download | tdebase-522923dbc7f99fe0ef4bd44c6e9f761addec9de2.tar.gz tdebase-522923dbc7f99fe0ef4bd44c6e9f761addec9de2.zip |
Bug fix #153: Possible fix for a rare timing issue
Possible fix for a very rare timing issue in focus detection. Compton
may fail to detect the currently focused window, when a window newly
mapped gets focused, we failed to listen to events and get FocusIn from
it in time, and a series of focus change events before it happens stay
in the event queue and puzzled compton. My choice is to force focus
recheck on all focus-related events. More roundtrips to X, but not
necessarily worse performance, due to the high cost of focus flipping
especially when there's a lot of conditions. Thanks to SlackBox for
reporting. (#153)
-rw-r--r-- | common.h | 1 | ||||
-rw-r--r-- | compton.c | 20 |
2 files changed, 9 insertions, 12 deletions
@@ -30,6 +30,7 @@ // #define DEBUG_GLX_GLSL 1 // #define DEBUG_GLX_ERR 1 // #define DEBUG_GLX_MARK 1 +// #define DEBUG_GLX_PAINTREG 1 // #define MONITOR_REPAINT 1 // Whether to enable PCRE regular expression support in blacklists, enabled @@ -781,6 +781,12 @@ recheck_focus(session_t *ps) { win *w = find_win_all(ps, wid); +#ifdef DEBUG_EVENTS + print_timestamp(ps); + printf_dbgf("(): %#010lx (%#010lx \"%s\") focused.\n", wid, + (w ? w->id: None), (w ? w->name: NULL)); +#endif + // And we set the focus state here if (w) { win_set_focused(ps, w, true); @@ -3815,12 +3821,7 @@ ev_focus_in(session_t *ps, XFocusChangeEvent *ev) { ev_focus_report(ev); #endif - if (!ev_focus_accept(ev)) - return; - - win *w = find_win_all(ps, ev->window); - if (w) - win_set_focused(ps, w, true); + recheck_focus(ps); } inline static void @@ -3829,12 +3830,7 @@ ev_focus_out(session_t *ps, XFocusChangeEvent *ev) { ev_focus_report(ev); #endif - if (!ev_focus_accept(ev)) - return; - - win *w = find_win_all(ps, ev->window); - if (w) - win_set_focused(ps, w, false); + recheck_focus(ps); } inline static void |