_canvas_event_feed_mouse_move_legacy(Evas *eo_e, Evas_Public_Data *e, int x, int y,
unsigned int timestamp, const void *data);
+static inline Eina_Bool
+_evas_event_feed_allow(Evas_Public_Data *e)
+{
+ if (EINA_LIKELY(!e->running_post_events)) return EINA_TRUE;
+ ERR("Can not feed input events while running post-event callbacks!");
+ return EINA_FALSE;
+}
+
+#define EVAS_EVENT_FEED_SAFETY_CHECK(evas, ...) do { \
+ if (!_evas_event_feed_allow(evas)) return __VA_ARGS__; } while (0)
+
static void
_evas_event_havemap_adjust_f(Evas_Object *eo_obj EINA_UNUSED, Evas_Object_Protected_Data *obj, Eina_Vector2 *point, Eina_Bool mouse_grabbed)
{
_efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
Evas_Object_Pointer_Data *obj_pdata;
int event_id;
- event_id = _evas_object_event_new();
-
/* Duplicating UP event */
evt = efl_input_dup(parent_ev);
ev = efl_data_scope_get(evt, EFL_INPUT_POINTER_CLASS);
if (!ev) return 0;
+ event_id = _evas_object_event_new();
+
/* Actually we want an OUT */
ev->action = EFL_POINTER_ACTION_OUT;
_efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
e = efl_data_scope_get(eo_e, EVAS_CANVAS_CLASS);
if (!e) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, eo_e, (void **) &ev);
if (!ev) return;
if (!e || !ev) return;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, eo_e, (void **) &ev);
if (!ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
ev->timestamp = timestamp;
ev->data = (void *) data;
_efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_DIRECTION);
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, pe->device);
if (!pdata) return;
if (!e || !ev) return;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
// NOTE: was foreach + append without free (smelled bad)
newin = eina_list_merge(newin, ins);
-
EINA_LIST_FOREACH(lst, l, eo_obj)
{
obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
_efl_input_value_mask(EFL_INPUT_VALUE_TOOL);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
_efl_input_value_mask(EFL_INPUT_VALUE_TOOL);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
pdata->inside = 0;
_efl_input_value_mask(EFL_INPUT_VALUE_BUTTON);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
_efl_input_value_mask(EFL_INPUT_VALUE_TOOL);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, eo_e, (void **) &ev);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
if (EINA_DBL_EQ(fx, 0.0)) fx = x;
if (EINA_DBL_EQ(fy, 0.0)) fy = y;
_efl_input_value_mask(EFL_INPUT_VALUE_TOOL);
if (!e || !ev) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
if (!e || !ev) return;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
e->last_timestamp = ev->timestamp;
_evas_walk(e);
if (!e || !ev) return;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
e->last_timestamp = ev->timestamp;
_evas_walk(e);
Evas_Pointer_Data *pdata;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
e->last_timestamp = timestamp;
event_id = _evas_object_event_new();
if (!e || !ev) return;
if (e->is_frozen) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
pdata = _evas_pointer_data_by_device_get(e, ev->device);
if (!pdata) return;
double x = 0, y = 0;
int n;
+ if (!e) return;
+ EVAS_EVENT_FEED_SAFETY_CHECK(e);
+
evt = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, eo_e, (void **) &ev);
if (!ev) return;