use gtk_widget_set_app_paintable for renderer
[geeqie.git] / src / pixbuf-renderer.c
index 7089bb1..f14d8f9 100644 (file)
@@ -25,8 +25,6 @@
 
 #include <gtk/gtk.h>
 
-#define RENDERER_NEW(pr) renderer_clutter_new(pr)
-
 /* comment this out if not using this from within Geeqie
  * defining GQ_BUILD does these things:
  *   - Sets the shift-click scroller pixbuf to a nice icon instead of a black box
@@ -381,6 +379,20 @@ static void pixbuf_renderer_class_init(PixbufRendererClass *class)
                             G_TYPE_NONE, 0);
 }
 
+static RendererFuncs *pr_backend_renderer_new(PixbufRenderer *pr)
+{
+       if (options->image.use_clutter_renderer)
+               {
+#ifdef HAVE_CLUTTER
+               return renderer_clutter_new(pr);
+#else
+               DEBUG_0("Geeqie is built without clutter renderer support");
+#endif
+               }
+       return renderer_tiles_new(pr);
+}      
+
+
 static void pixbuf_renderer_init(PixbufRenderer *pr)
 {
        GtkWidget *box;
@@ -414,11 +426,12 @@ static void pixbuf_renderer_init(PixbufRenderer *pr)
        
        pr->stereo_mode = PR_STEREO_NONE;
        
-       pr->renderer = RENDERER_NEW(pr);
+       pr->renderer = pr_backend_renderer_new(pr);
        
        pr->renderer2 = NULL;
 
        gtk_widget_set_double_buffered(box, FALSE);
+       gtk_widget_set_app_paintable(box, TRUE);
        g_signal_connect_after(G_OBJECT(box), "size_allocate",
                               G_CALLBACK(pr_size_cb), pr);
 
@@ -900,8 +913,8 @@ void pixbuf_renderer_set_color(PixbufRenderer *pr, GdkColor *color)
 
        gtk_widget_set_style(widget, style);
 
-       pr->renderer->update_sizes(pr->renderer);
-       if (pr->renderer2) pr->renderer2->update_sizes(pr->renderer2);
+       pr->renderer->update_viewport(pr->renderer);
+       if (pr->renderer2) pr->renderer2->update_viewport(pr->renderer2);
 }
 
 /*
@@ -1578,15 +1591,12 @@ static gboolean pr_size_clamp(PixbufRenderer *pr)
 }
 
 static gboolean pr_zoom_clamp(PixbufRenderer *pr, gdouble zoom,
-                             PrZoomFlags flags, gboolean *redrawn)
+                             PrZoomFlags flags)
 {
        gint w, h;
        gdouble scale;
-       gboolean invalid;
        gboolean force = !!(flags & PR_ZOOM_FORCE);
        gboolean new = !!(flags & PR_ZOOM_NEW);
-       gboolean invalidate = !!(flags & PR_ZOOM_INVALIDATE);
-       gboolean lazy = !!(flags & PR_ZOOM_LAZY);
 
        zoom = CLAMP(zoom, pr->zoom_min, pr->zoom_max);
 
@@ -1670,23 +1680,11 @@ static gboolean pr_zoom_clamp(PixbufRenderer *pr, gdouble zoom,
                h = h * scale * pr->aspect_ratio;
                }
 
-       invalid = (pr->width != w || pr->height != h);
-
        pr->zoom = zoom;
        pr->width = w;
        pr->height = h;
        pr->scale = scale;
 
-       if (invalidate || invalid)
-               {
-               pr->renderer->update_zoom(pr->renderer, lazy);
-               if (pr->renderer2) pr->renderer2->update_zoom(pr->renderer2, lazy);
-//             if (!lazy) pr_redraw(pr, TRUE);
-               }
-       if (redrawn) *redrawn = (invalidate || invalid);
-
-       pixbuf_renderer_sync_scroll_center(pr);
-
        return TRUE;
 }
 
@@ -1697,7 +1695,6 @@ static void pr_zoom_sync(PixbufRenderer *pr, gdouble zoom,
        gint old_cx, old_cy;
        gboolean clamped;
        gboolean sized;
-       gboolean redrawn = FALSE;
        gboolean center_point = !!(flags & PR_ZOOM_CENTER);
        gboolean force = !!(flags & PR_ZOOM_FORCE);
        gboolean new = !!(flags & PR_ZOOM_NEW);
@@ -1722,8 +1719,7 @@ static void pr_zoom_sync(PixbufRenderer *pr, gdouble zoom,
                }
 
        if (force) clamp_flags |= PR_ZOOM_INVALIDATE;
-       if (lazy) clamp_flags |= PR_ZOOM_LAZY;
-       if (!pr_zoom_clamp(pr, zoom, clamp_flags, &redrawn)) return;
+       if (!pr_zoom_clamp(pr, zoom, clamp_flags)) return;
 
        clamped = pr_size_clamp(pr);
        sized = pr_parent_window_resize(pr, pr->width, pr->height);
@@ -1767,17 +1763,6 @@ static void pr_zoom_sync(PixbufRenderer *pr, gdouble zoom,
 
        pr_scroll_clamp(pr);
 
-#if 0  
-       if (lazy)
-               {
-               pr->renderer->queue_clear(pr->renderer);
-               if (pr->renderer2) pr->renderer2->queue_clear(pr->renderer2);
-               }
-       else
-               {
-               pr_redraw(pr, redrawn);
-               }
-#endif
        pr->renderer->update_zoom(pr->renderer, lazy);
        if (pr->renderer2) pr->renderer2->update_zoom(pr->renderer2, lazy);
 
@@ -1821,15 +1806,22 @@ static void pr_size_sync(PixbufRenderer *pr, gint new_width, gint new_height)
        if (pr->zoom == 0.0)
                {
                gdouble old_scale = pr->scale;
-               pr_zoom_clamp(pr, 0.0, PR_ZOOM_FORCE, NULL);
+               pr_zoom_clamp(pr, 0.0, PR_ZOOM_FORCE);
                zoom_changed = (old_scale != pr->scale);
                }
 
        pr_size_clamp(pr);
        pr_scroll_clamp(pr);
 
-       pr->renderer->update_sizes(pr->renderer);
-       if (pr->renderer2) pr->renderer2->update_sizes(pr->renderer2);
+       if (zoom_changed)
+               {
+               pr->renderer->update_zoom(pr->renderer, FALSE);
+               if (pr->renderer2) pr->renderer2->update_zoom(pr->renderer2, FALSE);
+               }
+
+       pr->renderer->update_viewport(pr->renderer);
+       if (pr->renderer2) pr->renderer2->update_viewport(pr->renderer2);
+
 
        /* ensure scroller remains visible */
        if (pr->scroller_overlay != -1)
@@ -2353,18 +2345,8 @@ static void pr_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, P
 
                box = GTK_WIDGET(pr);
 
-#if GTK_CHECK_VERSION(2,20,0)
-               if (gtk_widget_get_realized(box))
-#else
-               if (GTK_WIDGET_REALIZED(box))
-#endif
-                       {
-#if !GTK_CHECK_VERSION(3,0,0)
-                       gdk_window_clear(gtk_widget_get_window(box));
-#endif
-                       pr->renderer->overlay_draw(pr->renderer, 0, 0, pr->viewport_width, pr->viewport_height);
-                       if (pr->renderer2) pr->renderer2->overlay_draw(pr->renderer2, 0, 0, pr->viewport_width, pr->viewport_height);
-                       }
+               pr->renderer->update_pixbuf(pr->renderer, flags & PR_ZOOM_LAZY);
+               if (pr->renderer2) pr->renderer2->update_pixbuf(pr->renderer2, flags & PR_ZOOM_LAZY);
 
                pr_update_signal(pr);
 
@@ -2421,15 +2403,7 @@ void pixbuf_renderer_set_orientation(PixbufRenderer *pr, gint orientation)
        pr->orientation = orientation;
 
        pr_pixbuf_size_sync(pr);
-       if (0)
-               {
-               pr->renderer->update_pixbuf(pr->renderer, FALSE);
-               if (pr->renderer2) pr->renderer2->update_pixbuf(pr->renderer2, FALSE);
-               }
        pr_zoom_sync(pr, pr->zoom, PR_ZOOM_FORCE, 0, 0);
-
-       pr->renderer->update_sizes(pr->renderer);
-       if (pr->renderer2) pr->renderer2->update_sizes(pr->renderer2);
 }
 
 gint pixbuf_renderer_get_orientation(PixbufRenderer *pr)
@@ -2441,6 +2415,8 @@ gint pixbuf_renderer_get_orientation(PixbufRenderer *pr)
 void pixbuf_renderer_set_stereo_data(PixbufRenderer *pr, StereoPixbufData stereo_data)
 {
        g_return_if_fail(IS_PIXBUF_RENDERER(pr));
+       if (pr->stereo_data == stereo_data) return;
+
 
        pr->stereo_data = stereo_data;
 
@@ -2600,13 +2576,13 @@ void pixbuf_renderer_zoom_set_limits(PixbufRenderer *pr, gdouble min, gdouble ma
 
 static void pr_stereo_set(PixbufRenderer *pr)
 {
-       if (!pr->renderer) pr->renderer = RENDERER_NEW(pr);
+       if (!pr->renderer) pr->renderer = pr_backend_renderer_new(pr);
        
        pr->renderer->stereo_set(pr->renderer, pr->stereo_mode & ~PR_STEREO_MIRROR_RIGHT & ~PR_STEREO_FLIP_RIGHT);
        
        if (pr->stereo_mode & (PR_STEREO_HORIZ | PR_STEREO_VERT | PR_STEREO_FIXED))
                {
-               if (!pr->renderer2) pr->renderer2 = RENDERER_NEW(pr);
+               if (!pr->renderer2) pr->renderer2 = pr_backend_renderer_new(pr);
                pr->renderer2->stereo_set(pr->renderer2, (pr->stereo_mode & ~PR_STEREO_MIRROR_LEFT & ~PR_STEREO_FLIP_LEFT) | PR_STEREO_RIGHT);
                }
        else
@@ -2664,7 +2640,7 @@ static void pr_stereo_temp_disable(PixbufRenderer *pr, gboolean disable)
        pr->stereo_temp_disable = disable;
        if (disable)
                {
-               if (!pr->renderer) pr->renderer = RENDERER_NEW(pr);
+               if (!pr->renderer) pr->renderer = pr_backend_renderer_new(pr);
                pr->renderer->stereo_set(pr->renderer, PR_STEREO_NONE);
                if (pr->renderer2) pr->renderer2->free(pr->renderer2);
                pr->renderer2 = NULL;
@@ -2832,6 +2808,9 @@ gboolean pixbuf_renderer_get_virtual_rect(PixbufRenderer *pr, GdkRectangle *rect
 
 void pixbuf_renderer_set_size_early(PixbufRenderer *pr, guint width, guint height)
 {
+#if 0
+       /* FIXME: this function does not consider the image orientation, 
+       so it probably only breaks something */
        gdouble zoom;
        gint w, h;
 
@@ -2846,6 +2825,7 @@ void pixbuf_renderer_set_size_early(PixbufRenderer *pr, guint width, guint heigh
 
        //pr->width = width;
        //pr->height = height;
+#endif
 }
 
 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */