+ return sgrabs;
+}
+
+void grab_startup(gboolean reconfig)
+{
+ guint i = 0;
+ guint num, caps, scroll;
+
+ num = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_NUMLOCK);
+ caps = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_CAPSLOCK);
+ scroll = obt_keyboard_modkey_to_modmask(OBT_KEYBOARD_MODKEY_SCROLLLOCK);
+
+ mask_list[i++] = 0;
+ 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);
+}
+
+void grab_shutdown(gboolean reconfig)
+{
+ if (reconfig) return;
+
+ while (ungrab_keyboard());
+ while (ungrab_pointer());
+ while (grab_server(FALSE));
+}
+
+void grab_button_full(guint button, guint state, Window win, guint mask,
+ gint pointer_mode, ObCursor cur)
+{
+ guint i;
+
+ /* can get BadAccess from these */
+ obt_display_ignore_errors(TRUE);
+ for (i = 0; i < MASK_LIST_SIZE; ++i)
+ XGrabButton(obt_display, button, state | mask_list[i], win, False,
+ mask, pointer_mode, GrabModeAsync, None, ob_cursor(cur));
+ obt_display_ignore_errors(FALSE);
+ if (obt_display_error_occured)
+ ob_debug("Failed to grab button %d modifiers %d", button, state);