devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=0a46096337dcbde7b18e093518e3b0846a425053
commit 0a46096337dcbde7b18e093518e3b0846a425053 Author: Chris Michael <[email protected]> Date: Fri Oct 21 15:28:13 2016 -0400 elementary: Provide EFL mouse pointers for Wayland Client applications This commit allows EFL wayland client applications to make use of EFL mouse pointers instead of the wayland-cursor provided ones. NB: There are still some minor hiccups with this (move pointer does not change, mouse pointer getting clipped off when on the lower border, etc) but those will get sorted out soon. Feature request by the old man ;) @feature Signed-off-by: Chris Michael <[email protected]> --- src/lib/elementary/efl_ui_win.c | 158 ++++++++++++++++++++++++++++------------ src/lib/elementary/els_cursor.c | 33 ++++----- 2 files changed, 126 insertions(+), 65 deletions(-) diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 5678230..d9b1b8b 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -919,8 +919,22 @@ _elm_win_mouse_in(Ecore_Evas *ee) _elm_win_throttle_ok = EINA_TRUE; if (sd->resizing) sd->resizing = EINA_FALSE; #ifdef HAVE_ELEMENTARY_WL2 - if (sd->wl.win && (!sd->frame_obj)) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + + ecore_evas_object_cursor_set(sd->ee, sd->pointer.obj, + ELM_OBJECT_LAYER_CURSOR, + sd->pointer.hot_x, sd->pointer.hot_y); +#endif +} + +static void +_elm_win_mouse_out(Ecore_Evas *ee) +{ + Efl_Ui_Win_Data *sd = _elm_win_associate_get(ee); + if (!sd) return; + +#ifdef HAVE_ELEMENTARY_WL2 + sd->pointer.obj = ecore_evas_cursor_unset(sd->ee); #endif } @@ -3503,10 +3517,14 @@ _elm_win_frame_cb_move_start(void *data, if (!sd) return; #ifdef HAVE_ELEMENTARY_WL2 + ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + if (!strcmp(source, "elm")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, ELM_CURSOR_HAND1); + _elm_theme_object_set(sd->obj, sd->pointer.obj, + "pointer", "base", "move"); else - ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + _elm_theme_object_set(sd->obj, sd->pointer.obj, + "pointer", "base", "default"); #else (void)source; #endif @@ -3534,6 +3552,7 @@ _elm_win_frame_cb_move_stop(void *data, #ifdef HAVE_ELEMENTARY_WL2 ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", "default"); #endif } @@ -3562,19 +3581,6 @@ static struct _resize_info _border_corner[4] = #endif static void -_elm_win_frame_obj_mouse_in(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) -{ -#ifdef HAVE_ELEMENTARY_WL2 - Efl_Ui_Win_Data *sd = data; - - if (sd->wl.win) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); -#else - (void)data; -#endif -} - -static void _elm_win_frame_obj_move(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, @@ -3614,34 +3620,44 @@ _elm_win_frame_cb_resize_show(void *data, if (sd->resizing) return; #ifdef HAVE_ELEMENTARY_WL2 + Evas_Coord mw = 1, mh = 1, hx = 0, hy = 0; int i; + i = sd->rot / 90; if (!strcmp(source, "elm.event.resize.t")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_side[(0 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_side[(0 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.b")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_side[(2 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_side[(2 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.l")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_side[(1 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_side[(1 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.r")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_side[(3 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_side[(3 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.tl")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_corner[(0 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_corner[(0 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.tr")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_corner[(3 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_corner[(3 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.bl")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_corner[(1 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_corner[(1 + i) % 4].name); else if (!strcmp(source, "elm.event.resize.br")) - ecore_wl2_window_cursor_from_name_set(sd->wl.win, - _border_corner[(2 + i) % 4].name); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", + _border_corner[(2 + i) % 4].name); else - ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", "default"); + + edje_object_size_min_calc(sd->pointer.obj, &mw, &mh); + evas_object_resize(sd->pointer.obj, mw, mh); + edje_object_part_geometry_get(sd->pointer.obj, "elm.swallow.hotspot", + &hx, &hy, NULL, NULL); + sd->pointer.hot_x = hx; + sd->pointer.hot_y = hy; + #else (void)source; #endif @@ -3659,7 +3675,7 @@ _elm_win_frame_cb_resize_hide(void *data, if (sd->resizing) return; #ifdef HAVE_ELEMENTARY_WL2 - ecore_wl2_window_cursor_from_name_set(sd->wl.win, NULL); + _elm_theme_object_set(sd->obj, sd->pointer.obj, "pointer", "base", "default"); #endif } @@ -3818,6 +3834,39 @@ _elm_win_frame_pre_render(void *data, Evas *e EINA_UNUSED, void *ev EINA_UNUSED) #endif static void +_elm_win_frame_cb_mouse_down(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Efl_Ui_Win_Data *sd; + + if (!(sd = data)) return; + if (!sd->pointer.obj) return; + edje_object_signal_emit(sd->pointer.obj, "elm,action,mouse,down", "elm"); +} + +static void +_elm_win_frame_cb_mouse_up(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Efl_Ui_Win_Data *sd; + + if (!(sd = data)) return; + if (!sd->pointer.obj) return; + edje_object_signal_emit(sd->pointer.obj, "elm,action,mouse,up", "elm"); +} + +static void +_elm_win_frame_cb_mouse_move(void *data, Evas *e EINA_UNUSED, + Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +{ + Efl_Ui_Win_Data *sd; + + if (!(sd = data)) return; + if (!sd->pointer.obj) return; + edje_object_signal_emit(sd->pointer.obj, "elm,action,mouse,move", "elm"); +} + +static void _elm_win_frame_add(Efl_Ui_Win_Data *sd, const char *style) { Evas_Object *obj = sd->obj; @@ -3861,15 +3910,18 @@ _elm_win_frame_add(Efl_Ui_Win_Data *sd, const char *style) } } - edje_object_part_swallow(sd->frame_obj, "elm.swallow.icon", - sd->icon); + edje_object_part_swallow(sd->frame_obj, "elm.swallow.icon", sd->icon); evas_object_event_callback_add - (sd->frame_obj, EVAS_CALLBACK_MOUSE_IN, _elm_win_frame_obj_mouse_in, sd); - evas_object_event_callback_add (sd->frame_obj, EVAS_CALLBACK_MOVE, _elm_win_frame_obj_move, sd); evas_object_event_callback_add (sd->frame_obj, EVAS_CALLBACK_RESIZE, _elm_win_frame_obj_resize, sd); + evas_object_event_callback_add + (sd->frame_obj, EVAS_CALLBACK_MOUSE_DOWN, _elm_win_frame_cb_mouse_down, sd); + evas_object_event_callback_add + (sd->frame_obj, EVAS_CALLBACK_MOUSE_UP, _elm_win_frame_cb_mouse_up, sd); + evas_object_event_callback_add + (sd->frame_obj, EVAS_CALLBACK_MOUSE_MOVE, _elm_win_frame_cb_mouse_move, sd); /* NB: Do NOT remove these calls !! Needed to calculate proper * framespace on initial show of the window */ @@ -3987,7 +4039,6 @@ _debug_key_down(void *data EINA_UNUSED, INF("Tree graph generated."); elm_object_tree_dot_dump(obj, "./dump.dot"); } - #endif static void @@ -4653,7 +4704,11 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W ecore_evas_callback_move_set(sd->ee, _elm_win_move); ecore_evas_callback_pre_render_set(sd->ee, _elm_win_pre_render); if (type != ELM_WIN_FAKE) - ecore_evas_callback_mouse_in_set(sd->ee, _elm_win_mouse_in); + { + ecore_evas_callback_mouse_in_set(sd->ee, _elm_win_mouse_in); + ecore_evas_callback_mouse_out_set(sd->ee, _elm_win_mouse_out); + } + evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _elm_win_cb_hide, NULL); evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _elm_win_cb_show, NULL); @@ -4707,10 +4762,16 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W if (type != ELM_WIN_FAKE) { + /* NB: As we do not want to use standard X/FDO cursors for EFL + * Wayland Client Apps, we can use Elm Softcursor to provide an + * EFL mouse pointer for Wayland Client Apps */ if ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_ON) || ((_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_AUTO) && - ((engine) && - ((!strcmp(engine, ELM_SOFTWARE_FB)) || (!strcmp(engine, ELM_DRM)))))) + ((engine) && + ((!strcmp(engine, ELM_SOFTWARE_FB)) || + (!strcmp(engine, ELM_DRM)) || + (!strcmp(engine, ELM_WAYLAND_SHM)) || + (!strcmp(engine, ELM_WAYLAND_EGL)))))) { Evas_Object *o; Evas_Coord mw = 1, mh = 1, hx = 0, hy = 0; @@ -4723,8 +4784,15 @@ _elm_win_finalize_internal(Eo *obj, Efl_Ui_Win_Data *sd, const char *name, Elm_W &hx, &hy, NULL, NULL); sd->pointer.hot_x = hx; sd->pointer.hot_y = hy; - evas_object_show(o); - ecore_evas_object_cursor_set(tmp_sd.ee, o, EVAS_LAYER_MAX, hx, hy); + + /* NB: Sadly we have to mark pointer as a frame object now due + * to the recent changes in evas_render wrt framespace & context + * clipping...if we do not, then the pointer never gets drawn + * over the frame object due to clipping */ + evas_object_is_frame_object_set(sd->pointer.obj, EINA_TRUE); + + ecore_evas_object_cursor_set(tmp_sd.ee, o, + ELM_OBJECT_LAYER_CURSOR, hx, hy); } else if (_elm_config->softcursor_mode == ELM_SOFTCURSOR_MODE_OFF) { diff --git a/src/lib/elementary/els_cursor.c b/src/lib/elementary/els_cursor.c index f25ba35..d321053 100644 --- a/src/lib/elementary/els_cursor.c +++ b/src/lib/elementary/els_cursor.c @@ -282,6 +282,7 @@ _elm_cursor_set(Elm_Cursor *cur) if (cur->visible) return; evas_event_freeze(cur->evas); + if (!cur->use_engine) { if (!cur->obj) @@ -305,10 +306,6 @@ _elm_cursor_set(Elm_Cursor *cur) if (cur->x.win) ecore_x_window_cursor_set(cur->x.win, cur->x.cursor); #endif -#ifdef HAVE_ELEMENTARY_WL2 - if (cur->wl.win) - ecore_wl2_window_cursor_from_name_set(cur->wl.win, cur->cursor_name); -#endif #ifdef HAVE_ELEMENTARY_COCOA if (cur->cocoa.win) @@ -365,18 +362,15 @@ _elm_cursor_mouse_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_ } if (!cur->use_engine) - ecore_evas_object_cursor_set(cur->ee, NULL, ELM_OBJECT_LAYER_CURSOR, - cur->hot_x, cur->hot_y); + cur->obj = ecore_evas_cursor_unset(cur->ee); + /* ecore_evas_object_cursor_set(cur->ee, NULL, ELM_OBJECT_LAYER_CURSOR, */ + /* cur->hot_x, cur->hot_y); */ else { #ifdef HAVE_ELEMENTARY_X if (cur->x.win) ecore_x_window_cursor_set(cur->x.win, ECORE_X_CURSOR_X); #endif -#ifdef HAVE_ELEMENTARY_WL2 - if (cur->wl.win) - ecore_wl2_window_cursor_from_name_set(cur->wl.win, NULL); -#endif #ifdef HAVE_ELEMENTARY_COCOA if (cur->cocoa.win) @@ -427,12 +421,15 @@ _elm_cursor_cur_set(Elm_Cursor *cur) cur->use_engine = EINA_TRUE; } -#ifdef HAVE_ELEMENTARY_DRM +#if defined (HAVE_ELEMENTARY_DRM) || defined(HAVE_ELEMENTARY_WL2) const char *engine_name; engine_name = ecore_evas_engine_name_get(cur->ee); - if ((engine_name) && (!strcmp(engine_name, ELM_DRM))) - cur->use_engine = EINA_FALSE; + if ((engine_name) && + ((!strcmp(engine_name, ELM_DRM)) || + (!strcmp(engine_name, ELM_WAYLAND_SHM)) || + (!strcmp(engine_name, ELM_WAYLAND_EGL)))) + cur->use_engine = EINA_FALSE; #endif if (cur->use_engine) @@ -481,9 +478,9 @@ _elm_cursor_cur_set(Elm_Cursor *cur) } #endif -#ifdef HAVE_ELEMENTARY_WL2 - cur->wl.win = elm_win_wl_window_get(top); -#endif +/* #ifdef HAVE_ELEMENTARY_WL2 */ +/* cur->wl.win = elm_win_wl_window_get(top); */ +/* #endif */ #ifdef HAVE_ELEMENTARY_WIN32 cur->win32.win = elm_win_win32_window_get(top); if (cur->win32.win) @@ -627,10 +624,6 @@ elm_object_cursor_unset(Evas_Object *obj) else if (cur->cocoa.win) ecore_cocoa_window_cursor_set(cur->cocoa.win, ECORE_COCOA_CURSOR_DEFAULT); #endif -#ifdef HAVE_ELEMENTARY_WL2 - else if (cur->wl.win) - ecore_wl2_window_cursor_from_name_set(cur->wl.win, NULL); -#endif #ifdef HAVE_ELEMENTARY_WIN32 else ecore_win32_window_cursor_set(cur->win32.win, ecore_win32_cursor_shaped_new(ECORE_WIN32_CURSOR_SHAPE_ARROW)); --
