diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index c73e81cfd4..5c771575ac 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -447,7 +447,7 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, } EINA_COW_WRITE_END(evas_object_proxy_cow, src->proxy, proxy_write); - if (pdata->downs > 1) addgrab = pdata->downs - 1; + if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1; EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child) { @@ -465,11 +465,11 @@ _evas_event_source_mouse_down_events(Evas_Object *eo_obj, Evas *eo_e, (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) { obj_pdata->mouse_grabbed += (addgrab + 1); - pdata->mouse_grabbed += (addgrab + 1); + pdata->seat->mouse_grabbed += (addgrab + 1); if (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) { - pdata->nogrep++; + pdata->seat->nogrep++; break; } } @@ -535,7 +535,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, ev->source = eo_obj; ev->tool = 0; - if (pdata->mouse_grabbed) + if (pdata->seat->mouse_grabbed) { Eina_List *outs = NULL; Eina_List *copy = evas_event_list_copy(src->proxy->src_event_in); @@ -695,7 +695,7 @@ _evas_event_source_mouse_move_events(Evas_Object *eo_obj, Evas *eo_e, } } - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write) { @@ -761,7 +761,7 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e, (obj_pdata->mouse_grabbed > 0)) { obj_pdata->mouse_grabbed--; - pdata->mouse_grabbed--; + pdata->seat->mouse_grabbed--; } ev->cur = point; @@ -772,7 +772,7 @@ _evas_event_source_mouse_up_events(Evas_Object *eo_obj, Evas *eo_e, if (e->delete_me) break; if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) { - if (pdata->nogrep > 0) pdata->nogrep--; + if (pdata->seat->nogrep > 0) pdata->seat->nogrep--; break; } } @@ -890,7 +890,7 @@ _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->downs > 1) addgrab = pdata->downs - 1; + if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1; EINA_LIST_FOREACH(src->proxy->src_event_in, l, eo_child) { @@ -905,7 +905,7 @@ _evas_event_source_multi_down_events(Evas_Object_Protected_Data *obj, Evas_Publi if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) { obj_pdata->mouse_grabbed += (addgrab + 1); - pdata->mouse_grabbed += (addgrab + 1); + pdata->seat->mouse_grabbed += (addgrab + 1); } } @@ -976,7 +976,7 @@ _evas_event_source_multi_up_events(Evas_Object_Protected_Data *obj, Evas_Public_ (obj_pdata->mouse_grabbed > 0)) { obj_pdata->mouse_grabbed--; - pdata->mouse_grabbed--; + pdata->seat->mouse_grabbed--; } ev->cur = point; _evas_event_havemap_adjust_f(eo_child, child, &ev->cur, obj_pdata->mouse_grabbed); @@ -1019,7 +1019,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi /* Why a new event id here? Other 'source' events keep the same id. */ event_id = _evas_object_event_new(); - if (pdata->mouse_grabbed > 0) + if (pdata->seat->mouse_grabbed > 0) { copy = evas_event_list_copy(src->proxy->src_event_in); EINA_LIST_FOREACH(copy, l, eo_child) @@ -1091,7 +1091,7 @@ _evas_event_source_multi_move_events(Evas_Object_Protected_Data *obj, Evas_Publi } } eina_list_free(copy); - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { EINA_COW_WRITE_BEGIN(evas_object_proxy_cow, src->proxy, Evas_Object_Proxy_Data, proxy_write) { @@ -1320,7 +1320,7 @@ _canvas_event_thaw_eval_internal(Eo *eo_e, Evas_Public_Data *e) { Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, NULL); if (!pdata) return; - _canvas_event_feed_mouse_move_legacy(eo_e, e, pdata->x, pdata->y, + _canvas_event_feed_mouse_move_legacy(eo_e, e, pdata->seat->x, pdata->seat->y, e->last_timestamp, NULL); } @@ -1413,11 +1413,11 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da b = ev->button; DBG("ButtonEvent:down time=%u x=%d y=%d button=%d downs=%d", - ev->timestamp, pdata->x, pdata->y, b, pdata->downs); + ev->timestamp, pdata->seat->x, pdata->seat->y, b, pdata->seat->downs); if ((b < 1) || (b > 32)) return; pdata->button |= (1u << (b - 1)); - pdata->downs++; + pdata->seat->downs++; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; @@ -1426,8 +1426,8 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da event_id = _evas_object_event_new(); - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; @@ -1438,24 +1438,24 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da _evas_walk(e); /* append new touch point to the touch point list */ - _evas_touch_point_append(e->evas, 0, pdata->x, pdata->y); + _evas_touch_point_append(e->evas, 0, pdata->seat->x, pdata->seat->y); /* If this is the first finger down, i.e no other fingers pressed, * get a new event list, otherwise, keep the current grabbed list. */ - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { Eina_List *ins = evas_event_objects_event_list(eo_e, NULL, - pdata->x, - pdata->y); + pdata->seat->x, + pdata->seat->y); /* free our old list of ins */ - pdata->object.in = eina_list_free(pdata->object.in); + pdata->seat->object.in = eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = ins; + pdata->seat->object.in = ins; /* adjust grabbed count by the nuymber of currently held down * fingers/buttons */ - if (pdata->downs > 1) addgrab = pdata->downs - 1; + if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1; } - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -1471,10 +1471,10 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN)) { obj_pdata->mouse_grabbed += addgrab + 1; - pdata->mouse_grabbed += addgrab + 1; + pdata->seat->mouse_grabbed += addgrab + 1; if (obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) { - pdata->nogrep++; + pdata->seat->nogrep++; break; } } @@ -1491,8 +1491,8 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da ev->device); continue; } - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; pointer_mode = obj_pdata->pointer_mode; _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_DOWN, evt, @@ -1507,7 +1507,7 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da e->last_mouse_down_counter++; _evas_post_event_callback_call(eo_e, e, event_id); /* update touch point's state to EVAS_TOUCH_POINT_STILL */ - _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_STILL); + _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_STILL); _evas_unwalk(e); if (ev->device) efl_unref(ev->device); @@ -1536,13 +1536,13 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, ev->action = EFL_POINTER_ACTION_OUT; /* get new list of ins */ - ins = evas_event_objects_event_list(eo_e, NULL, pdata->x, pdata->y); + ins = evas_event_objects_event_list(eo_e, NULL, pdata->seat->x, pdata->seat->y); /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, ll, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - if ((!eina_list_data_find(ins, eo_obj)) || (!pdata->inside)) + if ((!eina_list_data_find(ins, eo_obj)) || (!pdata->seat->inside)) { obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) @@ -1555,8 +1555,8 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, obj_pdata->mouse_in = 0; if (!e->is_frozen) { - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + 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); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt, event_id, EFL_EVENT_POINTER_OUT); @@ -1570,7 +1570,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, eina_list_free(copy); - if (pdata->inside) + if (pdata->seat->inside) { Evas_Object *eo_obj_itr; @@ -1580,7 +1580,7 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, EINA_LIST_FOREACH(ins, l, eo_obj_itr) { Evas_Object_Protected_Data *obj_itr = efl_data_scope_get(eo_obj_itr, EFL_CANVAS_OBJECT_CLASS); - if (!eina_list_data_find(pdata->object.in, eo_obj_itr)) + if (!eina_list_data_find(pdata->seat->object.in, eo_obj_itr)) { obj_pdata = _evas_object_pointer_data_get(pdata, obj_itr); if (!obj_pdata) @@ -1592,8 +1592,8 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, if (obj_pdata->mouse_in) continue; obj_pdata->mouse_in = 1; if (e->is_frozen) continue; - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; _evas_event_havemap_adjust_f(eo_obj_itr, obj_itr, &ev->cur, obj_pdata->mouse_grabbed); evas_object_event_callback_call(eo_obj_itr, obj_itr, EVAS_CALLBACK_MOUSE_IN, evt, event_id, EFL_EVENT_POINTER_IN); @@ -1610,19 +1610,19 @@ _post_up_handle(Evas_Public_Data *e, Efl_Input_Pointer *parent_ev, ins = eina_list_free(ins); } - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { /* free our old list of ins */ - eina_list_free(pdata->object.in); + eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = ins; + pdata->seat->object.in = ins; } else { /* free our cur ins */ eina_list_free(ins); } - if (pdata->inside) + if (pdata->seat->inside) _evas_canvas_event_pointer_move_event_dispatch(e, pdata, ev->data); efl_del(evt); @@ -1653,12 +1653,12 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data b = ev->button; DBG("ButtonEvent:up time=%u x=%d y=%d button=%d downs=%d", - ev->timestamp, pdata->x, pdata->y, b, pdata->downs); + ev->timestamp, pdata->seat->x, pdata->seat->y, b, pdata->seat->downs); if ((b < 1) || (b > 32)) return; - if (pdata->downs <= 0) return; + if (pdata->seat->downs <= 0) return; pdata->button &= ~(1u << (b - 1)); - pdata->downs--; + pdata->seat->downs--; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; @@ -1667,8 +1667,8 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data event_id = _evas_object_event_new(); - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; @@ -1678,8 +1678,8 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data _evas_walk(e); /* update released touch point */ - _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_UP); - copy = evas_event_list_copy(pdata->object.in); + _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_UP); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Pointer_Mode pointer_mode; @@ -1699,14 +1699,14 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data (obj_pdata->mouse_grabbed > 0)) { obj_pdata->mouse_grabbed--; - pdata->mouse_grabbed--; + pdata->seat->mouse_grabbed--; } pointer_mode = obj_pdata->pointer_mode; if ((!e->is_frozen) && (!evas_event_freezes_through(eo_obj, obj))) { - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + 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); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_UP, evt, event_id, EFL_EVENT_POINTER_UP); @@ -1716,7 +1716,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data } if (pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) { - if (pdata->nogrep > 0) pdata->nogrep--; + if (pdata->seat->nogrep > 0) pdata->seat->nogrep--; break; } } @@ -1724,13 +1724,13 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data e->last_mouse_up_counter++; _evas_post_event_callback_call(eo_e, e, event_id); - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) _post_up_handle(e, evt, pdata); - if (pdata->mouse_grabbed < 0) + if (pdata->seat->mouse_grabbed < 0) { - ERR("BUG? pdata->mouse_grabbed (=%d) < 0!", - pdata->mouse_grabbed); + ERR("BUG? pdata->seat->mouse_grabbed (=%d) < 0!", + pdata->seat->mouse_grabbed); } /* remove released touch point from the touch point list */ _evas_touch_point_remove(eo_e, 0); @@ -1910,8 +1910,8 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) if (!ev) return; // adjust missing data based on evas state - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; @@ -1919,7 +1919,7 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) ev->value_flags |= value_flags; _evas_walk(e); - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { @@ -1934,8 +1934,8 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) ev->device); continue; } - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + 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); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_WHEEL, evt, event_id, EFL_EVENT_POINTER_WHEEL); @@ -2008,17 +2008,17 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da e->last_timestamp = ev->timestamp; // prev pos - pdata->prev.x = pdata->x; - pdata->prev.y = pdata->y; - px = ev->prev.x = pdata->x; - py = ev->prev.y = pdata->y; + pdata->seat->prev.x = pdata->seat->x; + pdata->seat->prev.y = pdata->seat->y; + px = ev->prev.x = pdata->seat->x; + py = ev->prev.y = pdata->seat->y; // new pos - x = pdata->x = ev->cur.x; - y = pdata->y = ev->cur.y; + x = pdata->seat->x = ev->cur.x; + y = pdata->seat->y = ev->cur.y; point = ev->cur; - if ((!pdata->inside) && (pdata->mouse_grabbed == 0)) return; + if ((!pdata->seat->inside) && (pdata->seat->mouse_grabbed == 0)) return; evt = ev->eo; ev->modifiers = &(e->modifiers); @@ -2032,9 +2032,9 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da _evas_walk(e); /* update moved touch point */ if ((px != x) || (py != y)) - _evas_touch_point_update(eo_e, 0, pdata->x, pdata->y, EVAS_TOUCH_POINT_MOVE); + _evas_touch_point_update(eo_e, 0, pdata->seat->x, pdata->seat->y, EVAS_TOUCH_POINT_MOVE); /* if our mouse button is grabbed to any objects */ - if (pdata->mouse_grabbed > 0) + if (pdata->seat->mouse_grabbed > 0) { Eina_List *outs = NULL; @@ -2044,7 +2044,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da event_id = _evas_object_event_new(); /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -2077,7 +2077,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da else outs = eina_list_append(outs, eo_obj); if ((obj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) && - (pdata->nogrep > 0)) + (pdata->seat->nogrep > 0)) { eina_list_free(copy); eina_list_free(outs); @@ -2110,7 +2110,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (!obj_pdata->mouse_in) continue; obj_pdata->mouse_in = 0; if (obj->delete_me || e->is_frozen) continue; - pdata->object.in = eina_list_remove(pdata->object.in, eo_obj); + pdata->seat->object.in = eina_list_remove(pdata->seat->object.in, eo_obj); ev->cur = point; _evas_event_havemap_adjust_f(eo_obj, obj, &ev->cur, obj_pdata->mouse_grabbed); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt, @@ -2130,7 +2130,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da /* get all new in objects */ ins = evas_event_objects_event_list(eo_e, NULL, x, y); /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -2197,7 +2197,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); /* if its not in the old list of ins send an enter event */ - if (!eina_list_data_find(pdata->object.in, eo_obj)) + if (!eina_list_data_find(pdata->seat->object.in, eo_obj)) { obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) @@ -2222,12 +2222,12 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da } } } - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { /* free our old list of ins */ - eina_list_free(pdata->object.in); + eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = ins; + pdata->seat->object.in = ins; } else { @@ -2246,7 +2246,7 @@ nogrep: event_id = _evas_object_event_new(); /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { if (eo_obj == nogrep_obj) @@ -2264,7 +2264,7 @@ nogrep: int norep = 0; ins = _evas_event_object_list_raw_in_get(eo_e, NULL, EINA_INLIST_GET(below_obj), NULL, - pdata->x, pdata->y, + pdata->seat->x, pdata->seat->y, &norep, EINA_FALSE); } @@ -2340,7 +2340,7 @@ nogrep: { obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); /* if its not in the old list of ins send an enter event */ - if (!eina_list_data_find(pdata->object.in, eo_obj)) + if (!eina_list_data_find(pdata->seat->object.in, eo_obj)) { obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) @@ -2363,9 +2363,9 @@ nogrep: } } /* free our old list of ins */ - eina_list_free(pdata->object.in); + eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = newin; + pdata->seat->object.in = newin; _evas_post_event_callback_call(eo_e, e, event_id); } @@ -2435,17 +2435,17 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) pdata = _evas_pointer_data_by_device_get(e, ev->device); if (!pdata) return; - pdata->inside = 1; + pdata->seat->inside = 1; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; - if (pdata->mouse_grabbed != 0) return; + if (pdata->seat->mouse_grabbed != 0) return; evt = ev->eo; ev->action = EFL_POINTER_ACTION_IN; ev->pressed_buttons = pdata->button; - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; @@ -2456,12 +2456,12 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) _evas_walk(e); /* get new list of ins */ - ins = evas_event_objects_event_list(eo_e, NULL, pdata->x, pdata->y); + ins = evas_event_objects_event_list(eo_e, NULL, pdata->seat->x, pdata->seat->y); EINA_LIST_FOREACH(ins, l, eo_obj) { Evas_Object_Pointer_Data *obj_pdata; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - if (!eina_list_data_find(pdata->object.in, eo_obj)) + if (!eina_list_data_find(pdata->seat->object.in, eo_obj)) { obj_pdata = _evas_object_pointer_data_get(pdata, obj); if (!obj_pdata) @@ -2472,8 +2472,8 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) } if (obj_pdata->mouse_in) continue; obj_pdata->mouse_in = 1; - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + 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); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_IN, evt, event_id, EFL_EVENT_POINTER_IN); @@ -2483,9 +2483,9 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) } } /* free our old list of ins */ - pdata->object.in = eina_list_free(pdata->object.in); + pdata->seat->object.in = eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = ins; + pdata->seat->object.in = ins; _evas_post_event_callback_call(eo_e, e, event_id); _canvas_event_feed_mouse_move_internal(e, ev); _evas_unwalk(e); @@ -2514,7 +2514,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) EVAS_EVENT_FEED_SAFETY_CHECK(e); pdata = _evas_pointer_data_by_device_get(e, ev->device); if (!pdata) return; - pdata->inside = 0; + pdata->seat->inside = 0; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; @@ -2524,8 +2524,8 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) evt = ev->eo; ev->action = EFL_POINTER_ACTION_OUT; ev->pressed_buttons = pdata->button; - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; @@ -2535,7 +2535,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) _evas_walk(e); /* if our mouse button is inside any objects */ /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Pointer_Data *obj_pdata; @@ -2550,8 +2550,8 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) } if (!obj_pdata->mouse_in) continue; obj_pdata->mouse_in = 0; - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + 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); evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MOUSE_OUT, evt, event_id, EFL_EVENT_POINTER_OUT); @@ -2563,8 +2563,8 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) eina_list_free(copy); /* free our old list of ins */ - pdata->object.in = eina_list_free(pdata->object.in); - pdata->mouse_grabbed = 0; + pdata->seat->object.in = eina_list_free(pdata->seat->object.in); + pdata->seat->mouse_grabbed = 0; _evas_post_event_callback_call(eo_e, e, event_id); _evas_unwalk(e); @@ -2634,8 +2634,8 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (!pdata) return; eo_e = e->evas; DBG("ButtonEvent:multi down time=%u x=%.1f y=%.1f button=%d downs=%d", - ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->downs); - pdata->downs++; + ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->seat->downs); + pdata->seat->downs++; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; @@ -2653,11 +2653,11 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da _evas_walk(e); /* append new touch point to the touch point list */ _evas_touch_point_append(eo_e, ev->tool, ev->cur.x, ev->cur.y); - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { - if (pdata->downs > 1) addgrab = pdata->downs - 1; + if (pdata->seat->downs > 1) addgrab = pdata->seat->downs - 1; } - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -2671,7 +2671,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (obj_pdata->pointer_mode != EVAS_OBJECT_POINTER_MODE_NOGRAB) { obj_pdata->mouse_grabbed += addgrab + 1; - pdata->mouse_grabbed += addgrab + 1; + pdata->seat->mouse_grabbed += addgrab + 1; } } EINA_LIST_FOREACH(copy, l, eo_obj) @@ -2726,9 +2726,9 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data if (!pdata) return; eo_e = e->evas; DBG("ButtonEvent:multi up time=%u x=%.1f y=%.1f device=%d downs=%d", - ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->downs); - if (pdata->downs <= 0) return; - pdata->downs--; + ev->timestamp, ev->cur.x, ev->cur.y, ev->tool, pdata->seat->downs); + if (pdata->seat->downs <= 0) return; + pdata->seat->downs--; if (e->is_frozen) return; e->last_timestamp = ev->timestamp; @@ -2746,7 +2746,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data _evas_walk(e); /* update released touch point */ _evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_UP); - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Pointer_Data *obj_pdata; @@ -2765,7 +2765,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data (obj_pdata->mouse_grabbed > 0)) { obj_pdata->mouse_grabbed--; - pdata->mouse_grabbed--; + pdata->seat->mouse_grabbed--; } evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_MULTI_UP, evt, event_id, EFL_EVENT_FINGER_UP); @@ -2774,7 +2774,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data if (e->delete_me || e->is_frozen) break; } eina_list_free(copy); - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { _post_up_handle(e, evt, pdata); _evas_post_event_callback_call(eo_e, e, event_id); @@ -2911,7 +2911,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (e->is_frozen) return; e->last_timestamp = ev->timestamp; - if ((!pdata->inside) && (pdata->mouse_grabbed == 0)) return; + if ((!pdata->seat->inside) && (pdata->seat->mouse_grabbed == 0)) return; evt = ev->eo; ev->modifiers = &(e->modifiers); @@ -2927,10 +2927,10 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da /* update moved touch point */ _evas_touch_point_update(eo_e, ev->tool, ev->cur.x, ev->cur.y, EVAS_TOUCH_POINT_MOVE); /* if our mouse button is grabbed to any objects */ - if (pdata->mouse_grabbed > 0) + if (pdata->seat->mouse_grabbed > 0) { /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -2969,7 +2969,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da /* get all new in objects */ ins = evas_event_objects_event_list(eo_e, NULL, ev->cur.x, ev->cur.y); /* go thru old list of in objects */ - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -3006,12 +3006,12 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da if (e->delete_me || e->is_frozen) break; } eina_list_free(copy); - if (pdata->mouse_grabbed == 0) + if (pdata->seat->mouse_grabbed == 0) { /* free our old list of ins */ - eina_list_free(pdata->object.in); + eina_list_free(pdata->seat->object.in); /* and set up the new one */ - pdata->object.in = ins; + pdata->seat->object.in = ins; } else { @@ -3375,7 +3375,7 @@ evas_event_feed_hold(Eo *eo_e, int hold, unsigned int timestamp, const void *dat _evas_walk(e); - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -3426,7 +3426,7 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D if (ev->device) efl_ref(ev->device); _evas_walk(e); - copy = evas_event_list_copy(pdata->object.in); + copy = evas_event_list_copy(pdata->seat->object.in); EINA_LIST_FOREACH(copy, l, eo_obj) { @@ -3573,15 +3573,15 @@ _feed_mouse_move_eval_internal(Eo *eo_obj, Evas_Object_Protected_Data *obj) Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(evas, NULL); if (!pdata) return; - in_output_rect = evas_object_is_in_output_rect(eo_obj, obj, pdata->x, - pdata->y, 1, 1); + in_output_rect = evas_object_is_in_output_rect(eo_obj, obj, pdata->seat->x, + pdata->seat->y, 1, 1); if ((in_output_rect) && ((!obj->precise_is_inside) || (evas_object_is_inside(eo_obj, obj, - pdata->x, - pdata->y)))) + pdata->seat->x, + pdata->seat->y)))) { _canvas_event_feed_mouse_move_legacy(evas->evas, evas, - pdata->x, pdata->y, + pdata->seat->x, pdata->seat->y, evas->last_timestamp, NULL); } } @@ -3666,7 +3666,7 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ if (obj_pdata->pointer_mode == setting) return EINA_FALSE; /* adjust by number of pointer down events */ - addgrab = pdata->downs; + addgrab = pdata->seat->downs; switch (obj_pdata->pointer_mode) { /* nothing needed */ @@ -3674,13 +3674,13 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ /* decrement canvas nogrep (NO Grab/REPeat) counter */ case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN: if (obj_pdata->mouse_grabbed) - pdata->nogrep--; + pdata->seat->nogrep--; /* fall through */ /* remove related grabs from canvas and object */ case EVAS_OBJECT_POINTER_MODE_AUTOGRAB: if (obj_pdata->mouse_grabbed) { - pdata->mouse_grabbed -= obj_pdata->mouse_grabbed; + pdata->seat->mouse_grabbed -= obj_pdata->mouse_grabbed; obj_pdata->mouse_grabbed = 0; } } @@ -3691,13 +3691,13 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ case EVAS_OBJECT_POINTER_MODE_NOGRAB: break; /* increment canvas nogrep (NO Grab/REPeat) counter */ case EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN: - pdata->nogrep++; + pdata->seat->nogrep++; /* having nogrep set indicates that any object following it in * the pointer.object.in list will not be receiving events, meaning * that they will fail to unset any existing grabs/flags. unset them * now to avoid breaking the canvas */ - EINA_LIST_FOREACH(pdata->object.in, l, cobj) + EINA_LIST_FOREACH(pdata->seat->object.in, l, cobj) { Evas_Object_Protected_Data *cobj_data; @@ -3712,9 +3712,9 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ if (!cobj_pdata) continue; if (!cobj_pdata->mouse_grabbed) continue; cobj_pdata->mouse_grabbed -= addgrab; - pdata->mouse_grabbed -= addgrab; + pdata->seat->mouse_grabbed -= addgrab; if (cobj_pdata->pointer_mode == EVAS_OBJECT_POINTER_MODE_NOGRAB_NO_REPEAT_UPDOWN) - pdata->nogrep--; + pdata->seat->nogrep--; } break; } @@ -3722,7 +3722,7 @@ _efl_canvas_object_pointer_mode_by_device_set(Eo *eo_obj, Evas_Object_Protected_ /* add all button grabs to this object */ case EVAS_OBJECT_POINTER_MODE_AUTOGRAB: obj_pdata->mouse_grabbed += addgrab; - pdata->mouse_grabbed += addgrab; + pdata->seat->mouse_grabbed += addgrab; } obj_pdata->pointer_mode = setting; return EINA_TRUE; @@ -3787,7 +3787,7 @@ _efl_canvas_object_pointer_device_in_get(Eo *eo_obj, /* 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. */ - EINA_LIST_FOREACH(pdata->object.in, l, eo_in) + EINA_LIST_FOREACH(pdata->seat->object.in, l, eo_in) { if (EINA_UNLIKELY(eo_in == eo_obj)) return EINA_TRUE; @@ -3906,7 +3906,7 @@ _evas_canvas_event_down_count_by_device_get(Eo *eo_e EINA_UNUSED, Evas_Public_Da { Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev); EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, 0); - return pdata->downs; + return pdata->seat->downs; } EOLIAN int @@ -4083,8 +4083,8 @@ _evas_canvas_event_pointer_move_event_dispatch(Evas_Public_Data *edata, ev->data = (void *) data; ev->timestamp = edata->last_timestamp; ev->device = efl_ref(pdata->pointer); - ev->cur.x = pdata->x; - ev->cur.y = pdata->y; + ev->cur.x = pdata->seat->x; + ev->cur.y = pdata->seat->y; _canvas_event_feed_mouse_move_internal(edata, ev); @@ -4104,10 +4104,10 @@ _evas_canvas_event_pointer_in_rect_mouse_move_feed(Evas_Public_Data *edata, EINA_LIST_FOREACH(edata->pointers, l, pdata) { - if (!evas_object_is_in_output_rect(obj, obj_data, pdata->x, - pdata->y, w, h)) + if (!evas_object_is_in_output_rect(obj, obj_data, pdata->seat->x, + pdata->seat->y, w, h)) continue; - if ((in_objects_list && eina_list_data_find(pdata->object.in, obj)) || !in_objects_list) + if ((in_objects_list && eina_list_data_find(pdata->seat->object.in, obj)) || !in_objects_list) _evas_canvas_event_pointer_move_event_dispatch(edata, pdata, data); } } @@ -4126,8 +4126,8 @@ _evas_canvas_event_pointer_in_list_mouse_move_feed(Evas_Public_Data *edata, EINA_LIST_FOREACH(edata->pointers, l, pdata) { - int in = evas_object_is_in_output_rect(obj, obj_data, pdata->x, - pdata->y, w, h); + int in = evas_object_is_in_output_rect(obj, obj_data, pdata->seat->x, + pdata->seat->y, w, h); Evas_Pointer_Data *found = eina_list_data_find(was, pdata); if ((xor_rule && ((in && !found) || (!in && found))) || diff --git a/src/lib/evas/canvas/evas_events_legacy.c b/src/lib/evas/canvas/evas_events_legacy.c index d4f414610a..e7cd5d742e 100644 --- a/src/lib/evas/canvas/evas_events_legacy.c +++ b/src/lib/evas/canvas/evas_events_legacy.c @@ -47,9 +47,9 @@ efl_input_pointer_legacy_info_fill(Evas *eo_evas, Efl_Input_Key *eo_ev, Evas_Cal pdata = _evas_pointer_data_by_device_get(evas, ev->device); EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL); -#define COORD_DUP(e) do { (e)->output.x = pdata->x; (e)->output.y = pdata->y; } while (0) -#define COORD_DUP_CUR(e) do { (e)->cur.output.x = pdata->x; (e)->cur.output.y = pdata->y; } while (0) -#define COORD_DUP_PREV(e) do { (e)->prev.output.x = pdata->prev.x; (e)->prev.output.y = pdata->prev.y; } while (0) +#define COORD_DUP(e) do { (e)->output.x = pdata->seat->x; (e)->output.y = pdata->seat->y; } while (0) +#define COORD_DUP_CUR(e) do { (e)->cur.output.x = pdata->seat->x; (e)->cur.output.y = pdata->seat->y; } while (0) +#define COORD_DUP_PREV(e) do { (e)->prev.output.x = pdata->seat->prev.x; (e)->prev.output.y = pdata->seat->prev.y; } while (0) #define TYPE_CHK(typ) do { if ((type != EVAS_CALLBACK_LAST) && (type != EVAS_CALLBACK_ ## typ)) return NULL; } while (0) switch (ev->action) diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index cda9551c1a..7f8b2b8501 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -400,10 +400,10 @@ _evas_canvas_efl_object_destructor(Eo *eo_e, Evas_Public_Data *e) _evas_device_cleanup(eo_e); e->focused_by = eina_list_free(e->focused_by); - EINA_LIST_FREE(e->pointers, pdata) + while (e->pointers) { - eina_list_free(pdata->object.in); - free(pdata); + pdata = eina_list_data_get(e->pointers); + _evas_pointer_data_remove(e, pdata->pointer); } eina_lock_free(&(e->lock_objects)); @@ -550,8 +550,8 @@ _evas_canvas_pointer_output_xy_by_device_get(Eo *eo_e EINA_UNUSED, } else { - if (x) *x = pdata->x; - if (y) *y = pdata->y; + if (x) *x = pdata->seat->x; + if (y) *y = pdata->seat->y; } } @@ -571,8 +571,8 @@ _evas_canvas_pointer_canvas_xy_by_device_get(Eo *eo_e EINA_UNUSED, } else { - if (x) *x = pdata->x; - if (y) *y = pdata->y; + if (x) *x = pdata->seat->x; + if (y) *y = pdata->seat->y; } } @@ -593,7 +593,7 @@ _evas_canvas_pointer_inside_by_device_get(Eo *eo_e EINA_UNUSED, { Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, dev); if (!pdata) return EINA_FALSE; - return pdata->inside; + return pdata->seat->inside; } EOLIAN static void @@ -1142,12 +1142,36 @@ Eina_Bool _evas_pointer_data_add(Evas_Public_Data *edata, Efl_Input_Device *pointer) { Evas_Pointer_Data *pdata; + Evas_Pointer_Seat *pseat = NULL; + Eina_List *l; + Eo *seat; + seat = efl_input_device_seat_get(pointer); + EINA_SAFETY_ON_NULL_RETURN_VAL(pointer, EINA_FALSE); + EINA_LIST_FOREACH(edata->pointers, l, pdata) + if (pdata->seat->seat == seat) + { + pseat = pdata->seat; + break; + } + if (!pseat) + { + pseat = calloc(1, sizeof(Evas_Pointer_Seat)); + EINA_SAFETY_ON_NULL_RETURN_VAL(pseat, EINA_FALSE); + pseat->seat = seat; + } pdata = calloc(1, sizeof(Evas_Pointer_Data)); - EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, EINA_FALSE); + if (!pdata) + { + free(pseat); + ERR("alloc fail"); + return EINA_FALSE; + } pdata->pointer = pointer; edata->pointers = eina_list_append(edata->pointers, pdata); + pdata->seat = pseat; + pseat->pointers = eina_list_append(pseat->pointers, pdata); return EINA_TRUE; } @@ -1162,7 +1186,12 @@ _evas_pointer_data_remove(Evas_Public_Data *edata, Efl_Input_Device *pointer) if (pdata->pointer == pointer) { edata->pointers = eina_list_remove_list(edata->pointers, l); - eina_list_free(pdata->object.in); + pdata->seat->pointers = eina_list_remove(pdata->seat->pointers, pdata); + if (!pdata->seat->pointers) + { + eina_list_free(pdata->seat->object.in); + free(pdata->seat); + } free(pdata); break; } @@ -1179,8 +1208,8 @@ _evas_pointer_list_in_rect_get(Evas_Public_Data *edata, Evas_Object *obj, EINA_LIST_FOREACH(edata->pointers, l, pdata) { - if (evas_object_is_in_output_rect(obj, obj_data, pdata->x, - pdata->y, w, h)) + if (evas_object_is_in_output_rect(obj, obj_data, pdata->seat->x, + pdata->seat->y, w, h)) list = eina_list_append(list, pdata); } diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 7e5f476f94..0f323132f1 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -107,10 +107,10 @@ _evas_object_pointer_grab_del(Evas_Object_Protected_Data *obj, Evas_Object_Pointer_Data *pdata) { if ((pdata->mouse_grabbed > 0) && (obj->layer) && (obj->layer->evas)) - pdata->evas_pdata->mouse_grabbed -= pdata->mouse_grabbed; + 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->object.in = eina_list_remove(pdata->evas_pdata->object.in, obj->object); + pdata->evas_pdata->seat->object.in = eina_list_remove(pdata->evas_pdata->seat->object.in, obj->object); efl_event_callback_del(pdata->evas_pdata->pointer, EFL_EVENT_DEL, _evas_device_del_cb, obj); obj->pointer_grabs = eina_inlist_remove(obj->pointer_grabs, @@ -1734,8 +1734,8 @@ _hide(Evas_Object *eo_obj, Evas_Object_Protected_Data *obj) EINA_INLIST_FOREACH(obj->pointer_grabs, obj_pdata) { if (!obj_pdata->mouse_grabbed && - evas_object_is_in_output_rect(eo_obj, obj, obj_pdata->evas_pdata->x, - obj_pdata->evas_pdata->y, + evas_object_is_in_output_rect(eo_obj, obj, obj_pdata->evas_pdata->seat->x, + obj_pdata->evas_pdata->seat->y, 1, 1)) _evas_canvas_event_pointer_move_event_dispatch(obj->layer->evas, obj_pdata->evas_pdata, NULL); } @@ -2204,7 +2204,7 @@ evas_object_top_at_pointer_get(const Evas *eo_e) Evas_Pointer_Data *pdata = _evas_pointer_data_by_device_get(e, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(pdata, NULL); - return evas_canvas_object_top_at_xy_get((Eo *)eo_e, pdata->x, pdata->y, EINA_TRUE, EINA_TRUE); + return evas_canvas_object_top_at_xy_get((Eo *)eo_e, pdata->seat->x, pdata->seat->y, EINA_TRUE, EINA_TRUE); } EOLIAN Evas_Object* diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index 94ad660b21..5bacc34fd3 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -817,19 +817,26 @@ typedef struct Evas_Object_Protected_Data *obj; } Evas_Active_Entry; -struct _Evas_Pointer_Data +typedef struct Evas_Pointer_Seat { - Evas_Device *pointer; + Evas_Device *seat; + Eina_List *pointers; struct { Eina_List *in; } object; - DATA32 button; Evas_Coord x, y; Evas_Point prev; int mouse_grabbed; int downs; int nogrep; unsigned char inside : 1; +} Evas_Pointer_Seat; + +struct _Evas_Pointer_Data +{ + Evas_Device *pointer; + DATA32 button; + Evas_Pointer_Seat *seat; }; typedef struct _Evas_Post_Render_Job