pepper: send keyboard modifiers event
authorJunghoon <jh13.son@samsung.com>
Mon, 5 Oct 2015 11:51:05 +0000 (20:51 +0900)
committerJunghoon <jh13.son@samsung.com>
Mon, 5 Oct 2015 11:51:05 +0000 (20:51 +0900)
Change-Id: I43109f7907bc63e9189b38a7aa2c33b38ace7010

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

index 855c79a..41300e0 100644 (file)
@@ -171,6 +171,12 @@ default_keyboard_grab_key(pepper_keyboard_t *keyboard, void *data,
     pepper_keyboard_send_key(keyboard, time, key, state);
 }
 
+static void
+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, mods_depressed, mods_latched, mods_locked, group);
+}
 
 static void
 default_keyboard_grab_cancel(pepper_keyboard_t *keyboard, void *data)
@@ -181,6 +187,7 @@ default_keyboard_grab_cancel(pepper_keyboard_t *keyboard, void *data)
 static const pepper_keyboard_grab_t default_keyboard_grab =
 {
     default_keyboard_grab_key,
+    default_keyboard_grab_modifiers,
     default_keyboard_grab_cancel,
 };
 
index 444e5ce..b6f6277 100644 (file)
@@ -41,12 +41,56 @@ clear_keymap(pepper_keyboard_t *keyboard)
 }
 
 static void
+update_modifiers(pepper_keyboard_t *keyboard)
+{
+    uint32_t mods_depressed, mods_latched, mods_locked, group;
+
+    mods_depressed = xkb_state_serialize_mods(keyboard->state, XKB_STATE_MODS_DEPRESSED);
+    mods_latched = xkb_state_serialize_mods(keyboard->state, XKB_STATE_MODS_LATCHED);
+    mods_locked = xkb_state_serialize_mods(keyboard->state, XKB_STATE_MODS_LOCKED);
+    group = xkb_state_serialize_mods(keyboard->state, XKB_STATE_LAYOUT_EFFECTIVE);
+
+    if ((mods_depressed != keyboard->mods_depressed) || (mods_latched != keyboard->mods_latched) ||
+        (mods_locked != keyboard->mods_locked) || (group != keyboard->group))
+    {
+        keyboard->mods_depressed = mods_depressed;
+        keyboard->mods_latched = mods_latched;
+        keyboard->mods_locked = mods_locked;
+        keyboard->group = group;
+
+        keyboard->grab->modifiers(keyboard, keyboard->data, mods_depressed, mods_latched,
+                                  mods_locked, group);
+    }
+}
+
+static void
+update_key(pepper_keyboard_t *keyboard, uint32_t key, uint32_t state)
+{
+    enum xkb_key_direction  direction;
+
+    if (!keyboard->state)
+        return;
+
+    if (state == WL_KEYBOARD_KEY_STATE_PRESSED)
+        direction = XKB_KEY_DOWN;
+    else
+        direction = XKB_KEY_UP;
+
+    xkb_state_update_key(keyboard->state, key + 8, direction);
+    update_modifiers(keyboard);
+}
+
+static void
 update_keymap(pepper_keyboard_t *keyboard)
 {
     struct wl_resource             *resource;
     char                           *keymap_str = NULL;
     char                           *keymap_map = NULL;
 
+    struct xkb_state               *state;
+    uint32_t                        mods_latched = 0;
+    uint32_t                        mods_locked = 0;
+
     if (keyboard->keymap)
         xkb_keymap_unref(keyboard->keymap);
 
@@ -70,9 +114,32 @@ update_keymap(pepper_keyboard_t *keyboard)
 
     strcpy(keymap_map, keymap_str);
 
+    state = xkb_state_new(keyboard->keymap);
+    PEPPER_CHECK(state, goto error, "failed to create xkb state\n");
+
+    if (keyboard->state)
+    {
+        mods_latched = xkb_state_serialize_mods(keyboard->state, XKB_STATE_MODS_LATCHED);
+        mods_locked = xkb_state_serialize_mods(keyboard->state, XKB_STATE_MODS_LOCKED);
+        xkb_state_update_mask(state, 0, mods_latched, mods_locked, 0, 0, 0);
+        xkb_state_unref(keyboard->state);
+    }
+    keyboard->state = state;
+
     wl_resource_for_each(resource, &keyboard->resource_list)
         wl_keyboard_send_keymap(resource, WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
                                 keyboard->keymap_fd, keyboard->keymap_len);
+
+    update_modifiers(keyboard);
+
+    if (!mods_latched && !mods_locked)
+        goto done;
+
+    wl_resource_for_each(resource, &keyboard->resource_list)
+        wl_keyboard_send_modifiers(resource,
+                                   wl_display_next_serial(keyboard->seat->compositor->display),
+                                   keyboard->mods_depressed, keyboard->mods_latched,
+                                   keyboard->mods_locked, keyboard->group);
     goto done;
 
 error:
@@ -117,6 +184,8 @@ pepper_keyboard_handle_event(pepper_keyboard_t *keyboard, uint32_t id, pepper_in
     if (keyboard->pending_keymap && (keyboard->keys.size == 0))
         update_keymap(keyboard);
 
+    update_key(keyboard, event->key, event->state);
+
     pepper_object_emit_event(&keyboard->base, id, event);
 }
 
index 66ff3dc..b849d95 100644 (file)
@@ -269,6 +269,12 @@ struct pepper_keyboard
     int                             keymap_fd;
     int                             keymap_len;
     struct xkb_keymap              *pending_keymap;
+
+    struct xkb_state               *state;
+    uint32_t                        mods_depressed;
+    uint32_t                        mods_latched;
+    uint32_t                        mods_locked;
+    uint32_t                        group;
 };
 
 pepper_keyboard_t *
index 17b23a7..a6f98e1 100644 (file)
@@ -373,7 +373,10 @@ pepper_pointer_get_grab_data(pepper_pointer_t *pointer);
 /* Keyboard. */
 struct pepper_keyboard_grab
 {
-    void (*key)(pepper_keyboard_t *keyboard, void *data, uint32_t time, uint32_t key, uint32_t state);
+    void (*key)(pepper_keyboard_t *keyboard, void *data, uint32_t time, uint32_t key,
+                uint32_t state);
+    void (*modifiers)(pepper_keyboard_t *keyboard, void *data, uint32_t mods_depressed,
+                      uint32_t mods_latched, uint32_t mods_locked, uint32_t group);
     void (*cancel)(pepper_keyboard_t *keyboard, void *data);
 };