Send keys through compositor 05/66705/2
authorJengHyun Kang <jhyuni.kang@samsung.com>
Wed, 20 Apr 2016 11:12:39 +0000 (20:12 +0900)
committerJengHyun Kang <jhyuni.kang@samsung.com>
Wed, 20 Apr 2016 11:20:17 +0000 (20:20 +0900)
Change-Id: I3d2944f590a5faba1892c84cdf61bfac4d619748

src/e_mod_keyrouter_events.c
src/e_mod_keyrouter_list.c
src/e_mod_main_wl.h

index 8490be623ccb0ab0306360e9b7e4b5fefe801731..8f7e0ba53225ccd4a79520e706322d47b949986a 100644 (file)
@@ -5,7 +5,7 @@
 static Eina_Bool _e_keyrouter_send_key_events(int type, Ecore_Event_Key *ev);
 static Eina_Bool _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev);
 static Eina_Bool _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev);
-static Eina_Bool _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev);
+static Eina_Bool _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, Eina_Bool focused, unsigned int mode);
 
 static Eina_Bool _e_keyrouter_send_key_events_register(int type, Ecore_Event_Key *ev);
 
@@ -42,6 +42,12 @@ e_keyrouter_process_key_event(void *event, int type)
 
    KLDBG("[%s] keyname: %s, key: %s, keycode: %d\n", (type == ECORE_EVENT_KEY_DOWN) ? "KEY_PRESS" : "KEY_RELEASE", ev->keyname, ev->key, ev->keycode);
 
+   if (ev->data)
+     {
+        KLDBG("data is exist send to compositor: %p\n", ev->data);
+        goto finish;
+     }
+
    if (krt->max_tizen_hwkeys < ev->keycode)
      {
         KLWRN("The key(%d) is too larger to process keyrouting: Invalid keycode\n", ev->keycode);
@@ -96,9 +102,10 @@ _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev)
      {
         if (key_node_data)
           {
-             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev);
-             KLINF("Release Pair : Key %s(%s:%d) ===> E_Client (%p) WL_Client (%p) (pid: %d)\n",
-                      ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
+             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
+                                               key_node_data->focused, TIZEN_KEYROUTER_MODE_PRESSED);
+             KLINF("Release Pair : Key %s(%s:%d)(Focus: %d) ===> E_Client (%p) WL_Client (%p) (pid: %d)\n",
+                      ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode, key_node_data->focused,
                       key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
              E_FREE(key_node_data);
              if (res == EINA_FALSE) ret = EINA_FALSE;
@@ -115,7 +122,7 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
    unsigned int keycode = ev->keycode;
    struct wl_resource *surface_focus = NULL;
    E_Client *ec_focus = NULL;
-   Eina_Bool res = EINA_TRUE, ret = EINA_TRUE;
+   Eina_Bool res = EINA_TRUE;
 
    E_Keyrouter_Key_List_NodePtr key_node_data;
    Eina_List *l = NULL;
@@ -124,7 +131,8 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
      {
         if (key_node_data)
           {
-             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev);
+             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
+                                               key_node_data->focused, TIZEN_KEYROUTER_MODE_EXCLUSIVE);
              KLINF("EXCLUSIVE Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
                       ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                       key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -137,7 +145,8 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
      {
         if (key_node_data)
           {
-             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev);
+             res = _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev,
+                                               key_node_data->focused, TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE);
              KLINF("OVERRIDABLE_EXCLUSIVE Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
                      ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                      key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -158,7 +167,8 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
                {
                   if ((EINA_FALSE == krt->isWindowStackChanged) && (surface_focus == key_node_data->surface))
                     {
-                       res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev);
+                       res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, key_node_data->focused,
+                                                         TIZEN_KEYROUTER_MODE_TOPMOST);
                        KLINF("TOPMOST (TOP_POSITION) Mode : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
                                 ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                                 key_node_data->surface, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -169,7 +179,8 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
 
                   if (_e_keyrouter_check_top_visible_window(ec_focus, keycode))
                     {
-                       res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev);
+                       res = _e_keyrouter_send_key_event(type, key_node_data->surface, NULL, ev, key_node_data->focused,
+                                                         TIZEN_KEYROUTER_MODE_TOPMOST);
                        KLINF("TOPMOST (TOP_POSITION) Mode : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
                              ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                              key_node_data->surface, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -183,7 +194,7 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
 
    if (krt->HardKeys[keycode].shared_ptr)
      {
-        res = _e_keyrouter_send_key_event(type, surface_focus, NULL, ev);
+        res = _e_keyrouter_send_key_event(type, surface_focus, NULL, ev, EINA_TRUE, TIZEN_KEYROUTER_MODE_SHARED);
         KLINF("SHARED [Focus client] : Key %s (%s:%d) ===> Surface (%p) (pid: %d)\n",
                  ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up "), ev->keyname, ev->keycode,
                  surface_focus, e_keyrouter_util_get_pid(NULL, surface_focus));
@@ -196,7 +207,9 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
                     {
                        if (key_node_data->surface != surface_focus)
                          {
-                            _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev);
+                            _e_keyrouter_send_key_event(type, key_node_data->surface,
+                                                        key_node_data->wc, ev, key_node_data->focused,
+                                                        TIZEN_KEYROUTER_MODE_SHARED);
                             KLINF("SHARED Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
                                      ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                                      key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -207,7 +220,9 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
                        if (((surface_focus) && (key_node_data->wc != wl_resource_get_client(surface_focus))) ||
                            (!surface_focus))
                          {
-                            _e_keyrouter_send_key_event(type, key_node_data->surface, key_node_data->wc, ev);
+                            _e_keyrouter_send_key_event(type, key_node_data->surface,
+                                                        key_node_data->wc, ev, key_node_data->focused,
+                                                        TIZEN_KEYROUTER_MODE_SHARED);
                             KLINF("SHARED Mode : Key %s(%s:%d) ===> Surface (%p) WL_Client (%p) (pid: %d)\n",
                                      ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
                                      key_node_data->surface, key_node_data->wc, e_keyrouter_util_get_pid(key_node_data->wc, key_node_data->surface));
@@ -239,7 +254,9 @@ _e_keyrouter_send_key_events_register(int type, Ecore_Event_Key *ev)
         return EINA_FALSE;
      }
 
-   res = _e_keyrouter_send_key_event(type, krt->HardKeys[keycode].registered_ptr->surface, NULL, ev);
+   res = _e_keyrouter_send_key_event(type, krt->HardKeys[keycode].registered_ptr->surface,
+                                     NULL, ev, krt->HardKeys[keycode].registered_ptr->focused,
+                                     TIZEN_KEYROUTER_MODE_REGISTERED);
    KLINF("REGISTER Mode : Key %s(%s:%d) ===> Surface (%p) (pid: %d)\n",
             ((ECORE_EVENT_KEY_DOWN == type) ? "Down" : "Up"), ev->keyname, ev->keycode,
             krt->HardKeys[keycode].registered_ptr->surface, e_keyrouter_util_get_pid(NULL, krt->HardKeys[keycode].registered_ptr->surface));
@@ -291,49 +308,15 @@ _e_keyrouter_check_top_visible_window(E_Client *ec_focus, int arr_idx)
    return EINA_FALSE;
 }
 
-static void
-_e_keyrouter_send_event_device(struct wl_client *wc, uint32_t timestamp, const char *dev_name, uint32_t serial)
-{
-   const char *last_dev_name;
-   E_Comp_Wl_Input_Device *input_dev;
-   struct wl_resource *dev_res;
-   Eina_List *l, *ll;
-
-   last_dev_name = e_comp_wl->input_device_manager.last_device_name;
-   if (!last_dev_name || (last_dev_name && (strcmp(last_dev_name, dev_name))))
-     {
-        if (last_dev_name)
-          eina_stringshare_del(last_dev_name);
-        last_dev_name = eina_stringshare_add(dev_name);
-        e_comp_wl->input_device_manager.last_device_name = last_dev_name;
-
-        EINA_LIST_FOREACH(e_comp_wl->input_device_manager.device_list, l, input_dev)
-          {
-             if ((strcmp(input_dev->identifier, dev_name)) ||
-                 (input_dev->capability != ECORE_DEVICE_KEYBOARD))
-               continue;
-             e_comp_wl->input_device_manager.last_device_cap = input_dev->capability;
-             EINA_LIST_FOREACH(input_dev->resources, ll, dev_res)
-               {
-                  if (wl_resource_get_client(dev_res) != wc) continue;
-                  tizen_input_device_send_event_device(dev_res, serial, input_dev->identifier, timestamp);
-               }
-          }
-     }
-}
-
 /* Function for sending key event to wl_client(s) */
 static Eina_Bool
-_e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev)
+_e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_client *wc, Ecore_Event_Key *ev, Eina_Bool focused, unsigned int mode)
 {
    struct wl_client *wc_send, *wc_focus = NULL;
-   struct wl_resource *res, *surface_focus;
-   const char *dev_name;
+   struct wl_resource *surface_focus;
    E_Client *ec_focus;
-
-   uint evtype;
-   uint serial;
-   Eina_List *l;
+   Ecore_Event_Key *ev_cpy;
+   int len;
 
    ec_focus = e_client_focused_get();
    surface_focus = e_keyrouter_util_get_surface_from_eclient(ec_focus);
@@ -356,39 +339,37 @@ _e_keyrouter_send_key_event(int type, struct wl_resource *surface, struct wl_cli
 
    if (ECORE_EVENT_KEY_DOWN == type)
      {
-        e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED);
-        evtype = WL_KEYBOARD_KEY_STATE_PRESSED;
+        if (mode == TIZEN_KEYROUTER_MODE_EXCLUSIVE ||
+            mode == TIZEN_KEYROUTER_MODE_OVERRIDABLE_EXCLUSIVE ||
+            mode == TIZEN_KEYROUTER_MODE_TOPMOST ||
+            mode == TIZEN_KEYROUTER_MODE_REGISTERED)
+          {
+             focused = EINA_TRUE;
+             ev->data = wc_send;
+             KLDBG("Send only one key! wc_send: %p(%d)\n", wc_send, e_keyrouter_util_get_pid(wc_send, NULL));
+          }
+        e_keyrouter_prepend_to_keylist(surface, wc, ev->keycode, TIZEN_KEYROUTER_MODE_PRESSED, focused);
      }
    else
      {
-        evtype = WL_KEYBOARD_KEY_STATE_RELEASED;
+        if (focused == EINA_TRUE) ev->data = wc_send;
      }
 
-   if (wc_send == wc_focus)
-     {
-        KLINF("Focused client: Send this key to compositor\n");
-        return EINA_FALSE;
-     }
+   if (focused == EINA_TRUE) return EINA_FALSE;
 
-   serial = wl_display_next_serial(e_comp_wl->wl.disp);
-   EINA_LIST_FOREACH(e_comp_wl->kbd.resources, l, res)
-     {
-        if (res)
-          {
-             if (wl_resource_get_client(res) != wc_send) continue;
+   KLDBG("Generate new key event! wc_send: %p(%d)\n", wc_send, e_keyrouter_util_get_pid(wc_send, NULL));
+
+   ev_cpy = (Ecore_Event_Key *)calloc(1, sizeof(ev));
+   len = sizeof(Ecore_Event_Key) + strlen(ev->key) + strlen(ev->keyname) + ((ev->compose) ? strlen(ev->compose) : 0) + 3;
+   ev_cpy = calloc(1, len);
+   memcpy(ev_cpy, ev, len);
+   ev_cpy->data = wc_send;
+
+   if (ECORE_EVENT_KEY_DOWN == type)
+     ecore_event_add(ECORE_EVENT_KEY_DOWN, ev_cpy, NULL, NULL);
+   else
+     ecore_event_add(ECORE_EVENT_KEY_UP, ev_cpy, NULL, NULL);
 
-             if (ev->dev)
-               {
-                  dev_name = ecore_device_identifier_get(ev->dev);
-                  if (dev_name)
-                    _e_keyrouter_send_event_device(wc_send, ev->timestamp, dev_name, serial);
-               }
-             KLDBG("[time: %d] res: %p, serial: %d send a key(%d):%d to wl_client:%p\n", ev->timestamp, res, serial, (ev->keycode)-8, evtype, wc_send);
-             TRACE_INPUT_BEGIN(_e_keyrouter_send_key_event);
-             wl_keyboard_send_key(res, serial, ev->timestamp, ev->keycode-8, evtype);
-             TRACE_INPUT_END();
-          }
-     }
    return EINA_TRUE;
 }
 
index 684c4e414fb3349487c16e9e99499dd816affe46..6f977f2aa1dd61814c4c0bee6002b20ee71579fa 100644 (file)
@@ -47,7 +47,8 @@ e_keyrouter_set_keygrab_in_list(struct wl_resource *surface, struct wl_client *c
         res = e_keyrouter_prepend_to_keylist(surface,
                                         surface ? NULL : client,
                                         key,
-                                        mode);
+                                        mode,
+                                        EINA_FALSE);
      }
 
    EINA_SAFETY_ON_FALSE_RETURN_VAL(res == TIZEN_KEYROUTER_ERROR_NONE, res);
@@ -144,7 +145,7 @@ _e_keyrouter_find_key_in_list(struct wl_resource *surface, struct wl_client *wc,
 
 /* Function for prepending a new key grab information in the keyrouting list */
 int
-e_keyrouter_prepend_to_keylist(struct wl_resource *surface, struct wl_client *wc, uint32_t key, uint32_t mode)
+e_keyrouter_prepend_to_keylist(struct wl_resource *surface, struct wl_client *wc, uint32_t key, uint32_t mode, Eina_Bool focused)
 {
    int res = TIZEN_KEYROUTER_ERROR_NONE;
 
@@ -161,6 +162,7 @@ e_keyrouter_prepend_to_keylist(struct wl_resource *surface, struct wl_client *wc
 
    new_keyptr->surface = surface;
    new_keyptr->wc = wc;
+   new_keyptr->focused = focused;
 
    switch(mode)
      {
@@ -437,6 +439,7 @@ _e_keyrouter_build_register_list(void)
                        node = E_NEW(E_Keyrouter_Key_List_Node, 1);
                        node->surface = surface;
                        node->wc = NULL;
+                       node->focused = EINA_FALSE;
                        krt->HardKeys[*ddata].registered_ptr = node;
 
                        KLDBG("%d key's register surface is %p\n", *ddata, surface);
index 91146da2a53db5809a0d9268d7fc8ffa49fcfe16..04d0d13347eaec0c7b30d4686c0a8daf962d35b5 100644 (file)
@@ -80,6 +80,7 @@ struct _E_Keyrouter_Key_List_Node
 {
    struct wl_resource *surface;
    struct wl_client *wc;
+   Eina_Bool focused;
 };
 
 struct _E_Keyrouter_Tizen_HWKey
@@ -143,7 +144,7 @@ E_API int   e_modapi_shutdown(E_Module *m);
 E_API int   e_modapi_save(E_Module *m);
 
 int e_keyrouter_set_keygrab_in_list(struct wl_resource *surface, struct wl_client *client, uint32_t key, uint32_t mode);
-int e_keyrouter_prepend_to_keylist(struct wl_resource *surface, struct wl_client *wc, uint32_t key, uint32_t mode);
+int e_keyrouter_prepend_to_keylist(struct wl_resource *surface, struct wl_client *wc, uint32_t key, uint32_t mode, Eina_Bool focused);
 void e_keyrouter_find_and_remove_client_from_list(struct wl_resource *surface, struct wl_client *wc, uint32_t key, uint32_t mode);
 void e_keyrouter_remove_client_from_list(struct wl_resource *surface, struct wl_client *wc);
 int e_keyrouter_find_key_in_list(struct wl_resource *surface, struct wl_client *wc, uint32_t key);