exposay: properly go away when the modifier is pressed
authorEmilio Pozuelo Monfort <emilio.pozuelo@collabora.co.uk>
Wed, 27 Nov 2013 09:49:08 +0000 (10:49 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 28 Nov 2013 06:49:31 +0000 (22:49 -0800)
We no longer receive an exposay_binding() call while exposay
is in-flight as we have grabbed the keyboard, so we need to
listen on the modifiers callback for the modifier press and
release.

src/shell.c

index 6ba1f10..2084ed6 100644 (file)
@@ -220,6 +220,9 @@ struct desktop_shell {
 
                int row_current;
                int column_current;
+
+               bool mod_pressed;
+               bool mod_invalid;
        } exposay;
 
        uint32_t binding_modifier;
@@ -5367,6 +5370,29 @@ exposay_modifier(struct weston_keyboard_grab *grab, uint32_t serial,
                  uint32_t mods_depressed, uint32_t mods_latched,
                  uint32_t mods_locked, uint32_t group)
 {
+       struct desktop_shell *shell =
+               container_of(grab, struct desktop_shell, exposay.grab_kbd);
+       struct weston_seat *seat = (struct weston_seat *) grab->keyboard->seat;
+
+       /* We want to know when mod has been pressed and released.
+        * FIXME: There is a problem here: if mod is pressed, then a key
+        * is pressed and released, then mod is released, we will treat that
+        * as if only mod had been pressed and released. */
+       if (seat->modifier_state) {
+               if (seat->modifier_state == shell->binding_modifier) {
+                       shell->exposay.mod_pressed = true;
+               } else {
+                       shell->exposay.mod_invalid = true;
+               }
+       } else {
+               if (shell->exposay.mod_pressed && !shell->exposay.mod_invalid)
+                       exposay_set_state(shell, EXPOSAY_TARGET_CANCEL, seat);
+
+               shell->exposay.mod_invalid = false;
+               shell->exposay.mod_pressed = false;
+       }
+
+       return;
 }
 
 static void
@@ -5512,10 +5538,7 @@ exposay_binding(struct weston_seat *seat, enum weston_keyboard_modifier modifier
 {
        struct desktop_shell *shell = data;
 
-       if (shell->exposay.state_target == EXPOSAY_TARGET_OVERVIEW)
-               exposay_set_state(shell, EXPOSAY_TARGET_CANCEL, seat);
-       else
-               exposay_set_state(shell, EXPOSAY_TARGET_OVERVIEW, seat);
+       exposay_set_state(shell, EXPOSAY_TARGET_OVERVIEW, seat);
 }
 
 static void