From 0b27fd8dfddd5c305d6d186dda8cef0dc6b8c172 Mon Sep 17 00:00:00 2001 From: Jaehyun Cho Date: Thu, 2 Aug 2018 18:16:46 +0900 Subject: [PATCH] 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 --- src/lib/evas/canvas/evas_events.c | 45 +++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 3a27cf5b65..b670c60e02 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -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);