summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Grenville <[email protected]>2013-10-21 22:17:01 +0800
committerRichard Grenville <[email protected]>2013-10-21 22:17:01 +0800
commit522923dbc7f99fe0ef4bd44c6e9f761addec9de2 (patch)
tree7a6a9ce09e030fbfbc6b4587343500b236ddcc30
parent70dfd1f58e94ae63eb8d035a35c4002dcd5cc14a (diff)
downloadtdebase-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.h1
-rw-r--r--compton.c20
2 files changed, 9 insertions, 12 deletions
diff --git a/common.h b/common.h
index eadaafd95..f8531bcbd 100644
--- a/common.h
+++ b/common.h
@@ -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
diff --git a/compton.c b/compton.c
index 68577f1ec..0c9855281 100644
--- a/compton.c
+++ b/compton.c
@@ -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