efl.canvas.object: implement pointer_inside of Efl.Canvas.Pointer.

remove eo apis pointer_in, pointer_device_in, pointer_inside_get &
pointer_inside_by_device_get and add legacy APIs for
pointer_inside_get & pointer_inside_by_device_get.
These four APIs do almost same things.
This commit is contained in:
Amitesh Singh 2017-12-08 16:04:18 +09:00
parent 80463f0e2e
commit b734c132f9
6 changed files with 59 additions and 96 deletions

View File

@ -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);
}

View File

@ -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"

View File

@ -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; }
}
}

View File

@ -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)
{

View File

@ -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)

View File

@ -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