diff options
author | Hosang Kim <hosang12.kim@samsung.com> | 2019-04-26 13:24:01 +0900 |
---|---|---|
committer | Hermet Park <hermetpark@gmail.com> | 2019-04-26 13:24:01 +0900 |
commit | c006589607c78dd18ed1634f0696d63db0f47727 (patch) | |
tree | 7c9ad3c01284fff8533c74c6eca77d54f656bc33 /src/lib/evas/canvas/evas_object_main.c | |
parent | 3cc9fc481caaae5fa941bff2f43d5f0f5d0bdb25 (diff) | |
download | efl-c006589607c78dd18ed1634f0696d63db0f47727.tar.gz |
evas_events: fix grab count does not become 0 with proxy object.
Summary:
1. src_event_in should not be initialized when grabbed object exists.
2. when object of pointer grab is deleted and if object has proxy,
proxy object of pointer grab should be deleted together.
Reviewers: Hermet
Reviewed By: Hermet
Subscribers: zmike, cedric, #reviewers, #committers
Tags: #efl
Differential Revision: https://phab.enlightenment.org/D8698
Diffstat (limited to 'src/lib/evas/canvas/evas_object_main.c')
-rw-r--r-- | src/lib/evas/canvas/evas_object_main.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index ad0eaf82d6..07193790ba 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -112,6 +112,33 @@ _evas_device_del_cb(void *data, const Efl_Event *ev) } static void +_evas_object_proxy_grab_del(Evas_Object_Protected_Data *obj, + Evas_Object_Pointer_Data *pdata) +{ + Evas_Object *eo_src = _evas_object_image_source_get(obj->object); + Evas_Object_Protected_Data *src = efl_data_scope_get(eo_src, EFL_CANVAS_OBJECT_CLASS); + Eina_List *copy = eina_list_clone(src->proxy->src_event_in); + Eina_List *l; + Evas_Object *eo_child; + EINA_LIST_FOREACH(copy, l, eo_child) + { + Evas_Object_Protected_Data *child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS); + if (!child) continue; + Evas_Object_Pointer_Data *obj_pdata = _evas_object_pointer_data_get(pdata->evas_pdata, child); + if (!obj_pdata) + continue; + if (obj_pdata->mouse_grabbed > 0) + { + pdata->evas_pdata->seat->mouse_grabbed -= obj_pdata->mouse_grabbed; + obj_pdata->mouse_grabbed = 0; + EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write) + proxy_write->src_event_in = eina_list_remove(proxy_write->src_event_in, eo_child); + EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write); + } + } +} + +static void _evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, Evas_Object_Pointer_Data *pdata) { @@ -119,7 +146,11 @@ _evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, pdata->evas_pdata->seat->mouse_grabbed -= pdata->mouse_grabbed; if (((pdata->mouse_in) || (pdata->mouse_grabbed > 0)) && (obj->layer) && (obj->layer->evas)) - pdata->evas_pdata->seat->object.in = eina_list_remove(pdata->evas_pdata->seat->object.in, obj->object); + { + pdata->evas_pdata->seat->object.in = eina_list_remove(pdata->evas_pdata->seat->object.in, obj->object); + if (obj->proxy->is_proxy && obj->proxy->src_events) + _evas_object_proxy_grab_del(obj, pdata); + } efl_event_callback_del(pdata->evas_pdata->pointer, EFL_EVENT_DEL, _evas_device_del_cb, obj->object); EINA_COW_WRITE_BEGIN(evas_object_events_cow, obj->events, Evas_Object_Events_Data, events) |