[mutter] window: Be better at filtering window grab mods



commit d233238c6462b0817dba34c078cd06c3ba3cf368
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Fri Aug 15 16:03:50 2014 -0400

    window: Be better at filtering window grab mods
    
    It turns out that Clutter doesn't actually filter NumLock / ScrollLock /
    CapsLock from button events due to its terrible event translation code.
    
    Check only the grab mods to check if it's unmodified.

 src/core/window.c |   49 ++++++++++++++++++++-----------------------------
 1 files changed, 20 insertions(+), 29 deletions(-)
---
diff --git a/src/core/window.c b/src/core/window.c
index 92ea731..5036818 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -6108,16 +6108,6 @@ end_grab_op (MetaWindow *window,
   meta_display_end_grab_op (window->display, clutter_event_get_time (event));
 }
 
-static gboolean
-button_event_is_window_grab (MetaDisplay *display,
-                             const ClutterEvent *event)
-{
-  ClutterModifierType mods = event->button.modifier_state;
-  ClutterModifierType grab_mods = meta_display_get_window_grab_modifiers (display);
-
-  return (mods & grab_mods) == grab_mods;
-}
-
 gboolean
 meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
                                          const ClutterEvent *event)
@@ -6129,19 +6119,23 @@ meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
   switch (event->type)
     {
     case CLUTTER_BUTTON_PRESS:
-      /* This is the keybinding or menu case where we've
-       * been dragging around the window without the button
-       * pressed. */
-
-      if ((meta_grab_op_is_mouse (window->display->grab_op) &&
-           button_event_is_window_grab (window->display, event) &&
-           window->display->grab_button != (int) event->button.button) ||
-          meta_grab_op_is_keyboard (window->display->grab_op))
-        {
-          end_grab_op (window, event);
-          return FALSE;
-        }
-      return TRUE;
+      {
+        ClutterModifierType grab_mods = meta_display_get_window_grab_modifiers (display);
+
+        /* This is the keybinding or menu case where we've
+         * been dragging around the window without the button
+         * pressed. */
+
+        if ((meta_grab_op_is_mouse (window->display->grab_op) &&
+             (event->button.modifier_state & grab_mods) == grab_mods &&
+             window->display->grab_button != (int) event->button.button) ||
+            meta_grab_op_is_keyboard (window->display->grab_op))
+          {
+            end_grab_op (window, event);
+            return FALSE;
+          }
+        return TRUE;
+      }
 
     case CLUTTER_TOUCH_END:
       if (meta_display_is_pointer_emulating_sequence (window->display, sequence))
@@ -7912,12 +7906,9 @@ meta_window_handle_ungrabbed_event (MetaWindow         *window,
    * care about. Just let the event through.
    */
 
-  const int CLUTTER_BUTTON_MASK = (CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK |
-                                   CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK |
-                                   CLUTTER_BUTTON5_MASK);
-
-  unmodified = (event->button.modifier_state & ~CLUTTER_BUTTON_MASK) == 0;
-  is_window_grab = button_event_is_window_grab (display, event);
+  ClutterModifierType grab_mods = meta_display_get_window_grab_modifiers (display);
+  unmodified = (event->button.modifier_state & grab_mods) == 0;
+  is_window_grab = (event->button.modifier_state & grab_mods) == grab_mods;
 
   if (unmodified)
     {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]