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 +++++++ 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, -- 2.7.4