discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=57f62675cc07e7040cc8a96b7e76a2beb40659e2

commit 57f62675cc07e7040cc8a96b7e76a2beb40659e2
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Thu Mar 10 15:18:47 2016 -0500

    make wayland client keyboard focus list pruning more robust
    
    this should handle all possible cases where focused keyboard resources
    need to be removed from the global list
---
 src/bin/e_comp_wl.c | 49 +++++++++++++++++++++++++++++++------------------
 1 file changed, 31 insertions(+), 18 deletions(-)

diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c
index f17a2e0..7098b43 100644
--- a/src/bin/e_comp_wl.c
+++ b/src/bin/e_comp_wl.c
@@ -515,40 +515,52 @@ _e_comp_wl_evas_cb_focus_in(void *data, Evas *evas 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
-_e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, void *event EINA_UNUSED)
+_e_comp_wl_keyboard_leave(E_Client *ec)
 {
-   E_Client *ec = data;
    struct wl_resource *res;
+   struct wl_client *wc;
+   Eina_List *l, *ll;
    uint32_t serial, *k;
    double t;
 
-   E_FREE_FUNC(ec->comp_data->on_focus_timer, ecore_timer_del);
-
-   /* lower client priority */
-   if (!e_object_is_del(data))
-     _e_comp_wl_client_priority_normal(ec);
-
-   if (!ec->comp_data->surface) return;
-
    if (!eina_list_count(e_comp_wl->kbd.resources)) return;
+   if (!ec->comp_data) return;
+   if (!ec->comp_data->surface) return;
 
-   /* send keyboard_leave to all keyboard resources */
-   if (!e_object_is_del(data))
+   wc = wl_resource_get_client(ec->comp_data->surface);
+   if (!e_object_is_del(E_OBJECT(ec)))
      {
         serial = wl_display_next_serial(e_comp_wl->wl.disp);
         t = ecore_time_unix_get();
      }
-   EINA_LIST_FREE(e_comp_wl->kbd.focused, res)
+   EINA_LIST_FOREACH_SAFE(e_comp_wl->kbd.focused, l, ll, res)
      {
-        if (e_object_is_del(data)) continue;
-        wl_array_for_each(k, &e_comp_wl->kbd.keys)
-          wl_keyboard_send_key(res, serial, t,
-                               *k, WL_KEYBOARD_KEY_STATE_RELEASED);
-        wl_keyboard_send_leave(res, serial, ec->comp_data->surface);
+        if (wl_resource_get_client(res) != wc) continue;
+        if (!e_object_is_del(E_OBJECT(ec)))
+          {
+             wl_array_for_each(k, &e_comp_wl->kbd.keys)
+               wl_keyboard_send_key(res, serial, t,
+                                    *k, WL_KEYBOARD_KEY_STATE_RELEASED);
+             wl_keyboard_send_leave(res, serial, ec->comp_data->surface);
+          }
+        e_comp_wl->kbd.focused = eina_list_remove_list(e_comp_wl->kbd.focused, 
l);
      }
 }
 
 static void
+_e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Client *ec = data;
+
+   E_FREE_FUNC(ec->comp_data->on_focus_timer, ecore_timer_del);
+
+   /* lower client priority */
+   if (!e_object_is_del(data))
+     _e_comp_wl_client_priority_normal(ec);
+   _e_comp_wl_keyboard_leave(ec);
+}
+
+static void
 _e_comp_wl_evas_cb_restack(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    E_Client *sec, *ec = data;
@@ -2140,6 +2152,7 @@ _e_comp_wl_client_cb_del(void *data EINA_UNUSED, E_Client 
*ec)
         ec->parent->lock_close = EINA_FALSE;
         ec->parent->modal = NULL;
      }
+   _e_comp_wl_keyboard_leave(ec);
 
    wl_signal_emit(&ec->comp_data->destroy_signal, &ec->comp_data->surface);
 

-- 


Reply via email to