Index: src/eog-print-preview.c
===================================================================
--- src/eog-print-preview.c	(revisión: 4207)
+++ src/eog-print-preview.c	(copia de trabajo)
@@ -77,6 +77,7 @@ struct _EogPrintPreviewPrivate {
 /* Signal IDs */
 enum {
 	SIGNAL_IMAGE_MOVED,
+	SIGNAL_IMAGE_SCALED,
 	SIGNAL_LAST
 };
 static gint preview_signals [SIGNAL_LAST];
@@ -387,6 +388,19 @@ eog_print_preview_class_init (EogPrintPr
 			      G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
 			      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE,
 			      0, NULL);
+
+/**
+ * EogPrintPreview::image-scaled:
+ * @preview: the object which received the signal
+ *
+ * The ::image-scaled signal is emmited when the scale of the image is changed.
+ */
+	preview_signals [SIGNAL_IMAGE_SCALED] =
+		g_signal_new ("image_scaled",
+			      G_TYPE_FROM_CLASS (gobject_class),
+			      G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
+			      g_cclosure_marshal_VOID__VOID, G_TYPE_NONE,
+			      0, NULL);
 	
 	g_type_class_add_private (klass, sizeof (EogPrintPreviewPrivate));
 }
@@ -463,6 +477,7 @@ static gboolean button_press_event_cb   
 static gboolean button_release_event_cb (GtkWidget *widget, GdkEventButton *bev, gpointer user_data);
 static gboolean motion_notify_event_cb  (GtkWidget *widget, GdkEventMotion *mev, gpointer user_data);
 static gboolean key_press_event_cb      (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
+static gboolean scroll_event_cb         (GtkWidget *widget, GdkEventScroll *event, gpointer user_data);
 
 static void expose_event_cb (GtkDrawingArea *drawing_area, GdkEventExpose *eev, gpointer  user_data);
 static void size_allocate_cb (GtkWidget *widget, GtkAllocation *allocation, gpointer user_data);
@@ -518,6 +533,7 @@ eog_print_preview_new (void)
 			       GDK_BUTTON1_MOTION_MASK      |
 			       GDK_BUTTON_PRESS_MASK        |
 			       GDK_BUTTON_RELEASE_MASK      |
+			       GDK_SCROLL_MASK              |
 			       GDK_KEY_PRESS_MASK);
 
 	g_object_set (G_OBJECT (area),
@@ -544,6 +560,9 @@ eog_print_preview_new (void)
 	g_signal_connect (area, "size-allocate",
 			  G_CALLBACK (size_allocate_cb), preview);
 
+	g_signal_connect (G_OBJECT (area), "scroll-event",
+			  G_CALLBACK (scroll_event_cb), preview);
+
 	return GTK_WIDGET (preview);
 }
 
@@ -955,6 +974,39 @@ motion_notify_event_cb (GtkWidget      *
 	return FALSE;
 }
 
+static gboolean
+scroll_event_cb (GtkWidget *widget,
+		 GdkEventScroll *event,
+		 gpointer user_data)
+{
+	g_assert (EOG_IS_PRINT_PREVIEW (user_data));
+
+	EogPrintPreview *preview = EOG_PRINT_PREVIEW (user_data);
+
+	if (press_inside_image_area (EOG_PRINT_PREVIEW (user_data),
+				     event->x, event->y))
+	{
+		gfloat scale;
+		gfloat multiplier;
+		
+		g_object_get (preview, "image-scale", &scale, NULL);
+		
+		switch (event->direction) {
+		case GDK_SCROLL_UP:
+			/* scale up */
+			multiplier = 1.1;
+			break;
+		case GDK_SCROLL_DOWN:
+			/* scale down */
+			multiplier = 0.9;
+
+		}
+		eog_print_preview_set_scale (preview, CLAMP (scale * multiplier, 0., 1.));
+	}
+	return TRUE;
+}
+
+
 static void
 size_allocate_cb (GtkWidget *widget,
 		  GtkAllocation *allocation,
@@ -1213,4 +1265,31 @@ eog_print_preview_set_scale (EogPrintPre
 	g_object_set (preview,
 		      "image-scale", scale,
 		      NULL);
+
+	g_signal_emit (G_OBJECT (preview),
+		       preview_signals
+		       [SIGNAL_IMAGE_SCALED], 0);
+
+}
+
+/**
+ * eog_print_preview_get_scale:
+ * @preview: A #EogPrintPreview.
+ * 
+ * Gets the scale for the image.
+ * 
+ * Returns: The scale for the image.
+ **/
+gfloat
+eog_print_preview_get_scale (EogPrintPreview *preview)
+{
+	gfloat scale;
+	
+	g_return_val_if_fail (EOG_IS_PRINT_PREVIEW (preview), 0);
+	
+	g_object_get (preview,
+		      "image-scale", &scale,
+		      NULL);
+
+	return scale;
 }
Index: src/eog-print-preview.h
===================================================================
--- src/eog-print-preview.h	(revisión: 4207)
+++ src/eog-print-preview.h	(copia de trabajo)
@@ -71,6 +71,8 @@ void         eog_print_preview_set_image
 void         eog_print_preview_set_scale           (EogPrintPreview *preview,
 						    gfloat           scale);
 
+gfloat       eog_print_preview_get_scale           (EogPrintPreview *preview);
+
 G_END_DECLS
 
 #endif /* _EOG_PRINT_PREVIEW_H_ */
Index: src/eog-print-image-setup.c
===================================================================
--- src/eog-print-image-setup.c	(revisión: 4207)
+++ src/eog-print-image-setup.c	(copia de trabajo)
@@ -609,6 +609,18 @@ on_preview_image_moved (EogPrintPreview 
 	gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->top), y);
 }
 
+static void
+on_preview_image_scaled (EogPrintPreview *preview,
+			 gpointer user_data)
+{
+	EogPrintImageSetupPrivate *priv = EOG_PRINT_IMAGE_SETUP (user_data)->priv;
+	gfloat scale;
+
+	scale = eog_print_preview_get_scale (preview);
+
+	gtk_range_set_value (GTK_RANGE (priv->scaling), 100*scale);
+}
+
 /* Function taken from gtkprintunixdialog.c */
 static GtkWidget *
 wrap_in_frame (const gchar *label, 
@@ -791,6 +803,8 @@ connect_signals (EogPrintImageSetup *set
 			  G_CALLBACK (on_scale_format_value), NULL);
 	g_signal_connect (G_OBJECT (priv->preview), "image-moved",
 			  G_CALLBACK (on_preview_image_moved), setup);
+	g_signal_connect (G_OBJECT (priv->preview), "image-scaled",
+			  G_CALLBACK (on_preview_image_scaled), setup);
 }
 
 static void
