summaryrefslogtreecommitdiff
path: root/testsuite
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2014-06-03 13:17:13 +0200
committerCarlos Garnacho <carlosg@gnome.org>2014-06-03 15:59:03 +0200
commitfe7215e36905993ab1924f3b6777cd40cff7d9d7 (patch)
tree20121619b7babdb8fa87d3532c2440281905fb14 /testsuite
parent26ced6abad9fab0dbfd932a00d1ca5f32f479e0e (diff)
downloadgtk+-fe7215e36905993ab1924f3b6777cd40cff7d9d7.tar.gz
testsuite: Prepare gestures testsuite for mouse/touch events
state is preserved for mouse emulation, and up to 10 touchpoints for touch emulation.
Diffstat (limited to 'testsuite')
-rw-r--r--testsuite/gtk/gestures.c190
1 files changed, 168 insertions, 22 deletions
diff --git a/testsuite/gtk/gestures.c b/testsuite/gtk/gestures.c
index e1efddc363..a6f8134c22 100644
--- a/testsuite/gtk/gestures.c
+++ b/testsuite/gtk/gestures.c
@@ -1,32 +1,171 @@
#include <gtk/gtk.h>
-static gboolean
-inject_press (gpointer data)
+typedef struct {
+ 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;
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);
- ev = (GdkEventButton*)gdk_event_new (GDK_BUTTON_PRESS);
- ev->window = g_object_ref (gtk_widget_get_window (widget));
- ev->time = GDK_CURRENT_TIME;
- ev->x = 1;
- ev->y = 1;
- ev->state = 0;
- ev->button = 1;
- gdk_event_set_device ((GdkEvent*)ev, device);
+ if (point == &mouse_state)
+ {
+ ev = gdk_event_new (GDK_BUTTON_PRESS);
+ ev->any.window = g_object_ref (gtk_widget_get_window (widget));
+ ev->button.time = GDK_CURRENT_TIME;
+ ev->button.x = point->x;
+ ev->button.y = point->y;
+ ev->button.button = button;
+ ev->button.state = point->state;
+
+ 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);
+
+ 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->widget = widget;
+}
- gtk_main_do_event ((GdkEvent*)ev);
+static void
+point_update (PointState *point,
+ GtkWidget *widget,
+ gdouble x,
+ gdouble y)
+{
+ GdkDisplay *display;
+ GdkDeviceManager *dm;
+ GdkDevice *device;
+ GdkEvent *ev;
- gdk_event_free ((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);
- return G_SOURCE_REMOVE;
+ 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 *
@@ -190,7 +329,8 @@ test_phases (void)
add_gesture (B, "b3", 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, ==,
"capture a1, "
@@ -242,7 +382,8 @@ test_mixed (void)
add_legacy (B, 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, ==,
"capture a1, "
@@ -295,7 +436,8 @@ test_early_exit (void)
add_legacy (B, str, GDK_EVENT_STOP);
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, ==,
"capture a1, "
@@ -341,7 +483,8 @@ test_claim_capture (void)
add_gesture (B, "b3", 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, ==,
"capture a1, "
@@ -384,7 +527,8 @@ test_claim_target (void)
add_gesture (B, "b3", 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, ==,
"capture a1, "
@@ -428,7 +572,8 @@ test_claim_bubble (void)
add_gesture (B, "b3", GTK_PHASE_BUBBLE, str, GTK_EVENT_SEQUENCE_CLAIMED);
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, ==,
"capture a1, "
@@ -481,7 +626,8 @@ test_group (void)
add_gesture (B, "b3", 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, ==,
"capture a1, "