Wed Oct 25 15:17:38 2006 John Ellis <johne@verizon.net>
authorJohn Ellis <johne@verizon.net>
Wed, 25 Oct 2006 19:23:46 +0000 (19:23 +0000)
committerJohn Ellis <johne@verizon.net>
Wed, 25 Oct 2006 19:23:46 +0000 (19:23 +0000)
        * pixbuf-renderer.c (pixbuf_renderer_scroll): Fix long standing bug
        where obstructed portions of an image were not always generating an
        expose event when scrolling the image.

ChangeLog
src/pixbuf-renderer.c

index 99b4452..ac3fb59 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Oct 25 15:17:38 2006  John Ellis  <johne@verizon.net>
+
+       * pixbuf-renderer.c (pixbuf_renderer_scroll): Fix long standing bug
+       where obstructed portions of an image were not always generating an
+       expose event when scrolling the image.
+
 Mon Oct 23 05:34:29 2006  John Ellis  <johne@verizon.net>
 
        * img-view.c, layout_image.c, layout_util.c, pan-view.c: Make F11 also
index d336550..9399c34 100644 (file)
@@ -2008,6 +2008,12 @@ static void pr_tile_render(PixbufRenderer *pr, ImageTile *it,
                                w, h,
                                pr->dither_quality, it->x + x, it->y + y);
                }
+
+#if 0
+       /* enable this line for debugging the edges of tiles */
+       gdk_draw_rectangle(it->pixmap, box->style->white_gc,
+                          FALSE, 0, 0, it->w, it->h);
+#endif
 }
 
 
@@ -2779,6 +2785,7 @@ void pixbuf_renderer_scroll(PixbufRenderer *pr, gint x, gint y)
                gint x2, y2;
                GtkWidget *box;
                GdkGC *gc;
+               GdkEvent *event;
 
                if (x_off < 0)
                        {
@@ -2833,6 +2840,19 @@ void pixbuf_renderer_scroll(PixbufRenderer *pr, gint x, gint y)
                                 pr->x_scroll, y_off > 0 ? pr->y_scroll + (pr->vis_height - h) : pr->y_scroll,
                                 pr->vis_width, h, TRUE, TILE_RENDER_ALL, FALSE, FALSE);
                        }
+
+               /* process exposures here, "expose_event" seems to miss a few with obstructed windows */
+               while ((event = gdk_event_get_graphics_expose(box->window)) != NULL)
+                       {
+                       pixbuf_renderer_paint(pr, &event->expose.area);
+
+                       if (event->expose.count == 0)
+                               {
+                               gdk_event_free(event);
+                               break;
+                               }
+                       gdk_event_free(event);
+                       }
                }
 }