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
This commit is contained in:
Hosang Kim 2019-04-26 13:24:01 +09:00 committed by Hermet Park
parent 3cc9fc481c
commit c006589607
2 changed files with 78 additions and 22 deletions

View File

@ -460,6 +460,7 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
Eina_Vector2 point;
int addgrab = 0;
int no_rep = 0;
int srcgrab = 0;
if (obj->delete_me || src->delete_me || e->is_frozen) return;
@ -472,31 +473,52 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e,
ev->source = eo_obj;
ev->tool = 0;
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
{
if (proxy_write->src_event_in)
proxy_write->src_event_in = eina_list_free(proxy_write->src_event_in);
Evas_Object_Pointer_Data *obj_pdata;
if (src->is_smart)
child = efl_data_scope_get(eo_child, EFL_CANVAS_OBJECT_CLASS);
obj_pdata = _evas_object_pointer_data_get(pdata, child);
if (!obj_pdata)
{
proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in,
evas_object_smart_members_get_direct(eo_src), NULL,
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
}
else if (src->is_event_parent)
{
proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in,
NULL, evas_object_event_grabber_members_list(eo_src),
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
}
else
proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src);
ERR("Could not find the object pointer data for device %p",
ev->device);
continue;
}
srcgrab += obj_pdata->mouse_grabbed;
}
EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
if (srcgrab == 0)
{
EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write)
{
if (proxy_write->src_event_in)
proxy_write->src_event_in = eina_list_free(proxy_write->src_event_in);
if (src->is_smart)
{
proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in,
evas_object_smart_members_get_direct(eo_src), NULL,
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
}
else if (src->is_event_parent)
{
proxy_write->src_event_in = _evas_event_object_list_raw_in_get
(eo_e, proxy_write->src_event_in,
NULL, evas_object_event_grabber_members_list(eo_src),
NULL, ev->cur.x, ev->cur.y, &no_rep, EINA_TRUE);
}
else
proxy_write->src_event_in = eina_list_append(proxy_write->src_event_in, eo_src);
}
EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write);
}
if (pdata->seat->mouse_grabbed == 0)
{
if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
}
EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
{
@ -960,7 +982,10 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi
ev->source = obj->object;
ev->action = EFL_POINTER_ACTION_DOWN;
if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
if (pdata->seat->mouse_grabbed == 0)
{
if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1;
}
EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child)
{

View File

@ -111,6 +111,33 @@ _evas_device_del_cb(void *data, const Efl_Event *ev)
_evas_object_pointer_grab_del(obj, pdata);
}
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)