diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h index 83080e7fb1..0c7b03043d 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_private.h @@ -424,6 +424,7 @@ void _ecore_evas_wl_common_size_min_set(Ecore_Evas *ee, int w, int h); void _ecore_evas_wl_common_size_max_set(Ecore_Evas *ee, int w, int h); 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_object_cursor_set(Ecore_Evas *ee, Evas_Object *obj, int layer, int hot_x, int hot_y); void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer); void _ecore_evas_wl_common_iconified_set(Ecore_Evas *ee, int iconify); void _ecore_evas_wl_common_maximized_set(Ecore_Evas *ee, int max); diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_common.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_common.c index 6a49b2f035..e1df083275 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_common.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_common.c @@ -580,6 +580,51 @@ _ecore_evas_wl_common_size_step_set(Ecore_Evas *ee, int w, int h) ee->prop.step.h = h; } +static void +_ecore_evas_object_cursor_del(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Ecore_Evas *ee; + + ee = data; + if (ee) ee->prop.cursor.object = NULL; +} + +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; + + if (ee->prop.cursor.object) evas_object_del(ee->prop.cursor.object); + + if (!obj) + { + ee->prop.cursor.object = NULL; + ee->prop.cursor.layer = 0; + ee->prop.cursor.hot.x = 0; + ee->prop.cursor.hot.y = 0; + ecore_wl_window_cursor_default_restore(ee->engine.wl.win); + return; + } + + ee->prop.cursor.object = obj; + ee->prop.cursor.layer = layer; + ee->prop.cursor.hot.x = hot_x; + ee->prop.cursor.hot.y = hot_y; + + ecore_wl_window_pointer_set(ee->engine.wl.win, NULL, 0, 0); + + evas_pointer_output_xy_get(ee->evas, &x, &y); + evas_object_layer_set(ee->prop.cursor.object, ee->prop.cursor.layer); + evas_object_move(ee->prop.cursor.object, + x - ee->prop.cursor.hot.x, + y - ee->prop.cursor.hot.y); + evas_object_pass_events_set(ee->prop.cursor.object, 1); + if (evas_pointer_inside_get(ee->evas)) + evas_object_show(ee->prop.cursor.object); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _ecore_evas_object_cursor_del, ee); +} + void _ecore_evas_wl_common_layer_set(Ecore_Evas *ee, int layer) { diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c index 545c295d98..430da4b8cb 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_egl.c @@ -70,7 +70,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = _ecore_evas_wl_common_size_max_set, _ecore_evas_wl_common_size_base_set, _ecore_evas_wl_common_size_step_set, - NULL, // object_cursor_set + _ecore_evas_wl_common_object_cursor_set, _ecore_evas_wl_common_layer_set, NULL, // focus set _ecore_evas_wl_common_iconified_set, diff --git a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c index d2cf1b8640..0a7584a795 100644 --- a/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c +++ b/legacy/ecore/src/lib/ecore_evas/ecore_evas_wayland_shm.c @@ -86,7 +86,7 @@ static Ecore_Evas_Engine_Func _ecore_wl_engine_func = _ecore_evas_wl_common_size_max_set, _ecore_evas_wl_common_size_base_set, _ecore_evas_wl_common_size_step_set, - NULL, // object_cursor_set + _ecore_evas_wl_common_object_cursor_set, // object_cursor_set _ecore_evas_wl_common_layer_set, NULL, // focus set _ecore_evas_wl_common_iconified_set,