jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=2edf50cb10f6ce5e6fc8b04492413c41678e7d85
commit 2edf50cb10f6ce5e6fc8b04492413c41678e7d85 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Mon Aug 29 17:04:31 2016 +0900 evas events: Properly signal to clients which values are set Since pointer events are all the same thing, users may not know what values are valid for what kind of event. Eventually we want to expose more information, but we also need a way to inform the caller about the validity of the values we get. --- src/lib/efl/interfaces/efl_common_internal.h | 6 +- src/lib/evas/canvas/efl_input_pointer.c | 11 ++++ src/lib/evas/canvas/evas_events.c | 91 +++++++++++++++++++++++++++- 3 files changed, 105 insertions(+), 3 deletions(-) diff --git a/src/lib/efl/interfaces/efl_common_internal.h b/src/lib/efl/interfaces/efl_common_internal.h index 07d6236..d6c51de 100644 --- a/src/lib/efl/interfaces/efl_common_internal.h +++ b/src/lib/efl/interfaces/efl_common_internal.h @@ -107,13 +107,15 @@ struct _Efl_Input_Hold_Data static inline Eina_Bool _efl_input_value_has(const Efl_Input_Pointer_Data *pd, Efl_Input_Value key) { - return (pd->value_flags & (1 << (int) key)) != 0; + return (pd->value_flags & (1u << (int) key)) != 0; } static inline void _efl_input_value_mark(Efl_Input_Pointer_Data *pd, Efl_Input_Value key) { - pd->value_flags |= (1 << (int) key); + pd->value_flags |= (1u << (int) key); } +#define _efl_input_value_mask(key) (1u << (int) key) + #endif diff --git a/src/lib/evas/canvas/efl_input_pointer.c b/src/lib/evas/canvas/efl_input_pointer.c index dd055a1..cd06f7d 100644 --- a/src/lib/evas/canvas/efl_input_pointer.c +++ b/src/lib/evas/canvas/efl_input_pointer.c @@ -147,6 +147,7 @@ _efl_input_pointer_action_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd) EOLIAN static void _efl_input_pointer_button_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int but) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_BUTTON); pd->button = but; } @@ -161,6 +162,7 @@ _efl_input_pointer_button_pressed_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Dat { if (button < 0) return; if (button > 31) return; + _efl_input_value_mark(pd, EFL_INPUT_VALUE_BUTTONS_PRESSED); if (pressed) pd->button_flags |= (1 << button); else @@ -178,6 +180,8 @@ _efl_input_pointer_button_pressed_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Dat EOLIAN static void _efl_input_pointer_position_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int x, int y) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_X); + _efl_input_value_mark(pd, EFL_INPUT_VALUE_Y); pd->cur.x = (double) x; pd->cur.y = (double) y; } @@ -192,6 +196,8 @@ _efl_input_pointer_position_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, EOLIAN static void _efl_input_pointer_previous_position_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int x, int y) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_PREVIOUS_X); + _efl_input_value_mark(pd, EFL_INPUT_VALUE_PREVIOUS_Y); pd->prev.x = (double) x; pd->prev.y = (double) y; } @@ -264,6 +270,7 @@ _efl_input_pointer_efl_input_event_event_flags_get(Eo *obj EINA_UNUSED, Efl_Inpu EOLIAN static void _efl_input_pointer_efl_input_event_timestamp_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, double ms) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_TIMESTAMP); pd->timestamp = (unsigned int) ms; } @@ -276,6 +283,7 @@ _efl_input_pointer_efl_input_event_timestamp_get(Eo *obj EINA_UNUSED, Efl_Input_ EOLIAN static void _efl_input_pointer_wheel_direction_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Efl_Orient dir) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_WHEEL_DIRECTION); pd->wheel.dir = dir; } @@ -288,6 +296,7 @@ _efl_input_pointer_wheel_direction_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Da EOLIAN static void _efl_input_pointer_wheel_delta_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int dist) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_WHEEL_DELTA); pd->wheel.z = dist; } @@ -306,6 +315,7 @@ _efl_input_pointer_tool_get(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd) EOLIAN static void _efl_input_pointer_tool_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, int id) { + _efl_input_value_mark(pd, EFL_INPUT_VALUE_TOOL); pd->tool = id; } @@ -465,6 +475,7 @@ _efl_input_pointer_value_set(Eo *obj EINA_UNUSED, Efl_Input_Pointer_Data *pd, Ef return EINA_FALSE; } + _efl_input_value_mark(pd, key); return EINA_TRUE; } diff --git a/src/lib/evas/canvas/evas_events.c b/src/lib/evas/canvas/evas_events.c index 2075eb2..b390c60 100644 --- a/src/lib/evas/canvas/evas_events.c +++ b/src/lib/evas/canvas/evas_events.c @@ -1209,6 +1209,13 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da Evas *eo_e; int addgrab = 0; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON); + if (!e || !ev) return; b = ev->button; @@ -1232,6 +1239,8 @@ _canvas_event_feed_mouse_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; ev->tool = 0; + ev->action = EFL_POINTER_ACTION_DOWN; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -1408,6 +1417,13 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data int event_id, b; Evas *eo_e; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON); + if (!e || !ev) return; b = ev->button; @@ -1432,6 +1448,7 @@ _canvas_event_feed_mouse_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; ev->tool = 0; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -1552,6 +1569,12 @@ _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_ Evas *eo_e; int i; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; if (e->is_frozen) return; @@ -1568,13 +1591,15 @@ _canvas_event_feed_mouse_cancel_internal(Evas_Public_Data *e, Efl_Input_Pointer_ _canvas_event_feed_mouse_updown_legacy(eo_e, i + 1, 0, ev->timestamp, ev->data, 0); } + ev->action = EFL_POINTER_ACTION_CANCEL; + ev->value_flags |= value_flags; ev->event_flags = flags; EINA_LIST_FOREACH_SAFE(e->touch_points, l, ll, point) { if ((point->state == EVAS_TOUCH_POINT_DOWN) || (point->state == EVAS_TOUCH_POINT_MOVE)) { - ev->button = point->id; + ev->tool = point->id; ev->cur.x = point->x; ev->cur.y = point->y; _canvas_event_feed_multi_up_internal(e, ev); @@ -1616,6 +1641,13 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) Evas_Object *eo_obj; int event_id = 0; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_DELTA) | + _efl_input_value_mask(EFL_INPUT_VALUE_WHEEL_DIRECTION); + if (e->is_frozen) return; e->last_timestamp = pe->timestamp; @@ -1633,6 +1665,7 @@ _canvas_event_feed_mouse_wheel_internal(Eo *eo_e, Efl_Input_Pointer_Data *pe) ev->event_flags = e->default_event_flags; ev->device = efl_ref(_evas_device_top_get(eo_e)); ev->action = EFL_POINTER_ACTION_WHEEL; + ev->value_flags |= value_flags; _evas_walk(e); copy = evas_event_list_copy(e->pointer.object.in); @@ -1691,6 +1724,18 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da int event_id; int x, y, px, py; + // inform which values are valid + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_PREVIOUS_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_PREVIOUS_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_DX) | + _efl_input_value_mask(EFL_INPUT_VALUE_DY) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; if (e->is_frozen) return; @@ -1714,6 +1759,7 @@ _canvas_event_feed_mouse_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da ev->event_flags = e->default_event_flags; ev->pressed_buttons = e->pointer.button; ev->tool = 0; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -2073,6 +2119,13 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) Evas_Object *eo_obj; int event_id; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; e->pointer.inside = 1; @@ -2089,6 +2142,7 @@ _canvas_event_feed_mouse_in_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); event_id = _evas_object_event_new(); @@ -2133,6 +2187,13 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) Evas_Object *eo_obj; int event_id; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTONS_PRESSED) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; e->pointer.inside = 0; @@ -2149,6 +2210,7 @@ _canvas_event_feed_mouse_out_internal(Evas *eo_e, Efl_Input_Pointer_Data *ev) ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -2231,6 +2293,13 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da int event_id; int addgrab = 0; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL) | + _efl_input_value_mask(EFL_INPUT_VALUE_BUTTON); + if (!e || !ev) return; eo_e = e->evas; @@ -2248,6 +2317,7 @@ _canvas_event_feed_multi_down_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -2298,6 +2368,12 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data Evas *eo_e; int event_id; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; eo_e = e->evas; @@ -2316,6 +2392,7 @@ _canvas_event_feed_multi_up_internal(Evas_Public_Data *e, Efl_Input_Pointer_Data ev->modifiers = &(e->modifiers); ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); _evas_walk(e); @@ -2453,6 +2530,13 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da Evas *eo_e; int event_id; + /* FIXME: Add previous x,y information (from evas touch point list) */ + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP) | + _efl_input_value_mask(EFL_INPUT_VALUE_X) | + _efl_input_value_mask(EFL_INPUT_VALUE_Y) | + _efl_input_value_mask(EFL_INPUT_VALUE_TOOL); + if (!e || !ev) return; eo_e = e->evas; @@ -2468,6 +2552,7 @@ _canvas_event_feed_multi_move_internal(Evas_Public_Data *e, Efl_Input_Pointer_Da ev->locks = &(e->locks); ev->event_flags = e->default_event_flags; ev->action = EFL_POINTER_ACTION_MOVE; + ev->value_flags |= value_flags; if (ev->device) efl_ref(ev->device); point = ev->cur; @@ -2886,6 +2971,9 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D int event_id = 0; Evas *eo_e; + static const int value_flags = + _efl_input_value_mask(EFL_INPUT_VALUE_TIMESTAMP); + if (!e || !ev) return; if (e->is_frozen) return; @@ -2893,6 +2981,7 @@ _canvas_event_feed_axis_update_internal(Evas_Public_Data *e, Efl_Input_Pointer_D e->last_timestamp = ev->timestamp; ev->action = EFL_POINTER_ACTION_AXIS; + ev->value_flags |= value_flags; event_id = _evas_object_event_new(); evt = ev->eo; --