testgestures: Update for gestures

This commit is contained in:
Benjamin Otte
2012-03-14 19:25:18 +01:00
parent 55421f7fed
commit 2bf2b5df5f

View File

@@ -21,16 +21,12 @@
#include <gtk/gtk.h>
typedef struct _SwipeData SwipeData;
struct _SwipeData {
typedef struct _AreaData AreaData;
struct _AreaData {
double x_offset;
double y_offset;
double progress;
guint color;
};
typedef struct _PinchPanData PinchPanData;
struct _PinchPanData {
cairo_matrix_t matrix;
cairo_matrix_t pending;
GdkPixbuf *pixbuf;
@@ -39,7 +35,7 @@ struct _PinchPanData {
static void
update_swipe (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
SwipeData *data)
AreaData *data)
{
GtkSwipeGesture *swipe = GTK_SWIPE_GESTURE (tracker);
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
@@ -57,7 +53,7 @@ update_swipe (GtkEventRecognizer *recognizer,
static void
finish_swipe (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
SwipeData *data)
AreaData *data)
{
GtkSwipeGesture *swipe = GTK_SWIPE_GESTURE (tracker);
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
@@ -81,7 +77,7 @@ finish_swipe (GtkEventRecognizer *recognizer,
static void
cancel_swipe (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
SwipeData *data)
AreaData *data)
{
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
@@ -91,39 +87,6 @@ cancel_swipe (GtkEventRecognizer *recognizer,
gtk_widget_queue_draw (widget);
}
static gboolean
draw_swipe (GtkWidget *widget,
cairo_t *cr,
SwipeData *data)
{
static const GdkRGBA colors[4] = {
{ 1, 0, 0, 1 },
{ 0, 1, 0, 1 },
{ 0, 0, 1, 1 },
{ 1, 1, 0, 1 },
};
int i, x, y, w, h;
w = gtk_widget_get_allocated_width (widget);
h = gtk_widget_get_allocated_height (widget);
x = data->x_offset * w;
y = data->y_offset * h;
cairo_translate (cr, x, y);
for (i = 0; i < 4; i++)
{
gdk_cairo_set_source_rgba (cr, &colors[data->color ^ i]);
cairo_rectangle (cr,
i % 2 ? (x > 0 ? -w : w) : 0,
i / 2 ? (y > 0 ? -h : h) : 0,
w, h);
cairo_fill (cr);
}
return FALSE;
}
static void
pinch_pan_get_matrix (cairo_matrix_t *matrix,
GtkPinchPanGesture *pinch)
@@ -142,12 +105,13 @@ pinch_pan_get_matrix (cairo_matrix_t *matrix,
static void
update_pinch_pan (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
PinchPanData *data)
AreaData *data)
{
GtkPinchPanGesture *pinch = GTK_PINCH_PAN_GESTURE (tracker);
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
pinch_pan_get_matrix (&data->pending, pinch);
if (gtk_gesture_owns_all_sequences (GTK_GESTURE (tracker)))
pinch_pan_get_matrix (&data->pending, pinch);
gtk_widget_queue_draw (widget);
}
@@ -155,7 +119,7 @@ update_pinch_pan (GtkEventRecognizer *recognizer,
static void
finish_pinch_pan (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
PinchPanData *data)
AreaData *data)
{
GtkPinchPanGesture *pinch = GTK_PINCH_PAN_GESTURE (tracker);
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
@@ -170,7 +134,7 @@ finish_pinch_pan (GtkEventRecognizer *recognizer,
static void
cancel_pinch_pan (GtkEventRecognizer *recognizer,
GtkEventTracker *tracker,
PinchPanData *data)
AreaData *data)
{
GtkWidget *widget = gtk_event_tracker_get_widget (tracker);
@@ -180,10 +144,39 @@ cancel_pinch_pan (GtkEventRecognizer *recognizer,
}
static gboolean
draw_pinch_pan (GtkWidget *widget,
cairo_t *cr,
PinchPanData *data)
draw_area (GtkWidget *widget,
cairo_t *cr,
AreaData *data)
{
static const GdkRGBA colors[4] = {
{ 1, 0, 0, 1 },
{ 0, 1, 0, 1 },
{ 0, 0, 1, 1 },
{ 1, 1, 0, 1 },
};
int i, x, y, w, h;
w = gtk_widget_get_allocated_width (widget);
h = gtk_widget_get_allocated_height (widget);
x = data->x_offset * w;
y = data->y_offset * h;
cairo_save (cr);
cairo_translate (cr, x, y);
for (i = 0; i < 4; i++)
{
gdk_cairo_set_source_rgba (cr, &colors[data->color ^ i]);
cairo_rectangle (cr,
i % 2 ? (x > 0 ? -w : w) : 0,
i / 2 ? (y > 0 ? -h : h) : 0,
w, h);
cairo_fill (cr);
}
cairo_restore (cr);
cairo_translate (cr,
gtk_widget_get_allocated_width (widget) / 2.0,
gtk_widget_get_allocated_height (widget) / 2.0);
@@ -204,8 +197,7 @@ main (int argc, char *argv[])
{
GtkEventRecognizer *recognizer;
GtkWidget *window, *area;
SwipeData swipe_data = { 0, };
PinchPanData pinch_pan_data = { { 0 }, };
AreaData area_data = { 0 };
gtk_init (&argc, &argv);
@@ -217,30 +209,25 @@ main (int argc, char *argv[])
gtk_widget_set_size_request (area, 400, 300);
recognizer = gtk_swipe_recognizer_new ();
g_signal_connect (recognizer, "started", G_CALLBACK (update_swipe), &swipe_data);
g_signal_connect (recognizer, "updated", G_CALLBACK (update_swipe), &swipe_data);
g_signal_connect (recognizer, "finished", G_CALLBACK (finish_swipe), &swipe_data);
g_signal_connect (recognizer, "cancelled", G_CALLBACK (cancel_swipe), &swipe_data);
#if 0
g_signal_connect (recognizer, "started", G_CALLBACK (update_swipe), &area_data);
g_signal_connect (recognizer, "updated", G_CALLBACK (update_swipe), &area_data);
g_signal_connect (recognizer, "finished", G_CALLBACK (finish_swipe), &area_data);
g_signal_connect (recognizer, "cancelled", G_CALLBACK (cancel_swipe), &area_data);
gtk_widget_add_recognizer (area, recognizer);
#endif
cairo_matrix_init_identity (&pinch_pan_data.matrix);
cairo_matrix_init_identity (&pinch_pan_data.pending);
pinch_pan_data.pixbuf = gdk_pixbuf_new_from_file ("gnome-textfile.png", NULL);
g_assert (pinch_pan_data.pixbuf);
cairo_matrix_init_identity (&area_data.matrix);
cairo_matrix_init_identity (&area_data.pending);
area_data.pixbuf = gdk_pixbuf_new_from_file ("gnome-textfile.png", NULL);
g_assert (area_data.pixbuf);
recognizer = gtk_pinch_pan_recognizer_new ();
g_signal_connect (recognizer, "started", G_CALLBACK (update_pinch_pan), &pinch_pan_data);
g_signal_connect (recognizer, "updated", G_CALLBACK (update_pinch_pan), &pinch_pan_data);
g_signal_connect (recognizer, "finished", G_CALLBACK (finish_pinch_pan), &pinch_pan_data);
g_signal_connect (recognizer, "cancelled", G_CALLBACK (cancel_pinch_pan), &pinch_pan_data);
#if 1
g_signal_connect (recognizer, "started", G_CALLBACK (update_pinch_pan), &area_data);
g_signal_connect (recognizer, "updated", G_CALLBACK (update_pinch_pan), &area_data);
g_signal_connect (recognizer, "finished", G_CALLBACK (finish_pinch_pan), &area_data);
g_signal_connect (recognizer, "cancelled", G_CALLBACK (cancel_pinch_pan), &area_data);
gtk_widget_add_recognizer (area, recognizer);
#endif
g_signal_connect_after (area, "draw", G_CALLBACK (draw_swipe), &swipe_data);
g_signal_connect_after (area, "draw", G_CALLBACK (draw_pinch_pan), &pinch_pan_data);
g_signal_connect_after (area, "draw", G_CALLBACK (draw_area), &area_data);
gtk_container_add (GTK_CONTAINER (window), area);
gtk_widget_show_all (window);