From 5e98bcbdf936c10b2ea9f415df442005a1a189a8 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Fri, 19 Apr 2019 17:37:01 +0900 Subject: [PATCH] keyrouter: add pepper_keyrouter_set_keyboard API Change-Id: I7c9f9772d71b0d96c2e9e8810a527eb7b435f6a9 Signed-off-by: Sung-Jin Park --- src/lib/keyrouter/keyrouter.c | 10 ++++++++-- src/lib/keyrouter/pepper-keyrouter.c | 19 +++++++++++++++++++ src/lib/keyrouter/pepper-keyrouter.h | 1 + 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c index 12fc8e0..397b836 100644 --- a/src/lib/keyrouter/keyrouter.c +++ b/src/lib/keyrouter/keyrouter.c @@ -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) { diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index f7c6f2a..62bb8ae 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -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); } diff --git a/src/lib/keyrouter/pepper-keyrouter.h b/src/lib/keyrouter/pepper-keyrouter.h index c109dc3..83ec15a 100644 --- a/src/lib/keyrouter/pepper-keyrouter.h +++ b/src/lib/keyrouter/pepper-keyrouter.h @@ -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); -- 2.34.1