*/
#include "grab.h"
+#include "modkeys.h"
#include "openbox.h"
#include "event.h"
#include "xerror.h"
static guint pgrabs = 0;
/*! The time at which the last grab was made */
static Time grab_time = CurrentTime;
+static gint passive_count = 0;
static Time ungrab_time()
{
Time t = event_curtime;
- if (!(t == CurrentTime || event_time_after(t, grab_time)))
+ if (grab_time == CurrentTime ||
+ !(t == CurrentTime || event_time_after(t, grab_time)))
/* When the time moves backward on the server, then we can't use
the grab time because that will be in the future. So instead we
have to use CurrentTime.
return pgrabs > 0;
}
-gboolean grab_keyboard(gboolean grab)
+gboolean grab_keyboard_full(gboolean grab)
{
gboolean ret = FALSE;
event_curtime) == Success;
if (!ret)
--kgrabs;
- else
+ else {
+ passive_count = 0;
grab_time = event_curtime;
+ }
} else
ret = TRUE;
} else if (kgrabs > 0) {
return ret;
}
-gboolean grab_pointer(gboolean grab, gboolean owner_events, ObCursor cur)
+gboolean grab_pointer_full(gboolean grab, gboolean owner_events,
+ gboolean confine, ObCursor cur)
{
gboolean ret = FALSE;
if (pgrabs++ == 0) {
ret = XGrabPointer(ob_display, screen_support_win, owner_events,
GRAB_PTR_MASK,
- GrabModeAsync, GrabModeAsync, None,
+ GrabModeAsync, GrabModeAsync,
+ (confine ? RootWindow(ob_display, ob_screen) :
+ None),
ob_cursor(cur), event_curtime) == Success;
if (!ret)
--pgrabs;
void grab_startup(gboolean reconfig)
{
guint i = 0;
+ guint num, caps, scroll;
- if (reconfig) return;
+ num = modkeys_key_to_mask(OB_MODKEY_KEY_NUMLOCK);
+ caps = modkeys_key_to_mask(OB_MODKEY_KEY_CAPSLOCK);
+ scroll = modkeys_key_to_mask(OB_MODKEY_KEY_SCROLLLOCK);
mask_list[i++] = 0;
- mask_list[i++] = LockMask;
- mask_list[i++] = NumLockMask;
- mask_list[i++] = LockMask | NumLockMask;
- mask_list[i++] = ScrollLockMask;
- mask_list[i++] = ScrollLockMask | LockMask;
- mask_list[i++] = ScrollLockMask | NumLockMask;
- mask_list[i++] = ScrollLockMask | LockMask | NumLockMask;
+ mask_list[i++] = num;
+ mask_list[i++] = caps;
+ mask_list[i++] = scroll;
+ mask_list[i++] = num | caps;
+ mask_list[i++] = num | scroll;
+ mask_list[i++] = caps | scroll;
+ mask_list[i++] = num | caps | scroll;
g_assert(i == MASK_LIST_SIZE);
}
{
if (reconfig) return;
- while (grab_keyboard(FALSE));
- while (grab_pointer(FALSE, FALSE, OB_CURSOR_NONE));
+ while (ungrab_keyboard());
+ while (ungrab_pointer());
while (grab_server(FALSE));
}
{
XUngrabKey(ob_display, AnyKey, AnyModifier, win);
}
+
+void grab_key_passive_count(int change)
+{
+ if (grab_on_keyboard()) return;
+ passive_count += change;
+ if (passive_count < 0) passive_count = 0;
+}
+
+void ungrab_passive_key()
+{
+ /*ob_debug("ungrabbing %d passive grabs\n", passive_count);*/
+ if (passive_count) {
+ /* kill out passive grab */
+ XUngrabKeyboard(ob_display, event_curtime);
+ passive_count = 0;
+ }
+}