]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkviewport.c
Merges from gtk-1-2
[~andy/gtk] / gtk / gtkviewport.c
index bbfd69eb8a3744499733beaab8d4f7d4adf8368a..afffdf01ad5580e4c04824f63c33db81f4f1c2e7 100644 (file)
  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  * Boston, MA 02111-1307, USA.
  */
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999.  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"
 
+enum {
+  ARG_0,
+  ARG_HADJUSTMENT,
+  ARG_VADJUSTMENT,
+  ARG_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_set_scroll_adjustments          (GtkViewport      *viewport,
+                                                  GtkAdjustment    *hadjustment,
+                                                  GtkAdjustment    *vadjustment);
 static void gtk_viewport_map                      (GtkWidget        *widget);
 static void gtk_viewport_unmap                    (GtkWidget        *widget);
 static void gtk_viewport_realize                  (GtkWidget        *widget);
@@ -39,33 +64,35 @@ static void gtk_viewport_size_request             (GtkWidget        *widget,
                                                   GtkRequisition   *requisition);
 static void gtk_viewport_size_allocate            (GtkWidget        *widget,
                                                   GtkAllocation    *allocation);
-static gint gtk_viewport_need_resize              (GtkContainer     *container);
 static void gtk_viewport_adjustment_changed       (GtkAdjustment    *adjustment,
                                                   gpointer          data);
 static void gtk_viewport_adjustment_value_changed (GtkAdjustment    *adjustment,
                                                   gpointer          data);
+static void gtk_viewport_style_set                (GtkWidget *widget,
+                                                  GtkStyle  *previous_style);
 
 static GtkBinClass *parent_class;
 
-guint
-gtk_viewport_get_type ()
+GtkType
+gtk_viewport_get_type (void)
 {
-  static guint viewport_type = 0;
+  static GtkType viewport_type = 0;
 
   if (!viewport_type)
     {
-      GtkTypeInfo viewport_info =
+      static const GtkTypeInfo viewport_info =
       {
        "GtkViewport",
        sizeof (GtkViewport),
        sizeof (GtkViewportClass),
        (GtkClassInitFunc) gtk_viewport_class_init,
        (GtkObjectInitFunc) gtk_viewport_init,
-       (GtkArgSetFunc) NULL,
-        (GtkArgGetFunc) NULL,
+       /* reserved_1 */ NULL,
+        /* reserved_2 */ NULL,
+        (GtkClassInitFunc) NULL,
       };
 
-      viewport_type = gtk_type_unique (gtk_bin_get_type (), &viewport_info);
+      viewport_type = gtk_type_unique (GTK_TYPE_BIN, &viewport_info);
     }
 
   return viewport_type;
@@ -81,8 +108,24 @@ gtk_viewport_class_init (GtkViewportClass *class)
   object_class = (GtkObjectClass*) class;
   widget_class = (GtkWidgetClass*) class;
   container_class = (GtkContainerClass*) class;
-  parent_class = (GtkBinClass*) gtk_type_class (gtk_bin_get_type ());
-
+  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;
+  object_class->destroy = gtk_viewport_destroy;
   object_class->finalize = gtk_viewport_finalize;
   
   widget_class->map = gtk_viewport_map;
@@ -93,17 +136,79 @@ gtk_viewport_class_init (GtkViewportClass *class)
   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->set_scroll_adjustments_signal =
+    gtk_signal_new ("set_scroll_adjustments",
+                   GTK_RUN_LAST,
+                   object_class->type,
+                   GTK_SIGNAL_OFFSET (GtkViewportClass, set_scroll_adjustments),
+                   gtk_marshal_NONE__POINTER_POINTER,
+                   GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
+  
   container_class->add = gtk_viewport_add;
-  container_class->need_resize = gtk_viewport_need_resize;
+
+  class->set_scroll_adjustments = gtk_viewport_set_scroll_adjustments;
+}
+
+static void
+gtk_viewport_set_arg (GtkObject        *object,
+                     GtkArg           *arg,
+                     guint             arg_id)
+{
+  GtkViewport *viewport;
+
+  viewport = GTK_VIEWPORT (object);
+
+  switch (arg_id)
+    {
+    case ARG_HADJUSTMENT:
+      gtk_viewport_set_hadjustment (viewport, GTK_VALUE_POINTER (*arg));
+      break;
+    case ARG_VADJUSTMENT:
+      gtk_viewport_set_vadjustment (viewport, GTK_VALUE_POINTER (*arg));
+      break;
+    case ARG_SHADOW_TYPE:
+      gtk_viewport_set_shadow_type (viewport, GTK_VALUE_ENUM (*arg));
+      break;
+    default:
+      break;
+    }
+}
+
+static void
+gtk_viewport_get_arg (GtkObject        *object,
+                     GtkArg           *arg,
+                     guint             arg_id)
+{
+  GtkViewport *viewport;
+
+  viewport = GTK_VIEWPORT (object);
+
+  switch (arg_id)
+    {
+    case ARG_HADJUSTMENT:
+      GTK_VALUE_POINTER (*arg) = viewport->hadjustment;
+      break;
+    case ARG_VADJUSTMENT:
+      GTK_VALUE_POINTER (*arg) = viewport->vadjustment;
+      break;
+    case ARG_SHADOW_TYPE:
+      GTK_VALUE_ENUM (*arg) = viewport->shadow_type;
+      break;
+    default:
+      arg->type = GTK_TYPE_INVALID;
+      break;
+    }
 }
 
 static void
 gtk_viewport_init (GtkViewport *viewport)
 {
   GTK_WIDGET_UNSET_FLAGS (viewport, GTK_NO_WINDOW);
-  GTK_WIDGET_SET_FLAGS (viewport, GTK_BASIC);
 
+  gtk_container_set_resize_mode (GTK_CONTAINER (viewport), GTK_RESIZE_QUEUE);
+  
   viewport->shadow_type = GTK_SHADOW_IN;
   viewport->view_window = NULL;
   viewport->bin_window = NULL;
@@ -115,20 +220,29 @@ GtkWidget*
 gtk_viewport_new (GtkAdjustment *hadjustment,
                  GtkAdjustment *vadjustment)
 {
-  GtkViewport *viewport;
+  GtkWidget *viewport;
 
-  viewport = gtk_type_new (gtk_viewport_get_type ());
+  viewport = gtk_widget_new (GTK_TYPE_VIEWPORT,
+                            "hadjustment", hadjustment,
+                            "vadjustment", vadjustment,
+                            NULL);
 
-  if (!hadjustment)
-    hadjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+  return viewport;
+}
 
-  if (!vadjustment)
-    vadjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
+static void
+gtk_viewport_destroy (GtkObject *object)
+{
+  GtkViewport *viewport = GTK_VIEWPORT (object);
 
-  gtk_viewport_set_hadjustment (viewport, hadjustment);
-  gtk_viewport_set_vadjustment (viewport, vadjustment);
+  if (viewport->hadjustment)
+    gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment),
+                                  viewport);
+  if (viewport->vadjustment)
+    gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment),
+                                  viewport);
 
-  return GTK_WIDGET (viewport);
+  GTK_OBJECT_CLASS(parent_class)->destroy (object);
 }
 
 static void
@@ -166,17 +280,22 @@ gtk_viewport_set_hadjustment (GtkViewport   *viewport,
 {
   g_return_if_fail (viewport != NULL);
   g_return_if_fail (GTK_IS_VIEWPORT (viewport));
-  g_return_if_fail (adjustment != NULL);
+  if (adjustment)
+    g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (viewport->hadjustment != adjustment)
+  if (viewport->hadjustment && viewport->hadjustment != adjustment)
     {
-      if (viewport->hadjustment)
-       {
-         gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment),
-                                        (gpointer) viewport);
-         gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
-       }
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment),
+                                    (gpointer) viewport);
+      gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
+    }
+
+  if (!adjustment)
+    adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
+                                                    0.0, 0.0, 0.0));
 
+  if (viewport->hadjustment != adjustment)
+    {
       viewport->hadjustment = adjustment;
       gtk_object_ref (GTK_OBJECT (viewport->hadjustment));
       gtk_object_sink (GTK_OBJECT (viewport->hadjustment));
@@ -185,10 +304,10 @@ gtk_viewport_set_hadjustment (GtkViewport   *viewport,
                          (GtkSignalFunc) gtk_viewport_adjustment_changed,
                          (gpointer) viewport);
       gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
-                         (GtkSignalFunc)gtk_viewport_adjustment_value_changed,
+                         (GtkSignalFunc) gtk_viewport_adjustment_value_changed,
                          (gpointer) viewport);
 
-      gtk_viewport_adjustment_changed (adjustment, (gpointer) viewport);
+      gtk_viewport_adjustment_changed (adjustment, viewport);
     }
 }
 
@@ -198,17 +317,22 @@ gtk_viewport_set_vadjustment (GtkViewport   *viewport,
 {
   g_return_if_fail (viewport != NULL);
   g_return_if_fail (GTK_IS_VIEWPORT (viewport));
-  g_return_if_fail (adjustment != NULL);
+  if (adjustment)
+    g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
 
-  if (viewport->vadjustment != adjustment)
+  if (viewport->vadjustment && viewport->vadjustment != adjustment)
     {
-      if (viewport->vadjustment)
-       {
-         gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment),
-                                        (gpointer) viewport);
-         gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
-       }
+      gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment),
+                                    (gpointer) viewport);
+      gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
+    }
+
+  if (!adjustment)
+    adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
+                                                    0.0, 0.0, 0.0));
 
+  if (viewport->vadjustment != adjustment)
+    {
       viewport->vadjustment = adjustment;
       gtk_object_ref (GTK_OBJECT (viewport->vadjustment));
       gtk_object_sink (GTK_OBJECT (viewport->vadjustment));
@@ -217,13 +341,24 @@ gtk_viewport_set_vadjustment (GtkViewport   *viewport,
                          (GtkSignalFunc) gtk_viewport_adjustment_changed,
                          (gpointer) viewport);
       gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
-                         (GtkSignalFunc)gtk_viewport_adjustment_value_changed,
+                         (GtkSignalFunc) gtk_viewport_adjustment_value_changed,
                          (gpointer) viewport);
 
-      gtk_viewport_adjustment_changed (adjustment, (gpointer) viewport);
+      gtk_viewport_adjustment_changed (adjustment, viewport);
     }
 }
 
+static void
+gtk_viewport_set_scroll_adjustments (GtkViewport      *viewport,
+                                    GtkAdjustment    *hadjustment,
+                                    GtkAdjustment    *vadjustment)
+{
+  if (viewport->hadjustment != hadjustment)
+    gtk_viewport_set_hadjustment (viewport, hadjustment);
+  if (viewport->vadjustment != vadjustment)
+    gtk_viewport_set_vadjustment (viewport, vadjustment);
+}
+
 void
 gtk_viewport_set_shadow_type (GtkViewport   *viewport,
                              GtkShadowType  type)
@@ -255,12 +390,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
@@ -303,7 +438,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;
 
@@ -322,8 +459,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);
@@ -349,7 +486,12 @@ gtk_viewport_realize (GtkWidget *widget)
   widget->style = gtk_style_attach (widget->style, widget->window);
   gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
   gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);
-  
+
+   gtk_paint_flat_box(widget->style, viewport->bin_window, GTK_STATE_NORMAL,
+                     GTK_SHADOW_NONE,
+                     NULL, widget, "viewportbin",
+                     0, 0, -1, -1);
+   
   gdk_window_show (viewport->bin_window);
   gdk_window_show (viewport->view_window);
 }
@@ -423,11 +565,16 @@ gtk_viewport_draw (GtkWidget    *widget,
       
       gtk_viewport_paint (widget, &tmp_area);
 
+      tmp_area.x += viewport->hadjustment->value - widget->style->klass->xthickness;
+      tmp_area.y += viewport->vadjustment->value - widget->style->klass->ythickness;
+      
+      gtk_paint_flat_box(widget->style, viewport->bin_window, 
+                        GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+                        &tmp_area, widget, "viewportbin",
+                        0, 0, -1, -1);
+
       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);
        }
@@ -453,13 +600,22 @@ 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);
+         
+         if ((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);
+       }
+       
 
-      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;
@@ -467,32 +623,20 @@ gtk_viewport_expose (GtkWidget      *widget,
 
 static void
 gtk_viewport_add (GtkContainer *container,
-                 GtkWidget    *widget)
+                 GtkWidget    *child)
 {
   GtkBin *bin;
 
   g_return_if_fail (container != NULL);
   g_return_if_fail (GTK_IS_VIEWPORT (container));
-  g_return_if_fail (widget != NULL);
+  g_return_if_fail (child != NULL);
 
   bin = GTK_BIN (container);
+  g_return_if_fail (bin->child == NULL);
 
-  if (!bin->child)
-    {
-      gtk_widget_set_parent (widget, GTK_WIDGET (container));
-      gtk_widget_set_parent_window (widget, GTK_VIEWPORT (container)->bin_window);
-      if (GTK_WIDGET_VISIBLE (widget))
-       {
-         if (GTK_WIDGET_MAPPED (widget->parent) &&
-             !GTK_WIDGET_MAPPED (widget))
-           gtk_widget_map (widget);
-       }
-
-      bin->child = widget;
+  gtk_widget_set_parent_window (child, GTK_VIEWPORT (bin)->bin_window);
 
-      if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_VISIBLE (container))
-        gtk_widget_queue_resize (widget);
-    }
+  GTK_CONTAINER_CLASS (parent_class)->add (container, child);
 }
 
 static void
@@ -501,6 +645,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));
@@ -516,7 +661,11 @@ gtk_viewport_size_request (GtkWidget      *widget,
                         GTK_WIDGET (widget)->style->klass->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
@@ -579,8 +728,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,
@@ -588,7 +740,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,
@@ -604,12 +756,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;
@@ -630,27 +780,6 @@ gtk_viewport_size_allocate (GtkWidget     *widget,
     }
 }
 
-static gint
-gtk_viewport_need_resize (GtkContainer *container)
-{
-  GtkBin *bin;
-
-  g_return_val_if_fail (container != NULL, FALSE);
-  g_return_val_if_fail (GTK_IS_VIEWPORT (container), FALSE);
-
-  if (GTK_WIDGET_REALIZED (container))
-    {
-      bin = GTK_BIN (container);
-
-      gtk_widget_size_request (bin->child, &bin->child->requisition);
-
-      gtk_widget_size_allocate (GTK_WIDGET (container),
-                               &(GTK_WIDGET (container)->allocation));
-    }
-
-  return FALSE;
-}
-
 static void
 gtk_viewport_adjustment_changed (GtkAdjustment *adjustment,
                                 gpointer       data)
@@ -671,7 +800,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);
@@ -682,8 +810,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;
 
@@ -701,3 +827,19 @@ gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
                         child_allocation.y);
     }
 }
+
+static void
+gtk_viewport_style_set (GtkWidget *widget,
+                       GtkStyle  *previous_style)
+{
+   GtkViewport *viewport;
+   
+   if (GTK_WIDGET_REALIZED (widget) &&
+       !GTK_WIDGET_NO_WINDOW (widget))
+     {
+       viewport = GTK_VIEWPORT (widget);
+       
+       gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);
+       gtk_style_set_background (widget->style, widget->window, widget->state);
+     }
+}