From 7171135792b1f443ef9f27818ab08dadfe3bf267 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 6 Feb 2015 17:54:08 -0500 Subject: [PATCH] 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 +++++++ .../ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c | 7 +++++++ src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c | 7 +++++++ .../engines/wayland/ecore_evas_wayland_common.c | 6 ++++++ .../ecore_evas/engines/wayland/ecore_evas_wayland_egl.c | 1 + .../engines/wayland/ecore_evas_wayland_private.h | 1 + .../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 fa7bab232d..70a64ac4f8 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 afffa5e9f2..cf4e6e3113 100644 --- a/src/lib/ecore_evas/ecore_evas_ews.c +++ b/src/lib/ecore_evas/ecore_evas_ews.c @@ -406,6 +406,12 @@ _ecore_evas_ews_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object * ee->prop.cursor.object = NULL; } +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) { @@ -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 34635991f5..dc11228ff8 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 f66b7be16e..3ac93c3e61 100644 --- a/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c +++ b/src/modules/ecore_evas/engines/cocoa/ecore_evas_cocoa.c @@ -345,6 +345,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj ee->prop.cursor.object = NULL; } +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) { @@ -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 8ff1d394d7..3de46684ba 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, @@ -763,6 +765,12 @@ _ecore_evas_drm_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object * if ((ee = data)) ee->prop.cursor.object = NULL; } +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) { 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 a524a43ddf..9cb7f6f3ce 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 5373dd7e41..8d008ac600 100644 --- a/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c +++ b/src/modules/ecore_evas/engines/fb/ecore_evas_fb.c @@ -425,6 +425,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj ee->prop.cursor.object = NULL; } +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) { @@ -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 71de3b94b6..011aeda7af 100644 --- a/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c +++ b/src/modules/ecore_evas/engines/psl1ght/ecore_evas_psl1ght.c @@ -315,6 +315,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj ee->prop.cursor.object = NULL; } +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) { @@ -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 4ffbf3d02e..9a0e69b712 100644 --- a/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c +++ b/src/modules/ecore_evas/engines/sdl/ecore_evas_sdl.c @@ -403,6 +403,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj if (ee) ee->prop.cursor.object = NULL; } +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) { @@ -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 424a5aa87a..47fd54dd6f 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 @@ -1211,6 +1211,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj if (ee) ee->prop.cursor.object = NULL; } +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) { 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 dc3428bf58..46003e8555 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 905aa261d8..98e2624936 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 42e3ec41d3..9355e50b03 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 933345584a..36587b96a2 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 60c623f71d..31d5108075 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -2978,6 +2978,12 @@ _ecore_evas_object_cursor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj if (ee) ee->prop.cursor.object = NULL; } +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) { @@ -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,