summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuilherme Iscaro <iscaro@profusion.mobi>2016-12-06 19:27:15 -0200
committerBruno Dilly <bdilly@profusion.mobi>2016-12-12 14:59:22 -0200
commit23278816b6b75e2ce0c9e0d2f07bfaae8ad230f1 (patch)
tree06bfd2383c777690b6de261e768aa0811b48ce85
parentddfc98359fe57a8d0dfa49eb7e4666f90b356a22 (diff)
downloadefl-23278816b6b75e2ce0c9e0d2f07bfaae8ad230f1.tar.gz
Efl.Canvas.Object: Override efl_event_callback_[legacy]_call.
In order to properly block events from a given seat, Efl.Canvas.Object must override the efl_event_callback_[legacy]_call to check if the event is allowed or not.
-rw-r--r--src/lib/evas/canvas/efl_canvas_object.eo2
-rw-r--r--src/lib/evas/canvas/evas_object_main.c49
2 files changed, 51 insertions, 0 deletions
diff --git a/src/lib/evas/canvas/efl_canvas_object.eo b/src/lib/evas/canvas/efl_canvas_object.eo
index c2f655018e..24a706bd04 100644
--- a/src/lib/evas/canvas/efl_canvas_object.eo
+++ b/src/lib/evas/canvas/efl_canvas_object.eo
@@ -624,6 +624,8 @@ abstract Efl.Canvas.Object (Efl.Object, Efl.Gfx, Efl.Gfx.Stack, Efl.Animator,
Efl.Object.constructor;
Efl.Object.destructor;
Efl.Object.dbg_info_get;
+ Efl.Object.event_callback_legacy_call;
+ Efl.Object.event_callback_call;
Efl.Object.provider_find;
Efl.Gfx.visible.set;
Efl.Gfx.visible.get;
diff --git a/src/lib/evas/canvas/evas_object_main.c b/src/lib/evas/canvas/evas_object_main.c
index 050356ddb6..07518b6901 100644
--- a/src/lib/evas/canvas/evas_object_main.c
+++ b/src/lib/evas/canvas/evas_object_main.c
@@ -933,6 +933,55 @@ _efl_canvas_object_efl_input_interface_seat_event_filter_set(Eo *eo_obj,
}
}
+static Eina_Bool
+_is_event_blocked(Eo *eo_obj, const Efl_Event_Description *desc,
+ void *event_info)
+{
+ if ((desc == EFL_EVENT_FOCUS_IN) ||
+ (desc == EFL_EVENT_FOCUS_OUT) ||
+ (desc == EFL_EVENT_KEY_DOWN) ||
+ (desc == EFL_EVENT_KEY_UP) ||
+ (desc == EFL_EVENT_HOLD) ||
+ (desc == EFL_EVENT_POINTER_IN) ||
+ (desc == EFL_EVENT_POINTER_OUT) ||
+ (desc == EFL_EVENT_POINTER_DOWN) ||
+ (desc == EFL_EVENT_POINTER_UP) ||
+ (desc == EFL_EVENT_POINTER_MOVE) ||
+ (desc == EFL_EVENT_POINTER_WHEEL) ||
+ (desc == EFL_EVENT_POINTER_CANCEL) ||
+ (desc == EFL_EVENT_POINTER_AXIS) ||
+ (desc == EFL_EVENT_FINGER_MOVE) ||
+ (desc == EFL_EVENT_FINGER_DOWN) ||
+ (desc == EFL_EVENT_FINGER_UP))
+ {
+ Efl_Input_Device *seat = efl_input_device_seat_get(efl_input_device_get(event_info));
+ return !efl_input_seat_event_filter_get(eo_obj, seat);
+ }
+ return EINA_FALSE;
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_object_efl_object_event_callback_call(Eo *eo_obj,
+ Evas_Object_Protected_Data *obj EINA_UNUSED,
+ const Efl_Event_Description *desc,
+ void *event_info)
+{
+ if (_is_event_blocked(eo_obj, desc, event_info)) return EINA_FALSE;
+ return efl_event_callback_call(efl_super(eo_obj, MY_CLASS),
+ desc, event_info);
+}
+
+EOLIAN static Eina_Bool
+_efl_canvas_object_efl_object_event_callback_legacy_call(Eo *eo_obj,
+ Evas_Object_Protected_Data *obj EINA_UNUSED,
+ const Efl_Event_Description *desc,
+ void *event_info)
+{
+ if (_is_event_blocked(eo_obj, desc, event_info)) return EINA_FALSE;
+ return efl_event_callback_legacy_call(efl_super(eo_obj, MY_CLASS),
+ desc, event_info);
+}
+
EOLIAN static void
_efl_canvas_object_efl_object_destructor(Eo *eo_obj, Evas_Object_Protected_Data *obj)
{