[Xfce4-commits] <ristretto:master> Fix the adjustment settings

Stephan Arts stephan at xfce.org
Wed Aug 12 12:16:13 CEST 2009


Updating branch refs/heads/master
         to f28d501a4b94c752e2ad1e6ab4c8d06086a57907 (commit)
       from 58bee9be96336fe2448bae3f8f9906eaa2055169 (commit)

commit f28d501a4b94c752e2ad1e6ab4c8d06086a57907
Author: Stephan Arts <stephan at xfce.org>
Date:   Sat Feb 21 16:38:56 2009 +0100

    Fix the adjustment settings

 src/picture_viewer.c |   80 +++++++++++++++++++++++++++++++++----------------
 1 files changed, 54 insertions(+), 26 deletions(-)

diff --git a/src/picture_viewer.c b/src/picture_viewer.c
index b4828e4..5b203ba 100644
--- a/src/picture_viewer.c
+++ b/src/picture_viewer.c
@@ -680,6 +680,8 @@ rstto_picture_viewer_refresh(RsttoPictureViewer *viewer)
     gboolean *fit_to_screen = NULL;
     gdouble *scale = NULL; 
     gint width = 0, height = 0;
+    gboolean vadjustment_changed = FALSE;
+    gboolean hadjustment_changed = FALSE;
 
     /**
      * Get all the required image peripherals
@@ -775,37 +777,60 @@ rstto_picture_viewer_refresh(RsttoPictureViewer *viewer)
 
         if(*fit_to_screen)
         {
-            gdouble h_scale = (gdouble)GTK_WIDGET(viewer)->allocation.width / (gdouble)width;
-            gdouble v_scale = (gdouble)GTK_WIDGET(viewer)->allocation.height / (gdouble)height;
-            if(h_scale < v_scale)
+            /* The image does not fit the picture-viewer, and 
+             * we decided to scale it down to fit. Now we need to check
+             * which side we need to use as a reference.
+             *
+             * We use the one that produces a larger scale difference
+             * to the viewer. This way we know the image will always fit.
+             */
+            if ((GTK_WIDGET (viewer)->allocation.width / width) >
+                (GTK_WIDGET (viewer)->allocation.height / height))
             {
-                if(*scale != h_scale)
-                {
-                    *scale = h_scale;
-                }
+                *scale = (gdouble)GTK_WIDGET (viewer)->allocation.width / (gdouble)width;
             }
             else
             {
-                if(*scale != v_scale)
-                {
-                    *scale = v_scale;
-                }
+                *scale = (gdouble)GTK_WIDGET (viewer)->allocation.height / (gdouble)height;
             }
+
             g_object_set_data (G_OBJECT (viewer->priv->image), "viewer-scale", scale);
         }
     }
 
     if (GTK_WIDGET_REALIZED (widget))
     {
-        if (viewer->vadjustment && viewer->hadjustment)
+        if (viewer->hadjustment && viewer->hadjustment)
         {
             viewer->hadjustment->page_size = widget->allocation.width;
             viewer->hadjustment->upper = width * (*scale);
-            viewer->hadjustment->value = 0;
+            viewer->hadjustment->lower = 0;
+
+            if((viewer->hadjustment->value + viewer->hadjustment->page_size) > viewer->hadjustment->upper)
+            {
+                viewer->hadjustment->value = viewer->hadjustment->upper - viewer->hadjustment->page_size;
+                hadjustment_changed = TRUE;
+            }
+            if(viewer->hadjustment->value < viewer->hadjustment->lower)
+            {
+                viewer->hadjustment->value = viewer->hadjustment->lower;
+                hadjustment_changed = TRUE;
+            }
 
             viewer->vadjustment->page_size = widget->allocation.height;
             viewer->vadjustment->upper = height * (*scale);
-            viewer->vadjustment->value = 0;
+            viewer->vadjustment->lower = 0;
+
+            if((viewer->vadjustment->value + viewer->vadjustment->page_size) > viewer->vadjustment->upper)
+            {
+                viewer->vadjustment->value = viewer->vadjustment->upper - viewer->vadjustment->page_size;
+                vadjustment_changed = TRUE;
+            }
+            if(viewer->vadjustment->value < viewer->vadjustment->lower)
+            {
+                viewer->vadjustment->value = viewer->vadjustment->lower;
+                vadjustment_changed = TRUE;
+            }
 
         }
 
@@ -821,22 +846,17 @@ rstto_picture_viewer_refresh(RsttoPictureViewer *viewer)
         {
             if (src_pixbuf)
             {
-                viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (src_pixbuf,
-                                                            (gint)((gdouble)width * (*scale)),
-                                                            (gint)((gdouble)height * (*scale)),
-                                                            GDK_INTERP_BILINEAR);
-                /*
                 tmp_pixbuf = gdk_pixbuf_new_subpixbuf(src_pixbuf,
                                                    (gint)(viewer->hadjustment->value / (*scale)), 
                                                           viewer->vadjustment->value / (*scale),
-                                                        ((widget->allocation.width/(*scale))) < width?
-                                                          widget->allocation.width/(*scale):width,
-                                                        ((widget->allocation.height/(*scale)))< height?
-                                                          widget->allocation.height/(*scale):height);
+                                                        ((widget->allocation.width/(*scale))) < (gdouble)width?
+                                                          widget->allocation.width/(*scale):(gdouble)width,
+                                                        ((widget->allocation.height/(*scale)))< (gdouble)height?
+                                                          widget->allocation.height/(*scale):(gdouble)height);
                 if(tmp_pixbuf)
                 {
-                    gint dst_width = gdk_pixbuf_get_width(tmp_pixbuf)*(*scale);
-                    gint dst_height = gdk_pixbuf_get_height(tmp_pixbuf)*(*scale);
+                    gint dst_width = (gdouble)gdk_pixbuf_get_width(tmp_pixbuf)*(*scale);
+                    gint dst_height = (gdouble)gdk_pixbuf_get_height(tmp_pixbuf)*(*scale);
                     viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple(tmp_pixbuf,
                                             dst_width>0?dst_width:1,
                                             dst_height>0?dst_height:1,
@@ -844,10 +864,18 @@ rstto_picture_viewer_refresh(RsttoPictureViewer *viewer)
                     g_object_unref(tmp_pixbuf);
                     tmp_pixbuf = NULL;
                 }
-                */
             }
 
         }
+        if (viewer->vadjustment && viewer->hadjustment)
+        {
+            gtk_adjustment_changed(viewer->hadjustment);
+            gtk_adjustment_changed(viewer->vadjustment);
+        }
+        if (hadjustment_changed == TRUE)
+            gtk_adjustment_value_changed(viewer->hadjustment);
+        if (vadjustment_changed == TRUE)
+            gtk_adjustment_value_changed(viewer->vadjustment);
     }
     return TRUE;
 }



More information about the Xfce4-commits mailing list