Author: olivier
Date: 2006-07-12 18:39:16 +0000 (Wed, 12 Jul 2006)
New Revision: 22422

Modified:
   xfwm4/trunk/src/client.c
Log:
Fix a major issue with key/mouse grabs introduces in beta2, rework grabs and 
ungrabs, grab using last known event time, ungrab with current server time.

Modified: xfwm4/trunk/src/client.c
===================================================================
--- xfwm4/trunk/src/client.c    2006-07-12 13:30:54 UTC (rev 22421)
+++ xfwm4/trunk/src/client.c    2006-07-12 18:39:16 UTC (rev 22422)
@@ -3662,16 +3662,16 @@
         cursor = myDisplayGetCursorMove(display_info);
         getMouseXY (screen_info, screen_info->xroot, &passdata.mx, 
&passdata.my);
     }
-    g1 = myScreenGrabKeyboard (screen_info, CurrentTime);
+    g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
     g2 = myScreenGrabPointer (screen_info, ButtonMotionMask | 
ButtonReleaseMask, 
-                              cursor, CurrentTime);
+                              cursor, myDisplayGetCurrentTime (display_info));
     if (!g1 || !g2)
     {
         TRACE ("grab failed in clientMove");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, CurrentTime);
-        myScreenUngrabPointer (screen_info, CurrentTime);
+        myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
 
         return;
     }
@@ -3732,7 +3732,7 @@
     }
     clientConfigure (c, &wc, changes, NO_CFG_FLAG);
 
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
     if (!passdata.released)
     {
         /* If this is a drag-move, wait for the button to be released.
@@ -3742,7 +3742,7 @@
         gtk_main ();
         eventFilterPop (display_info->xfilter);
     }
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
+    myScreenUngrabPointer (screen_info, CurrentTime);
     if (passdata.grab && screen_info->params->box_move)
     {
         myDisplayUngrabServer (display_info);
@@ -4171,18 +4171,18 @@
         getMouseXY (screen_info, screen_info->xroot, &passdata.mx, 
&passdata.my);
     }
 
-    g1 = myScreenGrabKeyboard (screen_info, CurrentTime);
+    g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
     g2 = myScreenGrabPointer (screen_info, ButtonMotionMask | 
ButtonReleaseMask, 
                               myDisplayGetCursorResize(display_info, 
passdata.corner), 
-                              CurrentTime);
+                              myDisplayGetCurrentTime (display_info));
 
     if (!g1 || !g2)
     {
         TRACE ("grab failed in clientResize");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, CurrentTime);
-        myScreenUngrabPointer (screen_info, CurrentTime);
+        myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
 
         return;
     }
@@ -4243,7 +4243,7 @@
     wc.height = c->height;
     clientConfigure (c, &wc, CWX | CWY | CWHeight | CWWidth, CFG_NOTIFY);
 
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
     if (!passdata.released)
     {
         /* If this is a drag-resize, wait for the button to be released.
@@ -4253,7 +4253,7 @@
         gtk_main ();
         eventFilterPop (display_info->xfilter);
     }
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
+    myScreenUngrabPointer (screen_info, CurrentTime);
     if (passdata.grab && screen_info->params->box_resize)
     {
         myDisplayUngrabServer (display_info);
@@ -4316,6 +4316,7 @@
                 if (key_pressed)
                 {
                     Client *c2 = NULL;
+
                     /* If KEY_CYCLE_WINDOWS has Shift, then do not reverse */
                     if (!(modifier & ShiftMask) && (xevent->xkey.state & 
ShiftMask))
                     {
@@ -4332,6 +4333,12 @@
                         c = c2;
                         passdata->c = c;
                     }
+
+                    /* If last key press event had not our modifier pressed, 
finish cycling */
+                    if (!(xevent->xkey.state & modifier))
+                    {
+                        cycling = FALSE;
+                    }
                 }
 
                 if (c)
@@ -4348,7 +4355,8 @@
             {
                 int keysym = XLookupKeysym (&xevent->xkey, 0);
 
-                if (IsModifierKey(keysym) && (keysym != XK_Shift_L) && (keysym 
!= XK_Shift_R))
+                if (!(xevent->xkey.state & modifier) ||
+                    (IsModifierKey(keysym) && (keysym != XK_Shift_L) && 
(keysym != XK_Shift_R)))
                 {
                     cycling = FALSE;
                 }
@@ -4388,16 +4396,16 @@
     screen_info = c->screen_info;
     display_info = screen_info->display_info;
 
-    g1 = myScreenGrabKeyboard (screen_info, CurrentTime);
-    g2 = myScreenGrabPointer (screen_info, NoEventMask,  None, CurrentTime);
+    g1 = myScreenGrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+    g2 = myScreenGrabPointer (screen_info, NoEventMask,  None, 
myDisplayGetCurrentTime (display_info));
 
     if (!g1 || !g2)
     {
         TRACE ("grab failed in clientCycle");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, CurrentTime);
-        myScreenUngrabPointer (screen_info, CurrentTime);
+        myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
+        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
 
         return;
     }
@@ -4445,8 +4453,8 @@
         tabwinDestroy (passdata.tabwin);
         g_free (passdata.tabwin);
     }
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime 
(display_info));
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime 
(display_info));
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
+    myScreenUngrabPointer (screen_info, CurrentTime);
 
     if (passdata.c)
     {

_______________________________________________
Xfce4-commits mailing list
Xfce4-commits@xfce.org
http://foo-projects.org/mailman/listinfo/xfce4-commits

Reply via email to