Skip to content

Commit

Permalink
Bug fix #153: Possible fix for a rare timing issue
Browse files Browse the repository at this point in the history
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)
  • Loading branch information
richardgv committed Oct 21, 2013
1 parent 796e2c6 commit d897740
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Makefile
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions src/common.h
Expand Up @@ -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
Expand Down
20 changes: 8 additions & 12 deletions src/compton.c
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down

0 comments on commit d897740

Please sign in to comment.