[Xfce4-commits] <xfwm4:master> Restore grab mouse pointer based on commit 380c869 and restrict mouse interactions inside tabwin

Nick Schermer noreply at xfce.org
Sun Feb 23 21:10:26 CET 2014


Updating branch refs/heads/master
         to 642fef640679396fe89c37408a79ae94b39d6a44 (commit)
       from 6be40e9f72ca6828254ecfa9ae6795358cd38e6d (commit)

commit 642fef640679396fe89c37408a79ae94b39d6a44
Author: Cédric Leporcq <cedl38 at gmail.com>
Date:   Thu Dec 5 00:08:30 2013 +0100

    Restore grab mouse pointer based on commit 380c869 and restrict mouse interactions inside tabwin
    
    Signed-off-by: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>

 src/cycle.c      |   54 ++++++++++++++++++++++++++----------------------------
 src/events.c     |    2 +-
 src/moveresize.c |    6 ++++--
 src/screen.c     |    4 ++--
 src/screen.h     |    1 +
 5 files changed, 34 insertions(+), 33 deletions(-)

diff --git a/src/cycle.c b/src/cycle.c
index 3af6aea..6051d61 100644
--- a/src/cycle.c
+++ b/src/cycle.c
@@ -227,12 +227,14 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
     DisplayInfo *display_info;
     ClientCycleData *passdata;
     Client *c, *removed;
+    Client *c2 = NULL;
     eventFilterStatus status;
     KeyCode cancel, left, right, up, down;
     int key, modifiers;
     gboolean key_pressed, cycling, gone;
     GList *li;
     Window mouse_window = 0;
+    XButtonEvent ev;
 
     TRACE ("entering clientCycleEventFilter");
 
@@ -281,7 +283,6 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
             {
                 if (key_pressed)
                 {
-                    Client *c2 = NULL;
                     key = myScreenGetKeyPressed (screen_info, (XKeyEvent *) xevent);
                     /*
                      * We cannot simply check for key == KEY_CANCEL here because of the
@@ -360,30 +361,31 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
             }
             break;
         case ButtonPress:
-        case ButtonRelease:
             status = EVENT_FILTER_STOP;
-            cycling = FALSE;
+            ev = xevent->xbutton;
             /* window of the event, we might accept it later */
             mouse_window = xevent->xbutton.window;
+            if (mouse_window != 0)
+            {
+                /* only accept events for the tab windows */
+                for (li = passdata->tabwin->tabwin_list; li != NULL; li = li->next)
+                {
+                    if (GDK_WINDOW_XID (gtk_widget_get_window (li->data)) == mouse_window)
+                    {
+                        if  (ev.button == Button1)
+                        {
+                            cycling = FALSE;
+                            c = tabwinSelectHoveredWidget (passdata->tabwin);
+                            break;
+                        }
+                    }
+                }
+            }
             break;
         default:
             status = EVENT_FILTER_CONTINUE;
             break;
     }
-    
-    if (mouse_window != 0)
-    {
-        /* only accept events for the tab windows */
-        for (li = passdata->tabwin->tabwin_list; li != NULL; li = li->next)
-        {
-            if (GDK_WINDOW_XID (gtk_widget_get_window (li->data)) == mouse_window)
-            {
-                c = tabwinSelectHoveredWidget (passdata->tabwin);
-
-                break;
-            }
-        }
-    }
 
     if (!cycling)
     {
@@ -391,14 +393,6 @@ clientCycleEventFilter (XEvent * xevent, gpointer data)
         gtk_main_quit ();
     }
 
-    if (status == EVENT_FILTER_STOP)
-    {
-        /* If there's any chance of a leftover grab, release it. This happens
-         * when the user clicks outside of the tabwin window area onto another
-         * window */
-        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
-    }
-
     return status;
 }
 
@@ -409,7 +403,7 @@ clientCycle (Client * c, XKeyEvent * ev)
     DisplayInfo *display_info;
     ClientCycleData passdata;
     GList *client_list, *selected;
-    gboolean g1;
+    gboolean g1, g2;
     int key, modifier;
     Client *c2;
 
@@ -456,13 +450,16 @@ clientCycle (Client * c, XKeyEvent * ev)
     }
 
     g1 = myScreenGrabKeyboard (screen_info, ev->time);
+    g2 = myScreenGrabPointer (screen_info, TRUE, LeaveWindowMask, None, ev->time);
+
 
-    if (!g1)
+    if (!g1 || !g2)
     {
         TRACE ("grab failed in clientCycle");
 
         gdk_beep ();
         myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
+        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
         g_list_free (client_list);
 
         return;
@@ -477,7 +474,7 @@ clientCycle (Client * c, XKeyEvent * ev)
     }
     passdata.tabwin = tabwinCreate (&client_list, selected, screen_info->params->cycle_workspaces);
     eventFilterPush (display_info->xfilter, clientCycleEventFilter, &passdata);
-    
+
     c2 = myScreenGetClientFromWindow (screen_info, GDK_WINDOW_XID (gtk_widget_get_window ( passdata.tabwin->tabwin_list->data)), SEARCH_FRAME);
     g_message ("%p", c2);
     clientSetFocus (screen_info, c2, ev->time, NO_FOCUS_FLAG);
@@ -502,6 +499,7 @@ clientCycle (Client * c, XKeyEvent * ev)
     g_list_free (client_list);
 
     myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
+    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
 }
 
 gboolean
diff --git a/src/events.c b/src/events.c
index e83bde9..ccdb2a5 100644
--- a/src/events.c
+++ b/src/events.c
@@ -235,7 +235,7 @@ typeOfClick (ScreenInfo *screen_info, Window w, XEvent * ev, gboolean allow_doub
     g_return_val_if_fail (w != None, XFWM_BUTTON_UNDEFINED);
 
     display_info = screen_info->display_info;
-    g = myScreenGrabPointer (screen_info, DOUBLE_CLICK_GRAB, None, ev->xbutton.time);
+    g = myScreenGrabPointer (screen_info, FALSE, DOUBLE_CLICK_GRAB, None, ev->xbutton.time);
 
     if (!g)
     {
diff --git a/src/moveresize.c b/src/moveresize.c
index a98bdf7..ec0e423 100644
--- a/src/moveresize.c
+++ b/src/moveresize.c
@@ -1123,7 +1123,9 @@ clientMove (Client * c, XEvent * ev)
     }
 
     g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    g2 = myScreenGrabPointer (screen_info, MOVERESIZE_EVENT_MASK,
+    g2 = myScreenGrabPointer (screen_info,
+                              FALSE,
+                              MOVERESIZE_EVENT_MASK,
                               myDisplayGetCursorMove (display_info),
                               myDisplayGetCurrentTime (display_info));
     if (!g1 || !g2)
@@ -1694,7 +1696,7 @@ clientResize (Client * c, int handle, XEvent * ev)
     }
 
     g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    g2 = myScreenGrabPointer (screen_info, MOVERESIZE_EVENT_MASK,
+    g2 = myScreenGrabPointer (screen_info, FALSE, MOVERESIZE_EVENT_MASK,
                               cursor, myDisplayGetCurrentTime (display_info));
 
     if (!g1 || !g2)
diff --git a/src/screen.c b/src/screen.c
index 0db586d..b57f523 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -456,7 +456,7 @@ myScreenGrabKeyboard (ScreenInfo *screen_info, guint32 timestamp)
 }
 
 gboolean
-myScreenGrabPointer (ScreenInfo *screen_info, unsigned int event_mask, Cursor cursor, guint32 timestamp)
+myScreenGrabPointer (ScreenInfo *screen_info, gboolean owner_events, unsigned int event_mask, Cursor cursor, guint32 timestamp)
 {
     gboolean grab;
 
@@ -468,7 +468,7 @@ myScreenGrabPointer (ScreenInfo *screen_info, unsigned int event_mask, Cursor cu
     {
         grab = (XGrabPointer (myScreenGetXDisplay (screen_info),
                               screen_info->xroot,
-                              FALSE, event_mask,
+                              owner_events, event_mask,
                               GrabModeAsync, GrabModeAsync,
                               screen_info->xroot,
                               cursor,
diff --git a/src/screen.h b/src/screen.h
index ad5ce47..1c4b538 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -214,6 +214,7 @@ GdkWindow               *myScreenGetGdkWindow                   (ScreenInfo *);
 gboolean                 myScreenGrabKeyboard                   (ScreenInfo *,
                                                                  guint32);
 gboolean                 myScreenGrabPointer                    (ScreenInfo *,
+                                                                 gboolean,
                                                                  unsigned int,
                                                                  Cursor,
                                                                  guint32);


More information about the Xfce4-commits mailing list