summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--openbox/grab.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/openbox/grab.c b/openbox/grab.c
index a53fe5e8..9c6065a7 100644
--- a/openbox/grab.c
+++ b/openbox/grab.c
@@ -78,8 +78,38 @@ gboolean grab_pointer(gboolean grab, ObCursor cur)
else
ret = TRUE;
} else if (pgrabs > 0) {
- if (--pgrabs == 0)
+ if (--pgrabs == 0) {
XUngrabPointer(ob_display, event_lasttime);
+
+ /* ignore all enter events caused by ungrabbing the pointer */
+ {
+ GSList *saved = NULL, *it;
+ XEvent *e;
+ guint n = 0;
+
+ XSync(ob_display, FALSE);
+
+ /* count the events */
+ while (TRUE) {
+ e = g_new(XEvent, 1);
+ if (XCheckTypedEvent(ob_display, EnterNotify, e)) {
+ saved = g_slist_append(saved, e);
+ ++n;
+ } else {
+ g_free(e);
+ break;
+ }
+ }
+ /* put the events back */
+ for (it = saved; it; it = g_slist_next(it)) {
+ XPutBackEvent(ob_display, it->data);
+ g_free(it->data);
+ }
+ g_slist_free(saved);
+ /* ignore the events */
+ event_ignore_enter_focus(n);
+ }
+ }
ret = TRUE;
}
return ret;