merge r6504-6506 from trunk
authorDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 23:31:14 +0000 (23:31 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 23:31:14 +0000 (23:31 +0000)
openbox/action.c
openbox/grab.c
openbox/grab.h
openbox/keyboard.c
openbox/menuframe.c
openbox/moveresize.c

index 8c8064f89a21ab86acc5f145efbcdb6f981e9558..cb703a66e32a791c470f062ceb8199a69eec81fa 100644 (file)
@@ -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;
 
index b6a7a9392fb43c8a039bac6fe9425fa8a0a20bca..ac91a6bcdb692f442c5aa3b9f9b565b2949061ad 100644 (file)
@@ -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));
 }
 
index 67dff212db3866776ce675ae83587fe83055978f..8a654c8b0caa1f436c895fad3c4490fabf623dd3 100644 (file)
 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();
 
index 5cfd45713dbdff021d5f870be52e3cbcc90ce877..b834046b9cdc4282a51f19093346c53d1d6852c0 100644 (file)
@@ -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);
index b3938a4b5babfb093b9632b2c4271726a391ec6c..9474ca39dc486a46c8876881539a8b8c1610df97 100644 (file)
@@ -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);
index ac51f8b6e83399675dbb24cae379f6cbeba37b1d..b5fe6cb00564b1c0e0bda67f8f223a1b485ffe8e 100644 (file)
@@ -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);