discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7171135792b1f443ef9f27818ab08dadfe3bf267

commit 7171135792b1f443ef9f27818ab08dadfe3bf267
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Feb 6 17:54:08 2015 -0500

    ecore evas should not crash when unsetting pointer
    
    ref D812
    
    disappointed.jpg
---
 src/lib/ecore_evas/ecore_evas_buffer.c                           | 1 +
 src/lib/ecore_evas/ecore_evas_ews.c                              | 7 +++++++
 src/lib/ecore_evas/ecore_evas_private.h                          | 1 +
 src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c          | 7 +++++++
 src/modules/ecore_evas/engines/drm/ecore_evas_drm.c              | 8 ++++++++
 src/modules/ecore_evas/engines/extn/ecore_evas_extn.c            | 2 ++
 src/modules/ecore_evas/engines/fb/ecore_evas_fb.c                | 7 +++++++
 src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c      | 7 +++++++
 src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c              | 7 +++++++
 .../ecore_evas/engines/wayland/ecore_evas_wayland_common.c       | 6 ++++++
 src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c  | 1 +
 .../ecore_evas/engines/wayland/ecore_evas_wayland_private.h      | 1 +
 src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c  | 1 +
 src/modules/ecore_evas/engines/win32/ecore_evas_win32.c          | 9 ++++++++-
 src/modules/ecore_evas/engines/x/ecore_evas_x.c                  | 7 +++++++
 15 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/src/lib/ecore_evas/ecore_evas_buffer.c 
b/src/lib/ecore_evas/ecore_evas_buffer.c
index fa7bab2..70a64ac 100644
--- a/src/lib/ecore_evas/ecore_evas_buffer.c
+++ b/src/lib/ecore_evas/ecore_evas_buffer.c
@@ -572,6 +572,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func =
      NULL,
      NULL,
      NULL,
+     NULL,
      _ecore_evas_buffer_alpha_set,
      NULL, //transparent
      NULL, // profiles_set
diff --git a/src/lib/ecore_evas/ecore_evas_ews.c 
b/src/lib/ecore_evas/ecore_evas_ews.c
index afffa5e..cf4e6e3 100644
--- a/src/lib/ecore_evas/ecore_evas_ews.c
+++ b/src/lib/ecore_evas/ecore_evas_ews.c
@@ -407,6 +407,12 @@ _ecore_evas_ews_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *
 }
 
 static void
+_ecore_evas_ews_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_ews_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_ews_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, 
int hot_x, int hot_y)
 {
    int x, y;
@@ -671,6 +677,7 @@ static const Ecore_Evas_Engine_Func _ecore_ews_engine_func =
      _ecore_evas_ews_size_base_set,
      _ecore_evas_ews_size_step_set,
      _ecore_evas_ews_object_cursor_set,
+     _ecore_evas_ews_object_cursor_unset,
      _ecore_evas_ews_layer_set,
      _ecore_evas_ews_focus_set,
      _ecore_evas_ews_iconified_set,
diff --git a/src/lib/ecore_evas/ecore_evas_private.h 
b/src/lib/ecore_evas/ecore_evas_private.h
index 3463599..dc11228 100644
--- a/src/lib/ecore_evas/ecore_evas_private.h
+++ b/src/lib/ecore_evas/ecore_evas_private.h
@@ -87,6 +87,7 @@ struct _Ecore_Evas_Engine_Func
    void (*fn_size_base_set) (Ecore_Evas *ee, int w, int h);
    void (*fn_size_step_set) (Ecore_Evas *ee, int w, int h);
    void (*fn_object_cursor_set) (Ecore_Evas *ee, Evas_Object *obj, int layer, 
int hot_x, int hot_y);
+   void (*fn_object_cursor_unset) (Ecore_Evas *ee);
    void (*fn_layer_set) (Ecore_Evas *ee, int layer);
    void (*fn_focus_set) (Ecore_Evas *ee, Eina_Bool on);
    void (*fn_iconified_set) (Ecore_Evas *ee, Eina_Bool on);
diff --git a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c 
b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
index f66b7be..3ac93c3 100644
--- a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
+++ b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c
@@ -346,6 +346,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
+_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int 
hot_x, int hot_y)
 {
   int x, y;
@@ -465,6 +471,7 @@ static Ecore_Evas_Engine_Func _ecore_cocoa_engine_func =
     NULL,
     NULL,
     _ecore_evas_object_cursor_set,
+    _ecore_evas_object_cursor_unset,
     NULL,
     NULL,
     NULL,
diff --git a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c 
b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
index 8ff1d39..3de4668 100644
--- a/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
+++ b/src/modules/ecore_evas/engines/drm/ecore_evas_drm.c
@@ -53,6 +53,7 @@ static void _ecore_evas_drm_size_max_set(Ecore_Evas *ee, int 
w, int h);
 static void _ecore_evas_drm_size_base_set(Ecore_Evas *ee, int w, int h);
 static void _ecore_evas_drm_size_step_set(Ecore_Evas *ee, int w, int h);
 static void _ecore_evas_drm_object_cursor_set(Ecore_Evas *ee, Evas_Object 
*obj, int layer, int hot_x, int hot_y);
+static void _ecore_evas_drm_object_cursor_unset(Ecore_Evas *ee);
 static void _ecore_evas_drm_layer_set(Ecore_Evas *ee, int layer);
 static void _ecore_evas_drm_iconified_set(Ecore_Evas *ee, Eina_Bool on);
 static void _ecore_evas_drm_borderless_set(Ecore_Evas *ee, Eina_Bool on);
@@ -110,6 +111,7 @@ static Ecore_Evas_Engine_Func _ecore_evas_drm_engine_func =
    _ecore_evas_drm_size_base_set,
    _ecore_evas_drm_size_step_set,
    _ecore_evas_drm_object_cursor_set,
+   _ecore_evas_drm_object_cursor_unset,
    _ecore_evas_drm_layer_set,
    NULL, //void (*fn_focus_set) (Ecore_Evas *ee, Eina_Bool on);
    _ecore_evas_drm_iconified_set,
@@ -764,6 +766,12 @@ _ecore_evas_drm_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *
 }
 
 static void
+_ecore_evas_drm_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_drm_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_drm_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, 
int hot_x, int hot_y)
 {
    int x, y;
diff --git a/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c 
b/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
index a524a43..9cb7f6f 100644
--- a/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
+++ b/src/modules/ecore_evas/engines/extn/ecore_evas_extn.c
@@ -850,6 +850,7 @@ static const Ecore_Evas_Engine_Func 
_ecore_extn_plug_engine_func =
    NULL,
    NULL,
    NULL,
+   NULL,
    NULL, //transparent
    NULL, // profiles_set
    _ecore_evas_extn_plug_profile_set,
@@ -1986,6 +1987,7 @@ static const Ecore_Evas_Engine_Func 
_ecore_extn_socket_engine_func =
    NULL,
    NULL,
    NULL,
+   NULL,
    _ecore_evas_extn_socket_alpha_set,
    NULL, //transparent
    _ecore_evas_extn_socket_available_profiles_set,
diff --git a/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c 
b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
index 5373dd7..8d008ac 100644
--- a/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
+++ b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c
@@ -426,6 +426,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
+_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int 
hot_x, int hot_y)
 {
    int x, y;
@@ -572,6 +578,7 @@ static Ecore_Evas_Engine_Func _ecore_fb_engine_func =
      NULL,
      NULL,
      _ecore_evas_object_cursor_set,
+     _ecore_evas_object_cursor_unset,
      NULL,
      NULL,
      NULL,
diff --git a/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c 
b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
index 71de3b9..011aeda 100644
--- a/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
+++ b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c
@@ -316,6 +316,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
+_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int 
hot_x, int hot_y)
 {
    int x, y;
@@ -394,6 +400,7 @@ static Ecore_Evas_Engine_Func _ecore_psl1ght_engine_func =
    NULL,
    NULL,
    _ecore_evas_object_cursor_set,
+   _ecore_evas_object_cursor_unset,
    NULL,
    NULL,
    NULL,
diff --git a/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c 
b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
index 4ffbf3d..9a0e69b 100644
--- a/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
+++ b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c
@@ -404,6 +404,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
+_ecore_evas_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int 
hot_x, int hot_y)
 {
    int x, y;
@@ -483,6 +489,7 @@ static Ecore_Evas_Engine_Func _ecore_sdl_engine_func =
    NULL,
    NULL,
    _ecore_evas_object_cursor_set,
+   _ecore_evas_object_cursor_unset,
    NULL,
    NULL,
    NULL,
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c 
b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index 424a5aa..47fd54d 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -1212,6 +1212,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 void
+_ecore_evas_wl_common_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+void
 _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int 
layer, int hot_x, int hot_y)
 {
    int x, y, fx, fy;
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c 
b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c
index dc3428b..46003e8 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_egl.c
@@ -51,6 +51,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    _ecore_evas_wl_common_size_base_set,
    _ecore_evas_wl_common_size_step_set,
    _ecore_evas_wl_common_object_cursor_set,
+   _ecore_evas_wl_common_object_cursor_unset,
    _ecore_evas_wl_common_layer_set,
    NULL, // focus set
    _ecore_evas_wl_common_iconified_set,
diff --git 
a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h 
b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
index 905aa26..98e2624 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_private.h
@@ -63,6 +63,7 @@ void _ecore_evas_wl_common_size_base_set(Ecore_Evas *ee, int 
w, int h);
 void _ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h);
 void _ecore_evas_wl_common_aspect_set(Ecore_Evas *ee, double aspect);
 void _ecore_evas_wl_common_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, 
int layer, int hot_x, int hot_y);
+void _ecore_evas_wl_common_object_cursor_unset(Ecore_Evas *ee);
 void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer);
 void _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, Eina_Bool on);
 void _ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, Eina_Bool on);
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c 
b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c
index 42e3ec4..9355e50 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_shm.c
@@ -51,6 +51,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func =
    _ecore_evas_wl_common_size_base_set,
    _ecore_evas_wl_common_size_step_set,
    _ecore_evas_wl_common_object_cursor_set,
+   _ecore_evas_wl_common_object_cursor_unset,
    _ecore_evas_wl_common_layer_set,
    NULL, // focus set
    _ecore_evas_wl_common_iconified_set,
diff --git a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c 
b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
index 9333455..36587b9 100644
--- a/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
+++ b/src/modules/ecore_evas/engines/win32/ecore_evas_win32.c
@@ -821,7 +821,13 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
    ee = data;
    if (ee) ee->prop.cursor.object = NULL;
 }
-                              
+
+static void
+_ecore_evas_win32_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
 static void
 _ecore_evas_win32_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int 
hot_x, int hot_y)
 {
@@ -1131,6 +1137,7 @@ static Ecore_Evas_Engine_Func _ecore_win32_engine_func =
      _ecore_evas_win32_size_base_set,
      _ecore_evas_win32_size_step_set,
      _ecore_evas_win32_cursor_set,
+     _ecore_evas_win32_cursor_unset,
      NULL, /* _ecore_evas_x_layer_set */
      _ecore_evas_win32_focus_set,
      _ecore_evas_win32_iconified_set,
diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c 
b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
index 60c623f..31d5108 100644
--- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c
+++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
@@ -2979,6 +2979,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e 
EINA_UNUSED, Evas_Object *obj
 }
 
 static void
+_ecore_evas_x_object_cursor_unset(Ecore_Evas *ee)
+{
+   evas_object_event_callback_del_full(ee->prop.cursor.object, 
EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee);
+}
+
+static void
 _ecore_evas_x_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, 
int hot_x, int hot_y)
 {
    int x = 0, y = 0;
@@ -3552,6 +3558,7 @@ static Ecore_Evas_Engine_Func _ecore_x_engine_func =
    _ecore_evas_x_size_base_set,
    _ecore_evas_x_size_step_set,
    _ecore_evas_x_object_cursor_set,
+   _ecore_evas_x_object_cursor_unset,
    _ecore_evas_x_layer_set,
    _ecore_evas_x_focus_set,
    _ecore_evas_x_iconified_set,

-- 


Reply via email to