X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fgrab.c;h=9c6065a745fb92b980f953558bc76a7a8b098241;hb=d9e08487dffd010f4434d24b98a3a571b2e5a600;hp=de2efd9afa1e36689193839f5583819f383e8692;hpb=16f46c296d1fcd3f27fc62a18e71c55fb3fd3e88;p=chaz%2Fopenbox diff --git a/openbox/grab.c b/openbox/grab.c index de2efd9a..9c6065a7 100644 --- a/openbox/grab.c +++ b/openbox/grab.c @@ -32,10 +32,21 @@ /*! A list of all possible combinations of keyboard lock masks */ static unsigned int mask_list[MASK_LIST_SIZE]; +static guint kgrabs = 0; +static guint pgrabs = 0; + +gboolean grab_on_keyboard() +{ + return kgrabs > 0; +} + +gboolean grab_on_pointer() +{ + return pgrabs > 0; +} gboolean grab_keyboard(gboolean grab) { - static guint kgrabs = 0; gboolean ret = FALSE; if (grab) { @@ -56,7 +67,6 @@ gboolean grab_keyboard(gboolean grab) gboolean grab_pointer(gboolean grab, ObCursor cur) { - static guint pgrabs = 0; gboolean ret = FALSE; if (grab) { @@ -68,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; @@ -77,7 +117,6 @@ gboolean grab_pointer(gboolean grab, ObCursor cur) gboolean grab_pointer_window(gboolean grab, ObCursor cur, Window win) { - static guint pgrabs = 0; gboolean ret = FALSE; if (grab) {