Do not remove pressed list although the client is removed 86/85986/1 accepted/tizen/common/20160830.150300 accepted/tizen/ivi/20160830.235657 accepted/tizen/mobile/20160830.235446 accepted/tizen/tv/20160830.235528 accepted/tizen/wearable/20160830.235613 submit/tizen/20160830.063644
authorJengHyun Kang <jhyuni.kang@samsung.com>
Tue, 30 Aug 2016 04:59:28 +0000 (13:59 +0900)
committerJengHyun Kang <jhyuni.kang@samsung.com>
Tue, 30 Aug 2016 04:59:28 +0000 (13:59 +0900)
Change-Id: I464d85e218d5efc18564c460e3882134c26ad3dc

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

index 103cc67..e84dc72 100644 (file)
@@ -138,16 +138,16 @@ _e_keyrouter_send_key_events_release(int type, Ecore_Event_Key *ev)
    /* Deliver release  clean up pressed key list */
    EINA_LIST_FREE(krt->HardKeys[ev->keycode].press_ptr, key_node_data)
      {
-        if (key_node_data)
+        if (!key_node_data->deleted)
           {
              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;
           }
+        E_FREE(key_node_data);
+        if (res == EINA_FALSE) ret = EINA_FALSE;
      }
    krt->HardKeys[ev->keycode].press_ptr = NULL;
    krt->isRegisterDelivery = EINA_FALSE;
index 2ded4ee..ceae655 100644 (file)
@@ -165,6 +165,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;
+   new_keyptr->deleted = EINA_FALSE;
 
    switch(mode)
      {
@@ -353,15 +354,13 @@ e_keyrouter_remove_client_from_list(struct wl_resource *surface, struct wl_clien
                {
                   if (surface == key_node_data->surface)
                     {
-                       krt->HardKeys[i].press_ptr = eina_list_remove_list(krt->HardKeys[i].press_ptr, l);
-                       E_FREE(key_node_data);
+                       key_node_data->deleted = EINA_TRUE;
                        KLINF("Remove a Pressed  key(%d) by surface(%p)\n", i, surface);
                     }
                }
              else if ((wc == key_node_data->wc))
                {
-                  krt->HardKeys[i].press_ptr = eina_list_remove_list(krt->HardKeys[i].press_ptr, l);
-                  E_FREE(key_node_data);
+                  key_node_data->deleted = EINA_TRUE;
                   KLINF("Remove a Pressed key(%d) by wc(%p)\n", i, wc);
                }
           }
@@ -524,6 +523,7 @@ _e_keyrouter_build_register_list(void)
                        node->surface = surface;
                        node->wc = NULL;
                        node->focused = EINA_FALSE;
+                       node->deleted = EINA_FALSE;
                        krt->HardKeys[*ddata].registered_ptr = node;
 
                        KLDBG("%d key's register surface is %p\n", *ddata, surface);
index 0b65941..45c9ebe 100644 (file)
@@ -85,6 +85,7 @@ struct _E_Keyrouter_Key_List_Node
    struct wl_resource *surface;
    struct wl_client *wc;
    Eina_Bool focused;
+   Eina_Bool deleted;
 };
 
 struct _E_Keyrouter_Tizen_HWKey