keyrouter: add pepper_keyrouter_set_keyboard API 36/207136/1
authorSung-Jin Park <sj76.park@samsung.com>
Fri, 19 Apr 2019 08:37:01 +0000 (17:37 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Thu, 30 May 2019 08:32:43 +0000 (17:32 +0900)
Change-Id: I7c9f9772d71b0d96c2e9e8810a527eb7b435f6a9
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
src/lib/keyrouter/keyrouter.c
src/lib/keyrouter/pepper-keyrouter.c
src/lib/keyrouter/pepper-keyrouter.h

index 12fc8e0..397b836 100644 (file)
@@ -125,8 +125,14 @@ keyrouter_key_process(keyrouter_t *keyrouter,
                }
        }
        else if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.top)) {
-               /* Not supported yet */
-               return 0;
+               info = pepper_container_of(keyrouter->hard_keys[keycode].grab.top.next, info, link);
+               if (info) {
+                       delivery = (keyrouter_key_info_t *)calloc(1, sizeof(keyrouter_key_info_t));
+                       PEPPER_CHECK(delivery, return 0, "Failed to allocate memory\n");
+                       delivery->data = info->data;
+                       pepper_list_insert(delivery_list, &delivery->link);
+                       return 1;
+               }
        }
        else if (!pepper_list_empty(&keyrouter->hard_keys[keycode].grab.shared)) {
                pepper_list_for_each(info, &keyrouter->hard_keys[keycode].grab.shared, link) {
index f7c6f2a..62bb8ae 100644 (file)
@@ -36,6 +36,7 @@ struct pepper_keyrouter {
        struct wl_display *display;
        pepper_compositor_t *compositor;
        pepper_seat_t *seat;
+       pepper_keyboard_t *keyboard;
 
        pepper_list_t resources;
 
@@ -65,6 +66,13 @@ pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *s
        pepper_keyrouter->seat = seat;
 }
 
+PEPPER_API void
+pepper_keyrouter_set_keyboard(pepper_keyrouter_t * pepper_keyrouter, pepper_keyboard_t *keyboard)
+{
+       PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n");
+       pepper_keyrouter->keyboard = keyboard;
+}
+
 static void
 _pepper_keyrouter_key_send(pepper_keyrouter_t *pepper_keyrouter,
                               pepper_seat_t *seat, struct wl_client *client,
@@ -103,6 +111,9 @@ pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter,
                        if (pepper_keyrouter->seat && pepper_object_get_type((pepper_object_t *)pepper_keyrouter->seat) == PEPPER_OBJECT_SEAT) {
                                _pepper_keyrouter_key_send(pepper_keyrouter, pepper_keyrouter->seat, (struct wl_client *)info->data, key, state, time);
                        }
+                       else if (pepper_keyrouter->keyboard && pepper_object_get_type((pepper_object_t *)pepper_keyrouter->keyboard) == PEPPER_OBJECT_KEYBOARD) {
+                               _pepper_keyrouter_key_send(pepper_keyrouter, pepper_keyboard_get_seat(pepper_keyrouter->keyboard), (struct wl_client *)info->data, key, state, time);
+                       }
                        else {
                                seat_list = (pepper_list_t *)pepper_compositor_get_seat_list(pepper_keyrouter->compositor);
                                if (!pepper_list_empty(seat_list)) {
@@ -113,6 +124,12 @@ pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter,
                        }
                }
        }
+       else {
+               /* send key event to focused client */
+               pepper_view_t *focus_view = pepper_keyboard_get_focus(pepper_keyrouter->keyboard);
+               PEPPER_CHECK(focus_view, return , "No focused view exists.\n");
+               pepper_keyboard_send_key(pepper_keyrouter->keyboard, focus_view, time, key, state);
+       }
 }
 
 static void
@@ -392,6 +409,7 @@ pepper_keyrouter_event_handler(pepper_event_listener_t *listener,
 {
        pepper_input_event_t *event;
        pepper_keyrouter_t *pepper_keyrouter;
+       pepper_keyboard_t *keyboard = (pepper_keyboard_t *)object;
 
        PEPPER_CHECK((id == PEPPER_EVENT_KEYBOARD_KEY),
                     return, "%d event is not handled by keyrouter\n", id);
@@ -400,6 +418,7 @@ pepper_keyrouter_event_handler(pepper_event_listener_t *listener,
 
        event = (pepper_input_event_t *)info;
        pepper_keyrouter = (pepper_keyrouter_t *)data;
+       pepper_keyrouter_set_keyboard(pepper_keyrouter, keyboard);
        pepper_keyrouter_key_process(pepper_keyrouter, event->key, event->state, event->time);
 }
 
index c109dc3..83ec15a 100644 (file)
@@ -29,5 +29,6 @@ PEPPER_API pepper_keyrouter_t *pepper_keyrouter_create(pepper_compositor_t *comp
 PEPPER_API void pepper_keyrouter_destroy(pepper_keyrouter_t *pepper_keyrouter);
 
 PEPPER_API void pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat);
+PEPPER_API void pepper_keyrouter_set_keyboard(pepper_keyrouter_t * pepper_keyrouter, pepper_keyboard_t *keyboard);
 PEPPER_API void pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter, unsigned int key, unsigned int state, unsigned int time);
 PEPPER_API void pepper_keyrouter_event_handler(pepper_event_listener_t *listener, pepper_object_t *object, uint32_t id, void *info, void *data);