From bcee1cd0e00bc8dad1b8acf08c09893e032b450d Mon Sep 17 00:00:00 2001 From: JengHyun Kang Date: Mon, 20 Mar 2017 16:30:39 +0900 Subject: [PATCH] keyrouter: add an api(pepper_keyrouter_key_process) for process / send key events to client Change-Id: I3afc54a634f1fe63646b1849017f10be8b7f1a91 --- src/lib/keyrouter/pepper-keyrouter.c | 58 ++++++++++++++++++++++++++++++++++++ src/lib/keyrouter/pepper-keyrouter.h | 3 ++ 2 files changed, 61 insertions(+) diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index 64a3c2b..5bcee3c 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -34,6 +34,7 @@ struct pepper_keyrouter { struct wl_global *global; struct wl_display *display; pepper_compositor_t *compositor; + pepper_seat_t *seat; pepper_list_t resources; @@ -56,6 +57,63 @@ struct ungrab_list_data { int err; }; +PEPPER_API void +pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat) +{ + PEPPER_CHECK(pepper_keyrouter, return, "Invalid pepper_keyrouter_t\n"); + pepper_keyrouter->seat = seat; +} + +static void +_pepper_keyrouter_key_send(pepper_keyrouter_t *pepper_keyrouter, + pepper_seat_t *seat, struct wl_client *client, + unsigned int key, unsigned int state, + unsigned int time) +{ + struct wl_resource *resource; + pepper_keyboard_t *keyboard_info; + + keyboard_info = pepper_seat_get_keyboard(seat); + + wl_resource_for_each(resource, pepper_keyboard_get_resource_list(keyboard_info)) { + if (wl_resource_get_client(resource) == client) + { + wl_keyboard_send_key(resource, wl_display_get_serial(pepper_keyrouter->display), time, key, state); + PEPPER_TRACE("[%s] key : %d, state : %d, time : %d\n", __FUNCTION__, key, state, time); + } + } +} + +PEPPER_API void +pepper_keyrouter_key_process(pepper_keyrouter_t *pepper_keyrouter, + unsigned int key, unsigned int state, unsigned int time) +{ + pepper_list_t delivery_list; + pepper_list_t *seat_list; + keyrouter_key_info_t *info; + int count = 0; + pepper_seat_t *seat; + + pepper_list_init(&delivery_list); + count = keyrouter_key_process(pepper_keyrouter->keyrouter, key, state, &delivery_list); + + if (count > 0) { + pepper_list_for_each(info, &delivery_list, link) { + 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 { + seat_list = (pepper_list_t *)pepper_compositor_get_seat_list(pepper_keyrouter->compositor); + if (!pepper_list_empty(seat_list)) { + pepper_list_for_each(seat, seat_list, link) { + _pepper_keyrouter_key_send(pepper_keyrouter, seat, (struct wl_client *)info->data, key, state, time); + } + } + } + } + } +} + static void _pepper_keyrouter_remove_client_from_list(pepper_keyrouter_t *pepper_keyrouter, struct wl_client *client) { diff --git a/src/lib/keyrouter/pepper-keyrouter.h b/src/lib/keyrouter/pepper-keyrouter.h index 2c97193..2804b10 100644 --- a/src/lib/keyrouter/pepper-keyrouter.h +++ b/src/lib/keyrouter/pepper-keyrouter.h @@ -27,3 +27,6 @@ typedef struct pepper_keyrouter pepper_keyrouter_t; PEPPER_API pepper_keyrouter_t *pepper_keyrouter_create(pepper_compositor_t *compositor); 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_key_process(pepper_keyrouter_t *pepper_keyrouter, unsigned int key, unsigned int state, unsigned int time); -- 2.7.4