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)
This commit is contained in:
Richard Grenville 2013-10-21 22:17:01 +08:00
parent 796e2c6fec
commit d8977408fd
3 changed files with 10 additions and 13 deletions

View File

@ -49,7 +49,7 @@ ifeq "$(NO_VSYNC_DRM)" ""
CFG += -DCONFIG_VSYNC_DRM
endif
# ==== OpenGL VSync ====
# ==== OpenGL ====
ifeq "$(NO_VSYNC_OPENGL)" ""
CFG += -DCONFIG_VSYNC_OPENGL
# -lGL must precede some other libraries, or it segfaults on FreeBSD (#74)

View File

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

View File

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