{
if (config_focus_follow)
if (data->any.context != OB_FRAME_CONTEXT_CLIENT && !data->any.button)
- grab_pointer(TRUE, FALSE, OB_CURSOR_NONE);
+ grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
}
inline void client_action_end(union ActionData *data)
if (config_focus_follow)
if (data->any.context != OB_FRAME_CONTEXT_CLIENT) {
if (!data->any.button) {
- grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
+ ungrab_pointer();
} else {
ObClient *c;
return pgrabs > 0;
}
-gboolean grab_keyboard(gboolean grab)
+gboolean grab_keyboard_full(gboolean grab)
{
gboolean ret = FALSE;
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;
{
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));
}
void grab_startup(gboolean reconfig);
void grab_shutdown(gboolean reconfig);
-gboolean grab_keyboard(gboolean grab);
-gboolean grab_pointer(gboolean grab, gboolean owner_events, ObCursor cur);
+gboolean grab_keyboard_full(gboolean grab);
+/*! @param confine If true the pointer is confined to the screen */
+gboolean grab_pointer_full(gboolean grab, gboolean owner_events,
+ gboolean confine, ObCursor cur);
gint grab_server(gboolean grab);
+#define grab_keyboard() grab_keyboard_full(TRUE)
+#define ungrab_keyboard() grab_keyboard_full(FALSE)
+#define grab_pointer(o,c,u) grab_pointer_full(TRUE, (o), (c), (u))
+#define ungrab_pointer() grab_pointer_full(FALSE, FALSE, FALSE, OB_CURSOR_NONE)
+
gboolean grab_on_keyboard();
gboolean grab_on_pointer();
/* ungrab first so they won't be NotifyWhileGrabbed */
if (ungrab)
- grab_keyboard(FALSE);
+ ungrab_keyboard();
/* set this before running the actions so they know the keyboard is not
grabbed */
g_assert(action->data.any.interactive);
if (!istate.active) {
- if (!grab_keyboard(TRUE))
+ if (!grab_keyboard())
return FALSE;
} else if (action->func != istate.action->func) {
keyboard_interactive_end(state, TRUE, action->data.any.time, FALSE);
/* grab the pointer in such a way as to pass through "owner events"
so that we can get enter/leave notifies in the menu. */
- if (!grab_pointer(TRUE, TRUE, OB_CURSOR_POINTER))
+ if (!grab_pointer(TRUE, FALSE, OB_CURSOR_POINTER))
return FALSE;
- if (!grab_keyboard(TRUE)) {
- grab_pointer(FALSE, TRUE, OB_CURSOR_POINTER);
+ if (!grab_keyboard()) {
+ ungrab_pointer();
return FALSE;
}
}
if (menu_frame_visible == NULL) {
/* last menu shown */
- grab_pointer(FALSE, TRUE, OB_CURSOR_NONE);
- grab_keyboard(FALSE);
+ ungrab_pointer();
+ ungrab_keyboard();
}
XUnmapWindow(ob_display, self->window);
(c->functions & OB_CLIENT_FUNC_RESIZE)))
return;
+ if (corner == prop_atoms.net_wm_moveresize_size_topleft)
+ cur = OB_CURSOR_NORTHWEST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_top)
+ cur = OB_CURSOR_NORTH;
+ else if (corner == prop_atoms.net_wm_moveresize_size_topright)
+ cur = OB_CURSOR_NORTHEAST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_right)
+ cur = OB_CURSOR_EAST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_bottomright)
+ cur = OB_CURSOR_SOUTHEAST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_bottom)
+ cur = OB_CURSOR_SOUTH;
+ else if (corner == prop_atoms.net_wm_moveresize_size_bottomleft)
+ cur = OB_CURSOR_SOUTHWEST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_left)
+ cur = OB_CURSOR_WEST;
+ else if (corner == prop_atoms.net_wm_moveresize_size_keyboard)
+ cur = OB_CURSOR_SOUTHEAST;
+ else if (corner == prop_atoms.net_wm_moveresize_move)
+ cur = OB_CURSOR_MOVE;
+ else if (corner == prop_atoms.net_wm_moveresize_move_keyboard)
+ cur = OB_CURSOR_MOVE;
+ else
+ g_assert_not_reached();
+
+ /* keep the pointer bounded to the screen for move/resize */
+ if (!grab_pointer(FALSE, TRUE, cur))
+ return;
+ if (!grab_keyboard()) {
+ ungrab_pointer();
+ return;
+ }
+
frame_end_iconify_animation(c->frame);
moveresize_client = c;
moveresize_in_progress = TRUE;
- if (corner == prop_atoms.net_wm_moveresize_size_topleft)
- cur = OB_CURSOR_NORTHWEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_top)
- cur = OB_CURSOR_NORTH;
- else if (corner == prop_atoms.net_wm_moveresize_size_topright)
- cur = OB_CURSOR_NORTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_right)
- cur = OB_CURSOR_EAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottomright)
- cur = OB_CURSOR_SOUTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottom)
- cur = OB_CURSOR_SOUTH;
- else if (corner == prop_atoms.net_wm_moveresize_size_bottomleft)
- cur = OB_CURSOR_SOUTHWEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_left)
- cur = OB_CURSOR_WEST;
- else if (corner == prop_atoms.net_wm_moveresize_size_keyboard)
- cur = OB_CURSOR_SOUTHEAST;
- else if (corner == prop_atoms.net_wm_moveresize_move)
- cur = OB_CURSOR_MOVE;
- else if (corner == prop_atoms.net_wm_moveresize_move_keyboard)
- cur = OB_CURSOR_MOVE;
- else
- g_assert_not_reached();
-
#ifdef SYNC
if (config_resize_redraw && !moving && extensions_shape &&
moveresize_client->sync_request && moveresize_client->sync_counter)
waiting_for_sync = FALSE;
}
#endif
-
- grab_pointer(TRUE, FALSE, cur);
- grab_keyboard(TRUE);
}
void moveresize_end(gboolean cancel)
{
gint x, y;
- grab_keyboard(FALSE);
- grab_pointer(FALSE, FALSE, OB_CURSOR_NONE);
+ ungrab_keyboard();
+ ungrab_pointer();
popup_hide(popup);