]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkviewport.c
Remove explicit pointer grabs, since they are no longer necessary.
[~andy/gtk] / gtk / gtkviewport.c
index 504b8f092feb5e5d4bb306e101b6e1d601578b75..c370e9d2b646f6efe4d3e893a62cd00343346a6b 100644 (file)
@@ -2,42 +2,52 @@
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
  * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
+ * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2 of the License, or (at your option) any later version.
  *
  * This library is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
+ * Lesser General Public License for more details.
  *
- * You should have received a copy of the GNU Library General Public
+ * You should have received a copy of the GNU Lesser General Public
  * License along with this library; if not, write to the
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GTK+ Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
+ */
+
 #include "gtksignal.h"
 #include "gtkviewport.h"
+#include "gtkintl.h"
 
 enum {
-  ARG_0,
-  ARG_HADJUSTMENT,
-  ARG_VADJUSTMENT,
-  ARG_SHADOW_TYPE
+  PROP_0,
+  PROP_HADJUSTMENT,
+  PROP_VADJUSTMENT,
+  PROP_SHADOW_TYPE
 };
 
 
 static void gtk_viewport_class_init               (GtkViewportClass *klass);
 static void gtk_viewport_init                     (GtkViewport      *viewport);
 static void gtk_viewport_destroy                  (GtkObject        *object);
-static void gtk_viewport_finalize                 (GtkObject        *object);
-static void gtk_viewport_set_arg                 (GtkObject        *object,
-                                                  GtkArg           *arg,
-                                                  guint             arg_id);
-static void gtk_viewport_get_arg                 (GtkObject        *object,
-                                                  GtkArg           *arg,
-                                                  guint             arg_id);
-static void gtk_viewport_scroll_adjustments      (GtkViewport      *viewport,
+static void gtk_viewport_set_property             (GObject         *object,
+                                                  guint            prop_id,
+                                                  const GValue    *value,
+                                                  GParamSpec      *pspec);
+static void gtk_viewport_get_property             (GObject         *object,
+                                                  guint            prop_id,
+                                                  GValue          *value,
+                                                  GParamSpec      *pspec);
+static void gtk_viewport_set_scroll_adjustments          (GtkViewport      *viewport,
                                                   GtkAdjustment    *hadjustment,
                                                   GtkAdjustment    *vadjustment);
 static void gtk_viewport_map                      (GtkWidget        *widget);
@@ -46,8 +56,6 @@ static void gtk_viewport_realize                  (GtkWidget        *widget);
 static void gtk_viewport_unrealize                (GtkWidget        *widget);
 static void gtk_viewport_paint                    (GtkWidget        *widget,
                                                   GdkRectangle     *area);
-static void gtk_viewport_draw                     (GtkWidget        *widget,
-                                                  GdkRectangle     *area);
 static gint gtk_viewport_expose                   (GtkWidget        *widget,
                                                   GdkEventExpose   *event);
 static void gtk_viewport_add                      (GtkContainer     *container,
@@ -94,102 +102,117 @@ static void
 gtk_viewport_class_init (GtkViewportClass *class)
 {
   GtkObjectClass *object_class;
+  GObjectClass   *gobject_class;
   GtkWidgetClass *widget_class;
   GtkContainerClass *container_class;
 
   object_class = (GtkObjectClass*) class;
+  gobject_class = G_OBJECT_CLASS (class);
   widget_class = (GtkWidgetClass*) class;
   container_class = (GtkContainerClass*) class;
   parent_class = (GtkBinClass*) gtk_type_class (GTK_TYPE_BIN);
 
-  gtk_object_add_arg_type ("GtkViewport::hadjustment",
-                          GTK_TYPE_ADJUSTMENT,
-                          GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT,
-                          ARG_HADJUSTMENT);
-  gtk_object_add_arg_type ("GtkViewport::vadjustment",
-                          GTK_TYPE_ADJUSTMENT,
-                          GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT,
-                          ARG_VADJUSTMENT);
-  gtk_object_add_arg_type ("GtkViewport::shadow_type",
-                          GTK_TYPE_SHADOW_TYPE,
-                          GTK_ARG_READWRITE,
-                          ARG_SHADOW_TYPE);
-
-  object_class->set_arg = gtk_viewport_set_arg;
-  object_class->get_arg = gtk_viewport_get_arg;
+  gobject_class->set_property = gtk_viewport_set_property;
+  gobject_class->get_property = gtk_viewport_get_property;
   object_class->destroy = gtk_viewport_destroy;
-  object_class->finalize = gtk_viewport_finalize;
   
   widget_class->map = gtk_viewport_map;
   widget_class->unmap = gtk_viewport_unmap;
   widget_class->realize = gtk_viewport_realize;
   widget_class->unrealize = gtk_viewport_unrealize;
-  widget_class->draw = gtk_viewport_draw;
   widget_class->expose_event = gtk_viewport_expose;
   widget_class->size_request = gtk_viewport_size_request;
   widget_class->size_allocate = gtk_viewport_size_allocate;
   widget_class->style_set = gtk_viewport_style_set;
-
-  widget_class->scroll_adjustments_signal =
-    gtk_signal_new ("scroll_adjustments",
-                   GTK_RUN_LAST,
-                   object_class->type,
-                   GTK_SIGNAL_OFFSET (GtkViewportClass, scroll_adjustments),
-                   gtk_marshal_NONE__POINTER_POINTER,
-                   GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
   
   container_class->add = gtk_viewport_add;
 
-  class->scroll_adjustments = gtk_viewport_scroll_adjustments;
+  class->set_scroll_adjustments = gtk_viewport_set_scroll_adjustments;
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_HADJUSTMENT,
+                                   g_param_spec_object ("hadjustment",
+                                                       _("Horizontal adjustment"),
+                                                       _("The GtkAdjustment that determines the values of the horizontal position for this viewport."),
+                                                        GTK_TYPE_ADJUSTMENT,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_VADJUSTMENT,
+                                   g_param_spec_object ("vadjustment",
+                                                       _("Vertical adjustment"),
+                                                       _("The GtkAdjustment that determines the values of the vertical position for this viewport."),
+                                                        GTK_TYPE_ADJUSTMENT,
+                                                        G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
+                                   PROP_SHADOW_TYPE,
+                                   g_param_spec_enum ("shadow_type",
+                                                     _("Shadow type"),
+                                                     _("Determines how the shadowed box around the viewport is drawn."),
+                                                     GTK_TYPE_SHADOW_TYPE,
+                                                     GTK_SHADOW_IN,
+                                                     G_PARAM_READWRITE));
+
+  widget_class->set_scroll_adjustments_signal =
+    gtk_signal_new ("set_scroll_adjustments",
+                   GTK_RUN_LAST,
+                   GTK_CLASS_TYPE (object_class),
+                   GTK_SIGNAL_OFFSET (GtkViewportClass, set_scroll_adjustments),
+                   gtk_marshal_VOID__OBJECT_OBJECT,
+                   GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
 }
 
 static void
-gtk_viewport_set_arg (GtkObject        *object,
-                     GtkArg           *arg,
-                     guint             arg_id)
+gtk_viewport_set_property (GObject         *object,
+                          guint            prop_id,
+                          const GValue    *value,
+                          GParamSpec      *pspec)
 {
   GtkViewport *viewport;
 
   viewport = GTK_VIEWPORT (object);
 
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_HADJUSTMENT:
-      gtk_viewport_set_hadjustment (viewport, GTK_VALUE_POINTER (*arg));
+    case PROP_HADJUSTMENT:
+      gtk_viewport_set_hadjustment (viewport, g_value_get_object (value));
       break;
-    case ARG_VADJUSTMENT:
-      gtk_viewport_set_vadjustment (viewport, GTK_VALUE_POINTER (*arg));
+    case PROP_VADJUSTMENT:
+      gtk_viewport_set_vadjustment (viewport, g_value_get_object (value));
       break;
-    case ARG_SHADOW_TYPE:
-      gtk_viewport_set_shadow_type (viewport, GTK_VALUE_ENUM (*arg));
+    case PROP_SHADOW_TYPE:
+      gtk_viewport_set_shadow_type (viewport, g_value_get_enum (value));
       break;
     default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
 
 static void
-gtk_viewport_get_arg (GtkObject        *object,
-                     GtkArg           *arg,
-                     guint             arg_id)
+gtk_viewport_get_property (GObject         *object,
+                          guint            prop_id,
+                          GValue          *value,
+                          GParamSpec      *pspec)
 {
   GtkViewport *viewport;
 
   viewport = GTK_VIEWPORT (object);
 
-  switch (arg_id)
+  switch (prop_id)
     {
-    case ARG_HADJUSTMENT:
-      GTK_VALUE_POINTER (*arg) = viewport->hadjustment;
+    case PROP_HADJUSTMENT:
+      g_value_set_object (value, viewport->hadjustment);
       break;
-    case ARG_VADJUSTMENT:
-      GTK_VALUE_POINTER (*arg) = viewport->vadjustment;
+    case PROP_VADJUSTMENT:
+      g_value_set_object (value, viewport->vadjustment);
       break;
-    case ARG_SHADOW_TYPE:
-      GTK_VALUE_ENUM (*arg) = viewport->shadow_type;
+    case PROP_SHADOW_TYPE:
+      g_value_set_enum (value, viewport->shadow_type);
       break;
     default:
-      arg->type = GTK_TYPE_INVALID;
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
     }
 }
@@ -228,24 +251,19 @@ gtk_viewport_destroy (GtkObject *object)
   GtkViewport *viewport = GTK_VIEWPORT (object);
 
   if (viewport->hadjustment)
-    gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment),
-                                  viewport);
+    {
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment), viewport);
+      gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
+      viewport->hadjustment = NULL;
+    }
   if (viewport->vadjustment)
-    gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment),
-                                  viewport);
-
-  GTK_OBJECT_CLASS(parent_class)->destroy (object);
-}
-
-static void
-gtk_viewport_finalize (GtkObject *object)
-{
-  GtkViewport *viewport = GTK_VIEWPORT (object);
-
-  gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
-  gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
+    {
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment), viewport);
+      gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
+      viewport->vadjustment = NULL;
+    }
 
-  GTK_OBJECT_CLASS(parent_class)->finalize (object);
+  GTK_OBJECT_CLASS (parent_class)->destroy (object);
 }
 
 GtkAdjustment*
@@ -254,6 +272,9 @@ gtk_viewport_get_hadjustment (GtkViewport *viewport)
   g_return_val_if_fail (viewport != NULL, NULL);
   g_return_val_if_fail (GTK_IS_VIEWPORT (viewport), NULL);
 
+  if (!viewport->hadjustment)
+    gtk_viewport_set_hadjustment (viewport, NULL);
+
   return viewport->hadjustment;
 }
 
@@ -263,6 +284,9 @@ gtk_viewport_get_vadjustment (GtkViewport *viewport)
   g_return_val_if_fail (viewport != NULL, NULL);
   g_return_val_if_fail (GTK_IS_VIEWPORT (viewport), NULL);
 
+  if (!viewport->vadjustment)
+    gtk_viewport_set_vadjustment (viewport, NULL);
+
   return viewport->vadjustment;
 }
 
@@ -277,9 +301,9 @@ gtk_viewport_set_hadjustment (GtkViewport   *viewport,
 
   if (viewport->hadjustment && viewport->hadjustment != adjustment)
     {
-      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment),
-                                    (gpointer) viewport);
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment), viewport);
       gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
+      viewport->hadjustment = NULL;
     }
 
   if (!adjustment)
@@ -301,6 +325,8 @@ gtk_viewport_set_hadjustment (GtkViewport   *viewport,
 
       gtk_viewport_adjustment_changed (adjustment, viewport);
     }
+
+  g_object_notify (G_OBJECT (viewport), "hadjustment");
 }
 
 void
@@ -314,9 +340,9 @@ gtk_viewport_set_vadjustment (GtkViewport   *viewport,
 
   if (viewport->vadjustment && viewport->vadjustment != adjustment)
     {
-      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment),
-                                    (gpointer) viewport);
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment), viewport);
       gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
+      viewport->vadjustment = NULL;
     }
 
   if (!adjustment)
@@ -338,12 +364,14 @@ gtk_viewport_set_vadjustment (GtkViewport   *viewport,
 
       gtk_viewport_adjustment_changed (adjustment, viewport);
     }
+
+  g_object_notify (G_OBJECT (viewport), "vadjustment");
 }
 
 static void
-gtk_viewport_scroll_adjustments (GtkViewport      *viewport,
-                                GtkAdjustment    *hadjustment,
-                                GtkAdjustment    *vadjustment)
+gtk_viewport_set_scroll_adjustments (GtkViewport      *viewport,
+                                    GtkAdjustment    *hadjustment,
+                                    GtkAdjustment    *vadjustment)
 {
   if (viewport->hadjustment != hadjustment)
     gtk_viewport_set_hadjustment (viewport, hadjustment);
@@ -368,6 +396,8 @@ gtk_viewport_set_shadow_type (GtkViewport   *viewport,
          gtk_widget_queue_draw (GTK_WIDGET (viewport));
        }
     }
+
+  g_object_notify (G_OBJECT (viewport), "shadow_type");
 }
 
 
@@ -382,12 +412,12 @@ gtk_viewport_map (GtkWidget *widget)
   GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
   bin = GTK_BIN (widget);
 
-  gdk_window_show (widget->window);
-
   if (bin->child &&
       GTK_WIDGET_VISIBLE (bin->child) &&
       !GTK_WIDGET_MAPPED (bin->child))
     gtk_widget_map (bin->child);
+
+  gdk_window_show (widget->window);
 }
 
 static void
@@ -430,7 +460,9 @@ gtk_viewport_realize (GtkWidget *widget)
   attributes.colormap = gtk_widget_get_colormap (widget);
 
   event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
-  attributes.event_mask = event_mask;
+  /* We select on button_press_mask so that button 4-5 scrolls are trapped.
+   */
+  attributes.event_mask = event_mask | GDK_BUTTON_PRESS_MASK;
 
   attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
 
@@ -440,8 +472,8 @@ gtk_viewport_realize (GtkWidget *widget)
 
   if (viewport->shadow_type != GTK_SHADOW_NONE)
     {
-      attributes.x = widget->style->klass->xthickness;
-      attributes.y = widget->style->klass->ythickness;
+      attributes.x = widget->style->xthickness;
+      attributes.y = widget->style->ythickness;
     }
   else
     {
@@ -449,8 +481,8 @@ gtk_viewport_realize (GtkWidget *widget)
       attributes.y = 0;
     }
 
-  attributes.width = MAX (1, widget->allocation.width - attributes.x * 2 - border_width * 2);
-  attributes.height = MAX (1, widget->allocation.height - attributes.y * 2 - border_width * 2);
+  attributes.width = MAX (1, (gint)widget->allocation.width - attributes.x * 2 - border_width * 2);
+  attributes.height = MAX (1, (gint)widget->allocation.height - attributes.y * 2 - border_width * 2);
   attributes.event_mask = 0;
 
   viewport->view_window = gdk_window_new (widget->window, &attributes, attributes_mask);
@@ -528,44 +560,6 @@ gtk_viewport_paint (GtkWidget    *widget,
     }
 }
 
-static void
-gtk_viewport_draw (GtkWidget    *widget,
-                  GdkRectangle *area)
-{
-  GtkViewport *viewport;
-  GtkBin *bin;
-  GdkRectangle tmp_area;
-  GdkRectangle child_area;
-  gint border_width;
-
-  g_return_if_fail (widget != NULL);
-  g_return_if_fail (GTK_IS_VIEWPORT (widget));
-  g_return_if_fail (area != NULL);
-
-  if (GTK_WIDGET_DRAWABLE (widget))
-    {
-      viewport = GTK_VIEWPORT (widget);
-      bin = GTK_BIN (widget);
-
-      border_width = GTK_CONTAINER (widget)->border_width;
-      
-      tmp_area = *area;
-      tmp_area.x -= border_width;
-      tmp_area.y -= border_width;
-      
-      gtk_viewport_paint (widget, &tmp_area);
-
-      if (bin->child)
-       {
-         tmp_area.x += viewport->hadjustment->value - widget->style->klass->xthickness;
-         tmp_area.y += viewport->vadjustment->value - widget->style->klass->ythickness;
-
-         if (gtk_widget_intersect (bin->child, &tmp_area, &child_area))
-           gtk_widget_draw (bin->child, &child_area);
-       }
-    }
-}
-
 static gint
 gtk_viewport_expose (GtkWidget      *widget,
                     GdkEventExpose *event)
@@ -585,13 +579,19 @@ gtk_viewport_expose (GtkWidget      *widget,
 
       if (event->window == widget->window)
        gtk_viewport_paint (widget, &event->area);
+      else if (event->window == viewport->bin_window)
+       {
+         child_event = *event;
+
+         gtk_paint_flat_box(widget->style, viewport->bin_window, 
+                            GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+                            &event->area, widget, "viewportbin",
+                            0, 0, -1, -1);
+         
+         (* GTK_WIDGET_CLASS (parent_class)->expose_event) (widget, event);
+       }
+       
 
-      child_event = *event;
-      if ((event->window == viewport->bin_window) &&
-         (bin->child != NULL) &&
-         GTK_WIDGET_NO_WINDOW (bin->child) &&
-         gtk_widget_intersect (bin->child, &event->area, &child_event.area))
-       gtk_widget_event (bin->child, (GdkEvent*) &child_event);
     }
 
   return FALSE;
@@ -621,6 +621,7 @@ gtk_viewport_size_request (GtkWidget      *widget,
 {
   GtkViewport *viewport;
   GtkBin *bin;
+  GtkRequisition child_requisition;
 
   g_return_if_fail (widget != NULL);
   g_return_if_fail (GTK_IS_VIEWPORT (widget));
@@ -630,13 +631,17 @@ gtk_viewport_size_request (GtkWidget      *widget,
   bin = GTK_BIN (widget);
 
   requisition->width = (GTK_CONTAINER (widget)->border_width +
-                       GTK_WIDGET (widget)->style->klass->xthickness) * 2 + 5;
+                       GTK_WIDGET (widget)->style->xthickness) * 2 + 5;
 
   requisition->height = (GTK_CONTAINER (widget)->border_width * 2 +
-                        GTK_WIDGET (widget)->style->klass->ythickness) * 2 + 5;
+                        GTK_WIDGET (widget)->style->ythickness) * 2 + 5;
 
   if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
-    gtk_widget_size_request (bin->child, &bin->child->requisition);
+    {
+      gtk_widget_size_request (bin->child, &child_requisition);
+      requisition->width += child_requisition.width;
+      requisition->height += child_requisition.height;
+    }
 }
 
 static void
@@ -657,6 +662,12 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
   viewport = GTK_VIEWPORT (widget);
   bin = GTK_BIN (widget);
 
+  /* demand creation */
+  if (!viewport->hadjustment)
+    gtk_viewport_set_hadjustment (viewport, NULL);
+  if (!viewport->vadjustment)
+    gtk_viewport_set_hadjustment (viewport, NULL);
+
   border_width = GTK_CONTAINER (widget)->border_width;
 
   child_allocation.x = 0;
@@ -664,8 +675,8 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
 
   if (viewport->shadow_type != GTK_SHADOW_NONE)
     {
-      child_allocation.x = GTK_WIDGET (viewport)->style->klass->xthickness;
-      child_allocation.y = GTK_WIDGET (viewport)->style->klass->ythickness;
+      child_allocation.x = GTK_WIDGET (viewport)->style->xthickness;
+      child_allocation.y = GTK_WIDGET (viewport)->style->ythickness;
     }
 
   child_allocation.width = MAX (1, allocation->width - child_allocation.x * 2 - border_width * 2);
@@ -684,10 +695,6 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
                              child_allocation.y,
                              child_allocation.width,
                              child_allocation.height);
-       gtk_paint_flat_box(widget->style, viewport->bin_window, GTK_STATE_NORMAL,
-                         GTK_SHADOW_NONE,
-                         NULL, widget, "viewportbin",
-                         0, 0, -1, -1);
     }
 
   viewport->hadjustment->page_size = child_allocation.width;
@@ -703,8 +710,11 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
 
   if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
     {
+      GtkRequisition child_requisition;
+      gtk_widget_get_child_requisition (bin->child, &child_requisition);
+      
       viewport->hadjustment->lower = 0;
-      viewport->hadjustment->upper = MAX (bin->child->requisition.width,
+      viewport->hadjustment->upper = MAX (child_requisition.width,
                                          child_allocation.width);
 
       hval = CLAMP (hval, 0,
@@ -712,7 +722,7 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
                    viewport->hadjustment->page_size);
 
       viewport->vadjustment->lower = 0;
-      viewport->vadjustment->upper = MAX (bin->child->requisition.height,
+      viewport->vadjustment->upper = MAX (child_requisition.height,
                                          child_allocation.height);
 
       vval = CLAMP (vval, 0,
@@ -728,12 +738,10 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
       child_allocation.width = viewport->hadjustment->upper;
       child_allocation.height = viewport->vadjustment->upper;
 
-      if (!GTK_WIDGET_REALIZED (widget))
-        gtk_widget_realize (widget);
-
-      gdk_window_resize (viewport->bin_window,
-                        child_allocation.width,
-                        child_allocation.height);
+      if (GTK_WIDGET_REALIZED (widget))
+       gdk_window_resize (viewport->bin_window,
+                          child_allocation.width,
+                          child_allocation.height);
 
       child_allocation.x = 0;
       child_allocation.y = 0;
@@ -774,7 +782,6 @@ gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
   GtkViewport *viewport;
   GtkBin *bin;
   GtkAllocation child_allocation;
-  gint width, height;
 
   g_return_if_fail (adjustment != NULL);
   g_return_if_fail (data != NULL);
@@ -785,8 +792,6 @@ gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
 
   if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
     {
-      gdk_window_get_size (viewport->view_window, &width, &height);
-
       child_allocation.x = 0;
       child_allocation.y = 0;
 
@@ -799,9 +804,13 @@ gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
        child_allocation.y = viewport->vadjustment->lower - viewport->vadjustment->value;
 
       if (GTK_WIDGET_REALIZED (viewport))
-       gdk_window_move (viewport->bin_window,
-                        child_allocation.x,
-                        child_allocation.y);
+       {
+         gdk_window_move (viewport->bin_window,
+                          child_allocation.x,
+                          child_allocation.y);
+      
+         gdk_window_process_updates (viewport->bin_window, TRUE);
+       }
     }
 }
 
@@ -818,14 +827,5 @@ gtk_viewport_style_set (GtkWidget *widget,
        
        gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);
        gtk_style_set_background (widget->style, widget->window, widget->state);
-       gtk_paint_flat_box(widget->style, viewport->bin_window, GTK_STATE_NORMAL,
-                          GTK_SHADOW_NONE,
-                          NULL, widget, "viewportbin",
-                          0, 0, -1, -1);
-       if (GTK_WIDGET_DRAWABLE (widget))
-         {
-            gdk_window_clear (widget->window);
-            gdk_window_clear (viewport->bin_window);
-         }
      }
 }