+gboolean
+queue (gpointer data)
+{
+ struct ctx *ctx;
+ ctx = (struct ctx *) data;
+ gtk_widget_queue_draw (GTK_WIDGET (ctx->draw));
+ ctx->move = TRUE;
+ return FALSE;
+}
+
+gboolean
+expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)
+{
+ GdkPixbuf *screen;
+ struct ctx *ctx;
+ Point point;
+ int w, h;
+ ctx = (struct ctx *) data;
+ gdk_drawable_get_size (GDK_DRAWABLE (event->window), &w, &h);
+ if (ctx->move)
+ ctx->i = (ctx->i >= ctx->points->len) ? 0 : ctx->i + 1;
+ point = g_array_index (ctx->points, Point, ctx->i);
+ screen = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8,
+ event->area.width, event->area.height);
+ gdk_pixbuf_scale (ctx->picture, screen, 0, 0,
+ event->area.width, event->area.height,
+ -point.x + w/2 - event->area.x,
+ -point.y + h/2 - event->area.y,
+ point.rx, point.ry, GDK_INTERP_HYPER);
+ gdk_draw_pixbuf (widget->window, NULL, screen, 0, 0,
+ event->area.x, event->area.y,
+ event->area.width, event->area.height,
+ GDK_RGB_DITHER_NONE, 0, 0);
+ gdk_pixbuf_unref (screen);
+ if (point.name)
+ {
+ if (ctx->move)
+ g_timeout_add (3000, queue, ctx);
+ }
+ else
+ {
+ if (ctx->move)
+ g_timeout_add (10, queue, ctx);
+ }
+ ctx->move = FALSE;
+ return FALSE;
+}
+