Add a destroy listener if keyrouter a send key to focus 24/67624/1
authorJengHyun Kang <jhyuni.kang@samsung.com>
Wed, 27 Apr 2016 13:04:26 +0000 (22:04 +0900)
committerJengHyun Kang <jhyuni.kang@samsung.com>
Wed, 27 Apr 2016 13:04:28 +0000 (22:04 +0900)
 - Do not deliver release key events if client is destroyed

Change-Id: I29e9bfa0a4694976d085089ac61d0408d930ec59

src/e_mod_keyrouter_events.c
src/e_mod_keyrouter_list.c

index 800376cfccd1db4e44ee609d78e4c4865dcb714c..73e7e1f87f287443c3d2dbb4dd545556cc9e9fae 100644 (file)
@@ -198,6 +198,7 @@ _e_keyrouter_send_key_events_press(int type, Ecore_Event_Key *ev)
         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));
+        e_keyrouter_add_surface_destroy_listener(surface_focus);
 
         EINA_LIST_FOREACH(krt->HardKeys[keycode].shared_ptr, l, key_node_data)
           {
index 6f977f2aa1dd61814c4c0bee6002b20ee71579fa..fe688907b1fec0fbc8f7e4ac02c220580e379ccf 100644 (file)
@@ -341,6 +341,26 @@ e_keyrouter_remove_client_from_list(struct wl_resource *surface, struct wl_clien
                   KLINF("Remove a Shared Mode Grabbed key(%d) by wc(%p)\n", i, wc);
                }
           }
+        EINA_LIST_FOREACH_SAFE(krt->HardKeys[i].press_ptr, l, l_next, key_node_data)
+          {
+             if (!key_node_data) continue;
+
+             if (surface)
+               {
+                  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);
+                       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);
+                  KLINF("Remove a Pressed key(%d) by wc(%p)\n", i, wc);
+               }
+          }
      }
 
    _e_keyrouter_remove_registered_surface_in_list(surface);