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)
pull/2/head
Richard Grenville 11 years ago
parent 70dfd1f58e
commit 522923dbc7

@ -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

Loading…
Cancel
Save