grab.c for the Openbox window manager
Copyright (c) 2006 Mikael Magnusson
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2003-2007 Dana Jansens
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
*/
#include "grab.h"
+#include "modkeys.h"
#include "openbox.h"
#include "event.h"
#include "xerror.h"
#include "screen.h"
+#include "debug.h"
#include <glib.h>
#include <X11/Xlib.h>
static Time ungrab_time()
{
Time t = event_curtime;
- if (!(t == 0 || 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;
if (grab) {
if (kgrabs++ == 0) {
ret = XGrabKeyboard(ob_display, RootWindow(ob_display, ob_screen),
- FALSE, GrabModeAsync, GrabModeAsync,
+ False, GrabModeAsync, GrabModeAsync,
event_curtime) == Success;
if (!ret)
--kgrabs;
return ret;
}
-gboolean grab_pointer(gboolean grab, ObCursor cur)
+gboolean grab_pointer_full(gboolean grab, gboolean owner_events,
+ gboolean confine, ObCursor cur)
{
gboolean ret = FALSE;
if (grab) {
if (pgrabs++ == 0) {
- ret = XGrabPointer(ob_display, screen_support_win,
- False, GRAB_PTR_MASK, GrabModeAsync,
- GrabModeAsync, None,
+ ret = XGrabPointer(ob_display, screen_support_win, owner_events,
+ GRAB_PTR_MASK,
+ GrabModeAsync, GrabModeAsync,
+ (confine ? RootWindow(ob_display, ob_screen) :
+ None),
ob_cursor(cur), event_curtime) == Success;
if (!ret)
--pgrabs;
return ret;
}
-gboolean grab_pointer_window(gboolean grab, ObCursor cur, Window win)
-{
- gboolean ret = FALSE;
-
- if (grab) {
- if (pgrabs++ == 0) {
- ret = XGrabPointer(ob_display, win, False, GRAB_PTR_MASK,
- GrabModeAsync, GrabModeAsync, None,
- ob_cursor(cur),
- event_curtime) == Success;
- if (!ret)
- --pgrabs;
- else
- grab_time = event_curtime;
- } else
- ret = TRUE;
- } else if (pgrabs > 0) {
- if (--pgrabs == 0) {
- XUngrabPointer(ob_display, ungrab_time());
- }
- ret = TRUE;
- }
- return ret;
-}
-
gint grab_server(gboolean grab)
{
static guint sgrabs = 0;
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, OB_CURSOR_NONE));
- while (grab_pointer_window(FALSE, OB_CURSOR_NONE, None));
+ while (ungrab_keyboard());
+ while (ungrab_pointer());
while (grab_server(FALSE));
}
{
guint i;
- xerror_set_ignore(TRUE); /* can get BadAccess' from these */
+ xerror_set_ignore(TRUE); /* can get BadAccess from these */
xerror_occured = FALSE;
for (i = 0; i < MASK_LIST_SIZE; ++i)
- XGrabButton(ob_display, button, state | mask_list[i], win, FALSE, mask,
- pointer_mode, GrabModeSync, None, ob_cursor(cur));
+ XGrabButton(ob_display, button, state | mask_list[i], win, False, mask,
+ pointer_mode, GrabModeAsync, None, ob_cursor(cur));
xerror_set_ignore(FALSE);
if (xerror_occured)
- g_warning("failed to grab button %d modifiers %d", button, state);
-}
-
-void grab_button(guint button, guint state, Window win, guint mask)
-{
- grab_button_full(button, state, win, mask, GrabModeAsync, OB_CURSOR_NONE);
+ ob_debug("Failed to grab button %d modifiers %d", button, state);
}
void ungrab_button(guint button, guint state, Window win)
GrabModeAsync, keyboard_mode);
xerror_set_ignore(FALSE);
if (xerror_occured)
- g_warning("failed to grab keycode %d modifiers %d", keycode, state);
+ ob_debug("Failed to grab keycode %d modifiers %d", keycode, state);
}
void ungrab_all_keys(Window win)