diff --git a/src/lib/elementary/els_cursor.c b/src/lib/elementary/els_cursor.c index 69d541835e..a90c7daf25 100644 --- a/src/lib/elementary/els_cursor.c +++ b/src/lib/elementary/els_cursor.c @@ -570,7 +570,7 @@ _elm_cursor_cur_set(Elm_Cursor *cur) } } - if (efl_canvas_object_pointer_in_get(cur->eventarea)) + if (efl_canvas_pointer_inside_get(cur->eventarea, NULL)) _elm_cursor_set(cur); } diff --git a/src/lib/evas/Evas_Legacy.h b/src/lib/evas/Evas_Legacy.h index de7bf35d45..94b06d0f12 100644 --- a/src/lib/evas/Evas_Legacy.h +++ b/src/lib/evas/Evas_Legacy.h @@ -2210,6 +2210,39 @@ EAPI void evas_object_scale_set(Evas_Object *obj, double scale); */ EAPI double evas_object_scale_get(const Evas_Object *obj); +/** + * @brief Returns whether the mouse pointer is logically inside the object. + * + * @param[in] dev The pointer device. + * + * @return @c true if the pointer is inside, @c false otherwise. + * + * @since 1.20 + * + * @ingroup Evas_Object + */ +EAPI Eina_Bool evas_object_pointer_inside_by_device_get(const Evas_Object *obj, Efl_Input_Device * dev); + +/** + * @brief Returns whether the default mouse pointer is logically inside the + * object. + * + * When this function is called it will return a value of either @c false or + * @c true, depending on if event_feed_mouse_in or event_feed_mouse_out have + * been called to feed in a mouse enter event into the object. + * + * A return value of @c true indicates the mouse is logically inside the + * object, and @c false implies it is logically outside the object. + * + * If @c e is not a valid object, the return value is undefined. + * + * @return @c true if the mouse pointer is inside the object, @c false + * otherwise + * + * @ingroup Evas_Object + */ +EAPI Eina_Bool evas_object_pointer_inside_get(const Evas_Object *obj) EINA_WARN_UNUSED_RESULT; + #include "canvas/efl_canvas_object.eo.legacy.h" diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo index 7deae67d95..86c74b2431 100644 --- a/src/lib/evas/canvas/efl_canvas_object.eo +++ b/src/lib/evas/canvas/efl_canvas_object.eo @@ -3,7 +3,7 @@ import efl_animation_types; abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, Efl.Input.Interface, Efl.Gfx.Size.Hint, - Efl.Gfx.Map, Efl.Loop_User, Efl.Ui.Base) + Efl.Gfx.Map, Efl.Loop_User, Efl.Ui.Base, Efl.Canvas.Pointer) { [[Efl canvas object abstract class]] legacy_prefix: evas_object; @@ -56,41 +56,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, pointer_mode: Efl.Input.Object_Pointer_Mode; [[Input pointer mode]] } } - @property pointer_in { - [[Read-only value indicating whether the main pointer is in the object. - - This shall be true between pointer,in and pointer,out events (coming - in matching numbers). Note that group objects may receive multiple - pointer,in in a row. See algo @.pointer_device_in.get - - @since 1.19 - ]] - get { - legacy: null; - } - values { - in: bool; [[If $true the main pointer has entered this object.]] - } - } - @property pointer_device_in { - [[Read-only value indicating whether a pointer is in the object. - - This shall be true between pointer,in and pointer,out events (coming - in matching numbers). Note that group objects may receive multiple - pointer,in in a row. - - @since 1.19 - ]] - get { - legacy: null; - } - keys { - pointer: Efl.Input.Device; [[The pointer. Use $null for the defaul pointer]] - } - values { - in: bool; [[If $true the pointer has entered this object.]] - } - } @property render_op { [[Render mode to be used for compositing the Evas object. @@ -586,36 +551,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, enable: bool; [[Enable "no-render" mode.]] } } - @property pointer_inside_by_device { - [[Returns whether the mouse pointer is logically inside the - object. @since 1.20]] - keys { - dev: Efl.Input.Device; [[The pointer device.]] - } - get {} - values { - in: bool; [[$true if the pointer is inside, $false otherwise.]] - } - } - @property pointer_inside { - get { - [[Returns whether the default mouse pointer is logically inside the - object. - - When this function is called it will return a value of either - $false or $true, depending on if event_feed_mouse_in or - event_feed_mouse_out have been called to feed in a mouse - enter event into the object. - - A return value of $true indicates the mouse is logically - inside the object, and $false implies it is logically - outside the object. - - If $e is not a valid object, the return value is undefined. - ]] - return: bool @warn_unused; [[$true if the mouse pointer is inside the object, $false otherwise]] - } - } pointer_coords_inside_get { [[Returns whether the coords are logically inside the object. @@ -681,5 +616,6 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, Efl.Gfx.scale { set; get; } Efl.Input.Interface.seat_event_filter { get; set; } Efl.Loop_User.loop { get; } + Efl.Canvas.Pointer.pointer_inside { get; } } } diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 8011ae3195..7e15ead38b 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -3868,9 +3868,9 @@ _efl_canvas_object_pointer_mode_get(Eo *eo_obj, Evas_Object_Protected_Data *obj) } EOLIAN Eina_Bool -_efl_canvas_object_pointer_device_in_get(Eo *eo_obj, - Evas_Object_Protected_Data *obj, - Efl_Input_Device *pointer) +_efl_canvas_object_efl_canvas_pointer_pointer_inside_get(Eo *eo_obj, + Evas_Object_Protected_Data *obj, + Efl_Input_Device *pointer) { Evas_Object_Protected_Data *in, *parent; Eo *eo_in, *eo_parent; @@ -3880,7 +3880,6 @@ _efl_canvas_object_pointer_device_in_get(Eo *eo_obj, EVAS_OBJECT_DATA_ALIVE_CHECK(obj, EINA_FALSE); - if (!pointer) pointer = obj->layer->evas->default_mouse; @@ -3893,6 +3892,10 @@ _efl_canvas_object_pointer_device_in_get(Eo *eo_obj, if (!obj->is_smart) return obj_pdata->mouse_in; + /* This is to keep the legacy APIs evas_object_pointer_inside_by_device_get & + * evas_object_pointer_inside_get. */ + if (obj->is_pointer_inside_legacy) return EINA_FALSE; + /* For smart objects, this is a bit expensive obj->mouse_in will not be set. * Alternatively we could count the number of in and out events propagated * to the smart object, assuming they always match. */ @@ -3917,12 +3920,6 @@ _efl_canvas_object_pointer_device_in_get(Eo *eo_obj, return EINA_FALSE; } -EOLIAN Eina_Bool -_efl_canvas_object_pointer_in_get(Eo *eo_obj, Evas_Object_Protected_Data *obj) -{ - return _efl_canvas_object_pointer_device_in_get(eo_obj, obj, NULL); -} - EAPI void evas_event_refeed_event(Eo *eo_e, void *event_copy, Evas_Callback_Type event_type) { diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 7ffd1d7f7e..0b6a89d0d1 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -2661,19 +2661,6 @@ _efl_canvas_object_precise_is_inside_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Pro return obj->precise_is_inside; } -EOLIAN static Eina_Bool -_efl_canvas_object_pointer_inside_by_device_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Efl_Input_Device *dev) -{ - Evas_Pointer_Data *pdata; - Evas_Object_Pointer_Data *obj_pdata; - - if (!obj->layer) return EINA_FALSE; - pdata = _evas_pointer_data_by_device_get(obj->layer->evas, dev); - if (!pdata) return EINA_FALSE; - obj_pdata = _evas_object_pointer_data_get(pdata, obj); - return obj_pdata ? obj_pdata->mouse_in : EINA_FALSE; -} - EOLIAN static Eina_Bool _efl_canvas_object_pointer_coords_inside_get(Eo *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Evas_Coord x, Evas_Coord y) { @@ -2695,12 +2682,6 @@ _efl_canvas_object_pointer_coords_inside_get(Eo *eo_obj EINA_UNUSED, Evas_Object return RECTS_INTERSECT(x, y, 1, 1, c.x, c.y, c.w, c.h); } -EOLIAN static Eina_Bool -_efl_canvas_object_pointer_inside_get(Eo *eo_obj, Evas_Object_Protected_Data *obj) -{ - return _efl_canvas_object_pointer_inside_by_device_get(eo_obj, obj, NULL); -} - static void _is_frame_flag_set(Evas_Object_Protected_Data *obj, Eina_Bool is_frame) { @@ -2980,6 +2961,21 @@ evas_object_scale_get(const Evas_Object *obj) return efl_gfx_scale_get(obj); } +EAPI Eina_Bool +evas_object_pointer_inside_by_device_get(const Evas_Object *eo_obj, Efl_Input_Device *dev) +{ + Evas_Object_Protected_Data *obj = EVAS_OBJ_GET_OR_RETURN(eo_obj, EINA_FALSE); + + obj->is_pointer_inside_legacy = EINA_TRUE; + return efl_canvas_pointer_inside_get(eo_obj, dev); +} + +EAPI Eina_Bool +evas_object_pointer_inside_get(const Evas_Object *eo_obj) +{ + return evas_object_pointer_inside_by_device_get(eo_obj, NULL); +} + /* Internal EO APIs and hidden overrides */ EOAPI EFL_VOID_FUNC_BODY(efl_canvas_object_legacy_ctor) diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 6753931f34..a9bd98196c 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1209,6 +1209,7 @@ struct _Evas_Object_Protected_Data } parent_cache; Eina_Bool events_filter_enabled : 1; + Eina_Bool is_pointer_inside_legacy : 1; }; struct _Evas_Data_Node