forked from enlightenment/efl
770 lines
21 KiB
C
770 lines
21 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "elementary_config.h"
|
|
#endif
|
|
|
|
#include <Efl_Ui.h>
|
|
#include "efl_ui_suite.h"
|
|
/* mouse feeding */
|
|
#include <Evas_Legacy.h>
|
|
#include <evas_canvas_eo.h>
|
|
|
|
#include "custom_gesture.eo.h"
|
|
#include "custom_recognizer.eo.h"
|
|
#include "custom_recognizer2.eo.h"
|
|
|
|
/*
|
|
typedef enum
|
|
{
|
|
EFL_GESTURE_STATE_NONE = 0,
|
|
EFL_GESTURE_STATE_STARTED = 1,
|
|
EFL_GESTURE_STATE_UPDATED,
|
|
EFL_GESTURE_STATE_FINISHED,
|
|
EFL_GESTURE_STATE_CANCELED
|
|
} Efl_Canvas_Gesture_State;
|
|
*/
|
|
|
|
enum
|
|
{
|
|
TAP,
|
|
LONG_PRESS,
|
|
DOUBLE_TAP,
|
|
TRIPLE_TAP,
|
|
MOMENTUM,
|
|
FLICK,
|
|
ROTATE,
|
|
ZOOM,
|
|
CUSTOM,
|
|
CUSTOM2,
|
|
LAST
|
|
};
|
|
|
|
static int count[LAST][4] = {0};
|
|
|
|
/* macros to simplify checking gesture counts */
|
|
#define CHECK_START(type, val) \
|
|
ck_assert_int_eq(count[(type)][EFL_GESTURE_STATE_STARTED - 1], (val))
|
|
#define CHECK_UPDATE(type, val) \
|
|
ck_assert_int_eq(count[(type)][EFL_GESTURE_STATE_UPDATED - 1], (val))
|
|
#define CHECK_FINISH(type, val) \
|
|
ck_assert_int_eq(count[(type)][EFL_GESTURE_STATE_FINISHED - 1], (val))
|
|
#define CHECK_CANCEL(type, val) \
|
|
ck_assert_int_eq(count[(type)][EFL_GESTURE_STATE_CANCELED - 1], (val))
|
|
#define CHECK_ALL(type, ...) \
|
|
do {\
|
|
int state_vals[] = {__VA_ARGS__}; \
|
|
for (int i = 0; i < 4; i++) \
|
|
ck_assert_int_eq(count[(type)][i], state_vals[i]); \
|
|
} while (0)
|
|
#define CHECK_NONZERO(type) \
|
|
do {\
|
|
for (int i = 0; i < 4; i++) \
|
|
ck_assert_int_ne(count[(type)][i], 0); \
|
|
} while (0)
|
|
#define CHECK_ZERO(type) CHECK_ALL((type), 0, 0, 0, 0)
|
|
#define RESET memset(count, 0, sizeof(count))
|
|
|
|
static void
|
|
gesture_cb(void *data , const Efl_Event *ev)
|
|
{
|
|
Efl_Canvas_Gesture *g = ev->info;
|
|
int *count = data;
|
|
/* increment counter for event state which has been processed */
|
|
count[efl_gesture_state_get(g) - 1]++;
|
|
}
|
|
|
|
static Eo *
|
|
setup(void)
|
|
{
|
|
Eo *win, *rect;
|
|
|
|
RESET;
|
|
|
|
win = win_add();
|
|
efl_gfx_entity_size_set(win, EINA_SIZE2D(1000, 1000));
|
|
|
|
rect = efl_add(EFL_CANVAS_RECTANGLE_CLASS, win);
|
|
efl_content_set(win, rect);
|
|
|
|
#define WATCH(type) \
|
|
efl_event_callback_add(rect, EFL_EVENT_GESTURE_##type, gesture_cb, &count[(type)])
|
|
WATCH(TAP);
|
|
WATCH(LONG_PRESS);
|
|
WATCH(DOUBLE_TAP);
|
|
WATCH(TRIPLE_TAP);
|
|
WATCH(MOMENTUM);
|
|
WATCH(FLICK);
|
|
WATCH(ROTATE);
|
|
WATCH(ZOOM);
|
|
|
|
get_me_to_those_events(win);
|
|
return rect;
|
|
}
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_taps)
|
|
{
|
|
Eo *rect = setup();
|
|
|
|
/* basic tap */
|
|
click_object(rect);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
CHECK_ALL(DOUBLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* add a second tap */
|
|
click_object(rect);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* UPDATE -> FINISH */
|
|
CHECK_ALL(DOUBLE_TAP, 0, 1, 1, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 2, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* add a third tap */
|
|
click_object(rect);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* UPDATE -> FINISH */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 1, 1, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
/* clear states */
|
|
wait_timer(0.4);
|
|
RESET;
|
|
|
|
/* verify finger size */
|
|
click_object_at(rect, 500, 500);
|
|
click_object_at(rect, 505, 505);
|
|
CHECK_ALL(TAP, 2, 0, 2, 0);
|
|
CHECK_ALL(LONG_PRESS, 2, 0, 0, 2);
|
|
/* UPDATE -> FINISH */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 2, 1, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 3, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
/* clear states */
|
|
wait_timer(0.4);
|
|
RESET;
|
|
|
|
/* verify multiple simultaneous presses treated as same press */
|
|
multi_click_object(rect, 2);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
CHECK_ALL(DOUBLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
/* this is two fingers, so we have a rotate start */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* this is two fingers, so we have a zoom start */
|
|
CHECK_ALL(ZOOM, 1, 0, 0, 1);
|
|
|
|
RESET;
|
|
|
|
multi_click_object(rect, 2);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* UPDATE -> FINISH */
|
|
CHECK_ALL(DOUBLE_TAP, 0, 1, 1, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 2, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
/* this is two fingers, so we have a rotate start */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* this is two fingers, so we have a zoom start */
|
|
CHECK_ALL(ZOOM, 1, 0, 0, 1);
|
|
|
|
RESET;
|
|
|
|
multi_click_object(rect, 2);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* UPDATE -> FINISH */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 1, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 1, 1, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
/* this is two fingers, so we have a rotate start */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* this is two fingers, so we have a zoom start */
|
|
CHECK_ALL(ZOOM, 1, 0, 0, 1);
|
|
/* clear states */
|
|
wait_timer(0.4);
|
|
RESET;
|
|
|
|
multi_click_object(rect, 10);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
/* this is two fingers, so we have a rotate start */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* this is two fingers, so we have a zoom start */
|
|
CHECK_ALL(ZOOM, 1, 0, 0, 1);
|
|
RESET;
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_long_press)
|
|
{
|
|
Eo *rect = setup();
|
|
double timeout = 1.2;
|
|
Eina_Value *val;
|
|
Eo *e = efl_provider_find(rect, EVAS_CANVAS_CLASS);
|
|
|
|
val = efl_config_get(efl_provider_find(rect, EFL_CONFIG_INTERFACE), "glayer_long_tap_start_timeout");
|
|
eina_value_get(val, &timeout);
|
|
|
|
/* press */
|
|
press_object(rect);
|
|
CHECK_ALL(TAP, 1, 0, 0, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 0);
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 0);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
wait_timer(timeout + 0.01);
|
|
|
|
/* verify longpress */
|
|
CHECK_ALL(TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(LONG_PRESS, 0, 1, 0, 0);
|
|
CHECK_ALL(DOUBLE_TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 0, 0, 1);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
evas_event_feed_mouse_up(e, 1, 0, 2, NULL);
|
|
|
|
CHECK_ZERO(TAP);
|
|
CHECK_ALL(LONG_PRESS, 0, 0, 1, 0);
|
|
CHECK_ZERO(DOUBLE_TAP);
|
|
CHECK_ZERO(TRIPLE_TAP);
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
press_object_at(rect, 0, 0);
|
|
RESET;
|
|
|
|
/* move off-canvas */
|
|
evas_event_feed_mouse_move(e, -1, 0, 2, NULL);
|
|
wait_timer(timeout + 0.01);
|
|
|
|
/* verify longpress */
|
|
CHECK_ALL(TAP, 0, 1, 0, 0);
|
|
CHECK_ALL(LONG_PRESS, 0, 1, 0, 0);
|
|
CHECK_ALL(DOUBLE_TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(MOMENTUM, 1, 0, 0, 0);
|
|
CHECK_ALL(FLICK, 1, 0, 0, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
evas_event_feed_mouse_up(e, 1, 0, 3, NULL);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_flick)
|
|
{
|
|
int moves, i, single = 0;
|
|
Eo *rect = setup();
|
|
|
|
/* add extra random cb to verify that we get exactly 1 event */
|
|
efl_event_callback_add(rect, EFL_EVENT_GESTURE_MOMENTUM, (void*)event_callback_that_increments_an_int_when_called, &single);
|
|
|
|
/* basic flick */
|
|
drag_object(rect, 0, 0, 75, 0, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
/* updated but canceled */
|
|
CHECK_ALL(MOMENTUM, 1, DRAG_OBJECT_NUM_MOVES - 1, 0, 1);
|
|
/* triggered */
|
|
CHECK_ALL(FLICK, 1, DRAG_OBJECT_NUM_MOVES - 1, 1, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
efl_event_callback_del(rect, EFL_EVENT_GESTURE_MOMENTUM, (void*)event_callback_that_increments_an_int_when_called, &single);
|
|
ck_assert_int_ge(single, 0);
|
|
|
|
/* reverse flick */
|
|
drag_object(rect, 75, 0, -75, 0, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
/* updated but canceled */
|
|
CHECK_ALL(MOMENTUM, 1, DRAG_OBJECT_NUM_MOVES - 1, 0, 1);
|
|
/* triggered */
|
|
CHECK_ALL(FLICK, 1, DRAG_OBJECT_NUM_MOVES - 1, 1, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* vertical flick */
|
|
drag_object(rect, 0, 0, 0, 75, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
/* updated but canceled */
|
|
CHECK_ALL(MOMENTUM, 1, DRAG_OBJECT_NUM_MOVES - 1, 0, 1);
|
|
/* triggered */
|
|
CHECK_ALL(FLICK, 1, DRAG_OBJECT_NUM_MOVES - 1, 1, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* reverse vertical flick */
|
|
drag_object(rect, 0, 75, 0, -75, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
/* updated but canceled */
|
|
CHECK_ALL(MOMENTUM, 1, DRAG_OBJECT_NUM_MOVES - 1, 0, 1);
|
|
/* triggered */
|
|
CHECK_ALL(FLICK, 1, DRAG_OBJECT_NUM_MOVES - 1, 1, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
|
|
/* diagonal flick */
|
|
drag_object(rect, 0, 0, 75, 75, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
/* updated but canceled */
|
|
CHECK_ALL(MOMENTUM, 1, DRAG_OBJECT_NUM_MOVES - 1, 0, 1);
|
|
/* triggered */
|
|
CHECK_ALL(FLICK, 1, DRAG_OBJECT_NUM_MOVES - 1, 1, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* off-canvas flick */
|
|
drag_object(rect, 999, 0, 50, 0, EINA_FALSE);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
CHECK_START(MOMENTUM, 1);
|
|
CHECK_FINISH(MOMENTUM, 0);
|
|
CHECK_CANCEL(MOMENTUM, 1);
|
|
CHECK_START(FLICK, 1);
|
|
CHECK_FINISH(FLICK, 1);
|
|
CHECK_CANCEL(FLICK, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* definitely not a flick */
|
|
moves = drag_object_around(rect, 500, 500, 450, 180);
|
|
for (i = 0; i <= TRIPLE_TAP; i++)
|
|
{
|
|
/* canceled */
|
|
CHECK_START(TAP, 1);
|
|
CHECK_CANCEL(TAP, 1);
|
|
}
|
|
/* completed: a momentum gesture is any completed motion */
|
|
CHECK_ALL(MOMENTUM, 1, moves - 2, 1, 0);
|
|
/* NOT triggered; this is going to have some crazy number of update events since it ignores a bunch */
|
|
CHECK_FINISH(FLICK, 0);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* definitely not a flick, also outside canvas */
|
|
moves = drag_object_around(rect, 25, 50, 50, 180);
|
|
for (i = 0; i <= TRIPLE_TAP; i++)
|
|
{
|
|
/* canceled */
|
|
CHECK_START(TAP, 1);
|
|
CHECK_CANCEL(TAP, 1);
|
|
}
|
|
/* momentum should only begin at the initial press or if canceled due to timeout */
|
|
CHECK_START(MOMENTUM, 1);
|
|
CHECK_FINISH(MOMENTUM, 1);
|
|
/* canceled: the motion ends outside the canvas, so there is no momentum */
|
|
CHECK_CANCEL(MOMENTUM, 0);
|
|
|
|
/* flick checks a tolerance value for straight lines, so "start" will be >= 1 */
|
|
ck_assert_int_ge(count[FLICK][EFL_GESTURE_STATE_STARTED - 1], 1);
|
|
CHECK_FINISH(FLICK, 0);
|
|
/* flick checks a tolerance value for straight lines, so "start" will be >= 1 */
|
|
ck_assert_int_ge(count[FLICK][EFL_GESTURE_STATE_CANCELED - 1], 1);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
/* definitely not a flick, test re-entering canvas */
|
|
moves = drag_object_around(rect, 500, 750, 400, 180);
|
|
for (i = 0; i <= TRIPLE_TAP; i++)
|
|
{
|
|
/* canceled */
|
|
CHECK_START(TAP, 1);
|
|
CHECK_CANCEL(TAP, 1);
|
|
}
|
|
/* momentum should only begin at the initial press or if canceled due to timeout */
|
|
CHECK_START(MOMENTUM, 1);
|
|
/* finished: the motion ends outside the canvas, but we still count it */
|
|
CHECK_FINISH(MOMENTUM, 1);
|
|
CHECK_CANCEL(MOMENTUM, 0);
|
|
|
|
/* flick checks a tolerance value for straight lines, so "start" will be >= 1 */
|
|
ck_assert_int_ge(count[FLICK][EFL_GESTURE_STATE_STARTED - 1], 1);
|
|
CHECK_FINISH(FLICK, 0);
|
|
/* flick checks a tolerance value for straight lines, so "start" will be >= 1 */
|
|
ck_assert_int_ge(count[FLICK][EFL_GESTURE_STATE_CANCELED - 1], 1);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_zoom)
|
|
{
|
|
Eo *rect = setup();
|
|
int moves;
|
|
|
|
moves = pinch_object(rect, 500, 500, 501, 501, -250, -250, 250, 250);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
|
|
CHECK_START(MOMENTUM, 1);
|
|
CHECK_UPDATE(MOMENTUM, 0);
|
|
CHECK_FINISH(MOMENTUM, 0);
|
|
CHECK_CANCEL(MOMENTUM, 1);
|
|
|
|
/* only finish is verifiable */
|
|
CHECK_FINISH(FLICK, 0);
|
|
/* started then canceled */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* started 1x */
|
|
CHECK_START(ZOOM, 1);
|
|
/* 2 touch points tracked, so this will be roughly (2 * moves) but probably less */
|
|
ck_assert_int_ge(count[ZOOM][EFL_GESTURE_STATE_UPDATED - 1], moves);
|
|
/* finished 1x */
|
|
CHECK_FINISH(ZOOM, 1);
|
|
CHECK_CANCEL(ZOOM, 0);
|
|
|
|
RESET;
|
|
|
|
|
|
moves = pinch_object(rect, 250, 250, 750, 750, 250, 250, -250, -250);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
|
|
CHECK_START(MOMENTUM, 1);
|
|
CHECK_UPDATE(MOMENTUM, 0);
|
|
CHECK_FINISH(MOMENTUM, 0);
|
|
CHECK_CANCEL(MOMENTUM, 1);
|
|
|
|
/* only finish is verifiable */
|
|
CHECK_FINISH(FLICK, 0);
|
|
/* started then canceled */
|
|
CHECK_ALL(ROTATE, 1, 0, 0, 1);
|
|
/* started 1x */
|
|
CHECK_START(ZOOM, 1);
|
|
/* 2 touch points tracked, so this will be roughly (2 * moves) but probably less */
|
|
ck_assert_int_ge(count[ZOOM][EFL_GESTURE_STATE_UPDATED - 1], moves);
|
|
/* finished 1x */
|
|
CHECK_FINISH(ZOOM, 1);
|
|
CHECK_CANCEL(ZOOM, 0);
|
|
|
|
RESET;
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_rotate)
|
|
{
|
|
Eo *rect = setup();
|
|
int moves, momentum_moves;
|
|
|
|
multi_press_object(rect, 1);
|
|
CHECK_ALL(TAP, 1, 0, 0, 0);
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 0);
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 0);
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 0);
|
|
|
|
CHECK_ZERO(MOMENTUM);
|
|
CHECK_ZERO(FLICK);
|
|
CHECK_ZERO(ROTATE);
|
|
CHECK_ZERO(ZOOM);
|
|
|
|
RESET;
|
|
|
|
|
|
moves = multi_drag_object_around(rect, 1, 500, 500, 250, 180);
|
|
CHECK_ALL(TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(LONG_PRESS, 0, 0, 0, 1);
|
|
CHECK_ALL(DOUBLE_TAP, 0, 0, 0, 1);
|
|
CHECK_ALL(TRIPLE_TAP, 0, 0, 0, 1);
|
|
|
|
CHECK_START(MOMENTUM, 1);
|
|
momentum_moves = count[MOMENTUM][EFL_GESTURE_STATE_UPDATED - 1];
|
|
ck_assert_int_ge(count[MOMENTUM][EFL_GESTURE_STATE_UPDATED - 1], moves - 5);
|
|
CHECK_FINISH(MOMENTUM, 1);
|
|
CHECK_CANCEL(MOMENTUM, 0);
|
|
|
|
/* flick is just going to do flick stuff here, so don't even bother checking much */
|
|
CHECK_FINISH(FLICK, 0);
|
|
|
|
CHECK_ALL(ROTATE, 1, moves - 1, 1, 0);
|
|
CHECK_ALL(ZOOM, 1, 0, 0, 1);
|
|
|
|
RESET;
|
|
|
|
/* verify identical motion in reverse */
|
|
moves = multi_drag_object_around(rect, 1, 500, 500, 250, -180);
|
|
/* already occurred, first finger still down */
|
|
CHECK_ZERO(TAP);
|
|
/* already canceled, first finger still down */
|
|
CHECK_ZERO(LONG_PRESS);
|
|
CHECK_ZERO(DOUBLE_TAP);
|
|
CHECK_ZERO(TRIPLE_TAP);
|
|
|
|
/* continuing gesture, counts as already started */
|
|
CHECK_START(MOMENTUM, 0);
|
|
/* should be exactly 1 more than previous time */
|
|
CHECK_UPDATE(MOMENTUM, momentum_moves + 1);
|
|
CHECK_FINISH(MOMENTUM, 1);
|
|
CHECK_CANCEL(MOMENTUM, 0);
|
|
|
|
/* flick is just going to do flick stuff here, so don't even bother checking much */
|
|
CHECK_FINISH(FLICK, 0);
|
|
|
|
/* continuing gesture, counts as already started, increment update counter */
|
|
CHECK_ALL(ROTATE, 0, (moves - 1) + 1, 1, 0);
|
|
CHECK_ALL(ZOOM, 0, 1, 0, 1);
|
|
|
|
}
|
|
EFL_END_TEST
|
|
|
|
static void
|
|
custom_cb(void *data EINA_UNUSED , const Efl_Event *ev)
|
|
{
|
|
Efl_Canvas_Gesture *g = ev->info;
|
|
|
|
int *count = data;
|
|
if (!eina_streq(efl_gesture_custom_gesture_name_get(g), "custom_gesture")) return;
|
|
/* increment counter for event state which has been processed */
|
|
count[efl_gesture_state_get(g) - 1]++;
|
|
}
|
|
|
|
static void
|
|
custom_cb2(void *data EINA_UNUSED , const Efl_Event *ev)
|
|
{
|
|
Efl_Canvas_Gesture *g = ev->info;
|
|
|
|
int *count = data;
|
|
if (!eina_streq(efl_gesture_custom_gesture_name_get(g), "custom_gesture2")) return;
|
|
/* increment counter for event state which has been processed */
|
|
count[efl_gesture_state_get(g) - 1]++;
|
|
}
|
|
|
|
static void
|
|
custom_gesture_cb(void *data EINA_UNUSED , const Efl_Event *ev)
|
|
{
|
|
Efl_Canvas_Gesture *g = ev->info;
|
|
|
|
Eina_Position2D *delta = data;
|
|
if (!eina_streq(efl_gesture_custom_gesture_name_get(g), "custom_gesture")) return;
|
|
delta->x = custom_gesture_x_delta_get(g);
|
|
delta->y = custom_gesture_y_delta_get(g);
|
|
}
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_custom)
|
|
{
|
|
Eo *rect = setup();
|
|
Eo *manager = efl_provider_find(rect, EFL_CANVAS_GESTURE_MANAGER_CLASS);
|
|
Eo *recognizer = efl_add(CUSTOM_RECOGNIZER_CLASS, manager);
|
|
Eo *recognizer2 = efl_add(CUSTOM_RECOGNIZER2_CLASS, manager);
|
|
Eina_Position2D delta = {0};
|
|
|
|
efl_gesture_manager_recognizer_register(manager, recognizer);
|
|
efl_gesture_manager_recognizer_register(manager, recognizer2);
|
|
efl_event_callback_add(rect, EFL_EVENT_GESTURE_CUSTOM, custom_cb, &count[CUSTOM]);
|
|
efl_event_callback_add(rect, EFL_EVENT_GESTURE_CUSTOM, custom_cb2, &count[CUSTOM2]);
|
|
|
|
/* verify that we're processing */
|
|
click_object(rect);
|
|
CHECK_ALL(CUSTOM, 1, 0, 1, 0);
|
|
CHECK_ALL(CUSTOM2, 1, 0, 0, 1);
|
|
|
|
RESET;
|
|
|
|
/* verify gesture properties */
|
|
efl_event_callback_add(rect, EFL_EVENT_GESTURE_CUSTOM, custom_gesture_cb, &delta);
|
|
drag_object(rect, 0, 0, 75, 30, EINA_FALSE);
|
|
ck_assert_int_eq(delta.x, 75);
|
|
ck_assert_int_eq(delta.y, 30);
|
|
efl_event_callback_del(rect, EFL_EVENT_GESTURE_CUSTOM, custom_gesture_cb, &delta);
|
|
|
|
RESET;
|
|
|
|
/* verify that we aren't still processing */
|
|
efl_gesture_manager_recognizer_unregister(manager, recognizer);
|
|
efl_gesture_manager_recognizer_unregister(manager, recognizer2);
|
|
click_object(rect);
|
|
CHECK_ZERO(CUSTOM);
|
|
CHECK_ZERO(CUSTOM2);
|
|
|
|
RESET;
|
|
|
|
/* verify re-register + early finish from custom2 */
|
|
efl_gesture_manager_recognizer_register(manager, recognizer);
|
|
efl_gesture_manager_recognizer_register(manager, recognizer2);
|
|
drag_object(rect, 500, 500, 1, 0, EINA_FALSE);
|
|
CHECK_ALL(CUSTOM, 1, 1, 1, 0);
|
|
CHECK_ALL(CUSTOM2, 1, 0, 1, 0);
|
|
|
|
efl_event_callback_del(rect, EFL_EVENT_GESTURE_CUSTOM, custom_cb, &count[CUSTOM]);
|
|
efl_event_callback_del(rect, EFL_EVENT_GESTURE_CUSTOM, custom_cb2, &count[CUSTOM2]);
|
|
|
|
RESET;
|
|
|
|
/* verify we don't have anything totally weird going on */
|
|
click_object(rect);
|
|
CHECK_ZERO(CUSTOM);
|
|
CHECK_ZERO(CUSTOM2);
|
|
|
|
efl_gesture_manager_recognizer_unregister(manager, recognizer);
|
|
efl_gesture_manager_recognizer_unregister(manager, recognizer2);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
|
|
EFL_START_TEST(test_efl_ui_gesture_sequence)
|
|
{
|
|
Eo *rect = setup();
|
|
int moves;
|
|
|
|
multi_click_object(rect, 1);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
|
|
wait_timer(0.4);
|
|
RESET;
|
|
|
|
moves = pinch_object(rect, 500, 500, 501, 501, -250, 0, 250, 0);
|
|
/* canceled */
|
|
CHECK_ALL(TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(LONG_PRESS, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(DOUBLE_TAP, 1, 0, 0, 1);
|
|
/* canceled */
|
|
CHECK_ALL(TRIPLE_TAP, 1, 0, 0, 1);
|
|
|
|
|
|
CHECK_START(ZOOM, 1);
|
|
/* 2 touch points tracked, so this will be roughly (2 * moves) but probably less */
|
|
ck_assert_int_ge(count[ZOOM][EFL_GESTURE_STATE_UPDATED - 1], moves);
|
|
/* finished 1x */
|
|
CHECK_FINISH(ZOOM, 1);
|
|
CHECK_CANCEL(ZOOM, 0);
|
|
|
|
wait_timer(0.4);
|
|
RESET;
|
|
|
|
multi_click_object(rect, 1);
|
|
CHECK_ALL(TAP, 1, 0, 1, 0);
|
|
|
|
RESET;
|
|
}
|
|
EFL_END_TEST
|
|
|
|
void efl_ui_test_gesture(TCase *tc)
|
|
{
|
|
tcase_add_test(tc, test_efl_ui_gesture_taps);
|
|
tcase_add_test(tc, test_efl_ui_gesture_long_press);
|
|
tcase_add_test(tc, test_efl_ui_gesture_flick);
|
|
tcase_add_test(tc, test_efl_ui_gesture_zoom);
|
|
tcase_add_test(tc, test_efl_ui_gesture_rotate);
|
|
tcase_add_test(tc, test_efl_ui_gesture_custom);
|
|
tcase_add_test(tc, test_efl_ui_gesture_sequence);
|
|
}
|