1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
27 #include "gtksignal.h"
28 #include "gtkviewport.h"
38 static void gtk_viewport_class_init (GtkViewportClass *klass);
39 static void gtk_viewport_init (GtkViewport *viewport);
40 static void gtk_viewport_destroy (GtkObject *object);
41 static void gtk_viewport_set_arg (GtkObject *object,
44 static void gtk_viewport_get_arg (GtkObject *object,
47 static void gtk_viewport_set_scroll_adjustments (GtkViewport *viewport,
48 GtkAdjustment *hadjustment,
49 GtkAdjustment *vadjustment);
50 static void gtk_viewport_map (GtkWidget *widget);
51 static void gtk_viewport_unmap (GtkWidget *widget);
52 static void gtk_viewport_realize (GtkWidget *widget);
53 static void gtk_viewport_unrealize (GtkWidget *widget);
54 static void gtk_viewport_paint (GtkWidget *widget,
56 static void gtk_viewport_draw (GtkWidget *widget,
58 static gint gtk_viewport_expose (GtkWidget *widget,
59 GdkEventExpose *event);
60 static void gtk_viewport_add (GtkContainer *container,
62 static void gtk_viewport_size_request (GtkWidget *widget,
63 GtkRequisition *requisition);
64 static void gtk_viewport_size_allocate (GtkWidget *widget,
65 GtkAllocation *allocation);
66 static void gtk_viewport_adjustment_changed (GtkAdjustment *adjustment,
68 static void gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
70 static void gtk_viewport_style_set (GtkWidget *widget,
71 GtkStyle *previous_style);
73 static GtkBinClass *parent_class;
76 gtk_viewport_get_type (void)
78 static GtkType viewport_type = 0;
82 static const GtkTypeInfo viewport_info =
86 sizeof (GtkViewportClass),
87 (GtkClassInitFunc) gtk_viewport_class_init,
88 (GtkObjectInitFunc) gtk_viewport_init,
89 /* reserved_1 */ NULL,
90 /* reserved_2 */ NULL,
91 (GtkClassInitFunc) NULL,
94 viewport_type = gtk_type_unique (GTK_TYPE_BIN, &viewport_info);
101 gtk_viewport_class_init (GtkViewportClass *class)
103 GtkObjectClass *object_class;
104 GtkWidgetClass *widget_class;
105 GtkContainerClass *container_class;
107 object_class = (GtkObjectClass*) class;
108 widget_class = (GtkWidgetClass*) class;
109 container_class = (GtkContainerClass*) class;
110 parent_class = (GtkBinClass*) gtk_type_class (GTK_TYPE_BIN);
112 object_class->set_arg = gtk_viewport_set_arg;
113 object_class->get_arg = gtk_viewport_get_arg;
114 object_class->destroy = gtk_viewport_destroy;
116 widget_class->map = gtk_viewport_map;
117 widget_class->unmap = gtk_viewport_unmap;
118 widget_class->realize = gtk_viewport_realize;
119 widget_class->unrealize = gtk_viewport_unrealize;
120 widget_class->draw = gtk_viewport_draw;
121 widget_class->expose_event = gtk_viewport_expose;
122 widget_class->size_request = gtk_viewport_size_request;
123 widget_class->size_allocate = gtk_viewport_size_allocate;
124 widget_class->style_set = gtk_viewport_style_set;
126 container_class->add = gtk_viewport_add;
128 class->set_scroll_adjustments = gtk_viewport_set_scroll_adjustments;
130 gtk_object_add_arg_type ("GtkViewport::hadjustment",
134 gtk_object_add_arg_type ("GtkViewport::vadjustment",
138 gtk_object_add_arg_type ("GtkViewport::shadow_type",
139 GTK_TYPE_SHADOW_TYPE,
143 widget_class->set_scroll_adjustments_signal =
144 gtk_signal_new ("set_scroll_adjustments",
146 GTK_CLASS_TYPE (object_class),
147 GTK_SIGNAL_OFFSET (GtkViewportClass, set_scroll_adjustments),
148 gtk_marshal_NONE__POINTER_POINTER,
149 GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT);
153 gtk_viewport_set_arg (GtkObject *object,
157 GtkViewport *viewport;
159 viewport = GTK_VIEWPORT (object);
163 case ARG_HADJUSTMENT:
164 gtk_viewport_set_hadjustment (viewport, GTK_VALUE_POINTER (*arg));
166 case ARG_VADJUSTMENT:
167 gtk_viewport_set_vadjustment (viewport, GTK_VALUE_POINTER (*arg));
169 case ARG_SHADOW_TYPE:
170 gtk_viewport_set_shadow_type (viewport, GTK_VALUE_ENUM (*arg));
178 gtk_viewport_get_arg (GtkObject *object,
182 GtkViewport *viewport;
184 viewport = GTK_VIEWPORT (object);
188 case ARG_HADJUSTMENT:
189 GTK_VALUE_POINTER (*arg) = viewport->hadjustment;
191 case ARG_VADJUSTMENT:
192 GTK_VALUE_POINTER (*arg) = viewport->vadjustment;
194 case ARG_SHADOW_TYPE:
195 GTK_VALUE_ENUM (*arg) = viewport->shadow_type;
198 arg->type = GTK_TYPE_INVALID;
204 gtk_viewport_init (GtkViewport *viewport)
206 GTK_WIDGET_UNSET_FLAGS (viewport, GTK_NO_WINDOW);
208 gtk_container_set_resize_mode (GTK_CONTAINER (viewport), GTK_RESIZE_QUEUE);
210 viewport->shadow_type = GTK_SHADOW_IN;
211 viewport->view_window = NULL;
212 viewport->bin_window = NULL;
213 viewport->hadjustment = NULL;
214 viewport->vadjustment = NULL;
218 gtk_viewport_new (GtkAdjustment *hadjustment,
219 GtkAdjustment *vadjustment)
223 viewport = gtk_widget_new (GTK_TYPE_VIEWPORT,
224 "hadjustment", hadjustment,
225 "vadjustment", vadjustment,
232 gtk_viewport_destroy (GtkObject *object)
234 GtkViewport *viewport = GTK_VIEWPORT (object);
236 if (viewport->hadjustment)
238 gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment), viewport);
239 gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
240 viewport->hadjustment = NULL;
242 if (viewport->vadjustment)
244 gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment), viewport);
245 gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
246 viewport->vadjustment = NULL;
249 GTK_OBJECT_CLASS (parent_class)->destroy (object);
253 gtk_viewport_get_hadjustment (GtkViewport *viewport)
255 g_return_val_if_fail (viewport != NULL, NULL);
256 g_return_val_if_fail (GTK_IS_VIEWPORT (viewport), NULL);
258 if (!viewport->hadjustment)
259 gtk_viewport_set_hadjustment (viewport, NULL);
261 return viewport->hadjustment;
265 gtk_viewport_get_vadjustment (GtkViewport *viewport)
267 g_return_val_if_fail (viewport != NULL, NULL);
268 g_return_val_if_fail (GTK_IS_VIEWPORT (viewport), NULL);
270 if (!viewport->vadjustment)
271 gtk_viewport_set_vadjustment (viewport, NULL);
273 return viewport->vadjustment;
277 gtk_viewport_set_hadjustment (GtkViewport *viewport,
278 GtkAdjustment *adjustment)
280 g_return_if_fail (viewport != NULL);
281 g_return_if_fail (GTK_IS_VIEWPORT (viewport));
283 g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
285 if (viewport->hadjustment && viewport->hadjustment != adjustment)
287 gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->hadjustment), viewport);
288 gtk_object_unref (GTK_OBJECT (viewport->hadjustment));
289 viewport->hadjustment = NULL;
293 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
296 if (viewport->hadjustment != adjustment)
298 viewport->hadjustment = adjustment;
299 gtk_object_ref (GTK_OBJECT (viewport->hadjustment));
300 gtk_object_sink (GTK_OBJECT (viewport->hadjustment));
302 gtk_signal_connect (GTK_OBJECT (adjustment), "changed",
303 (GtkSignalFunc) gtk_viewport_adjustment_changed,
304 (gpointer) viewport);
305 gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
306 (GtkSignalFunc) gtk_viewport_adjustment_value_changed,
307 (gpointer) viewport);
309 gtk_viewport_adjustment_changed (adjustment, viewport);
314 gtk_viewport_set_vadjustment (GtkViewport *viewport,
315 GtkAdjustment *adjustment)
317 g_return_if_fail (viewport != NULL);
318 g_return_if_fail (GTK_IS_VIEWPORT (viewport));
320 g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
322 if (viewport->vadjustment && viewport->vadjustment != adjustment)
324 gtk_signal_disconnect_by_data (GTK_OBJECT (viewport->vadjustment), viewport);
325 gtk_object_unref (GTK_OBJECT (viewport->vadjustment));
326 viewport->vadjustment = NULL;
330 adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0,
333 if (viewport->vadjustment != adjustment)
335 viewport->vadjustment = adjustment;
336 gtk_object_ref (GTK_OBJECT (viewport->vadjustment));
337 gtk_object_sink (GTK_OBJECT (viewport->vadjustment));
339 gtk_signal_connect (GTK_OBJECT (adjustment), "changed",
340 (GtkSignalFunc) gtk_viewport_adjustment_changed,
341 (gpointer) viewport);
342 gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
343 (GtkSignalFunc) gtk_viewport_adjustment_value_changed,
344 (gpointer) viewport);
346 gtk_viewport_adjustment_changed (adjustment, viewport);
351 gtk_viewport_set_scroll_adjustments (GtkViewport *viewport,
352 GtkAdjustment *hadjustment,
353 GtkAdjustment *vadjustment)
355 if (viewport->hadjustment != hadjustment)
356 gtk_viewport_set_hadjustment (viewport, hadjustment);
357 if (viewport->vadjustment != vadjustment)
358 gtk_viewport_set_vadjustment (viewport, vadjustment);
362 gtk_viewport_set_shadow_type (GtkViewport *viewport,
365 g_return_if_fail (viewport != NULL);
366 g_return_if_fail (GTK_IS_VIEWPORT (viewport));
368 if ((GtkShadowType) viewport->shadow_type != type)
370 viewport->shadow_type = type;
372 if (GTK_WIDGET_VISIBLE (viewport))
374 gtk_widget_size_allocate (GTK_WIDGET (viewport), &(GTK_WIDGET (viewport)->allocation));
375 gtk_widget_queue_draw (GTK_WIDGET (viewport));
382 gtk_viewport_map (GtkWidget *widget)
386 g_return_if_fail (widget != NULL);
387 g_return_if_fail (GTK_IS_VIEWPORT (widget));
389 GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
390 bin = GTK_BIN (widget);
393 GTK_WIDGET_VISIBLE (bin->child) &&
394 !GTK_WIDGET_MAPPED (bin->child))
395 gtk_widget_map (bin->child);
397 gdk_window_show (widget->window);
401 gtk_viewport_unmap (GtkWidget *widget)
403 g_return_if_fail (widget != NULL);
404 g_return_if_fail (GTK_IS_VIEWPORT (widget));
406 GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
408 gdk_window_hide (widget->window);
412 gtk_viewport_realize (GtkWidget *widget)
415 GtkViewport *viewport;
416 GdkWindowAttr attributes;
417 gint attributes_mask;
421 g_return_if_fail (widget != NULL);
422 g_return_if_fail (GTK_IS_VIEWPORT (widget));
424 border_width = GTK_CONTAINER (widget)->border_width;
426 bin = GTK_BIN (widget);
427 viewport = GTK_VIEWPORT (widget);
428 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
430 attributes.x = widget->allocation.x + border_width;
431 attributes.y = widget->allocation.y + border_width;
432 attributes.width = widget->allocation.width - border_width * 2;
433 attributes.height = widget->allocation.height - border_width * 2;
434 attributes.window_type = GDK_WINDOW_CHILD;
435 attributes.wclass = GDK_INPUT_OUTPUT;
436 attributes.visual = gtk_widget_get_visual (widget);
437 attributes.colormap = gtk_widget_get_colormap (widget);
439 event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK;
440 /* We select on button_press_mask so that button 4-5 scrolls are trapped.
442 attributes.event_mask = event_mask | GDK_BUTTON_PRESS_MASK;
444 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
446 widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
447 &attributes, attributes_mask);
448 gdk_window_set_user_data (widget->window, viewport);
450 if (viewport->shadow_type != GTK_SHADOW_NONE)
452 attributes.x = widget->style->klass->xthickness;
453 attributes.y = widget->style->klass->ythickness;
461 attributes.width = MAX (1, (gint)widget->allocation.width - attributes.x * 2 - border_width * 2);
462 attributes.height = MAX (1, (gint)widget->allocation.height - attributes.y * 2 - border_width * 2);
463 attributes.event_mask = 0;
465 viewport->view_window = gdk_window_new (widget->window, &attributes, attributes_mask);
466 gdk_window_set_user_data (viewport->view_window, viewport);
473 attributes.width = viewport->hadjustment->upper;
474 attributes.height = viewport->vadjustment->upper;
477 attributes.event_mask = event_mask;
479 viewport->bin_window = gdk_window_new (viewport->view_window, &attributes, attributes_mask);
480 gdk_window_set_user_data (viewport->bin_window, viewport);
483 gtk_widget_set_parent_window (bin->child, viewport->bin_window);
485 widget->style = gtk_style_attach (widget->style, widget->window);
486 gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
487 gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);
489 gtk_paint_flat_box(widget->style, viewport->bin_window, GTK_STATE_NORMAL,
491 NULL, widget, "viewportbin",
494 gdk_window_show (viewport->bin_window);
495 gdk_window_show (viewport->view_window);
499 gtk_viewport_unrealize (GtkWidget *widget)
501 GtkViewport *viewport;
503 g_return_if_fail (widget != NULL);
504 g_return_if_fail (GTK_IS_VIEWPORT (widget));
506 viewport = GTK_VIEWPORT (widget);
508 gdk_window_set_user_data (viewport->view_window, NULL);
509 gdk_window_destroy (viewport->view_window);
510 viewport->view_window = NULL;
512 gdk_window_set_user_data (viewport->bin_window, NULL);
513 gdk_window_destroy (viewport->bin_window);
514 viewport->bin_window = NULL;
516 if (GTK_WIDGET_CLASS (parent_class)->unrealize)
517 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
521 gtk_viewport_paint (GtkWidget *widget,
524 GtkViewport *viewport;
526 g_return_if_fail (widget != NULL);
527 g_return_if_fail (GTK_IS_VIEWPORT (widget));
528 g_return_if_fail (area != NULL);
530 if (GTK_WIDGET_DRAWABLE (widget))
532 viewport = GTK_VIEWPORT (widget);
534 gtk_draw_shadow (widget->style, widget->window,
535 GTK_STATE_NORMAL, viewport->shadow_type,
541 gtk_viewport_draw (GtkWidget *widget,
544 GtkViewport *viewport;
546 GdkRectangle tmp_area;
547 GdkRectangle child_area;
550 g_return_if_fail (widget != NULL);
551 g_return_if_fail (GTK_IS_VIEWPORT (widget));
552 g_return_if_fail (area != NULL);
554 if (GTK_WIDGET_DRAWABLE (widget))
556 viewport = GTK_VIEWPORT (widget);
557 bin = GTK_BIN (widget);
559 border_width = GTK_CONTAINER (widget)->border_width;
562 tmp_area.x -= border_width;
563 tmp_area.y -= border_width;
565 gtk_viewport_paint (widget, &tmp_area);
567 tmp_area.x += viewport->hadjustment->value - widget->style->klass->xthickness;
568 tmp_area.y += viewport->vadjustment->value - widget->style->klass->ythickness;
570 gtk_paint_flat_box(widget->style, viewport->bin_window,
571 GTK_STATE_NORMAL, GTK_SHADOW_NONE,
572 &tmp_area, widget, "viewportbin",
577 if (gtk_widget_intersect (bin->child, &tmp_area, &child_area))
578 gtk_widget_draw (bin->child, &child_area);
584 gtk_viewport_expose (GtkWidget *widget,
585 GdkEventExpose *event)
587 GtkViewport *viewport;
589 GdkEventExpose child_event;
591 g_return_val_if_fail (widget != NULL, FALSE);
592 g_return_val_if_fail (GTK_IS_VIEWPORT (widget), FALSE);
593 g_return_val_if_fail (event != NULL, FALSE);
595 if (GTK_WIDGET_DRAWABLE (widget))
597 viewport = GTK_VIEWPORT (widget);
598 bin = GTK_BIN (widget);
600 if (event->window == widget->window)
601 gtk_viewport_paint (widget, &event->area);
602 else if (event->window == viewport->bin_window)
604 child_event = *event;
606 gtk_paint_flat_box(widget->style, viewport->bin_window,
607 GTK_STATE_NORMAL, GTK_SHADOW_NONE,
608 &event->area, widget, "viewportbin",
611 if ((bin->child != NULL) &&
612 GTK_WIDGET_NO_WINDOW (bin->child) &&
613 gtk_widget_intersect (bin->child, &event->area, &child_event.area))
614 gtk_widget_event (bin->child, (GdkEvent*) &child_event);
624 gtk_viewport_add (GtkContainer *container,
629 g_return_if_fail (container != NULL);
630 g_return_if_fail (GTK_IS_VIEWPORT (container));
631 g_return_if_fail (child != NULL);
633 bin = GTK_BIN (container);
634 g_return_if_fail (bin->child == NULL);
636 gtk_widget_set_parent_window (child, GTK_VIEWPORT (bin)->bin_window);
638 GTK_CONTAINER_CLASS (parent_class)->add (container, child);
642 gtk_viewport_size_request (GtkWidget *widget,
643 GtkRequisition *requisition)
645 GtkViewport *viewport;
647 GtkRequisition child_requisition;
649 g_return_if_fail (widget != NULL);
650 g_return_if_fail (GTK_IS_VIEWPORT (widget));
651 g_return_if_fail (requisition != NULL);
653 viewport = GTK_VIEWPORT (widget);
654 bin = GTK_BIN (widget);
656 requisition->width = (GTK_CONTAINER (widget)->border_width +
657 GTK_WIDGET (widget)->style->klass->xthickness) * 2 + 5;
659 requisition->height = (GTK_CONTAINER (widget)->border_width * 2 +
660 GTK_WIDGET (widget)->style->klass->ythickness) * 2 + 5;
662 if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
664 gtk_widget_size_request (bin->child, &child_requisition);
665 requisition->width += child_requisition.width;
666 requisition->height += child_requisition.height;
671 gtk_viewport_size_allocate (GtkWidget *widget,
672 GtkAllocation *allocation)
674 GtkViewport *viewport;
676 GtkAllocation child_allocation;
680 g_return_if_fail (widget != NULL);
681 g_return_if_fail (GTK_IS_VIEWPORT (widget));
682 g_return_if_fail (allocation != NULL);
684 widget->allocation = *allocation;
685 viewport = GTK_VIEWPORT (widget);
686 bin = GTK_BIN (widget);
688 /* demand creation */
689 if (!viewport->hadjustment)
690 gtk_viewport_set_hadjustment (viewport, NULL);
691 if (!viewport->vadjustment)
692 gtk_viewport_set_hadjustment (viewport, NULL);
694 border_width = GTK_CONTAINER (widget)->border_width;
696 child_allocation.x = 0;
697 child_allocation.y = 0;
699 if (viewport->shadow_type != GTK_SHADOW_NONE)
701 child_allocation.x = GTK_WIDGET (viewport)->style->klass->xthickness;
702 child_allocation.y = GTK_WIDGET (viewport)->style->klass->ythickness;
705 child_allocation.width = MAX (1, allocation->width - child_allocation.x * 2 - border_width * 2);
706 child_allocation.height = MAX (1, allocation->height - child_allocation.y * 2 - border_width * 2);
708 if (GTK_WIDGET_REALIZED (widget))
710 gdk_window_move_resize (widget->window,
711 allocation->x + border_width,
712 allocation->y + border_width,
713 allocation->width - border_width * 2,
714 allocation->height - border_width * 2);
716 gdk_window_move_resize (viewport->view_window,
719 child_allocation.width,
720 child_allocation.height);
723 viewport->hadjustment->page_size = child_allocation.width;
724 viewport->hadjustment->page_increment = viewport->hadjustment->page_size / 2;
725 viewport->hadjustment->step_increment = 10;
727 viewport->vadjustment->page_size = child_allocation.height;
728 viewport->vadjustment->page_increment = viewport->vadjustment->page_size / 2;
729 viewport->vadjustment->step_increment = 10;
731 hval = viewport->hadjustment->value;
732 vval = viewport->vadjustment->value;
734 if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
736 GtkRequisition child_requisition;
737 gtk_widget_get_child_requisition (bin->child, &child_requisition);
739 viewport->hadjustment->lower = 0;
740 viewport->hadjustment->upper = MAX (child_requisition.width,
741 child_allocation.width);
743 hval = CLAMP (hval, 0,
744 viewport->hadjustment->upper -
745 viewport->hadjustment->page_size);
747 viewport->vadjustment->lower = 0;
748 viewport->vadjustment->upper = MAX (child_requisition.height,
749 child_allocation.height);
751 vval = CLAMP (vval, 0,
752 viewport->vadjustment->upper -
753 viewport->vadjustment->page_size);
756 if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
758 child_allocation.x = 0;
759 child_allocation.y = 0;
761 child_allocation.width = viewport->hadjustment->upper;
762 child_allocation.height = viewport->vadjustment->upper;
764 if (GTK_WIDGET_REALIZED (widget))
765 gdk_window_resize (viewport->bin_window,
766 child_allocation.width,
767 child_allocation.height);
769 child_allocation.x = 0;
770 child_allocation.y = 0;
771 gtk_widget_size_allocate (bin->child, &child_allocation);
774 gtk_signal_emit_by_name (GTK_OBJECT (viewport->hadjustment), "changed");
775 gtk_signal_emit_by_name (GTK_OBJECT (viewport->vadjustment), "changed");
776 if (viewport->hadjustment->value != hval)
778 viewport->hadjustment->value = hval;
779 gtk_signal_emit_by_name (GTK_OBJECT (viewport->hadjustment), "value_changed");
781 if (viewport->vadjustment->value != vval)
783 viewport->vadjustment->value = vval;
784 gtk_signal_emit_by_name (GTK_OBJECT (viewport->vadjustment), "value_changed");
789 gtk_viewport_adjustment_changed (GtkAdjustment *adjustment,
792 GtkViewport *viewport;
794 g_return_if_fail (adjustment != NULL);
795 g_return_if_fail (data != NULL);
796 g_return_if_fail (GTK_IS_VIEWPORT (data));
798 viewport = GTK_VIEWPORT (data);
802 gtk_viewport_adjustment_value_changed (GtkAdjustment *adjustment,
805 GtkViewport *viewport;
807 GtkAllocation child_allocation;
809 g_return_if_fail (adjustment != NULL);
810 g_return_if_fail (data != NULL);
811 g_return_if_fail (GTK_IS_VIEWPORT (data));
813 viewport = GTK_VIEWPORT (data);
814 bin = GTK_BIN (data);
816 if (bin->child && GTK_WIDGET_VISIBLE (bin->child))
818 child_allocation.x = 0;
819 child_allocation.y = 0;
821 if (viewport->hadjustment->lower != (viewport->hadjustment->upper -
822 viewport->hadjustment->page_size))
823 child_allocation.x = viewport->hadjustment->lower - viewport->hadjustment->value;
825 if (viewport->vadjustment->lower != (viewport->vadjustment->upper -
826 viewport->vadjustment->page_size))
827 child_allocation.y = viewport->vadjustment->lower - viewport->vadjustment->value;
829 if (GTK_WIDGET_REALIZED (viewport))
831 gdk_window_move (viewport->bin_window,
835 gdk_window_process_updates (viewport->bin_window, TRUE);
841 gtk_viewport_style_set (GtkWidget *widget,
842 GtkStyle *previous_style)
844 GtkViewport *viewport;
846 if (GTK_WIDGET_REALIZED (widget) &&
847 !GTK_WIDGET_NO_WINDOW (widget))
849 viewport = GTK_VIEWPORT (widget);
851 gtk_style_set_background (widget->style, viewport->bin_window, GTK_STATE_NORMAL);
852 gtk_style_set_background (widget->style, widget->window, widget->state);