From 9cf526d1d2f6d9c326224d89e7d422d78b22f702 Mon Sep 17 00:00:00 2001 From: Sung-Jin Park Date: Tue, 23 Apr 2019 20:17:00 +0900 Subject: [PATCH] keyrouter core: add keyrouter_set_focus/top_client APIs Change-Id: I92449dc34a89bf91382f7b2de40dd1269e9c3784 Signed-off-by: Sung-Jin Park --- src/lib/keyrouter/keyrouter-internal.h | 3 +++ src/lib/keyrouter/keyrouter.c | 25 +++++++++++++++++++++++++ src/lib/keyrouter/keyrouter.h | 3 +++ src/lib/keyrouter/pepper-keyrouter.c | 21 +++++++++++++++++---- 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/src/lib/keyrouter/keyrouter-internal.h b/src/lib/keyrouter/keyrouter-internal.h index bda57c0..379f0e3 100644 --- a/src/lib/keyrouter/keyrouter-internal.h +++ b/src/lib/keyrouter/keyrouter-internal.h @@ -34,6 +34,9 @@ typedef struct keyrouter_grabbed keyrouter_grabbed_t; struct keyrouter { pepper_compositor_t *compositor; keyrouter_grabbed_t *hard_keys; + + void *focus_client; + void *top_client; }; struct keyrouter_grabbed { diff --git a/src/lib/keyrouter/keyrouter.c b/src/lib/keyrouter/keyrouter.c index 397b836..15cc3bb 100644 --- a/src/lib/keyrouter/keyrouter.c +++ b/src/lib/keyrouter/keyrouter.c @@ -92,6 +92,31 @@ _keyrouter_grabbed_check(keyrouter_t *keyrouter, return res; } +PEPPER_API void +keyrouter_set_focus_client(keyrouter_t *keyrouter, void *focus_client) +{ + PEPPER_CHECK(keyrouter, return, "keyrouter is invalid.\n"); + keyrouter->focus_client = focus_client; + + if (focus_client) + PEPPER_TRACE("[%s] focus client has been set. (focus_client=0x%p)\n", __FUNCTION__, focus_client); + else + PEPPER_TRACE("[%s] focus client has been set to NULL.\n", __FUNCTION__); +} + +PEPPER_API void +keyrouter_set_top_client(keyrouter_t *keyrouter, void *top_client) +{ + PEPPER_CHECK(keyrouter, return, "keyrouter is invalid.\n"); + + keyrouter->top_client = top_client; + + if (top_client) + PEPPER_TRACE("[%s] top client has been set. (top_client=0x%p)\n", __FUNCTION__, top_client); + else + PEPPER_TRACE("[%s] top client has been set to NULL.\n", __FUNCTION__); +} + PEPPER_API int keyrouter_key_process(keyrouter_t *keyrouter, int keycode, int pressed, pepper_list_t *delivery_list) diff --git a/src/lib/keyrouter/keyrouter.h b/src/lib/keyrouter/keyrouter.h index 26cd439..51ba2a8 100644 --- a/src/lib/keyrouter/keyrouter.h +++ b/src/lib/keyrouter/keyrouter.h @@ -46,6 +46,9 @@ PEPPER_API int keyrouter_grab_key(keyrouter_t *keyrouter, int type, int keycode, PEPPER_API void keyrouter_ungrab_key(keyrouter_t *keyrouter, int type, int keycode, void *data); PEPPER_API int keyrouter_key_process(keyrouter_t *keyrouter, int keycode, int pressed, pepper_list_t *delivery_list); +PEPPER_API void keyrouter_set_focus_client(keyrouter_t *keyrouter, void *focus_client); +PEPPER_API void keyrouter_set_top_client(keyrouter_t *keyrouter, void *top_client); + #ifdef __cplusplus } #endif diff --git a/src/lib/keyrouter/pepper-keyrouter.c b/src/lib/keyrouter/pepper-keyrouter.c index 8b17d53..4ad9d69 100644 --- a/src/lib/keyrouter/pepper-keyrouter.c +++ b/src/lib/keyrouter/pepper-keyrouter.c @@ -62,6 +62,21 @@ struct ungrab_list_data { int err; }; +static struct wl_client * +_pepper_keyrouter_get_client_from_view(pepper_view_t *view) +{ + pepper_surface_t *surface = pepper_view_get_surface(view); + PEPPER_CHECK(surface, return NULL, "No surfce available for the given view.\n"); + + struct wl_resource *resource = pepper_surface_get_resource(surface); + + if (resource) + return wl_resource_get_client(resource); + + return NULL; +} + + PEPPER_API void pepper_keyrouter_set_seat(pepper_keyrouter_t *pepper_keyrouter, pepper_seat_t *seat) { @@ -81,20 +96,18 @@ pepper_keyrouter_set_focus_view(pepper_keyrouter_t *pk, pepper_view_t *focus_vie { PEPPER_CHECK(pk, return, "pepper keyrouter is invalid.\n"); PEPPER_CHECK(pk->keyboard, return, "No keyboard is available for pepper keyrouter.\n"); - PEPPER_CHECK(focus_view, return, "Given focus_view is invalid.\n"); pk->focus_view = focus_view; - PEPPER_TRACE("[%s] focus_view has been set. (focus=0x%p)\n", __FUNCTION__, focus_view); + keyrouter_set_focus_client(pk->keyrouter, _pepper_keyrouter_get_client_from_view(focus_view)); } PEPPER_API void pepper_keyrouter_set_top_view(pepper_keyrouter_t *pk, pepper_view_t *top_view) { PEPPER_CHECK(pk, return, "pepper keyrouter is invalid.\n"); - PEPPER_CHECK(top_view, return, "Given top_view is invalid.\n"); pk->top_view = top_view; - PEPPER_TRACE("[%s] top_view has been set. (top=0x%p)\n", __FUNCTION__, top_view); + keyrouter_set_top_client(pk->keyrouter, _pepper_keyrouter_get_client_from_view(top_view)); } static void -- 2.7.4