raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=59f3dbdd3484f26028deb1496333f133253197b7

commit 59f3dbdd3484f26028deb1496333f133253197b7
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Thu Apr 12 23:31:39 2018 +0900

    efl selection manager - fix crashes when doing selections on non-x11
    
    elm was calling x calls when on wayland here... because it didnt check
    the RUNTIME display system type for the window, relying on ifdefs
    instead.
    
    @fix
---
 src/lib/elementary/efl_selection_manager.c | 108 ++++++++++++++++++-----------
 1 file changed, 66 insertions(+), 42 deletions(-)

diff --git a/src/lib/elementary/efl_selection_manager.c 
b/src/lib/elementary/efl_selection_manager.c
index 2df317a272..5bdf7ff6ec 100644
--- a/src/lib/elementary/efl_selection_manager.c
+++ b/src/lib/elementary/efl_selection_manager.c
@@ -4675,82 +4675,106 @@ _efl_selection_manager_selection_get(Eo *obj 
EINA_UNUSED, Efl_Selection_Manager_
 }
 
 EOLIAN static void
-_efl_selection_manager_selection_clear(Eo *obj EINA_UNUSED, 
Efl_Selection_Manager_Data *pd,
+_efl_selection_manager_selection_clear(Eo *obj, Efl_Selection_Manager_Data *pd,
                                        Efl_Object *owner, Efl_Selection_Type 
type, unsigned int seat)
 {
    Eina_Bool local = EINA_FALSE;
    Sel_Manager_Seat_Selection *seat_sel;
-   Sel_Manager_Selection *sel;
+   Sel_Manager_Selection *sel = NULL;
 
    sel_debug("owner: %p, seat: %d, type: %d", owner, seat, type);
    seat_sel = _sel_manager_seat_selection_init(pd, seat);
 #ifdef HAVE_ELEMENTARY_X
-   sel = seat_sel->sel_list + type;
+   Ecore_X_Window xwin = _x11_xwin_get(obj);
+   if (xwin)
+     {
+        sel = seat_sel->sel_list + type;
+     }
 #endif
 #ifdef HAVE_ELEMENTARY_WL2
-   sel = seat_sel->sel;
+   Ecore_Wl2_Window *win = _wl_window_get(obj);
+   if (win)
+     {
+        sel = seat_sel->sel;
+     }
 #endif
 #ifdef HAVE_ELEMENTARY_COCOA
-   sel = seat_sel->sel;
+   Ecore_Cocoa_Window *win = _cocoa_window_get(obj);
+   if (win)
+     {
+        sel = seat_sel->sel;
+     }
 #endif
 #ifdef HAVE_ELEMENTARY_WIN32
-   sel = seat_sel->sel_list + type;
+   Ecore_Win32_Window *win = _win32_window_get(obj);
+     {
+        sel = seat_sel->sel_list + type;
+     }
 #endif
+   if (!sel) return;
    if ((!sel->active) && (sel->owner != owner))
      {
         return;
      }
    sel->active = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_X
-   seat_sel->sel_list[type].data.len = 0;
-   if (seat_sel->sel_list[type].data.mem)
-     {
-        free(seat_sel->sel_list[type].data.mem);
-        seat_sel->sel_list[type].data.mem = NULL;
-     }
-   if (sel->xwin != 0)
-     local = EINA_TRUE;
-   if (!local)
-     {
-        seat_sel->sel_list[type].clear();
-     }
-   else
+   if (xwin)
      {
-        Eina_List *l, *l_next;
-        Sel_Manager_Selection_Lost *sel_lost;
-
-        EINA_LIST_FOREACH_SAFE(seat_sel->sel_lost_list, l, l_next, sel_lost)
+        seat_sel->sel_list[type].data.len = 0;
+        if (seat_sel->sel_list[type].data.mem)
           {
-             if ((sel_lost->request == sel->owner) &&
-                 (sel_lost->type == type))
+             free(seat_sel->sel_list[type].data.mem);
+             seat_sel->sel_list[type].data.mem = NULL;
+          }
+        if (sel->xwin != 0) local = EINA_TRUE;
+        if (!local) seat_sel->sel_list[type].clear();
+        else
+          {
+             Eina_List *l, *l_next;
+             Sel_Manager_Selection_Lost *sel_lost;
+
+             EINA_LIST_FOREACH_SAFE(seat_sel->sel_lost_list, l, l_next, 
sel_lost)
                {
-                  eina_promise_resolve(sel_lost->promise, 
eina_value_uint_init(sel_lost->type));
-                  seat_sel->sel_lost_list = 
eina_list_remove(seat_sel->sel_lost_list, sel_lost);
-                  free(sel_lost);
+                  if ((sel_lost->request == sel->owner) &&
+                      (sel_lost->type == type))
+                    {
+                       eina_promise_resolve(sel_lost->promise, 
eina_value_uint_init(sel_lost->type));
+                       seat_sel->sel_lost_list = 
eina_list_remove(seat_sel->sel_lost_list, sel_lost);
+                       free(sel_lost);
+                    }
                }
+             seat_sel->sel_list[type].owner = NULL;
           }
-        seat_sel->sel_list[type].owner = NULL;
      }
 #endif
 #ifdef HAVE_ELEMENTARY_WL2
-   sel->selection_serial = 
ecore_wl2_dnd_selection_clear(_wl_seat_get(_wl_window_get(owner), owner, seat));
+   if (win)
+     {
+        sel->selection_serial = 
ecore_wl2_dnd_selection_clear(_wl_seat_get(_wl_window_get(owner), owner, seat));
+     }
 #endif
 #ifdef HAVE_ELEMENTARY_COCOA
-   if (sel->owner)
-     evas_object_event_callback_del_full(sel->owner, EVAS_CALLBACK_DEL,
-                                         _cocoa_sel_obj_del_cb, sel);
-   if (sel->request_obj)
-     evas_object_event_callback_del_full(sel->request_obj, EVAS_CALLBACK_DEL,
-                                         _cocoa_sel_obj_del_req_cb, sel);
-   sel->owner = NULL;
-   sel->request_obj = NULL;
-   ELM_SAFE_FREE(sel->data.mem, free);
-   sel->data.len = 0;
+   if (win)
+     {
+        if (sel->owner)
+          evas_object_event_callback_del_full(sel->owner, EVAS_CALLBACK_DEL,
+                                              _cocoa_sel_obj_del_cb, sel);
+        if (sel->request_obj)
+          evas_object_event_callback_del_full(sel->request_obj, 
EVAS_CALLBACK_DEL,
+                                              _cocoa_sel_obj_del_req_cb, sel);
+        sel->owner = NULL;
+        sel->request_obj = NULL;
+        ELM_SAFE_FREE(sel->data.mem, free);
+        sel->data.len = 0;
 
-   ecore_cocoa_clipboard_clear();
+        ecore_cocoa_clipboard_clear();
+     }
 #endif
 #ifdef HAVE_ELEMENTARY_WIN32
-   _win32_efl_sel_manager_selection_clear(pd, owner, type, seat_sel);
+   if (win)
+     {
+        _win32_efl_sel_manager_selection_clear(pd, owner, type, seat_sel);
+     }
 #endif
 }
 

-- 


Reply via email to