#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
-#define ELM_WIN_PROTECTED
+#define EFL_INPUT_EVENT_PROTECTED
#include <Elementary.h>
#include <Elementary_Cursor.h>
typedef struct _Efl_Ui_Win_Data Efl_Ui_Win_Data;
typedef struct _Box_Item_Iterator Box_Item_Iterator;
+typedef struct _Input_Pointer_Iterator Input_Pointer_Iterator;
struct _Efl_Ui_Win_Data
{
short pointer_out;
short pointer_cancel;
short pointer_wheel;
+ short finger_move;
+ short finger_down;
+ short finger_up;
short key_down;
short key_up;
short render_pre;
Eo *object;
};
+struct _Input_Pointer_Iterator
+{
+ Eina_Iterator iterator;
+ Eina_List *list;
+ Eina_Iterator *real_iterator;
+ const Eo *object;
+};
+
static const char SIG_DELETE_REQUEST[] = "delete,request";
static const char SIG_FOCUS_OUT[] = "focus,out"; // deprecated. use "unfocused" instead.
static const char SIG_FOCUS_IN[] = "focus,in"; // deprecated. use "focused" instead.
if (evas_focus_get(evas_object_evas_get(win)) == win)
return;
- efl_event_callback_legacy_call(win, ev->desc, evt);
+ efl_event_callback_call(win, ev->desc, evt);
}
static void
if (!evdata || evdata->win_fed)
return;
- efl_event_callback_legacy_call(win, ev->desc, evt);
+ efl_event_callback_call(win, ev->desc, evt);
}
/* feed events from the window to evas - for fake inputs */
return;
evdata->win_fed = EINA_TRUE;
- efl_event_callback_legacy_call(evas, ev->desc, evt);
+ efl_event_callback_call(evas, ev->desc, evt);
evdata->win_fed = EINA_FALSE;
evdata->evas_done = EINA_FALSE;
}
return;
evdata->win_fed = EINA_TRUE;
- efl_event_callback_legacy_call(evas, ev->desc, evt);
+ efl_event_callback_call(evas, ev->desc, evt);
evdata->win_fed = EINA_FALSE;
evdata->evas_done = EINA_FALSE;
}
{ EFL_EVENT_POINTER_OUT, _evas_event_pointer_feed_fake_cb },
{ EFL_EVENT_POINTER_CANCEL, _evas_event_pointer_feed_fake_cb },
{ EFL_EVENT_POINTER_WHEEL, _evas_event_pointer_feed_fake_cb },
+{ EFL_EVENT_FINGER_MOVE, _evas_event_pointer_feed_fake_cb },
+{ EFL_EVENT_FINGER_DOWN, _evas_event_pointer_feed_fake_cb },
+{ EFL_EVENT_FINGER_UP, _evas_event_pointer_feed_fake_cb },
{ EFL_EVENT_KEY_DOWN, _evas_event_key_feed_fake_cb },
{ EFL_EVENT_KEY_UP, _evas_event_key_feed_fake_cb })
for (i = 0; array[i].desc; i++)
{
- if (ev->info == EFL_EVENT_POINTER_MOVE)
+ if (array[i].desc == EFL_EVENT_POINTER_MOVE)
{
if (!(sd->event_forward.pointer_move++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_DOWN)
+ else if (array[i].desc == EFL_EVENT_POINTER_DOWN)
{
if (!(sd->event_forward.pointer_down++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_UP)
+ else if (array[i].desc == EFL_EVENT_POINTER_UP)
{
if (!(sd->event_forward.pointer_up++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_IN)
+ else if (array[i].desc == EFL_EVENT_POINTER_IN)
{
if (!(sd->event_forward.pointer_in++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_OUT)
+ else if (array[i].desc == EFL_EVENT_POINTER_OUT)
{
if (!(sd->event_forward.pointer_out++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_CANCEL)
+ else if (array[i].desc == EFL_EVENT_POINTER_CANCEL)
{
if (!(sd->event_forward.pointer_cancel++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_WHEEL)
+ else if (array[i].desc == EFL_EVENT_POINTER_WHEEL)
{
if (!(sd->event_forward.pointer_wheel++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_KEY_DOWN)
+ else if (array[i].desc == EFL_EVENT_FINGER_MOVE)
+ {
+ if (!(sd->event_forward.finger_move++))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_FINGER_DOWN)
+ {
+ if (!(sd->event_forward.finger_down++))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_FINGER_UP)
+ {
+ if (!(sd->event_forward.finger_up++))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_KEY_DOWN)
{
if (!(sd->event_forward.key_down++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_key_cb, win);
}
- else if (ev->info == EFL_EVENT_KEY_UP)
+ else if (array[i].desc == EFL_EVENT_KEY_UP)
{
if (!(sd->event_forward.key_up++))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_key_cb, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_RENDER_POST)
+ else if (array[i].desc == EFL_CANVAS_EVENT_RENDER_POST)
{
if (!(sd->event_forward.render_post++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_RENDER_POST,
_elm_win_evas_render_post, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_RENDER_PRE)
+ else if (array[i].desc == EFL_CANVAS_EVENT_RENDER_PRE)
{
if (!(sd->event_forward.render_pre++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_RENDER_PRE,
_elm_win_evas_render_pre, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_FOCUS_IN)
+ else if (array[i].desc == EFL_CANVAS_EVENT_FOCUS_IN)
{
if (!(sd->event_forward.focus_in++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_FOCUS_IN,
_elm_win_evas_focus_in, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_FOCUS_OUT)
+ else if (array[i].desc == EFL_CANVAS_EVENT_FOCUS_OUT)
{
if (!(sd->event_forward.focus_out++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_FOCUS_OUT,
_elm_win_evas_focus_out, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_OBJECT_FOCUS_IN)
+ else if (array[i].desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_IN)
{
if (!(sd->event_forward.object_focus_in++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
_elm_win_evas_object_focus_in, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_OBJECT_FOCUS_OUT)
+ else if (array[i].desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_OUT)
{
if (!(sd->event_forward.object_focus_out++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
_elm_win_evas_object_focus_out, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_DEVICE_CHANGED)
+ else if (array[i].desc == EFL_CANVAS_EVENT_DEVICE_CHANGED)
{
if (!(sd->event_forward.device_changed++))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_DEVICE_CHANGED,
for (i = 0; array[i].desc; i++)
{
- if (ev->info == EFL_EVENT_POINTER_MOVE)
+ if (array[i].desc == EFL_EVENT_POINTER_MOVE)
{
if (!(--sd->event_forward.pointer_move))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_DOWN)
+ else if (array[i].desc == EFL_EVENT_POINTER_DOWN)
{
if (!(--sd->event_forward.pointer_down))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_UP)
+ else if (array[i].desc == EFL_EVENT_POINTER_UP)
{
if (!(--sd->event_forward.pointer_up))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_IN)
+ else if (array[i].desc == EFL_EVENT_POINTER_IN)
{
if (!(--sd->event_forward.pointer_in))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_OUT)
+ else if (array[i].desc == EFL_EVENT_POINTER_OUT)
{
if (!(--sd->event_forward.pointer_out))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_CANCEL)
+ else if (array[i].desc == EFL_EVENT_POINTER_CANCEL)
{
if (!(--sd->event_forward.pointer_cancel))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_POINTER_WHEEL)
+ else if (array[i].desc == EFL_EVENT_POINTER_WHEEL)
{
if (!(--sd->event_forward.pointer_wheel))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_pointer_cb, win);
}
- else if (ev->info == EFL_EVENT_KEY_DOWN)
+ else if (array[i].desc == EFL_EVENT_FINGER_MOVE)
+ {
+ if (!(--sd->event_forward.finger_move))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_FINGER_DOWN)
+ {
+ if (!(--sd->event_forward.finger_down))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_FINGER_UP)
+ {
+ if (!(--sd->event_forward.finger_up))
+ efl_event_callback_add(sd->evas, array[i].desc,
+ _evas_event_pointer_cb, win);
+ }
+ else if (array[i].desc == EFL_EVENT_KEY_DOWN)
{
if (!(--sd->event_forward.key_down))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_key_cb, win);
}
- else if (ev->info == EFL_EVENT_KEY_UP)
+ else if (array[i].desc == EFL_EVENT_KEY_UP)
{
if (!(--sd->event_forward.key_up))
efl_event_callback_add(sd->evas, array[i].desc,
_evas_event_key_cb, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_RENDER_POST)
+ else if (array[i].desc == EFL_CANVAS_EVENT_RENDER_POST)
{
if (!(--sd->event_forward.render_post))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_RENDER_POST,
_elm_win_evas_render_post, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_RENDER_PRE)
+ else if (array[i].desc == EFL_CANVAS_EVENT_RENDER_PRE)
{
if (!(--sd->event_forward.render_pre))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_RENDER_PRE,
_elm_win_evas_render_pre, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_FOCUS_IN)
+ else if (array[i].desc == EFL_CANVAS_EVENT_FOCUS_IN)
{
if (!(--sd->event_forward.focus_in))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_FOCUS_IN,
_elm_win_evas_focus_in, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_FOCUS_OUT)
+ else if (array[i].desc == EFL_CANVAS_EVENT_FOCUS_OUT)
{
if (!(--sd->event_forward.focus_out))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_FOCUS_OUT,
_elm_win_evas_focus_out, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_OBJECT_FOCUS_IN)
+ else if (array[i].desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_IN)
{
if (!(--sd->event_forward.object_focus_in))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_IN,
_elm_win_evas_object_focus_in, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_OBJECT_FOCUS_OUT)
+ else if (array[i].desc == EFL_CANVAS_EVENT_OBJECT_FOCUS_OUT)
{
if (!(--sd->event_forward.object_focus_out))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_CANVAS_OBJECT_FOCUS_OUT,
_elm_win_evas_object_focus_out, win);
}
- else if (ev->info == EFL_CANVAS_EVENT_DEVICE_CHANGED)
+ else if (array[i].desc == EFL_CANVAS_EVENT_DEVICE_CHANGED)
{
if (!(--sd->event_forward.device_changed))
evas_object_event_callback_add(sd->evas, EVAS_CALLBACK_DEVICE_CHANGED,
return evas_pointer_inside_get(sd->evas);
}
+/* multi touch support */
+static Eina_Bool
+_input_pointer_iterator_next(Input_Pointer_Iterator *it, void **data)
+{
+ Eo *sub;
+
+ if (!eina_iterator_next(it->real_iterator, (void **) &sub))
+ return EINA_FALSE;
+
+ if (data) *data = sub;
+ return EINA_TRUE;
+}
+
+static Eo *
+_input_pointer_iterator_get_container(Input_Pointer_Iterator *it)
+{
+ return (Eo *) it->object;
+}
+
+static void
+_input_pointer_iterator_free(Input_Pointer_Iterator *it)
+{
+ Efl_Input_Pointer *ptr;
+
+ EINA_LIST_FREE(it->list, ptr)
+ efl_del(ptr);
+ eina_iterator_free(it->real_iterator);
+ free(it);
+}
+
+EOLIAN static Eina_Iterator *
+_efl_ui_win_efl_input_interface_pointer_iterate(const Eo *obj, Efl_Ui_Win_Data *sd,
+ Eina_Bool hover EINA_UNUSED)
+{
+ Input_Pointer_Iterator *it;
+ Eina_List *list = NULL;
+ int i, cnt;
+
+ // Note: "hover" is here as a possible extension to this API. At the moment
+ // I don't have any device that could track the position of hovering fingers
+ // and Evas also wouldn't track those.
+
+ ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd, NULL);
+
+ cnt = evas_canvas_touch_point_list_count(sd->evas);
+ if (!cnt) return NULL;
+
+ it = calloc(1, sizeof(*it));
+ if (!it) return NULL;
+
+ EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR);
+
+ for (i = 0; i < cnt; i++)
+ {
+ Efl_Input_Pointer_Data *ptrdata;
+ Evas_Touch_Point_State state;
+ Efl_Input_Pointer *ptr;
+ double x, y;
+
+ ptr = efl_input_instance_get(EFL_INPUT_POINTER_CLASS, (Eo *) obj, (void **) &ptrdata);
+ if (!ptrdata) break;
+
+ ptrdata->tool = evas_canvas_touch_point_list_nth_id_get(sd->evas, i);
+ _efl_input_value_mark(ptrdata, EFL_INPUT_VALUE_TOOL);
+
+ // Note that "still" maps to "down" here.
+ state = evas_canvas_touch_point_list_nth_state_get(sd->evas, i);
+ switch (state)
+ {
+ case EVAS_TOUCH_POINT_DOWN: ptrdata->action = EFL_POINTER_ACTION_DOWN; break;
+ case EVAS_TOUCH_POINT_UP: ptrdata->action = EFL_POINTER_ACTION_UP; break;
+ case EVAS_TOUCH_POINT_MOVE: ptrdata->action = EFL_POINTER_ACTION_MOVE; break;
+ case EVAS_TOUCH_POINT_STILL: ptrdata->action = EFL_POINTER_ACTION_DOWN; break;
+ case EVAS_TOUCH_POINT_CANCEL: ptrdata->action = EFL_POINTER_ACTION_CANCEL; break;
+ default: ptrdata->action = EFL_POINTER_ACTION_NONE; break;
+ }
+
+ evas_canvas_touch_point_list_nth_xy_get(sd->evas, i, &x, &y);
+ _efl_input_value_mark(ptrdata, EFL_INPUT_VALUE_X);
+ _efl_input_value_mark(ptrdata, EFL_INPUT_VALUE_Y);
+ ptrdata->cur.x = x;
+ ptrdata->cur.y = y;
+ ptrdata->prev = ptrdata->cur;
+
+ list = eina_list_append(list, ptr);
+ }
+
+ it->list = list;
+ it->real_iterator = eina_list_iterator_new(it->list);
+ it->iterator.version = EINA_ITERATOR_VERSION;
+ it->iterator.next = FUNC_ITERATOR_NEXT(_input_pointer_iterator_next);
+ it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER(_input_pointer_iterator_get_container);
+ it->iterator.free = FUNC_ITERATOR_FREE(_input_pointer_iterator_free);
+ it->object = obj;
+
+ return &it->iterator;
+}
+
EOLIAN static Eina_Bool
_efl_ui_win_efl_canvas_image_max_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Win_Data *sd, int *maxw, int *maxh)
{
static const double _timeout1 = 0.1;
static const double _timeout2 = 0.2;
+static const double _timeout3 = 0.3;
static const double _timeout_fail = 2.0;
static void
}
END_TEST
+/* a very lax definition of == for doubles */
+#define VALEQ(a, b) ((fabs((a) - (b))) <= 0.001)
+
+typedef struct
+{
+ double x, y;
+} point_t;
+
+static point_t points[2][4] =
+{
+ {
+ { 20, 20 },
+ { 40, 10 },
+ { 60, 120 },
+ { 80, 80 }
+ },
+ {
+ { 30, 30 },
+ { 50, 50 },
+ { 70, 60 },
+ { 80, 80 }
+ },
+};
+
+static Eina_Bool
+_inputs_timer1_cb(void *data)
+{
+ Efl_Input_Pointer *ptr;
+ Eo *win = data;
+
+ /* Send down events first (note: stupid, all at once) */
+ for (size_t i = 0; i < 4; i++)
+ {
+ ptr = efl_add(EFL_INPUT_POINTER_CLASS, win);
+ efl_input_pointer_position_set(ptr, points[0][i].x, points[0][i].y);
+ efl_input_pointer_tool_set(ptr, i);
+ efl_input_pointer_button_set(ptr, 1);
+
+ if (i == 0)
+ {
+ /* in first */
+ efl_input_pointer_action_set(ptr, EFL_POINTER_ACTION_IN);
+ efl_event_callback_call(win, EFL_EVENT_POINTER_IN, ptr);
+
+ /* move second */
+ efl_input_pointer_position_set(ptr, points[0][i].x, points[0][i].y);
+ efl_input_pointer_action_set(ptr, EFL_POINTER_ACTION_MOVE);
+ efl_event_callback_call(win, EFL_EVENT_POINTER_MOVE, ptr);
+ }
+
+ /* down finally */
+ efl_input_pointer_action_set(ptr, EFL_POINTER_ACTION_DOWN);
+ efl_event_callback_call(win, EFL_EVENT_POINTER_DOWN, ptr);
+ }
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_inputs_timer2_cb(void *data)
+{
+ Efl_Input_Pointer *ptr;
+ Eina_Iterator *it;
+ Eo *win = data;
+ size_t i = 0, cnt = 0;
+
+ it = efl_input_pointer_iterate(win, 0);
+ EINA_ITERATOR_FOREACH(it, ptr)
+ {
+ double x, y;
+ int tool, ok = 0;
+
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_X));
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_Y));
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_TOOL));
+ fail_if(efl_input_pointer_action_get(ptr) != EFL_POINTER_ACTION_DOWN);
+
+ x = efl_input_pointer_value_get(ptr, EFL_INPUT_VALUE_X);
+ y = efl_input_pointer_value_get(ptr, EFL_INPUT_VALUE_Y);
+ tool = efl_input_pointer_tool_get(ptr);
+
+ for (i = 0; i < 4; i++)
+ if (tool == i)
+ {
+ fail_if(!VALEQ(x, points[0][i].x));
+ fail_if(!VALEQ(y, points[0][i].y));
+ ok = 1;
+ break;
+ }
+ fail_if(!ok);
+
+ cnt++;
+ }
+ eina_iterator_free(it);
+ fail_if(cnt != 4);
+
+ /* Send some moves */
+ for (i = 0; i < 4; i++)
+ {
+ ptr = efl_add(EFL_INPUT_POINTER_CLASS, win);
+ efl_input_pointer_position_set(ptr, points[1][i].x, points[1][i].y);
+ efl_input_pointer_tool_set(ptr, i);
+ efl_input_pointer_button_set(ptr, 1);
+
+ /* move first */
+ efl_input_pointer_action_set(ptr, EFL_POINTER_ACTION_MOVE);
+ efl_event_callback_call(win, EFL_EVENT_POINTER_MOVE, ptr);
+
+ /* then up (one 2 fingers up: #1 and #3) */
+ if ((i % 2) == 1)
+ {
+ efl_input_pointer_action_set(ptr, EFL_POINTER_ACTION_UP);
+ efl_event_callback_call(win, EFL_EVENT_POINTER_UP, ptr);
+ }
+ }
+
+ return ECORE_CALLBACK_DONE;
+}
+
+static Eina_Bool
+_inputs_timer3_cb(void *data)
+{
+ Efl_Input_Pointer *ptr;
+ Eina_Iterator *it;
+ Eo *win = data;
+ size_t i = 0, cnt = 0;
+
+ it = efl_input_pointer_iterate(win, 0);
+ EINA_ITERATOR_FOREACH(it, ptr)
+ {
+ int tool, ok = 0;
+ double x, y;
+
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_X));
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_Y));
+ fail_if(!efl_input_pointer_value_has_get(ptr, EFL_INPUT_VALUE_TOOL));
+ fail_if(efl_input_pointer_action_get(ptr) != EFL_POINTER_ACTION_MOVE);
+
+ x = efl_input_pointer_value_get(ptr, EFL_INPUT_VALUE_X);
+ y = efl_input_pointer_value_get(ptr, EFL_INPUT_VALUE_Y);
+ tool = efl_input_pointer_tool_get(ptr);
+
+ for (i = 0; i < 4; i++)
+ if (tool == i)
+ {
+ fail_if(!VALEQ(x, points[1][i].x));
+ fail_if(!VALEQ(y, points[1][i].y));
+ ok = 1;
+ break;
+ }
+ fail_if(!ok);
+
+ cnt++;
+ }
+ eina_iterator_free(it);
+ fail_if(cnt != 2); // 2 moves (in the list), 2 ups (gone)
+
+ elm_exit();
+
+ return ECORE_CALLBACK_DONE;
+}
+
+START_TEST (efl_ui_win_multi_touch_inputs)
+{
+ Eina_Bool fail_flag = EINA_FALSE;
+ Eo *win;
+
+ /* this tests only multi touch inputs - a lot of code but quite basic
+ * faking events is quite hard, as an exact sequence must be followed:
+ *
+ * pointer 0: in, move, down, move, move, ...
+ * pointer x: down, move, move, ...
+ */
+
+ elm_init(0, NULL);
+
+ elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+ win = elm_win_add(NULL, "win", ELM_WIN_BASIC);
+ elm_win_autohide_set(win, EINA_TRUE);
+ efl_gfx_visible_set(win, EINA_TRUE);
+ efl_gfx_size_set(win, 100, 100);
+
+ ecore_timer_add(_timeout1, _inputs_timer1_cb, win);
+ ecore_timer_add(_timeout2, _inputs_timer2_cb, win);
+ ecore_timer_add(_timeout3, _inputs_timer3_cb, win);
+ ecore_timer_add(_timeout_fail, _timer_fail_flag_cb, &fail_flag);
+
+ elm_run();
+
+ fail_if(fail_flag != EINA_FALSE);
+
+ elm_shutdown();
+}
+END_TEST
+
void elm_test_win(TCase *tc)
{
tcase_add_test(tc, elm_atspi_role_get);
tcase_add_test(tc, elm_atspi_component_position);
tcase_add_test(tc, elm_atspi_component_size);
tcase_add_test(tc, elm_win_policy_quit_last_window_hidden);
+ tcase_add_test(tc, efl_ui_win_multi_touch_inputs);
#ifdef HAVE_ELEMENTARY_X
tcase_add_test(tc, elm_win_autohide);
tcase_add_test(tc, elm_win_autohide_and_policy_quit_last_window_hidden);