evas_events: Fix to set mouse_in state to all pointers in the seat.

Summary:
mouse coordinate is set by seat.
Therefore, mouse_in state should be set based on seat.
As a result, mouse_in state of all pointers in the seat should be
updated at the same time.

Reviewers: eagleeye, devilhorns, zmike

Reviewed By: eagleeye, devilhorns, zmike

Subscribers: devilhorns, Hermet, kimcinoo, cedric, iscaro, zmike, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D6699
This commit is contained in:
Jaehyun Cho 2018-08-02 18:16:46 +09:00
parent dbc2c880a8
commit 0b27fd8dfd
1 changed files with 31 additions and 14 deletions

View File

@ -554,6 +554,23 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
efl_unref(evt);
}
static void
_evas_event_mouse_in_set(Evas_Pointer_Seat *pseat,
Evas_Object_Protected_Data *obj, Eina_Bool mouse_in)
{
Evas_Pointer_Data *pdata;
Evas_Object_Pointer_Data *obj_pdata;
if ((!pseat) || (!obj)) return;
EINA_INLIST_FOREACH(pseat->pointers, pdata)
{
obj_pdata = _evas_object_pointer_data_get(pdata, obj);
if (obj_pdata)
obj_pdata->mouse_in = mouse_in;
}
}
static void
_evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
Efl_Input_Pointer *parent_ev,
@ -639,7 +656,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
if ((obj_pdata->mouse_grabbed == 0) && (!e->delete_me))
{
if (obj_pdata->mouse_in) continue; /* FIXME: dubious logic! */
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, child, 0);
if (e->is_frozen) continue;
ev->cur = curpt_real;
_evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
@ -702,7 +719,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
}
else if (obj_pdata->mouse_in)
{
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, child, 0);
if (e->is_frozen) continue;
ev->cur = curpt;
_evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
@ -731,7 +748,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e,
{
if (!obj_pdata->mouse_in)
{
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, child, 1);
if (e->is_frozen) continue;
ev->cur = curpt;
_evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
@ -1222,7 +1239,7 @@ _evas_event_source_mouse_in_events(Evas_Object *eo_obj, Evas *eo_e,
if (!eina_list_data_find(src->proxy->src_event_in, eo_child))
{
if (obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, child, 1);
ev->cur = point;
_evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed);
ev->action = EFL_POINTER_ACTION_IN;
@ -1292,7 +1309,7 @@ _evas_event_source_mouse_out_events(Evas_Object *eo_obj, Evas *eo_e,
}
if (!obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, child, 0);
if (child->delete_me) continue;
ev->cur = point;
@ -1620,7 +1637,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
continue;
}
if (!obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, obj, 0);
if (!e->is_frozen)
{
ev->cur.x = pdata->seat->x;
@ -1658,7 +1675,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev,
continue;
}
if (obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, obj_itr, 1);
if (e->is_frozen) continue;
ev->cur.x = pdata->seat->x;
ev->cur.y = pdata->seat->y;
@ -2199,7 +2216,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
if ((obj_pdata->mouse_grabbed == 0) && (!e->delete_me))
{
if (!obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, obj, 0);
if (obj->delete_me || e->is_frozen) continue;
pdata->seat->object.in = eina_list_remove(pdata->seat->object.in, eo_obj);
ev->cur = point;
@ -2259,7 +2276,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
/* otherwise it has left the object */
else if (obj_pdata->mouse_in)
{
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, obj, 0);
if (e->is_frozen) continue;
ev->cur = point;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
@ -2293,7 +2310,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da
}
if (!obj_pdata->mouse_in)
{
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, obj, 1);
if (e->is_frozen) continue;
ev->cur = point;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
@ -2404,7 +2421,7 @@ nogrep:
{
/* otherwise it has left the object */
if (!obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, obj, 0);
if (e->is_frozen) continue;
ev->cur = point;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
@ -2436,7 +2453,7 @@ nogrep:
continue;
}
if (obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, obj, 1);
if (e->is_frozen) continue;
ev->cur = point;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
@ -2575,7 +2592,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
continue;
}
if (obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 1;
_evas_event_mouse_in_set(pdata->seat, obj, 1);
ev->cur.x = pdata->seat->x;
ev->cur.y = pdata->seat->y;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);
@ -2672,7 +2689,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev)
continue;
}
if (!obj_pdata->mouse_in) continue;
obj_pdata->mouse_in = 0;
_evas_event_mouse_in_set(pdata->seat, obj, 0);
ev->cur.x = pdata->seat->x;
ev->cur.y = pdata->seat->y;
_evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed);