From 858b77514ec71be3f70ac69c1754cf5c3cb0ce49 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 13 May 2007 23:31:14 +0000 Subject: [PATCH] merge r6504-6506 from trunk --- openbox/action.c | 4 +-- openbox/grab.c | 13 +++++---- openbox/grab.h | 11 ++++++-- openbox/keyboard.c | 4 +-- openbox/menuframe.c | 10 +++---- openbox/moveresize.c | 65 ++++++++++++++++++++++++-------------------- 6 files changed, 61 insertions(+), 46 deletions(-) diff --git a/openbox/action.c b/openbox/action.c index 8c8064f8..cb703a66 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -42,7 +42,7 @@ inline void client_action_start(union ActionData *data) { 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) @@ -50,7 +50,7 @@ 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; diff --git a/openbox/grab.c b/openbox/grab.c index b6a7a939..ac91a6bc 100644 --- a/openbox/grab.c +++ b/openbox/grab.c @@ -67,7 +67,7 @@ gboolean grab_on_pointer() return pgrabs > 0; } -gboolean grab_keyboard(gboolean grab) +gboolean grab_keyboard_full(gboolean grab) { gboolean ret = FALSE; @@ -92,7 +92,8 @@ gboolean grab_keyboard(gboolean grab) 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; @@ -100,7 +101,9 @@ gboolean grab_pointer(gboolean grab, gboolean owner_events, ObCursor cur) 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; @@ -158,8 +161,8 @@ void grab_shutdown(gboolean reconfig) { 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)); } diff --git a/openbox/grab.h b/openbox/grab.h index 67dff212..8a654c8b 100644 --- a/openbox/grab.h +++ b/openbox/grab.h @@ -27,10 +27,17 @@ 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(); diff --git a/openbox/keyboard.c b/openbox/keyboard.c index 5cfd4571..b834046b 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -197,7 +197,7 @@ static void keyboard_interactive_end(guint state, gboolean cancel, Time time, /* 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 */ @@ -226,7 +226,7 @@ gboolean keyboard_interactive_grab(guint state, ObClient *client, 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); diff --git a/openbox/menuframe.c b/openbox/menuframe.c index b3938a4b..9474ca39 100644 --- a/openbox/menuframe.c +++ b/openbox/menuframe.c @@ -974,10 +974,10 @@ static gboolean menu_frame_show(ObMenuFrame *self) /* 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; } } @@ -1095,8 +1095,8 @@ void menu_frame_hide(ObMenuFrame *self) 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); diff --git a/openbox/moveresize.c b/openbox/moveresize.c index ac51f8b6..b5fe6cb0 100644 --- a/openbox/moveresize.c +++ b/openbox/moveresize.c @@ -162,6 +162,39 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) (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; @@ -197,31 +230,6 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) 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) @@ -262,17 +270,14 @@ void moveresize_start(ObClient *c, gint x, gint y, guint b, guint32 cnr) 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); -- 2.34.1