From 244025611bfca21df3491c5cbd0ae2bcd9a1fd8a Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <fourdan.olivier@wanadoo.fr>
Date: Mon, 23 Feb 2009 23:59:06 +0000
Subject: [PATCH] 	* src/cycle.c, src/moveresize.c: Make sure any active
 grab on the 	  keyboard and pointer are released  (Corollary to bug #4959).

(Old svn revision: 29550)
---
 ChangeLog        |  5 +++++
 src/cycle.c      | 12 ++++++++----
 src/moveresize.c | 26 ++++++++++++++++++--------
 3 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 66fb929af..735a23da0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-02-23	olivier
+
+	* src/cycle.c, src/moveresize.c: Make sure any active grab on the
+	  keyboard and pointer are released  (Corollary to bug #4959).
+
 2009-02-23	olivier
 
 	* src/netwm.h, src/netwm.c, src/client.h, src/client.c, src/events.c,
diff --git a/src/cycle.c b/src/cycle.c
index e3d901d76..08bd64a10 100644
--- a/src/cycle.c
+++ b/src/cycle.c
@@ -214,8 +214,8 @@ clientCycle (Client * c, XKeyEvent * ev)
         TRACE ("grab failed in clientCycle");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, ev->time);
-        myScreenUngrabPointer (screen_info, ev->time);
+        myScreenUngrabKeyboard (screen_info, CurrentTime);
+        myScreenUngrabPointer (screen_info, CurrentTime);
 
         return;
     }
@@ -304,6 +304,10 @@ clientCycle (Client * c, XKeyEvent * ev)
         clientSetFocus (screen_info, c, myDisplayGetCurrentTime (display_info), NO_FOCUS_FLAG);
     }
 
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+    /*
+     * Use CurrentTime instead of actual last event time to make sure
+     * that the grab is released in any case.
+     */
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
+    myScreenUngrabPointer (screen_info, CurrentTime);
 }
diff --git a/src/moveresize.c b/src/moveresize.c
index 686b60478..0082f8bc0 100644
--- a/src/moveresize.c
+++ b/src/moveresize.c
@@ -952,8 +952,8 @@ clientMove (Client * c, XEvent * ev)
         TRACE ("grab failed in clientMove");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+        myScreenUngrabKeyboard (screen_info, CurrentTime);
+        myScreenUngrabPointer (screen_info, CurrentTime);
 
         return;
     }
@@ -1022,8 +1022,13 @@ clientMove (Client * c, XEvent * ev)
         gtk_main ();
         eventFilterPop (display_info->xfilter);
     }
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+
+    /*
+     * Use CurrentTime instead of actual last event time to make sure
+     * that the grab is released in any case.
+     */
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
+    myScreenUngrabPointer (screen_info, CurrentTime);
 
     if (passdata.grab && screen_info->params->box_move)
     {
@@ -1491,8 +1496,8 @@ clientResize (Client * c, int handle, XEvent * ev)
         TRACE ("grab failed in clientResize");
 
         gdk_beep ();
-        myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-        myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+        myScreenUngrabKeyboard (screen_info, CurrentTime);
+        myScreenUngrabPointer (screen_info, CurrentTime);
 
         return;
     }
@@ -1563,8 +1568,13 @@ clientResize (Client * c, int handle, XEvent * ev)
         gtk_main ();
         eventFilterPop (display_info->xfilter);
     }
-    myScreenUngrabKeyboard (screen_info, myDisplayGetCurrentTime (display_info));
-    myScreenUngrabPointer (screen_info, myDisplayGetCurrentTime (display_info));
+
+    /*
+     * Use CurrentTime instead of actual last event time to make sure
+     * that the grab is released in any case.
+     */
+    myScreenUngrabKeyboard (screen_info, CurrentTime);
+    myScreenUngrabPointer (screen_info, CurrentTime);
 
     if (passdata.grab && screen_info->params->box_resize)
     {
-- 
GitLab