Add keygrab/ungrab protocols using list 92/45392/7
authorjhyuni.kang <jhyuni.kang@samsung.com>
Wed, 5 Aug 2015 12:26:55 +0000 (21:26 +0900)
committerJengHyun Kang <jhyuni.kang@samsung.com>
Tue, 8 Sep 2015 12:35:42 +0000 (21:35 +0900)
Change-Id: I6076ff49946ca5b1f4fc14010c15e3a4995776da

src/e_mod_main_wl.c
src/e_mod_main_wl.h

index 3ee5a91..cf27174 100644 (file)
@@ -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)
 {
index 19f23f8..4eb0863 100644 (file)
@@ -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);