forked from enlightenment/efl
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.
This commit is contained in:
parent
68be4f49ed
commit
2edf50cb10
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue