From 97184fb573c3d21cfdd46712e313c6f3c2e45a50 Mon Sep 17 00:00:00 2001 From: "jhyuni.kang" Date: Wed, 5 Aug 2015 21:26:55 +0900 Subject: [PATCH] Add keygrab/ungrab protocols using list Change-Id: I6076ff49946ca5b1f4fc14010c15e3a4995776da --- src/e_mod_main_wl.c | 156 +++++++++++++++++++++++++++++++++++++++++++--------- src/e_mod_main_wl.h | 16 +++++- 2 files changed, 142 insertions(+), 30 deletions(-) diff --git a/src/e_mod_main_wl.c b/src/e_mod_main_wl.c index 3ee5a91..cf27174 100644 --- a/src/e_mod_main_wl.c +++ b/src/e_mod_main_wl.c @@ -17,21 +17,20 @@ static void _e_keyrouter_send_key_event(int type, E_Client *ec, struct wl_client static Eina_Bool _e_keyrouter_is_key_grabbed(int key); static Eina_Bool _e_keyrouter_check_top_visible_window(E_Comp *c, E_Client *ec_focus, int arr_idx); static void _e_keyrouter_query_tizen_key_table(void); +static int _e_keyrouter_wl_array_length(const struct wl_array *array); + static Eina_Bool _e_keyrouter_client_cb_stack(void *data, int type, void *event); static Eina_Bool _e_keyrouter_client_cb_remove(void *data, int type, void *event); static void _e_keyrouter_wl_client_cb_destroy(struct wl_listener *l, void *data); +static int _e_keyrouter_keygrab_set(struct wl_client *client, struct wl_resource *surface, uint32_t key, uint32_t mode); +static int _e_keyrouter_keygrab_unset(struct wl_client *client, struct wl_resource *surface, uint32_t key); -/* tizen_keyrouter_set_keygrab request handler */ -static void -_e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key, uint32_t mode) + +static int +_e_keyrouter_keygrab_set(struct wl_client *client, struct wl_resource *surface, uint32_t key, uint32_t mode) { - (void) client; - (void) resource; - (void) surface; - (void) key; - (void) mode; int res=0; if (!surface) @@ -41,7 +40,7 @@ _e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resour { KLDBG("Invalid surface for TOPMOST grab mode ! (key=%d, mode=%d)\n", key, mode); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE); + return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE; } else { @@ -53,7 +52,7 @@ _e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resour if (0 > key || MAX_HWKEYS < key ) { KLDBG("Invalid range of key ! (keycode:%d)\n", key); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_KEY); + return TIZEN_KEYROUTER_ERROR_INVALID_KEY; } /* Check whether the key can be grabbed or not ! @@ -61,14 +60,14 @@ _e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resour if (0 == krt->HardKeys[key].keycode) { KLDBG("Invalid key ! Disabled to grab ! (keycode:%d)\n", key); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_KEY); + return TIZEN_KEYROUTER_ERROR_INVALID_KEY; } /* Check whether the mode is valid or not */ if (TIZEN_KEYROUTER_MODE_NONE > mode || TIZEN_KEYROUTER_MODE_EXCLUSIVE < mode) { KLDBG("Invalid range of mode ! (mode:%d)\n", mode); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, TIZEN_KEYROUTER_ERROR_INVALID_MODE); + return TIZEN_KEYROUTER_ERROR_INVALID_MODE; } /* Check whether the request key can be grabbed or not */ @@ -76,18 +75,12 @@ _e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resour KLDBG("Result of grab check for a key (key:%d, mode:%d, res:%d)\n", key, mode, res); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, mode, res); + return res; } -/* tizen_keyrouter unset_keygrab request handler */ -static void -_e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key) +static int +_e_keyrouter_keygrab_unset(struct wl_client *client, struct wl_resource *surface, uint32_t key) { - (void) client; - (void) resource; - (void) surface; - (void) key; - E_Pixmap *ep = NULL; E_Client *ec = NULL; @@ -105,19 +98,19 @@ _e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *reso /* SHARED grab */ e_keyrouter_find_and_remove_client_from_list(NULL, client, key, TIZEN_KEYROUTER_MODE_SHARED); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); + return TIZEN_KEYROUTER_ERROR_NONE; } if (!surface || !(ep = wl_resource_get_user_data(surface))) { KLDBG("Surface or E_Pixman from the surface is invalid ! Return error !\n"); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE); + return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE; } if (!(ec = e_pixmap_client_get(ep))) { KLDBG("E_Client pointer from E_Pixman from surface is invalid ! Return error !\n"); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_INVALID_SURFACE); + return TIZEN_KEYROUTER_ERROR_INVALID_SURFACE; } /* EXCLUSIVE grab */ @@ -132,7 +125,33 @@ _e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *reso /* SHARED grab */ e_keyrouter_find_and_remove_client_from_list(ec, NULL, key, TIZEN_KEYROUTER_MODE_SHARED); - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); + return TIZEN_KEYROUTER_ERROR_NONE; +} + +/* tizen_keyrouter_set_keygrab request handler */ +static void +_e_keyrouter_cb_keygrab_set(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key, uint32_t mode) +{ + int res = 0; + + KLDBG("Key grab request (key:%d, mode:%d)\n", key, mode); + + res = _e_keyrouter_keygrab_set(client, surface, key, mode); + + tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, res); +} + +/* tizen_keyrouter unset_keygrab request handler */ +static void +_e_keyrouter_cb_keygrab_unset(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, uint32_t key) +{ + int res = 0; + + KLDBG("Key ungrab request (key:%d)\n", key); + + res = _e_keyrouter_keygrab_unset(client, surface, key); + + tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, res); } /* tizen_keyrouter get_keygrab_status request handler */ @@ -166,9 +185,76 @@ _e_keyrouter_cb_get_keygrab_status(struct wl_client *client, struct wl_resource /* TODO : Need to check key grab status for the requesting wl client */ - WL_KEYGRAB_NOTIFY_WITH_VAL(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); + tizen_keyrouter_send_keygrab_notify(resource, surface, key, TIZEN_KEYROUTER_MODE_NONE, TIZEN_KEYROUTER_ERROR_NONE); +} + +static void +_e_keyrouter_cb_keygrab_set_list(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, struct wl_array *grab_list) +{ + struct wl_array grab_result_list = {0,}; + E_Keyrouter_Grab_Result *grab_result = NULL; + E_Keyrouter_Grab_Request *grab_request = NULL; + int res = TIZEN_KEYROUTER_ERROR_NONE; + + wl_array_init(&grab_result_list); + + if (0 != (_e_keyrouter_wl_array_length(grab_list) % 2)) + { + /* FIX ME: Which way is effectively to notify invalid pair to client */ + KLDBG("Invalid keycode and grab mode pair. Check arguments in a list\n"); + grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result)); + grab_result->request_data.key = 0; + grab_result->request_data.mode = 0; + grab_result->err = TIZEN_KEYROUTER_ERROR_INVALID_ARRAY; + goto send_notify; + } + + wl_array_for_each(grab_request, grab_list) + { + if (grab_request) + { + res = _e_keyrouter_keygrab_set(client, surface, grab_request->key, grab_request->mode); + KLDBG("Grab request using list [key: %d, mode: %d, res: %d]\n", grab_request->key, grab_request->mode, res); + grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result)); + grab_result->request_data.key = grab_request->key; + grab_result->request_data.mode = grab_request->mode; + grab_result->err = res; + } + } + +send_notify: + tizen_keyrouter_send_keygrab_notify_list(resource, surface, &grab_result_list); + wl_array_release(&grab_result_list); } +static void +_e_keyrouter_cb_keygrab_unset_list(struct wl_client *client, struct wl_resource *resource, struct wl_resource *surface, struct wl_array *ungrab_list) +{ + struct wl_array grab_result_list = {0,}; + E_Keyrouter_Grab_Result *grab_result = NULL; + int *ungrab_request = NULL; + int res = TIZEN_KEYROUTER_ERROR_NONE; + + wl_array_init(&grab_result_list); + + wl_array_for_each(ungrab_request, ungrab_list) + { + if (ungrab_request) + { + res = _e_keyrouter_keygrab_unset(client, surface, *ungrab_request); + KLDBG("Ungrab request using list [key: %d, res: %d]\n", *ungrab_request, res); + grab_result = wl_array_add(&grab_result_list, sizeof(E_Keyrouter_Grab_Result)); + grab_result->request_data.key = *ungrab_request; + grab_result->request_data.mode = TIZEN_KEYROUTER_MODE_NONE; + grab_result->err = res; + } + } + + tizen_keyrouter_send_keygrab_notify_list(resource, surface, &grab_result_list); + wl_array_release(&grab_result_list); +} + + /* Function for registering wl_client destroy listener */ int e_keyrouter_add_client_destroy_listener(struct wl_client *client) @@ -209,7 +295,9 @@ e_keyrouter_add_client_destroy_listener(struct wl_client *client) static const struct tizen_keyrouter_interface _e_keyrouter_implementation = { _e_keyrouter_cb_keygrab_set, _e_keyrouter_cb_keygrab_unset, - _e_keyrouter_cb_get_keygrab_status + _e_keyrouter_cb_get_keygrab_status, + _e_keyrouter_cb_keygrab_set_list, + _e_keyrouter_cb_keygrab_unset_list }; /* tizen_keyrouter global object destroy function */ @@ -678,6 +766,20 @@ _e_keyrouter_query_tizen_key_table(void) fclose(fp_key_tables); } +static int +_e_keyrouter_wl_array_length(const struct wl_array *array) +{ + int *data = NULL; + int count = 0; + + wl_array_for_each(data, array) + { + if (data) count++; + } + + return count; +} + static void _e_keyrouter_deinit_handlers(void) { diff --git a/src/e_mod_main_wl.h b/src/e_mod_main_wl.h index 19f23f8..4eb0863 100644 --- a/src/e_mod_main_wl.h +++ b/src/e_mod_main_wl.h @@ -12,9 +12,6 @@ #define CHECK_NULL_VAL(val) if (!val) return val; #define KLDBG(msg, ARG...) DBG("[tizen_keyrouter][%s:%d] "msg, __FUNCTION__, __LINE__, ##ARG) -#define WL_KEYGRAB_NOTIFY_WITH_VAL(resource,surface,key,mode,err) \ - tizen_keyrouter_send_keygrab_notify(resource, surface, key, mode, err); \ - return typedef struct _E_Keyrouter E_Keyrouter; typedef struct _E_Keyrouter* E_KeyrouterPtr; @@ -22,6 +19,8 @@ typedef struct _E_Keyrouter_Key_List_Node E_Keyrouter_Key_List_Node; typedef struct _E_Keyrouter_Key_List_Node* E_Keyrouter_Key_List_NodePtr; typedef struct _E_Keyrouter_Tizen_HWKey E_Keyrouter_Tizen_HWKey; typedef struct _E_Keyrouter_Grabbed_Key E_Keyrouter_Grabbed_Key; +typedef struct _E_Keyrouter_Grab_Request E_Keyrouter_Grab_Request; +typedef struct _E_Keyrouter_Grab_Result E_Keyrouter_Grab_Result; #define TIZEN_KEYROUTER_MODE_PRESSED TIZEN_KEYROUTER_MODE_EXCLUSIVE+1 @@ -66,6 +65,17 @@ struct _E_Keyrouter int numTizenHWKeys; }; +struct _E_Keyrouter_Grab_Request { + int key; + int mode; +}; + +struct _E_Keyrouter_Grab_Result { + E_Keyrouter_Grab_Request request_data; + int err; +}; + + /* E Module */ EAPI extern E_Module_Api e_modapi; EAPI void *e_modapi_init(E_Module *m); -- 2.7.4