testsuite: Prepare gestures testsuite for mouse/touch events
state is preserved for mouse emulation, and up to 10 touchpoints for touch emulation.
This commit is contained in:
@ -1,32 +1,171 @@
|
|||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
static gboolean
|
typedef struct {
|
||||||
inject_press (gpointer data)
|
GtkWidget *widget;
|
||||||
|
gint x;
|
||||||
|
gint y;
|
||||||
|
guint state;
|
||||||
|
guint pressed : 1;
|
||||||
|
} PointState;
|
||||||
|
|
||||||
|
static PointState mouse_state;
|
||||||
|
static PointState touch_state[10]; /* touchpoint 0 gets pointer emulation,
|
||||||
|
* use it first in tests for consistency.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define EVENT_SEQUENCE(point) (GdkEventSequence*) ((point) - touch_state + 1)
|
||||||
|
|
||||||
|
static void
|
||||||
|
point_press (PointState *point,
|
||||||
|
GtkWidget *widget,
|
||||||
|
guint button)
|
||||||
{
|
{
|
||||||
GtkWidget *widget = data;
|
|
||||||
GdkEventButton *ev;
|
|
||||||
GdkDisplay *display;
|
GdkDisplay *display;
|
||||||
GdkDeviceManager *dm;
|
GdkDeviceManager *dm;
|
||||||
GdkDevice *device;
|
GdkDevice *device;
|
||||||
|
GdkEvent *ev;
|
||||||
|
|
||||||
display = gtk_widget_get_display (widget);
|
display = gtk_widget_get_display (widget);
|
||||||
dm = gdk_display_get_device_manager (display);
|
dm = gdk_display_get_device_manager (display);
|
||||||
device = gdk_device_manager_get_client_pointer (dm);
|
device = gdk_device_manager_get_client_pointer (dm);
|
||||||
|
|
||||||
ev = (GdkEventButton*)gdk_event_new (GDK_BUTTON_PRESS);
|
if (point == &mouse_state)
|
||||||
ev->window = g_object_ref (gtk_widget_get_window (widget));
|
{
|
||||||
ev->time = GDK_CURRENT_TIME;
|
ev = gdk_event_new (GDK_BUTTON_PRESS);
|
||||||
ev->x = 1;
|
ev->any.window = g_object_ref (gtk_widget_get_window (widget));
|
||||||
ev->y = 1;
|
ev->button.time = GDK_CURRENT_TIME;
|
||||||
ev->state = 0;
|
ev->button.x = point->x;
|
||||||
ev->button = 1;
|
ev->button.y = point->y;
|
||||||
gdk_event_set_device ((GdkEvent*)ev, device);
|
ev->button.button = button;
|
||||||
|
ev->button.state = point->state;
|
||||||
|
|
||||||
gtk_main_do_event ((GdkEvent*)ev);
|
point->state |= GDK_BUTTON1_MASK << (button - 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ev = gdk_event_new (GDK_TOUCH_BEGIN);
|
||||||
|
ev->any.window = g_object_ref (gtk_widget_get_window (widget));
|
||||||
|
ev->touch.time = GDK_CURRENT_TIME;
|
||||||
|
ev->touch.x = point->x;
|
||||||
|
ev->touch.y = point->y;
|
||||||
|
ev->touch.sequence = EVENT_SEQUENCE (point);
|
||||||
|
|
||||||
gdk_event_free ((GdkEvent*)ev);
|
if (point == &touch_state[0])
|
||||||
|
ev->touch.emulating_pointer = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
return G_SOURCE_REMOVE;
|
gdk_event_set_device (ev, device);
|
||||||
|
|
||||||
|
gtk_main_do_event (ev);
|
||||||
|
|
||||||
|
gdk_event_free (ev);
|
||||||
|
|
||||||
|
point->widget = widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
point_update (PointState *point,
|
||||||
|
GtkWidget *widget,
|
||||||
|
gdouble x,
|
||||||
|
gdouble y)
|
||||||
|
{
|
||||||
|
GdkDisplay *display;
|
||||||
|
GdkDeviceManager *dm;
|
||||||
|
GdkDevice *device;
|
||||||
|
GdkEvent *ev;
|
||||||
|
|
||||||
|
display = gtk_widget_get_display (widget);
|
||||||
|
dm = gdk_display_get_device_manager (display);
|
||||||
|
device = gdk_device_manager_get_client_pointer (dm);
|
||||||
|
|
||||||
|
if (point == &mouse_state)
|
||||||
|
{
|
||||||
|
ev = gdk_event_new (GDK_MOTION_NOTIFY);
|
||||||
|
ev->any.window = g_object_ref (gtk_widget_get_window (widget));
|
||||||
|
ev->button.time = GDK_CURRENT_TIME;
|
||||||
|
ev->motion.x = x;
|
||||||
|
ev->motion.y = y;
|
||||||
|
ev->motion.state = point->state;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (!point->widget || widget != point->widget)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ev = gdk_event_new (GDK_TOUCH_UPDATE);
|
||||||
|
ev->any.window = g_object_ref (gtk_widget_get_window (widget));
|
||||||
|
ev->touch.time = GDK_CURRENT_TIME;
|
||||||
|
ev->touch.x = x;
|
||||||
|
ev->touch.y = y;
|
||||||
|
ev->touch.sequence = EVENT_SEQUENCE (point);
|
||||||
|
ev->touch.state = 0;
|
||||||
|
|
||||||
|
if (point == &touch_state[0])
|
||||||
|
ev->touch.emulating_pointer = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_event_set_device (ev, device);
|
||||||
|
|
||||||
|
gtk_main_do_event (ev);
|
||||||
|
|
||||||
|
gdk_event_free (ev);
|
||||||
|
|
||||||
|
point->x = x;
|
||||||
|
point->y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
point_release (PointState *point,
|
||||||
|
guint button)
|
||||||
|
{
|
||||||
|
GdkDisplay *display;
|
||||||
|
GdkDeviceManager *dm;
|
||||||
|
GdkDevice *device;
|
||||||
|
GdkEvent *ev;
|
||||||
|
|
||||||
|
if (point->widget == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
display = gtk_widget_get_display (point->widget);
|
||||||
|
dm = gdk_display_get_device_manager (display);
|
||||||
|
device = gdk_device_manager_get_client_pointer (dm);
|
||||||
|
|
||||||
|
if (!point->widget)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (point == &mouse_state)
|
||||||
|
{
|
||||||
|
if ((point->state & (GDK_BUTTON1_MASK << (button - 1))) == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
ev = gdk_event_new (GDK_BUTTON_RELEASE);
|
||||||
|
ev->any.window = g_object_ref (gtk_widget_get_window (point->widget));
|
||||||
|
ev->button.time = GDK_CURRENT_TIME;
|
||||||
|
ev->button.x = point->x;
|
||||||
|
ev->button.y = point->y;
|
||||||
|
ev->button.state = point->state;
|
||||||
|
|
||||||
|
point->state &= ~(GDK_BUTTON1_MASK << (button - 1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ev = gdk_event_new (GDK_TOUCH_END);
|
||||||
|
ev->any.window = g_object_ref (gtk_widget_get_window (point->widget));
|
||||||
|
ev->touch.time = GDK_CURRENT_TIME;
|
||||||
|
ev->touch.x = point->x;
|
||||||
|
ev->touch.y = point->y;
|
||||||
|
ev->touch.sequence = EVENT_SEQUENCE (point);
|
||||||
|
ev->touch.state = point->state;
|
||||||
|
|
||||||
|
if (point == &touch_state[0])
|
||||||
|
ev->touch.emulating_pointer = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gdk_event_set_device (ev, device);
|
||||||
|
|
||||||
|
gtk_main_do_event (ev);
|
||||||
|
|
||||||
|
gdk_event_free (ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const gchar *
|
static const gchar *
|
||||||
@ -190,7 +329,8 @@ test_phases (void)
|
|||||||
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -242,7 +382,8 @@ test_mixed (void)
|
|||||||
add_legacy (B, str, GDK_EVENT_PROPAGATE);
|
add_legacy (B, str, GDK_EVENT_PROPAGATE);
|
||||||
add_legacy (C, str, GDK_EVENT_PROPAGATE);
|
add_legacy (C, str, GDK_EVENT_PROPAGATE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -295,7 +436,8 @@ test_early_exit (void)
|
|||||||
add_legacy (B, str, GDK_EVENT_STOP);
|
add_legacy (B, str, GDK_EVENT_STOP);
|
||||||
add_legacy (C, str, GDK_EVENT_PROPAGATE);
|
add_legacy (C, str, GDK_EVENT_PROPAGATE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -341,7 +483,8 @@ test_claim_capture (void)
|
|||||||
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -384,7 +527,8 @@ test_claim_target (void)
|
|||||||
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -428,7 +572,8 @@ test_claim_bubble (void)
|
|||||||
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_CLAIMED);
|
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_CLAIMED);
|
||||||
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (C, "c3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
@ -481,7 +626,8 @@ test_group (void)
|
|||||||
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
add_gesture (C, "c4", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
add_gesture (C, "c4", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_NONE);
|
||||||
|
|
||||||
inject_press (C);
|
point_update (&mouse_state, C, 10, 10);
|
||||||
|
point_press (&mouse_state, C, 1);
|
||||||
|
|
||||||
g_assert_cmpstr (str->str, ==,
|
g_assert_cmpstr (str->str, ==,
|
||||||
"capture a1, "
|
"capture a1, "
|
||||||
|
|||||||
Reference in New Issue
Block a user