pepper-keyboard: do not process a keyboard event if a grab returns false 91/207191/1
authorjeon <jhyuni.kang@samsung.com>
Thu, 9 May 2019 08:36:39 +0000 (17:36 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:34:30 +0000 (17:34 +0900)
Change-Id: I2cf66c669a14db798f0c171b2b57e22f83d1d7d4

src/lib/desktop-shell/shell.c
src/lib/pepper/keyboard.c
src/lib/pepper/pepper.h

index 888d94d..ffa83b1 100644 (file)
@@ -209,27 +209,32 @@ pointer_remove_callback(pepper_event_listener_t *listener,
        /* Nothing to do. */
 }
 
-static void
+static pepper_bool_t
 default_keyboard_grab_key(pepper_keyboard_t *keyboard, void *data,
                                                  uint32_t time, uint32_t key, uint32_t state)
 {
        pepper_keyboard_send_key(keyboard, pepper_keyboard_get_focus(keyboard), time,
                                                         key, state);
+
+       return PEPPER_TRUE;
 }
 
-static void
+static pepper_bool_t
 default_keyboard_grab_modifiers(pepper_keyboard_t *keyboard, void *data,
                                                                uint32_t mods_depressed,
                                                                uint32_t mods_latched, uint32_t mods_locked, uint32_t group)
 {
        pepper_keyboard_send_modifiers(keyboard, pepper_keyboard_get_focus(keyboard),
                                                                   mods_depressed, mods_latched, mods_locked, group);
+
+       return PEPPER_TRUE;
 }
 
-static void
+static pepper_bool_t
 default_keyboard_grab_cancel(pepper_keyboard_t *keyboard, void *data)
 {
        /* Nothing to do. */
+       return PEPPER_TRUE;
 }
 
 static const pepper_keyboard_grab_t default_keyboard_grab = {
index 79fa442..804a8a2 100644 (file)
@@ -48,6 +48,8 @@ static const struct wl_keyboard_interface keyboard_impl = {
 static void
 update_modifiers(pepper_keyboard_t *keyboard)
 {
+       pepper_bool_t res = PEPPER_TRUE;
+
        if ((keyboard->pending.mods_depressed != keyboard->mods_depressed) ||
                (keyboard->pending.mods_latched != keyboard->mods_latched) ||
                (keyboard->pending.mods_locked != keyboard->mods_locked) ||
@@ -58,11 +60,13 @@ update_modifiers(pepper_keyboard_t *keyboard)
                keyboard->mods_locked = keyboard->pending.mods_locked;
                keyboard->group = keyboard->pending.group;
 
-               keyboard->grab->modifiers(keyboard,
-                                                                 keyboard->data,
-                                                                 keyboard->mods_depressed,
-                                                                 keyboard->mods_latched,
-                                                                 keyboard->mods_locked, keyboard->group);
+               res = keyboard->grab->modifiers(keyboard,
+                                                                               keyboard->data,
+                                                                               keyboard->mods_depressed,
+                                                                               keyboard->mods_latched,
+                                                                               keyboard->mods_locked, keyboard->group);
+
+               if (!res) return;
        }
 }
 
@@ -106,6 +110,7 @@ pepper_keyboard_handle_event(pepper_keyboard_t *keyboard, uint32_t id,
        uint32_t *keys = keyboard->keys.data;
        unsigned int num_keys = keyboard->keys.size / sizeof(uint32_t);
        unsigned int i;
+       pepper_bool_t res = PEPPER_TRUE;
 
        if (id != PEPPER_EVENT_INPUT_DEVICE_KEYBOARD_KEY)
                return;
@@ -123,9 +128,11 @@ pepper_keyboard_handle_event(pepper_keyboard_t *keyboard, uint32_t id,
        if (event->state == PEPPER_KEY_STATE_PRESSED)
                *(uint32_t *) wl_array_add(&keyboard->keys, sizeof(uint32_t)) = event->key;
 
-       if (keyboard->grab)
-               keyboard->grab->key(keyboard, keyboard->data, event->time, event->key,
-                                                       event->state);
+       if (keyboard->grab) {
+               res = keyboard->grab->key(keyboard, keyboard->data, event->time, event->key,
+                                                                 event->state);
+               if (!res) return;
+       }
 
        if (keyboard->need_update_keymap && keyboard->keys.size == 0) {
                pepper_object_emit_event(&keyboard->base,
index 3d8484e..b293386 100644 (file)
@@ -1088,9 +1088,9 @@ struct pepper_keyboard_grab {
         * @param key       key code
         * @param state     state flag (ex. WL_KEYBOARD_KEY_STATE_PRESSED)
         **/
-       void (*key)(pepper_keyboard_t *keyboard, void *data, uint32_t time,
-                               uint32_t key,
-                               uint32_t state);
+       pepper_bool_t (*key)(pepper_keyboard_t *keyboard, void *data, uint32_t time,
+                                                uint32_t key,
+                                                uint32_t state);
 
        /**
         * Handler for keyboard modifier event
@@ -1102,9 +1102,9 @@ struct pepper_keyboard_grab {
         * @param mods_locked       locked mods
         * @param group             (none)
         **/
-       void (*modifiers)(pepper_keyboard_t *keyboard, void *data,
-                                         uint32_t mods_depressed,
-                                         uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
+       pepper_bool_t (*modifiers)(pepper_keyboard_t *keyboard, void *data,
+                                                          uint32_t mods_depressed,
+                                                          uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
 
        /**
         * Handler for grab cancel
@@ -1112,7 +1112,7 @@ struct pepper_keyboard_grab {
         * @param keyboard  keyboard object
         * @param data      data registered for the grab (@see pepper_keyboard_set_grab)
         **/
-       void (*cancel)(pepper_keyboard_t *keyboard, void *data);
+       pepper_bool_t (*cancel)(pepper_keyboard_t *keyboard, void *data);
 };
 
 PEPPER_API struct wl_list *