[gthumb] use the draw signal to paint widgets and other changes



commit 28373050e3ea681dfc7c0512bfbbc955daf50845
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Oct 16 13:11:23 2011 +0200

    use the draw signal to paint widgets and other changes

 .../contact_sheet/gth-contact-sheet-theme-dialog.c |   13 +-
 extensions/gstreamer_tools/gth-media-viewer-page.c |   16 +-
 extensions/image_print/gth-image-print-job.c       |   17 +-
 extensions/image_viewer/gth-image-viewer-page.c    |    1 -
 gthumb/gedit-message-area.c                        |   14 +--
 gthumb/gth-browser.c                               |    5 +-
 gthumb/gth-cell-renderer-thumbnail.c               |   10 +-
 gthumb/gth-dumb-notebook.c                         |  156 ++++++++++++---
 gthumb/gth-empty-list.c                            |   15 +-
 gthumb/gth-file-list.c                             |   77 +++++---
 gthumb/gth-folder-tree.c                           |   21 +--
 gthumb/gth-histogram-view.c                        |   18 +-
 gthumb/gth-icon-view.c                             |   33 ++--
 gthumb/gth-image-dragger.c                         |   11 +-
 gthumb/gth-image-navigator.c                       |   19 +--
 gthumb/gth-image-selector.c                        |   47 ++---
 gthumb/gth-image-viewer-tool.c                     |    7 +-
 gthumb/gth-image-viewer-tool.h                     |    6 +-
 gthumb/gth-image-viewer.c                          |  211 ++++++++++++--------
 gthumb/gth-image-viewer.h                          |    2 -
 gthumb/gth-time-selector.c                         |    3 +-
 gthumb/gth-toggle-menu-tool-button.c               |   10 +-
 22 files changed, 409 insertions(+), 303 deletions(-)
---
diff --git a/extensions/contact_sheet/gth-contact-sheet-theme-dialog.c b/extensions/contact_sheet/gth-contact-sheet-theme-dialog.c
index 61a2f1e..c7be9e0 100644
--- a/extensions/contact_sheet/gth-contact-sheet-theme-dialog.c
+++ b/extensions/contact_sheet/gth-contact-sheet-theme-dialog.c
@@ -67,19 +67,16 @@ gth_contact_sheet_theme_dialog_class_init (GthContactSheetThemeDialogClass *klas
 
 
 static gboolean
-preview_area_expose_event_cb (GtkWidget      *widget,
-			      GdkEventExpose *event,
-			      gpointer        user_data)
+preview_area_draw_cb (GtkWidget *widget,
+		      cairo_t   *cr,
+		      gpointer   user_data)
 {
 	GthContactSheetThemeDialog *self = user_data;
-	cairo_t                    *cr;
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
 	gth_contact_sheet_theme_paint_preview (self->priv->theme,
 					       cr,
 					       gdk_window_get_width (gtk_widget_get_window (widget)),
 					       gdk_window_get_height (gtk_widget_get_window (widget)));
-	cairo_destroy (cr);
 
 	return TRUE;
 }
@@ -229,8 +226,8 @@ gth_contact_sheet_theme_dialog_init (GthContactSheetThemeDialog *self)
 	gtk_dialog_set_default_response (GTK_DIALOG (self), GTK_RESPONSE_OK);
 
 	g_signal_connect (GET_WIDGET ("preview_area"),
-			  "expose_event",
-			  G_CALLBACK (preview_area_expose_event_cb),
+			  "draw",
+			  G_CALLBACK (preview_area_draw_cb),
 			  self);
 	g_signal_connect_swapped (GET_WIDGET ("solid_color_radiobutton"),
 			  	  "toggled",
diff --git a/extensions/gstreamer_tools/gth-media-viewer-page.c b/extensions/gstreamer_tools/gth-media-viewer-page.c
index 2a0bf43..e4b5ff5 100644
--- a/extensions/gstreamer_tools/gth-media-viewer-page.c
+++ b/extensions/gstreamer_tools/gth-media-viewer-page.c
@@ -171,14 +171,13 @@ video_area_unrealize_cb (GtkWidget *widget,
 
 
 static gboolean
-video_area_expose_event_cb (GtkWidget      *widget,
-			    GdkEventExpose *event,
-			    gpointer        user_data)
+video_area_draw_cb (GtkWidget *widget,
+		    cairo_t   *cr,
+		    gpointer   user_data)
 {
 	GthMediaViewerPage *self = user_data;
 	GtkAllocation       allocation;
 	GtkStyle           *style;
-	cairo_t            *cr;
 
 	if (event->count > 0)
 		return FALSE;
@@ -210,9 +209,6 @@ video_area_expose_event_cb (GtkWidget      *widget,
 		g_free (type);
 	}
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
-	gdk_cairo_region (cr, event->region);
-	cairo_clip (cr);
 	if (self->priv->has_video)
 		cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
 	else
@@ -250,8 +246,6 @@ video_area_expose_event_cb (GtkWidget      *widget,
 		cairo_fill (cr);
 	}
 
-	cairo_destroy (cr);
-
 	return TRUE;
 }
 
@@ -714,8 +708,8 @@ gth_media_viewer_page_real_activate (GthViewerPage *base,
 			  G_CALLBACK (video_area_unrealize_cb),
 			  self);
 	g_signal_connect (G_OBJECT (self->priv->area),
-			  "expose_event",
-			  G_CALLBACK (video_area_expose_event_cb),
+			  "draw",
+			  G_CALLBACK (video_area_draw_cb),
 			  self);
 	g_signal_connect (G_OBJECT (self->priv->area),
 			  "button_press_event",
diff --git a/extensions/image_print/gth-image-print-job.c b/extensions/image_print/gth-image-print-job.c
index b44838f..1b1060d 100644
--- a/extensions/image_print/gth-image-print-job.c
+++ b/extensions/image_print/gth-image-print-job.c
@@ -1029,10 +1029,10 @@ gth_image_print_job_update_image_preview (GthImagePrintJob *self,
 }
 
 
-static void
-preview_expose_event_cb (GtkWidget      *widget,
-			 GdkEventExpose *event,
-			 gpointer        user_data)
+static gboolean
+preview_draw_cb (GtkWidget *widget,
+		 cairo_t   *cr,
+		 gpointer   user_data)
 {
 	GthImagePrintJob *self = user_data;
 	cairo_t          *cr;
@@ -1042,8 +1042,6 @@ preview_expose_event_cb (GtkWidget      *widget,
 	g_return_if_fail (GTH_IS_IMAGE_PRINT_JOB (self));
 	g_return_if_fail ((self->priv->page_setup != NULL) && GTK_IS_PAGE_SETUP (self->priv->page_setup));
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
-
 	/* paint the paper */
 
 	cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
@@ -1065,7 +1063,8 @@ preview_expose_event_cb (GtkWidget      *widget,
 				   TRUE);
 
 	g_object_unref (pango_layout);
-	cairo_destroy (cr);
+
+	return TRUE;
 }
 
 
@@ -1517,8 +1516,8 @@ operation_create_custom_widget_cb (GtkPrintOperation *operation,
 	gtk_combo_box_set_active (GTK_COMBO_BOX (GET_WIDGET ("unit_combobox")), eel_gconf_get_enum (PREF_IMAGE_PRINT_UNIT, GTH_TYPE_METRIC, GTH_METRIC_PIXELS));
 
 	g_signal_connect (GET_WIDGET ("preview_drawingarea"),
-			  "expose_event",
-	                  G_CALLBACK (preview_expose_event_cb),
+			  "draw",
+			  G_CALLBACK (preview_draw_cb),
 	                  self);
 	g_signal_connect (GET_WIDGET ("preview_drawingarea"),
 			  "motion-notify-event",
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 2c75eeb..eafd5fa 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -572,7 +572,6 @@ pref_viewer_shrink_wrap_changed (GConfClient *client,
 
 static void
 paint_comment_over_image_func (GthImageViewer *image_viewer,
-			       GdkEventExpose *event,
 			       cairo_t        *cr,
 			       gpointer        user_data)
 {
diff --git a/gthumb/gedit-message-area.c b/gthumb/gedit-message-area.c
index 5565d62..a4795b6 100644
--- a/gthumb/gedit-message-area.c
+++ b/gthumb/gedit-message-area.c
@@ -71,17 +71,6 @@ static guint signals[LAST_SIGNAL];
 
 G_DEFINE_TYPE(GeditMessageArea, gedit_message_area, GTK_TYPE_HBOX)
 
-
-static void
-gedit_message_area_finalize (GObject *object)
-{
-	/*
-	GeditMessageArea *message_area = GEDIT_MESSAGE_AREA (object);
-	*/
-
-	G_OBJECT_CLASS (gedit_message_area_parent_class)->finalize (object);
-}
-
 static ResponseData *
 get_response_data (GtkWidget *widget,
 		   gboolean   create)
@@ -89,8 +78,7 @@ get_response_data (GtkWidget *widget,
 	ResponseData *ad = g_object_get_data (G_OBJECT (widget),
                                        	      "gedit-message-area-response-data");
 
-	if (ad == NULL && create)
-	{
+	if (ad == NULL && create) {
 		ad = g_new (ResponseData, 1);
 
 		g_object_set_data_full (G_OBJECT (widget),
diff --git a/gthumb/gth-browser.c b/gthumb/gth-browser.c
index 7b59e25..8aaeabc 100644
--- a/gthumb/gth-browser.c
+++ b/gthumb/gth-browser.c
@@ -4144,6 +4144,8 @@ _gth_browser_construct (GthBrowser *browser)
 		gtk_window_set_default_size (GTK_WINDOW (browser), width, height);
 	}
 
+	gtk_window_set_has_resize_grip (GTK_WINDOW (browser), TRUE);
+
 	/* ui actions */
 
 	browser->priv->actions = gtk_action_group_new ("Actions");
@@ -4287,7 +4289,6 @@ _gth_browser_construct (GthBrowser *browser)
 	/* statusbar */
 
 	browser->priv->statusbar = gth_statusbar_new ();
-	gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (browser->priv->statusbar), TRUE);
 	browser->priv->help_message_cid = gtk_statusbar_get_context_id (GTK_STATUSBAR (browser->priv->statusbar), "gth_help_message");
 	_gth_browser_set_statusbar_visibility (browser, eel_gconf_get_boolean (PREF_UI_STATUSBAR_VISIBLE, TRUE));
 	gth_window_attach (GTH_WINDOW (browser), browser->priv->statusbar, GTH_WINDOW_STATUSBAR);
@@ -6029,7 +6030,7 @@ hide_mouse_pointer_cb (gpointer data)
 		GtkWidget *widget = scan->data;
 		int        x, y, w, h;
 
-		gdk_window_get_geometry (gtk_widget_get_window (widget), &x, &y, &w, &h, NULL);
+		gdk_window_get_geometry (gtk_widget_get_window (widget), &x, &y, &w, &h);
 
 		if ((px >= x) && (px <= x + w) && (py >= y) && (py <= y + h))
 			return FALSE;
diff --git a/gthumb/gth-cell-renderer-thumbnail.c b/gthumb/gth-cell-renderer-thumbnail.c
index d6c9bf8..222dc2c 100644
--- a/gthumb/gth-cell-renderer-thumbnail.c
+++ b/gthumb/gth-cell-renderer-thumbnail.c
@@ -226,7 +226,7 @@ gth_cell_renderer_thumbnail_get_size (GtkCellRenderer       *cell,
 
 static void
 gth_cell_renderer_thumbnail_render (GtkCellRenderer       *cell,
-				    GdkWindow             *window,
+				    cairo_t               *cr,
 				    GtkWidget             *widget,
 				    cairo_rectangle_int_t *background_area,
 				    cairo_rectangle_int_t *cell_area,
@@ -239,7 +239,6 @@ gth_cell_renderer_thumbnail_render (GtkCellRenderer       *cell,
 	cairo_rectangle_int_t     thumb_rect;
 	cairo_rectangle_int_t     draw_rect;
 	cairo_rectangle_int_t     image_rect;
-	cairo_t                  *cr;
 	GdkPixbuf                *pixbuf;
 	int                       xpad;
 	int                       ypad;
@@ -265,13 +264,8 @@ gth_cell_renderer_thumbnail_render (GtkCellRenderer       *cell,
 	thumb_rect.width  -= xpad * 2;
 	thumb_rect.height -= ypad * 2;
 
-	if (! gdk_rectangle_intersect (cell_area, &thumb_rect, &draw_rect)
-	    || ! gdk_rectangle_intersect (expose_area, &thumb_rect, &draw_rect))
-	{
+	if (! gdk_rectangle_intersect (cell_area, &thumb_rect, &draw_rect))
 		return;
-	}
-
-	cr = gdk_cairo_create (window);
 
 	image_rect.width = gdk_pixbuf_get_width (pixbuf);
 	image_rect.height = gdk_pixbuf_get_height (pixbuf);
diff --git a/gthumb/gth-dumb-notebook.c b/gthumb/gth-dumb-notebook.c
index 3b2d4f5..428d52e 100644
--- a/gthumb/gth-dumb-notebook.c
+++ b/gthumb/gth-dumb-notebook.c
@@ -49,32 +49,136 @@ gth_dumb_notebook_finalize (GObject *object)
 }
 
 
+static GtkSizeRequestMode
+gth_dumb_notebook_get_request_mode (GtkWidget *widget)
+{
+	return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
+}
+
+
 static void
-gth_dumb_notebook_size_request (GtkWidget      *widget,
-				GtkRequisition *requisition)
+gth_dumb_notebook_get_preferred_height (GtkWidget *widget,
+                			int       *minimum_height,
+                			int       *natural_height)
 {
 	GthDumbNotebook *dumb_notebook = GTH_DUMB_NOTEBOOK (widget);
 	GList           *scan;
-	GtkRequisition   child_requisition;
 	int              border_width;
-	
-	requisition->width = 0;
-  	requisition->height = 0;
-  
+
+	*minimum_height = 0;
+	*natural_height = 0;
+
 	for (scan = dumb_notebook->priv->children; scan; scan = scan->next) {
 		GtkWidget *child = scan->data;
+		int        child_minimum_height;
+		int        child_natural_height;
 		
 		if (! gtk_widget_get_visible (child))
                         continue;
-                        
-		gtk_widget_size_request (child, &child_requisition);
-		requisition->width = MAX (requisition->width, child_requisition.width);
-		requisition->height = MAX (requisition->height, child_requisition.height);
+
+		gtk_widget_get_preferred_height (child, &child_minimum_height, &child_natural_height);
+		*minimum_height = MAX (*minimum_height, child_minimum_height);
+		*natural_height = MAX (*natural_height, child_natural_height);
 	}
 	
 	border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
-	requisition->width += border_width * 2;
-  	requisition->height += border_width * 2;
+	*minimum_height += border_width * 2;
+	*natural_height += border_width * 2;
+}
+
+
+static void
+gth_dumb_notebook_get_preferred_width_for_height (GtkWidget *widget,
+                				  int        height,
+                				  int       *minimum_width,
+                				  int       *natural_width)
+{
+	GthDumbNotebook *dumb_notebook = GTH_DUMB_NOTEBOOK (widget);
+	GList           *scan;
+	int              border_width;
+
+	*minimum_width = 0;
+	*natural_width = 0;
+
+	for (scan = dumb_notebook->priv->children; scan; scan = scan->next) {
+		GtkWidget *child = scan->data;
+		int        child_minimum_width;
+		int        child_natural_width;
+
+		if (! gtk_widget_get_visible (child))
+                        continue;
+
+		gtk_widget_get_preferred_width_for_height (child, height, &child_minimum_width, &child_natural_width);
+		*minimum_width = MAX (*minimum_width, child_minimum_width);
+		*natural_width = MAX (*natural_width, child_natural_width);
+	}
+
+	border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+	*minimum_width += border_width * 2;
+	*natural_width += border_width * 2;
+}
+
+
+static void
+gth_dumb_notebook_get_preferred_width (GtkWidget *widget,
+                		       int       *minimum_width,
+                		       int       *natural_width)
+{
+	GthDumbNotebook *dumb_notebook = GTH_DUMB_NOTEBOOK (widget);
+	GList           *scan;
+	int              border_width;
+
+	*minimum_width = 0;
+	*natural_width = 0;
+
+	for (scan = dumb_notebook->priv->children; scan; scan = scan->next) {
+		GtkWidget *child = scan->data;
+		int        child_minimum_width;
+		int        child_natural_width;
+
+		if (! gtk_widget_get_visible (child))
+                        continue;
+
+		gtk_widget_get_preferred_width (child, &child_minimum_width, &child_natural_width);
+		*minimum_width = MAX (*minimum_width, child_minimum_width);
+		*natural_width = MAX (*natural_width, child_natural_width);
+	}
+
+	border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+	*minimum_width += border_width * 2;
+	*natural_width += border_width * 2;
+}
+
+
+static void
+gth_dumb_notebook_get_preferred_height_for_width (GtkWidget *widget,
+                				  int        width,
+                				  int       *minimum_height,
+                				  int       *natural_height)
+{
+	GthDumbNotebook *dumb_notebook = GTH_DUMB_NOTEBOOK (widget);
+	GList           *scan;
+	int              border_width;
+
+	*minimum_height = 0;
+	*natural_height = 0;
+
+	for (scan = dumb_notebook->priv->children; scan; scan = scan->next) {
+		GtkWidget *child = scan->data;
+		int        child_minimum_height;
+		int        child_natural_height;
+
+		if (! gtk_widget_get_visible (child))
+                        continue;
+
+		gtk_widget_get_preferred_height_for_width (child, width, &child_minimum_height, &child_natural_height);
+		*minimum_height = MAX (*minimum_height, child_minimum_height);
+		*natural_height = MAX (*natural_height, child_natural_height);
+	}
+
+	border_width = gtk_container_get_border_width (GTK_CONTAINER (widget));
+	*minimum_height += border_width * 2;
+	*natural_height += border_width * 2;
 }
 
 
@@ -104,18 +208,18 @@ gth_dumb_notebook_size_allocate (GtkWidget     *widget,
 }
 
 
-static int
-gth_dumb_notebook_expose (GtkWidget      *widget,
-			  GdkEventExpose *event)
+static gboolean
+gth_dumb_notebook_draw (GtkWidget *widget,
+			cairo_t   *cr)
 {
 	GthDumbNotebook *dumb_notebook = GTH_DUMB_NOTEBOOK (widget);
 	
-	if (dumb_notebook->priv->current != NULL)
-		 gtk_container_propagate_expose (GTK_CONTAINER (dumb_notebook),
-						 dumb_notebook->priv->current,
-						 event);
-				 
-	return FALSE;
+	if (dumb_notebook->priv->current == NULL)
+		return FALSE;
+
+	gtk_widget_draw (dumb_notebook->priv->current, cr);
+
+	return TRUE;
 }
 
 
@@ -186,9 +290,13 @@ gth_dumb_notebook_class_init (GthDumbNotebookClass *klass)
 	gobject_class->finalize = gth_dumb_notebook_finalize;
 	
 	widget_class = GTK_WIDGET_CLASS (klass);
-	widget_class->size_request = gth_dumb_notebook_size_request;
+	widget_class->get_request_mode = gth_dumb_notebook_get_request_mode;
+	widget_class->get_preferred_height = gth_dumb_notebook_get_preferred_height;
+	widget_class->get_preferred_width_for_height = gth_dumb_notebook_get_preferred_width_for_height;
+	widget_class->get_preferred_width = gth_dumb_notebook_get_preferred_width;
+	widget_class->get_preferred_height_for_width = gth_dumb_notebook_get_preferred_height_for_width;
 	widget_class->size_allocate = gth_dumb_notebook_size_allocate;
-	widget_class->expose_event = gth_dumb_notebook_expose;
+	widget_class->draw = gth_dumb_notebook_draw;
 
 	container_class = GTK_CONTAINER_CLASS (klass);
 	container_class->add = gth_dumb_notebook_add;
diff --git a/gthumb/gth-empty-list.c b/gthumb/gth-empty-list.c
index efa2ac5..963e88d 100644
--- a/gthumb/gth-empty-list.c
+++ b/gthumb/gth-empty-list.c
@@ -121,12 +121,10 @@ gth_empty_list_realize (GtkWidget *widget)
 	attributes.height      = allocation.height;
 	attributes.wclass      = GDK_INPUT_OUTPUT;
 	attributes.visual      = gtk_widget_get_visual (widget);
-	attributes.colormap    = gtk_widget_get_colormap (widget);
 	attributes.event_mask  = GDK_VISIBILITY_NOTIFY_MASK;
 	attributes_mask        = (GDK_WA_X
 				  | GDK_WA_Y
-				  | GDK_WA_VISUAL
-				  | GDK_WA_COLORMAP);
+				  | GDK_WA_VISUAL);
 	window = gdk_window_new (gtk_widget_get_parent_window (widget),
 			         &attributes,
 			         attributes_mask);
@@ -233,8 +231,8 @@ gth_empty_list_size_allocate (GtkWidget     *widget,
 
 
 static gboolean
-gth_empty_list_expose_event (GtkWidget      *widget,
-		             GdkEventExpose *event)
+gth_empty_list_draw (GtkWidget *widget,
+		     cairo_t   *cr)
 {
 	GthEmptyList   *self = (GthEmptyList*) widget;
 	GtkAllocation   allocation;
@@ -253,7 +251,6 @@ gth_empty_list_expose_event (GtkWidget      *widget,
 	pango_layout_set_text (self->priv->layout, self->priv->text, strlen (self->priv->text));
 	pango_layout_get_pixel_extents (self->priv->layout, NULL, &bounds);
 
-	cr = gdk_cairo_create (self->priv->bin_window);
 	cairo_move_to (cr, 0, (allocation.height - bounds.height) / 2);
 	pango_cairo_layout_path (cr, self->priv->layout);
 	style = gtk_widget_get_style (widget);
@@ -272,9 +269,7 @@ gth_empty_list_expose_event (GtkWidget      *widget,
 				 allocation.height - 2);
 	}
 
-	cairo_destroy (cr);
-
-	return FALSE;
+	return TRUE;
 }
 
 
@@ -311,7 +306,7 @@ gth_empty_list_class_init (GthEmptyListClass *klass)
 	widget_class->map = gth_empty_list_map;
 	widget_class->unmap = gth_empty_list_unmap;
 	widget_class->size_allocate = gth_empty_list_size_allocate;
-	widget_class->expose_event = gth_empty_list_expose_event;
+	widget_class->draw = gth_empty_list_draw;
 	widget_class->button_press_event = gth_empty_list_button_press;
 	
 	/* properties */
diff --git a/gthumb/gth-file-list.c b/gthumb/gth-file-list.c
index 0d1a34f..169d085 100644
--- a/gthumb/gth-file-list.c
+++ b/gthumb/gth-file-list.c
@@ -279,41 +279,58 @@ gth_file_list_finalize (GObject *object)
 }
 
 
+static GtkSizeRequestMode
+gth_file_list_get_request_mode (GtkWidget *widget)
+{
+	GthFileList *file_list = GTH_FILE_LIST (widget);
+
+	if (file_list->priv->type == GTH_FILE_LIST_TYPE_V_SIDEBAR)
+		return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
+	else
+		return GTK_SIZE_REQUEST_WIDTH_FOR_HEIGHT;
+}
+
+
 static void
-gth_file_list_size_request (GtkWidget      *widget,
-			    GtkRequisition *requisition)
+gth_file_list_get_preferred_width (GtkWidget *widget,
+                		   int       *minimum_width,
+                		   int       *natural_width)
 {
-	GthFileList *file_list;
+	GthFileList *file_list = GTH_FILE_LIST (widget);
+	int          xthickness;
+	GtkWidget   *vscrollbar;
 
-	GTK_WIDGET_CLASS (parent_class)->size_request (widget, requisition);
+	xthickness = gtk_widget_get_style (file_list->priv->scrolled_window)->xthickness;
+	*minimum_width = file_list->priv->thumb_size + (THUMBNAIL_BORDER * 2) + xthickness * 2;
 
-	file_list = GTH_FILE_LIST (widget);
+	vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (file_list->priv->scrolled_window));
+	if (gtk_widget_get_visible (vscrollbar)) {
+		int vscrollbar_minimum_width;
+		int vscrollbar_natural_width;
+		int scrollbar_spacing;
 
-	if (file_list->priv->type == GTH_FILE_LIST_TYPE_V_SIDEBAR) {
-		int        xthickness;
-		GtkWidget *vscrollbar;
+		gtk_widget_get_preferred_width (vscrollbar, &vscrollbar_minimum_width, &vscrollbar_natural_width);
+		gtk_widget_style_get (file_list->priv->scrolled_window,
+				      "scrollbar-spacing", &scrollbar_spacing,
+				      NULL);
+		*minimum_width += vscrollbar_minimum_width + scrollbar_spacing;
+	 }
 
-		xthickness = gtk_widget_get_style (file_list->priv->scrolled_window)->xthickness;
-		requisition->width = file_list->priv->thumb_size + (THUMBNAIL_BORDER * 2) + xthickness * 2;
+	*natural_width = *minimum_width;
+}
 
-		vscrollbar = gtk_scrolled_window_get_vscrollbar (GTK_SCROLLED_WINDOW (file_list->priv->scrolled_window));
-		if (gtk_widget_get_visible (vscrollbar)) {
-			GtkRequisition vscrollbar_requisition;
-			int            scrollbar_spacing;
 
-			gtk_widget_size_request (vscrollbar, &vscrollbar_requisition);
-			gtk_widget_style_get (file_list->priv->scrolled_window,
-					      "scrollbar-spacing", &scrollbar_spacing,
-					      NULL);
-			requisition->width += vscrollbar_requisition.width + scrollbar_spacing;
-		}
-	}
-	else if (file_list->priv->type == GTH_FILE_LIST_TYPE_H_SIDEBAR) {
-		int ythickness;
+static void
+gth_file_list_get_preferred_height (GtkWidget *widget,
+                		    int       *minimum_height,
+                		    int       *natural_height)
+{
+	GthFileList *file_list = GTH_FILE_LIST (widget);
+	int          ythickness;
 
-		ythickness = gtk_widget_get_style (file_list->priv->scrolled_window)->ythickness;
-		requisition->height = file_list->priv->thumb_size + (THUMBNAIL_BORDER * 2) + ythickness * 2;
-	}
+	ythickness = gtk_widget_get_style (file_list->priv->scrolled_window)->ythickness;
+	*minimum_height = file_list->priv->thumb_size + (THUMBNAIL_BORDER * 2) + ythickness * 2;
+	*natural_height = *minimum_height;
 }
 
 
@@ -329,7 +346,9 @@ gth_file_list_class_init (GthFileListClass *class)
 	object_class->finalize = gth_file_list_finalize;
 
 	widget_class = (GtkWidgetClass*) class;
-	widget_class->size_request = gth_file_list_size_request;
+	widget_class->get_request_mode = gth_file_list_get_request_mode;
+	widget_class->get_preferred_width = gth_file_list_get_preferred_width;
+	widget_class->get_preferred_height = gth_file_list_get_preferred_height;
 }
 
 
diff --git a/gthumb/gth-folder-tree.c b/gthumb/gth-folder-tree.c
index 17629ec..f41cb15 100644
--- a/gthumb/gth-folder-tree.c
+++ b/gthumb/gth-folder-tree.c
@@ -532,11 +532,11 @@ motion_notify_event_cb (GtkWidget      *widget,
 						 event->x,
 						 event->y))
 		{
-			GtkTreePath    *path = NULL;
-			GdkDragContext *context;
-			int             cell_x;
-			int             cell_y;
-			GdkPixmap      *dnd_icon;
+			GtkTreePath     *path = NULL;
+			GdkDragContext  *context;
+			int              cell_x;
+			int              cell_y;
+			cairo_surface_t *dnd_surface;
 
 			if (! gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (folder_tree),
 							     event->x,
@@ -560,15 +560,10 @@ motion_notify_event_cb (GtkWidget      *widget,
 						  1,
 						  (GdkEvent *) event);
 
-			dnd_icon = gtk_tree_view_create_row_drag_icon (GTK_TREE_VIEW (folder_tree), path);
-			gtk_drag_set_icon_pixmap (context,
-						  gdk_drawable_get_colormap (dnd_icon),
-						  dnd_icon,
-						  NULL,
-						  cell_x,
-						  cell_y);
+			dnd_surface = gtk_tree_view_create_row_drag_icon (GTK_TREE_VIEW (folder_tree), path);
+			gtk_drag_set_icon_surface (context, dnd_surface);
 
-			g_object_unref (dnd_icon);
+			cairo_surface_destroy (dnd_surface);
 			gtk_tree_path_free (path);
 		}
 
diff --git a/gthumb/gth-histogram-view.c b/gthumb/gth-histogram-view.c
index ce76c07..2e877d4 100644
--- a/gthumb/gth-histogram-view.c
+++ b/gthumb/gth-histogram-view.c
@@ -531,14 +531,16 @@ gth_histogram_paint_selection (GthHistogramView *self,
 
 
 static gboolean
-histogram_view_expose_event_cb (GtkWidget      *widget,
-				GdkEventExpose *event,
-				gpointer        user_data)
+histogram_view_draw_cb (GtkWidget *widget,
+			cairo_t   *cr,
+			gpointer   user_data)
 {
 	GthHistogramView *self = user_data;
 	GtkAllocation     allocation;
 	GtkStyle         *style;
-	cairo_t          *cr;
+
+	if (GTK_WIDGET_CLASS (gth_histogram_view_parent_class)->draw != NULL)
+		GTK_WIDGET_CLASS (gth_histogram_view_parent_class)->draw (widget, cr);
 
 	gtk_widget_get_allocation (widget, &allocation);
 	allocation.width--;
@@ -546,8 +548,6 @@ histogram_view_expose_event_cb (GtkWidget      *widget,
 
 	style = gtk_widget_get_style (widget);
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
-
 	gdk_cairo_set_source_color (cr, &style->base[gtk_widget_get_state (widget)]);
 	cairo_rectangle (cr, 0, 0, allocation.width, allocation.height);
 	cairo_fill (cr);
@@ -571,8 +571,6 @@ histogram_view_expose_event_cb (GtkWidget      *widget,
 			gth_histogram_paint_channel (self, cr, self->priv->current_channel, &allocation);
 	}
 
-	cairo_destroy (cr);
-
 	return TRUE;
 }
 
@@ -919,8 +917,8 @@ gth_histogram_view_instance_init (GthHistogramView *self)
 	gtk_container_add (GTK_CONTAINER (view_frame), self->priv->histogram_view);
 
 	g_signal_connect (self->priv->histogram_view,
-			  "expose-event",
-			  G_CALLBACK (histogram_view_expose_event_cb),
+			  "draw",
+			  G_CALLBACK (histogram_view_draw_cb),
 			  self);
 	g_signal_connect (self->priv->histogram_view,
 			  "scroll-event",
diff --git a/gthumb/gth-icon-view.c b/gthumb/gth-icon-view.c
index 0eaef26..87dcd58 100644
--- a/gthumb/gth-icon-view.c
+++ b/gthumb/gth-icon-view.c
@@ -720,10 +720,12 @@ icon_view_motion_notify_event_cb (GtkWidget      *widget,
 						 event->x,
 						 event->y))
 		{
-			GtkTreePath    *path = NULL;
-			GdkDragContext *context;
-			GdkPixmap      *dnd_icon;
-			int             n_selected;
+			GtkTreePath     *path = NULL;
+			GdkDragContext  *context;
+			cairo_surface_t *dnd_surface;
+			int              width;
+			int              height;
+			int              n_selected;
 
 			path = gtk_icon_view_get_path_at_pos (GTK_ICON_VIEW (icon_view),
 							      event->x,
@@ -744,39 +746,42 @@ icon_view_motion_notify_event_cb (GtkWidget      *widget,
 			if (icon_view->priv->drag_button == 2)
 				gdk_drag_status (context, GDK_ACTION_ASK, event->time);
 
-			dnd_icon = gtk_icon_view_create_drag_icon (GTK_ICON_VIEW (icon_view), path);
+			dnd_surface = gtk_icon_view_create_drag_icon (GTK_ICON_VIEW (icon_view), path);
+			width = cairo_image_surface_get_width (dnd_surface);
+			height = cairo_image_surface_get_height (dnd_surface);
 
-			n_selected =  gth_file_selection_get_n_selected (GTH_FILE_SELECTION (icon_view));
+			n_selected = gth_file_selection_get_n_selected (GTH_FILE_SELECTION (icon_view));
 			if (n_selected >= 1) {
 				const int  offset = 3;
 				int        n_visible;
 				int        width;
 				int        height;
 				int        border;
+				GdkPixbuf *dnd_icon;
 				GdkPixbuf *multi_dnd_icon;
 				int        i;
 
+				dnd_icon = gdk_pixbuf_get_from_surface (dnd_surface, 0, 0, width, height);
+
 				n_visible = MIN (n_selected, 4);
-				gdk_pixmap_get_size (dnd_icon, &width, &height);
 				border = n_visible * offset;
 				multi_dnd_icon = gdk_pixbuf_new (GDK_COLORSPACE_RGB, TRUE, 8, width + border, height + border);
 				gdk_pixbuf_fill (multi_dnd_icon, 0x00000000);
 				for (i = n_visible - 1; i >= 0; i--)
-					gdk_pixbuf_get_from_drawable (multi_dnd_icon,
-								      dnd_icon,
-								      gdk_drawable_get_colormap (dnd_icon),
-								      0, 0,
-								      i * offset, i * offset,
-								      width, height);
+					gdk_pixbuf_copy_area (dnd_icon,
+							      0, 0,
+							      width, height,
+							      multi_dnd_icon,
+							      i * offset, i * offset);
 				gtk_drag_set_icon_pixbuf (context,
 							  multi_dnd_icon,
 							  width / 4,
 							  height / 4);
 
 				g_object_unref (multi_dnd_icon);
+				g_object_unref (dnd_icon);
 			}
 
-			g_object_unref (dnd_icon);
 			gtk_tree_path_free (path);
 		}
 
diff --git a/gthumb/gth-image-dragger.c b/gthumb/gth-image-dragger.c
index 2c9b27c..9fd1ae5 100644
--- a/gthumb/gth-image-dragger.c
+++ b/gthumb/gth-image-dragger.c
@@ -149,9 +149,8 @@ gth_image_dragger_unmap (GthImageViewerTool *base)
 
 
 static void
-gth_image_dragger_expose (GthImageViewerTool *self,
-			  GdkEventExpose     *event,
-		          cairo_t            *cr)
+gth_image_dragger_draw (GthImageViewerTool *self,
+		        cairo_t            *cr)
 {
 	GthImageDragger *dragger;
 	GthImageViewer  *viewer;
@@ -170,10 +169,10 @@ gth_image_dragger_expose (GthImageViewerTool *self,
 				       viewer->x_offset - viewer->image_area.x,
 				       viewer->y_offset - viewer->image_area.y,
 				       &viewer->image_area,
-				       event->region,
+				       NULL,
 				       gth_image_viewer_get_zoom_quality_filter (viewer));
 
-	gth_image_viewer_apply_painters (viewer, event, cr);
+	gth_image_viewer_apply_painters (viewer, cr);
 }
 
 
@@ -292,7 +291,7 @@ gth_image_dragger_gth_image_tool_interface_init (GthImageViewerToolIface *iface)
 	iface->size_allocate = gth_image_dragger_size_allocate;
 	iface->map = gth_image_dragger_map;
 	iface->unmap = gth_image_dragger_unmap;
-	iface->expose = gth_image_dragger_expose;
+	iface->draw = gth_image_dragger_draw;
 	iface->button_press = gth_image_dragger_button_press;
 	iface->button_release = gth_image_dragger_button_release;
 	iface->motion_notify = gth_image_dragger_motion_notify;
diff --git a/gthumb/gth-image-navigator.c b/gthumb/gth-image-navigator.c
index 874d6eb..3e4c2c7 100644
--- a/gthumb/gth-image-navigator.c
+++ b/gthumb/gth-image-navigator.c
@@ -295,21 +295,14 @@ nav_window_grab_pointer (NavigatorPopup *nav_popup)
 
 
 static gboolean
-navigator_popup_expose_event_cb (GtkWidget      *widget,
-				 GdkEventExpose *event,
-				 NavigatorPopup *nav_popup)
+navigator_popup_draw_cb (GtkWidget      *widget,
+			 cairo_t        *cr,
+			 NavigatorPopup *nav_popup)
 {
-	cairo_t *cr;
-
 	if (nav_popup->image == NULL)
 		return FALSE;
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
-
 	cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
-	gdk_cairo_region (cr, event->region);
-	cairo_clip (cr);
-
 
 	cairo_save (cr);
 	cairo_set_source_surface (cr, nav_popup->image, 0, 0);
@@ -350,8 +343,6 @@ navigator_popup_expose_event_cb (GtkWidget      *widget,
 		cairo_restore (cr);
 	}
 
-	cairo_destroy (cr);
-
 	return TRUE;
 }
 
@@ -384,8 +375,8 @@ navigator_event_area_button_press_event_cb (GtkWidget      *widget,
 	nav_popup->preview = gtk_drawing_area_new ();
 	gtk_container_add (GTK_CONTAINER (in_frame), nav_popup->preview);
 	g_signal_connect (G_OBJECT (nav_popup->preview),
-			  "expose_event",
-			  G_CALLBACK (navigator_popup_expose_event_cb),
+			  "draw",
+			  G_CALLBACK (navigator_popup_draw_cb),
 			  nav_popup);
 
 	nav_popup->x_root = event->x_root;
diff --git a/gthumb/gth-image-selector.c b/gthumb/gth-image-selector.c
index 000f3ce..8e5cd69 100644
--- a/gthumb/gth-image-selector.c
+++ b/gthumb/gth-image-selector.c
@@ -599,7 +599,6 @@ gth_image_selector_unmap (GthImageViewerTool *base)
 
 static void
 paint_background (GthImageSelector *self,
-		  GdkEventExpose   *event,
 		  cairo_t          *cr)
 {
 	gth_image_viewer_paint_region (self->priv->viewer,
@@ -608,35 +607,21 @@ paint_background (GthImageSelector *self,
 				       self->priv->viewer->x_offset - self->priv->viewer->image_area.x,
 				       self->priv->viewer->y_offset - self->priv->viewer->image_area.y,
 				       &self->priv->viewer->image_area,
-				       event->region,
+				       NULL,
 				       gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
 
 	/* make the background darker */
-	{
-		cairo_rectangle_int_t *rects;
-		int                    n_rects;
-		int                    i;
-
-		gdk_cairo_rectangle (cr, &self->priv->viewer->image_area);
-		cairo_clip (cr);
-		cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
-		gdk_region_get_rectangles (event->region, &rects, &n_rects);
-		for (i = 0; i < n_rects; i++) {
-			cairo_rectangle_int_t paint_area;
-
-			if (gdk_rectangle_intersect (&self->priv->viewer->image_area, &rects[i], &paint_area))
-				cairo_rectangle (cr, paint_area.x, paint_area.y, paint_area.width, paint_area.height);
-		}
-		cairo_fill (cr);
 
-		g_free (rects);
-	}
+	cairo_save (cr);
+	gdk_cairo_rectangle (cr, &self->priv->viewer->image_area);
+	cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 0.5);
+	cairo_fill (cr);
+	cairo_restore (cr);
 }
 
 
 static void
 paint_selection (GthImageSelector *self,
-		 GdkEventExpose   *event,
 		 cairo_t          *cr)
 {
 	cairo_rectangle_int_t selection_area;
@@ -652,7 +637,7 @@ paint_selection (GthImageSelector *self,
 					       self->priv->viewer->x_offset - self->priv->viewer->image_area.x,
 					       self->priv->viewer->y_offset - self->priv->viewer->image_area.y,
 					       &selection_area,
-					       event->region,
+					       NULL,
 					       gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
 
 	cairo_save (cr);
@@ -685,7 +670,6 @@ paint_selection (GthImageSelector *self,
 
 static void
 paint_image (GthImageSelector *self,
-	     GdkEventExpose   *event,
 	     cairo_t          *cr)
 {
 	gth_image_viewer_paint_region (self->priv->viewer,
@@ -694,15 +678,14 @@ paint_image (GthImageSelector *self,
 				       self->priv->viewer->x_offset - self->priv->viewer->image_area.x,
 				       self->priv->viewer->y_offset - self->priv->viewer->image_area.y,
 				       &self->priv->viewer->image_area,
-				       event->region,
+				       NULL,
 				       gth_image_viewer_get_zoom_quality_filter (self->priv->viewer));
 }
 
 
 static void
-gth_image_selector_expose (GthImageViewerTool *base,
-			   GdkEventExpose     *event,
-			   cairo_t            *cr)
+gth_image_selector_draw (GthImageViewerTool *base,
+			 cairo_t            *cr)
 {
 	GthImageSelector *self = GTH_IMAGE_SELECTOR (base);
 
@@ -713,13 +696,13 @@ gth_image_selector_expose (GthImageViewerTool *base,
 
 	if (self->priv->mask_visible) {
 		if (self->priv->viewer->dragging)
-			paint_image (self, event, cr);
+			paint_image (self, cr);
 		else
-			paint_background (self, event, cr);
-		paint_selection (self, event, cr);
+			paint_background (self, cr);
+		paint_selection (self, cr);
 	}
 	else
-		paint_image (self, event, cr);
+		paint_image (self, cr);
 }
 
 
@@ -1597,7 +1580,7 @@ gth_image_selector_gth_image_tool_interface_init (GthImageViewerToolIface *iface
 	iface->size_allocate = gth_image_selector_size_allocate;
 	iface->map = gth_image_selector_map;
 	iface->unmap = gth_image_selector_unmap;
-	iface->expose = gth_image_selector_expose;
+	iface->draw = gth_image_selector_draw;
 	iface->button_press = gth_image_selector_button_press;
 	iface->button_release = gth_image_selector_button_release;
 	iface->motion_notify = gth_image_selector_motion_notify;
diff --git a/gthumb/gth-image-viewer-tool.c b/gthumb/gth-image-viewer-tool.c
index 76ddd4e..2a9a7bc 100644
--- a/gthumb/gth-image-viewer-tool.c
+++ b/gthumb/gth-image-viewer-tool.c
@@ -102,11 +102,10 @@ gth_image_viewer_tool_size_allocate (GthImageViewerTool *self,
 
 
 void
-gth_image_viewer_tool_expose (GthImageViewerTool *self,
-			      GdkEventExpose     *event,
-			      cairo_t            *cr)
+gth_image_viewer_tool_draw (GthImageViewerTool *self,
+			    cairo_t            *cr)
 {
-	GTH_IMAGE_VIEWER_TOOL_GET_INTERFACE (self)->expose (self, event, cr);
+	GTH_IMAGE_VIEWER_TOOL_GET_INTERFACE (self)->draw (self, cr);
 }
 
 
diff --git a/gthumb/gth-image-viewer-tool.h b/gthumb/gth-image-viewer-tool.h
index df78c48..111257a 100644
--- a/gthumb/gth-image-viewer-tool.h
+++ b/gthumb/gth-image-viewer-tool.h
@@ -47,8 +47,7 @@ struct _GthImageViewerToolIface {
 	void      (*unrealize)      (GthImageViewerTool   *self);
 	void      (*size_allocate)  (GthImageViewerTool   *self,
 				     GtkAllocation        *allocation);
-	void      (*expose)         (GthImageViewerTool   *self,
-				     GdkEventExpose       *event,
+	void      (*draw)           (GthImageViewerTool   *self,
 				     cairo_t              *cr);
 	gboolean  (*button_press)   (GthImageViewerTool   *self,
 				     GdkEventButton       *event);
@@ -71,8 +70,7 @@ void       gth_image_viewer_tool_realize          (GthImageViewerTool *self);
 void       gth_image_viewer_tool_unrealize        (GthImageViewerTool *self);
 void       gth_image_viewer_tool_size_allocate    (GthImageViewerTool *self,
 						   GtkAllocation      *allocation);
-void       gth_image_viewer_tool_expose           (GthImageViewerTool *self,
-						   GdkEventExpose     *event,
+void       gth_image_viewer_tool_draw             (GthImageViewerTool *self,
 						   cairo_t            *cr);
 gboolean   gth_image_viewer_tool_button_press     (GthImageViewerTool *self,
 						   GdkEventButton     *event);
diff --git a/gthumb/gth-image-viewer.c b/gthumb/gth-image-viewer.c
index dd69cde..68766fc 100644
--- a/gthumb/gth-image-viewer.c
+++ b/gthumb/gth-image-viewer.c
@@ -49,6 +49,15 @@
 
 
 enum {
+   PROP_0,
+   PROP_HADJUSTMENT,
+   PROP_VADJUSTMENT,
+   PROP_HSCROLL_POLICY,
+   PROP_VSCROLL_POLICY
+};
+
+
+enum {
 	CLICKED,
 	ZOOM_IN,
 	ZOOM_OUT,
@@ -62,6 +71,9 @@ enum {
 
 
 struct _GthImageViewerPrivate {
+	GtkScrollablePolicy     hscroll_policy;
+	GtkScrollablePolicy     vscroll_policy;
+
 	cairo_surface_t        *surface;
 	GdkPixbufAnimation     *animation;
 	int                     original_width;
@@ -329,7 +341,6 @@ gth_image_viewer_realize (GtkWidget *widget)
 	attributes.height      = allocation.height;
 	attributes.wclass      = GDK_INPUT_OUTPUT;
 	attributes.visual      = gtk_widget_get_visual (widget);
-	attributes.colormap    = gtk_widget_get_colormap (widget);
 	attributes.event_mask  = (gtk_widget_get_events (widget)
 				  | GDK_EXPOSURE_MASK
 				  | GDK_BUTTON_PRESS_MASK
@@ -341,8 +352,7 @@ gth_image_viewer_realize (GtkWidget *widget)
 
 	attributes_mask        = (GDK_WA_X
 				  | GDK_WA_Y
-				  | GDK_WA_VISUAL
-				  | GDK_WA_COLORMAP);
+				  | GDK_WA_VISUAL);
 
 	window = gdk_window_new (gtk_widget_get_parent_window (widget),
 				 &attributes,
@@ -670,7 +680,7 @@ gth_image_viewer_key_press (GtkWidget   *widget,
 {
 	gboolean handled;
 
-	handled = gtk_bindings_activate (GTK_OBJECT (widget),
+	handled = gtk_bindings_activate (G_OBJECT (widget),
 					 event->keyval,
 					 event->state);
 	if (handled)
@@ -729,32 +739,24 @@ queue_animation_frame_change (GthImageViewer *self)
 }
 
 
-static int
-gth_image_viewer_expose (GtkWidget      *widget,
-			 GdkEventExpose *event)
+static gboolean
+gth_image_viewer_draw (GtkWidget *widget,
+		       cairo_t   *cr)
 {
 	GthImageViewer *self = GTH_IMAGE_VIEWER (widget);
-	cairo_t        *cr;
 
-	/* create the cairo context and set some default values */
+	/* set the default values of the cairo context */
 
-	cr = gdk_cairo_create (gtk_widget_get_window (widget));
 	cairo_set_line_width (cr, 0.5);
 	cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
 
-	/* clip to the exposed area */
-
-	gdk_cairo_region (cr, event->region);
-	cairo_clip (cr);
-
 	/* delegate the rest to the tool  */
 
-	gth_image_viewer_tool_expose (self->priv->tool, event, cr);
-	cairo_destroy (cr);
+	gth_image_viewer_tool_draw (self->priv->tool, cr);
 
 	queue_animation_frame_change (self);
 
-	return FALSE;
+	return TRUE;
 }
 
 
@@ -826,7 +828,7 @@ scroll_to (GthImageViewer *self,
 	   int            *x_offset,
 	   int            *y_offset)
 {
-	GdkDrawable   *drawable;
+	GdkWindow     *window;
 	GtkAllocation  allocation;
 	int            width, height;
 	int            delta_x, delta_y;
@@ -839,7 +841,7 @@ scroll_to (GthImageViewer *self,
 
 	_gth_image_viewer_get_zoomed_size (self, &width, &height);
 
-	drawable = gtk_widget_get_window (GTK_WIDGET (self));
+	window = gtk_widget_get_window (GTK_WIDGET (self));
 	gtk_widget_get_allocation (GTK_WIDGET (self), &allocation);
 	gdk_width = allocation.width - self->priv->frame_border2;
 	gdk_height = allocation.height - self->priv->frame_border2;
@@ -870,8 +872,8 @@ scroll_to (GthImageViewer *self,
 		area.y = 0;
 		area.width = allocation.width;
 		area.height = allocation.height;
-		gdk_window_invalidate_rect (drawable, &area, FALSE);
-		gdk_window_process_updates (drawable, FALSE);
+		gdk_window_invalidate_rect (window, &area, TRUE);
+		gdk_window_process_updates (window, TRUE);
 
 		return;
 	}
@@ -887,7 +889,7 @@ scroll_to (GthImageViewer *self,
 		area.width = gdk_width - abs (delta_x);
 		area.height = gdk_height - abs (delta_y);
 		region = gdk_region_rectangle (&area);
-		gdk_window_move_region (drawable, region, -delta_x, -delta_y);
+		gdk_window_move_region (window, region, -delta_x, -delta_y);
 
 		gdk_region_destroy (region);
 	}
@@ -912,12 +914,12 @@ scroll_to (GthImageViewer *self,
 		area.height = gdk_height;
 		gdk_region_union_with_rect (region, &area);
 
-		gdk_window_invalidate_region (drawable, region, FALSE);
+		gdk_window_invalidate_region (window, region, TRUE);
 
 		gdk_region_destroy (region);
 	}
 
-	gdk_window_process_updates (drawable, TRUE);
+	gdk_window_process_updates (window, TRUE);
 }
 
 
@@ -1102,43 +1104,20 @@ vadj_value_changed (GtkAdjustment  *adj,
 
 
 static void
-set_scroll_adjustments (GtkWidget     *widget,
-			GtkAdjustment *hadj,
-			GtkAdjustment *vadj)
+_gth_image_viewer_set_hadjustment (GthImageViewer *self,
+				   GtkAdjustment  *hadj)
 {
-	GthImageViewer *self;
-
-	g_return_if_fail (widget != NULL);
-	g_return_if_fail (GTH_IS_IMAGE_VIEWER (widget));
-
-	self = GTH_IMAGE_VIEWER (widget);
-
 	if (hadj != NULL)
 		g_return_if_fail (GTK_IS_ADJUSTMENT (hadj));
 	else
-		hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
-							   0.0, 0.0, 0.0));
-
-	if (vadj != NULL)
-		g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
-	else
-		vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
-							   0.0, 0.0, 0.0));
+		hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
 
 	if ((self->hadj != NULL) && (self->hadj != hadj)) {
-		g_signal_handlers_disconnect_by_data (G_OBJECT (self->hadj),
-						      self);
+		g_signal_handlers_disconnect_by_data (G_OBJECT (self->hadj), self);
 		g_object_unref (self->hadj);
-
 		self->hadj = NULL;
 	}
 
-	if ((self->vadj != NULL) && (self->vadj != vadj)) {
-		g_signal_handlers_disconnect_by_data (G_OBJECT (self->vadj), self);
-		g_object_unref (self->vadj);
-		self->vadj = NULL;
-	}
-
 	if (self->hadj != hadj) {
 		self->hadj = hadj;
 		g_object_ref (self->hadj);
@@ -1149,6 +1128,23 @@ set_scroll_adjustments (GtkWidget     *widget,
 				  G_CALLBACK (hadj_value_changed),
 				  self);
 	}
+}
+
+
+static void
+_gth_image_viewer_set_vadjustment (GthImageViewer *self,
+				   GtkAdjustment  *vadj)
+{
+	if (vadj != NULL)
+		g_return_if_fail (GTK_IS_ADJUSTMENT (vadj));
+	else
+		vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
+
+	if ((self->vadj != NULL) && (self->vadj != vadj)) {
+		g_signal_handlers_disconnect_by_data (G_OBJECT (self->vadj), self);
+		g_object_unref (self->vadj);
+		self->vadj = NULL;
+	}
 
 	if (self->vadj != vadj) {
 		self->vadj = vadj;
@@ -1197,6 +1193,64 @@ gth_image_viewer_set_zoom__key_binding (GthImageViewer *self,
 
 
 static void
+gth_image_viewer_get_property (GObject     *object,
+			       guint        prop_id,
+			       GValue      *value,
+			       GParamSpec  *pspec)
+{
+	GthImageViewer *self = GTH_IMAGE_VIEWER (object);
+
+	switch (prop_id) {
+	case PROP_HADJUSTMENT:
+		g_value_set_object (value, self->hadj);
+		break;
+	case PROP_VADJUSTMENT:
+		g_value_set_object (value, self->vadj);
+		break;
+	case PROP_HSCROLL_POLICY:
+		g_value_set_enum (value, self->priv->hscroll_policy);
+		break;
+	case PROP_VSCROLL_POLICY:
+		g_value_set_enum (value, self->priv->vscroll_policy);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+
+static void
+gth_image_viewer_set_property (GObject      *object,
+			       guint         prop_id,
+			       const GValue *value,
+			       GParamSpec   *pspec)
+{
+	GthImageViewer *self = GTH_IMAGE_VIEWER (object);
+
+	switch (prop_id) {
+	case PROP_HADJUSTMENT:
+		_gth_image_viewer_set_hadjustment (self, (GtkAdjustment *) g_value_get_object (value));
+		break;
+	case PROP_VADJUSTMENT:
+		_gth_image_viewer_set_vadjustment (self, (GtkAdjustment *) g_value_get_object (value));
+		break;
+	case PROP_HSCROLL_POLICY:
+		self->priv->hscroll_policy = g_value_get_enum (value);
+		gtk_widget_queue_resize (GTK_WIDGET (self));
+		break;
+	case PROP_VSCROLL_POLICY:
+		self->priv->vscroll_policy = g_value_get_enum (value);
+		gtk_widget_queue_resize (GTK_WIDGET (self));
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+		break;
+	}
+}
+
+
+static void
 gth_image_viewer_class_init (GthImageViewerClass *class)
 {
 	GObjectClass   *gobject_class;
@@ -1206,8 +1260,7 @@ gth_image_viewer_class_init (GthImageViewerClass *class)
 	parent_class = g_type_class_peek_parent (class);
 	g_type_class_add_private (class, sizeof (GthImageViewerPrivate));
 
-	widget_class = (GtkWidgetClass*) class;
-	gobject_class = (GObjectClass*) class;
+	/* signals */
 
 	gth_image_viewer_signals[CLICKED] =
 		g_signal_new ("clicked",
@@ -1274,18 +1327,6 @@ gth_image_viewer_class_init (GthImageViewerClass *class)
 			      g_cclosure_marshal_VOID__VOID,
 			      G_TYPE_NONE,
 			      0);
-	class->set_scroll_adjustments = set_scroll_adjustments;
-	widget_class->set_scroll_adjustments_signal =
-		g_signal_new ("set_scroll_adjustments",
-			      G_TYPE_FROM_CLASS (class),
-			      G_SIGNAL_RUN_LAST,
-			      G_STRUCT_OFFSET (GthImageViewerClass, set_scroll_adjustments),
-			      NULL, NULL,
-			      gth_marshal_VOID__POINTER_POINTER,
-			      G_TYPE_NONE,
-			      2,
-			      GTK_TYPE_ADJUSTMENT,
-			      GTK_TYPE_ADJUSTMENT);
 	gth_image_viewer_signals[SCROLL] =
 		g_signal_new ("scroll",
 			      G_TYPE_FROM_CLASS (class),
@@ -1298,24 +1339,28 @@ gth_image_viewer_class_init (GthImageViewerClass *class)
 			      GTK_TYPE_SCROLL_TYPE,
 			      GTK_TYPE_SCROLL_TYPE);
 
+	/**/
+
+	gobject_class = (GObjectClass*) class;
 	gobject_class->finalize = gth_image_viewer_finalize;
+	gobject_class->set_property = gth_image_viewer_set_property;
+	gobject_class->get_property = gth_image_viewer_get_property;
 
-	widget_class->realize         = gth_image_viewer_realize;
-	widget_class->unrealize       = gth_image_viewer_unrealize;
-	widget_class->map             = gth_image_viewer_map;
-	widget_class->unmap           = gth_image_viewer_unmap;
-	widget_class->size_allocate   = gth_image_viewer_size_allocate;
-	widget_class->focus_in_event  = gth_image_viewer_focus_in;
+	widget_class = (GtkWidgetClass*) class;
+	widget_class->realize = gth_image_viewer_realize;
+	widget_class->unrealize = gth_image_viewer_unrealize;
+	widget_class->map = gth_image_viewer_map;
+	widget_class->unmap = gth_image_viewer_unmap;
+	widget_class->size_allocate = gth_image_viewer_size_allocate;
+	widget_class->focus_in_event = gth_image_viewer_focus_in;
 	widget_class->focus_out_event = gth_image_viewer_focus_out;
 	widget_class->key_press_event = gth_image_viewer_key_press;
-
-	widget_class->expose_event         = gth_image_viewer_expose;
-	widget_class->button_press_event   = gth_image_viewer_button_press;
+	widget_class->draw = gth_image_viewer_draw;
+	widget_class->button_press_event = gth_image_viewer_button_press;
 	widget_class->button_release_event = gth_image_viewer_button_release;
-	widget_class->motion_notify_event  = gth_image_viewer_motion_notify;
-
+	widget_class->motion_notify_event = gth_image_viewer_motion_notify;
 	widget_class->scroll_event = gth_image_viewer_scroll_event;
-	widget_class->style_set    = gth_image_viewer_style_set;
+	widget_class->style_set = gth_image_viewer_style_set;
 
 	class->clicked      = NULL;
 	class->zoom_changed = NULL;
@@ -1325,6 +1370,13 @@ gth_image_viewer_class_init (GthImageViewerClass *class)
 	class->set_zoom     = gth_image_viewer_set_zoom__key_binding;
 	class->set_fit_mode = gth_image_viewer_set_fit_mode__key_binding;
 
+	/* GtkScrollable interface */
+
+	g_object_class_override_property (gobject_class, PROP_HADJUSTMENT, "hadjustment");
+	g_object_class_override_property (gobject_class, PROP_VADJUSTMENT, "vadjustment");
+	g_object_class_override_property (gobject_class, PROP_HSCROLL_POLICY, "hscroll-policy");
+	g_object_class_override_property (gobject_class, PROP_VSCROLL_POLICY, "vscroll-policy");
+
 	/* Add key bindings */
 
 	binding_set = gtk_binding_set_by_class (class);
@@ -2718,7 +2770,6 @@ gth_image_viewer_paint_background (GthImageViewer *self,
 
 void
 gth_image_viewer_apply_painters (GthImageViewer *self,
-				 GdkEventExpose *event,
 				 cairo_t        *cr)
 {
 	GList *scan;
@@ -2727,7 +2778,7 @@ gth_image_viewer_apply_painters (GthImageViewer *self,
 		PainterData *painter_data = scan->data;
 
 		cairo_save (cr);
-		painter_data->func (self, event, cr, painter_data->user_data);
+		painter_data->func (self, cr, painter_data->user_data);
 		cairo_restore (cr);
 	}
 }
diff --git a/gthumb/gth-image-viewer.h b/gthumb/gth-image-viewer.h
index 5dd22f1..d9dd0d5 100644
--- a/gthumb/gth-image-viewer.h
+++ b/gthumb/gth-image-viewer.h
@@ -47,7 +47,6 @@ typedef struct _GthImageViewerPrivate  GthImageViewerPrivate;
 #define GTH_IMAGE_VIEWER_FRAME_BORDER2   (GTH_IMAGE_VIEWER_FRAME_BORDER * 2)
 
 typedef void (*GthImageViewerPaintFunc) (GthImageViewer *image_viewer,
-					 GdkEventExpose *event,
 					 cairo_t        *cr,
 					 gpointer        user_data);
 
@@ -316,7 +315,6 @@ void           gth_image_viewer_paint_region             (GthImageViewer
 void           gth_image_viewer_paint_background         (GthImageViewer        *self,
 				   	   	          cairo_t               *cr);
 void           gth_image_viewer_apply_painters           (GthImageViewer        *image_viewer,
-							  GdkEventExpose        *event,
 							  cairo_t               *cr);
 void           gth_image_viewer_crop_area                (GthImageViewer        *viewer,
 							  cairo_rectangle_int_t *area);
diff --git a/gthumb/gth-time-selector.c b/gthumb/gth-time-selector.c
index 4508a61..7f8c0c8 100644
--- a/gthumb/gth-time-selector.c
+++ b/gthumb/gth-time-selector.c
@@ -345,8 +345,7 @@ calendar_popup_button_press_event_cb (GtkWidget      *widget,
 				 &popup_area.x,
 				 &popup_area.y,
 				 &popup_area.width,
-				 &popup_area.height,
-				 NULL);
+				 &popup_area.height);
 
 	/*g_print ("(%.0f, %.0f) <==> (%d, %d)[%d, %d]\n", event->x_root, event->y_root,  popup_area.x,  popup_area.y, popup_area.width, popup_area.height);*/
 
diff --git a/gthumb/gth-toggle-menu-tool-button.c b/gthumb/gth-toggle-menu-tool-button.c
index b14d1f4..22fcf9f 100644
--- a/gthumb/gth-toggle-menu-tool-button.c
+++ b/gthumb/gth-toggle-menu-tool-button.c
@@ -498,7 +498,6 @@ menu_position_func (GtkMenu                 *menu,
 	}
 	else {
 		gdk_window_get_origin (gtk_button_get_event_window (GTK_BUTTON (widget)), x, y);
-
 		gtk_widget_size_request (widget, &req);
 
 		if (direction == GTK_TEXT_DIR_LTR)
@@ -578,7 +577,7 @@ real_button_button_press_event_cb (GtkWidget               *widget,
 
 
 static void
-gth_toggle_menu_tool_button_destroy (GtkObject *object)
+gth_toggle_menu_tool_button_finalize (GObject *object)
 {
 	GthToggleMenuToolButton *button;
 
@@ -594,7 +593,7 @@ gth_toggle_menu_tool_button_destroy (GtkObject *object)
 		button->priv->toggle_button = NULL;
 	}
 
-	GTK_OBJECT_CLASS (parent_class)->destroy (object);
+	G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 
@@ -662,7 +661,6 @@ static void
 gth_toggle_menu_tool_button_class_init (GthToggleMenuToolButtonClass *klass)
 {
 	GObjectClass     *object_class;
-	GtkObjectClass   *gtk_object_class;
 	GtkWidgetClass   *widget_class;
 	GtkToolItemClass *tool_item_class;
 
@@ -670,12 +668,10 @@ gth_toggle_menu_tool_button_class_init (GthToggleMenuToolButtonClass *klass)
 	g_type_class_add_private (klass, sizeof (GthToggleMenuToolButtonPrivate));
 
 	object_class = (GObjectClass *) klass;
+	object_class->finalize = gth_toggle_menu_tool_button_finalize;
 	object_class->set_property = gth_toggle_menu_tool_button_set_property;
 	object_class->get_property = gth_toggle_menu_tool_button_get_property;
 
-	gtk_object_class = (GtkObjectClass *) klass;
-	gtk_object_class->destroy = gth_toggle_menu_tool_button_destroy;
-
 	widget_class = (GtkWidgetClass *) klass;
 	widget_class->state_changed = gth_toggle_menu_tool_button_state_changed;
 	widget_class->style_set = gth_toggle_menu_tool_button_style_set;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]