bdilly pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ddfc98359fe57a8d0dfa49eb7e4666f90b356a22
commit ddfc98359fe57a8d0dfa49eb7e4666f90b356a22 Author: Guilherme Iscaro <[email protected]> Date: Tue Dec 6 12:42:30 2016 -0200 Evas: Add seat_event_filter_set()/get() API. With this new API one can block or unblock keyboard, mouse and focus events that was originated from a seat. This is useful to create applications that wants to establish some kind of seat segregation. --- src/lib/evas/canvas/efl_canvas_object.eo | 2 ++ src/lib/evas/canvas/efl_input_interface.eo | 16 ++++++++++ src/lib/evas/canvas/evas_object_main.c | 48 ++++++++++++++++++++++++++++++ src/lib/evas/include/evas_private.h | 6 ++++ 4 files changed, 72 insertions(+) diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo index 606dd45..c2f6550 100644 --- a/src/lib/evas/canvas/efl_canvas_object.eo +++ b/src/lib/evas/canvas/efl_canvas_object.eo @@ -666,5 +666,7 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator, Efl.Gfx.Size.Hint.hint_weight.get; Efl.Gfx.Map.map_enable.set; Efl.Gfx.Map.map_enable.get; + Efl.Input.Interface.seat_event_filter.set; + Efl.Input.Interface.seat_event_filter.get; } } diff --git a/src/lib/evas/canvas/efl_input_interface.eo b/src/lib/evas/canvas/efl_input_interface.eo index 49a7f1a..5ee9782 100644 --- a/src/lib/evas/canvas/efl_input_interface.eo +++ b/src/lib/evas/canvas/efl_input_interface.eo @@ -79,6 +79,22 @@ interface Efl.Input.Interface () } return: iterator<const(Efl.Input.Pointer)>; [[Iterator to pointer positions]] } + @property seat_event_filter { + set { + [[Add or remove a given seat to the filter list. If the filter list is empty this object + will report mouse, keyboard and focus events from any seat, otherwise those events will + only be reported if the event comes from a seat that is in the list.]] + } + get { + [[Check if input events from a given seat is enabled.]] + } + keys { + seat: Efl.Input.Device; [[The seat to act on.]] + } + values { + enable: bool; [[$true to enable events for a seat or $false otherwise.]] + } + } } events { pointer,move: Efl.Input.Pointer; [[Main pointer move (current and previous positions are known).]] diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c index 00c4590..050356d 100644 --- a/src/lib/evas/canvas/evas_object_main.c +++ b/src/lib/evas/canvas/evas_object_main.c @@ -887,6 +887,52 @@ evas_object_del(Evas_Object *eo_obj) efl_del(eo_obj); } +EOLIAN static Eina_Bool +_efl_canvas_object_efl_input_interface_seat_event_filter_get(Eo *eo_obj EINA_UNUSED, + Evas_Object_Protected_Data *obj, + Efl_Input_Device *seat) +{ + //If the list is empty this object accept events from any seat. + if (!obj->events_whitelist) + return EINA_TRUE; + return eina_list_data_find(obj->events_whitelist, seat) ? + EINA_TRUE : EINA_FALSE; +} + +static void +_whitelist_events_device_remove_cb(void *data, const Efl_Event *event) +{ + Evas_Object_Protected_Data *obj = data; + obj->events_whitelist = eina_list_remove(obj->events_whitelist, + event->object); +} + +EOLIAN static void +_efl_canvas_object_efl_input_interface_seat_event_filter_set(Eo *eo_obj, + Evas_Object_Protected_Data *obj, + Efl_Input_Device *seat, + Eina_Bool add) +{ + EINA_SAFETY_ON_NULL_RETURN(seat); + + if (efl_input_device_type_get(seat) != EFL_INPUT_DEVICE_CLASS_SEAT) return; + if (add) + { + if (eina_list_data_find(obj->events_whitelist, seat)) return; + if (efl_canvas_object_seat_focus_check(eo_obj, seat)) + efl_canvas_object_seat_focus_del(eo_obj, seat); + obj->events_whitelist = eina_list_append(obj->events_whitelist, seat); + efl_event_callback_add(seat, EFL_EVENT_DEL, + _whitelist_events_device_remove_cb, obj); + } + else + { + obj->events_whitelist = eina_list_remove(obj->events_whitelist, seat); + efl_event_callback_del(seat, EFL_EVENT_DEL, + _whitelist_events_device_remove_cb, obj); + } +} + EOLIAN static void _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data *obj) { @@ -914,6 +960,8 @@ _efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data evas_object_event_callback_call(eo_obj, obj, EVAS_CALLBACK_DEL, NULL, _evas_object_event_new(), NULL); if ((obj->layer) && (obj->layer->evas)) _evas_post_event_callback_call(obj->layer->evas->evas, obj->layer->evas); + EINA_LIST_FREE(obj->events_whitelist, dev) + efl_event_callback_del(dev, EFL_EVENT_DEL, _whitelist_events_device_remove_cb, obj); if (obj->name) evas_object_name_set(eo_obj, NULL); if (!obj->layer) { diff --git a/src/lib/evas/include/evas_private.h b/src/lib/evas/include/evas_private.h index d5645fc..77e393d 100644 --- a/src/lib/evas/include/evas_private.h +++ b/src/lib/evas/include/evas_private.h @@ -1116,6 +1116,12 @@ struct _Evas_Object_Protected_Data Eina_List *grabs; Eina_Inlist *callbacks; + /* + The list below contain the seats (Efl.Input.Devices) which this + object allows events to be reported (Mouse, Keybord and focus events). + If this list is empty, this object will allow events from any seat. + */ + Eina_List *events_whitelist; struct { Eina_List *clipees; --
