Only reschedules when moving and only draws the needed portion of window
authorThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sat, 16 Aug 2008 15:28:17 +0000 (12:28 -0300)
committerThadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
Sat, 16 Aug 2008 15:28:17 +0000 (12:28 -0300)
gdk.c

diff --git a/gdk.c b/gdk.c
index 780e2ba..a6b6113 100644 (file)
--- a/gdk.c
+++ b/gdk.c
@@ -50,7 +50,9 @@ 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);
@@ -58,18 +60,23 @@ expose (GtkWidget *widget, GdkEventExpose *event, gpointer data)
                            event->area.width, event->area.height);
   gdk_pixbuf_scale (ctx->picture, screen, 0, 0,
                     event->area.width, event->area.height,
-                   -point.x + event->area.width/2, -point.y + event->area.height/2,
+                   -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, 0, 0, -1, -1,
+  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)
     {
-      g_timeout_add (3000, queue, ctx);
+      if (ctx->move)
+        g_timeout_add (3000, queue, ctx);
     }
   else
     {
-      g_timeout_add (10, queue, ctx);
+      if (ctx->move)
+        g_timeout_add (10, queue, ctx);
     }
   ctx->move = FALSE;
   return FALSE;