Index: gtk/gtkfilechooserdefault.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkfilechooserdefault.c,v
retrieving revision 1.244
diff -u -p -r1.244 gtkfilechooserdefault.c
--- gtk/gtkfilechooserdefault.c	19 Jan 2005 21:05:15 -0000	1.244
+++ gtk/gtkfilechooserdefault.c	24 Jan 2005 15:41:06 -0000
@@ -672,7 +672,6 @@ gtk_file_chooser_default_init (GtkFileCh
   impl->pending_op = PENDING_OP_NONE;
   impl->pending_select_path = NULL;
 
-  gtk_widget_set_redraw_on_allocate (GTK_WIDGET (impl), TRUE);
   gtk_box_set_spacing (GTK_BOX (impl), 12);
 
   impl->tooltips = gtk_tooltips_new ();
Index: gtk/gtkprivate.h
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkprivate.h,v
retrieving revision 1.28
diff -u -p -r1.28 gtkprivate.h
--- gtk/gtkprivate.h	2 Jun 2004 17:46:21 -0000	1.28
+++ gtk/gtkprivate.h	24 Jan 2005 15:41:06 -0000
@@ -52,7 +52,8 @@ typedef enum
   PRIVATE_GTK_CHILD_VISIBLE     = 1 <<  10,  /* If widget should be mapped when parent is mapped */
   PRIVATE_GTK_REDRAW_ON_ALLOC   = 1 <<  11,  /* If we should queue a draw on the entire widget when it is reallocated */
   PRIVATE_GTK_ALLOC_NEEDED      = 1 <<  12,  /* If we we should allocate even if the allocation is the same */
-  PRIVATE_GTK_REQUEST_NEEDED    = 1 <<  13   /* Whether we need to call gtk_widget_size_request */
+  PRIVATE_GTK_REQUEST_NEEDED    = 1 <<  13,  /* Whether we need to call gtk_widget_size_request */
+  PRIVATE_GTK_ALLOC_INVALID     = 1 <<  14   /* Whether allocation is invalid, for example, after unmap */
 } GtkPrivateFlags;
 
 /* Macros for extracting a widgets private_flags from GtkWidget.
@@ -70,6 +71,7 @@ typedef enum
 #define GTK_WIDGET_REDRAW_ON_ALLOC(obj)   ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_REDRAW_ON_ALLOC) != 0)
 #define GTK_WIDGET_ALLOC_NEEDED(obj)      ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_ALLOC_NEEDED) != 0)
 #define GTK_WIDGET_REQUEST_NEEDED(obj)    ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_REQUEST_NEEDED) != 0)
+#define GTK_WIDGET_ALLOC_INVALID(obj)     ((GTK_PRIVATE_FLAGS (obj) & PRIVATE_GTK_ALLOC_INVALID) != 0)
 
 /* Macros for setting and clearing private widget flags.
  * we use a preprocessor string concatenation here for a clear
Index: gtk/gtkwidget.c
===================================================================
RCS file: /cvs/gnome/gtk+/gtk/gtkwidget.c,v
retrieving revision 1.388
diff -u -p -r1.388 gtkwidget.c
--- gtk/gtkwidget.c	21 Jan 2005 18:24:04 -0000	1.388
+++ gtk/gtkwidget.c	24 Jan 2005 15:41:06 -0000
@@ -1658,6 +1658,7 @@ gtk_widget_init (GtkWidget *widget)
   GTK_PRIVATE_SET_FLAG (widget, GTK_REDRAW_ON_ALLOC);
   GTK_PRIVATE_SET_FLAG (widget, GTK_REQUEST_NEEDED);
   GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_NEEDED);
+  GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_INVALID);
 
   widget->style = gtk_widget_get_default_style ();
   g_object_ref (widget->style);
@@ -2092,6 +2093,7 @@ gtk_widget_real_hide (GtkWidget *widget)
   if (GTK_WIDGET_VISIBLE (widget))
     {
       GTK_WIDGET_UNSET_FLAGS (widget, GTK_VISIBLE);
+      GTK_PRIVATE_SET_FLAG (widget, GTK_ALLOC_INVALID);
       
       if (GTK_WIDGET_MAPPED (widget))
 	gtk_widget_unmap (widget);
@@ -2699,6 +2701,7 @@ gtk_widget_size_allocate (GtkWidget	*wid
   GdkRectangle old_allocation;
   gboolean alloc_needed;
   gboolean size_changed;
+  gboolean alloc_invalid;
   gboolean position_changed;
   
   g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -2729,6 +2732,9 @@ gtk_widget_size_allocate (GtkWidget	*wid
   if (!GTK_WIDGET_REQUEST_NEEDED (widget))      /* Preserve request/allocate ordering */
     GTK_PRIVATE_UNSET_FLAG (widget, GTK_ALLOC_NEEDED);
 
+  alloc_invalid = GTK_WIDGET_ALLOC_INVALID (widget);
+  GTK_PRIVATE_UNSET_FLAG (widget, GTK_ALLOC_INVALID);
+
   old_allocation = widget->allocation;
   real_allocation = *allocation;
   aux_info =_gtk_widget_get_aux_info (widget, FALSE);
@@ -2752,7 +2758,7 @@ gtk_widget_size_allocate (GtkWidget	*wid
   real_allocation.height = MAX (real_allocation.height, 1);
 
   size_changed = (old_allocation.width != real_allocation.width ||
-		  old_allocation.height != real_allocation.height);
+		  old_allocation.height != real_allocation.height) || alloc_invalid;
   position_changed = (old_allocation.x != real_allocation.x ||
 		      old_allocation.y != real_allocation.y);
 
