]> Pileus Git - ~andy/gtk/blob - gtk/gtkscrolledwindow.c
changed reversed_[12] to reserved_[12] in gtk_*_get_type functions.
[~andy/gtk] / gtk / gtkscrolledwindow.c
1 /* GTK - The GIMP Toolkit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
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.
8  *
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.
13  *
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.
18  */
19 #include "gtkscrolledwindow.h"
20 #include "gtksignal.h"
21
22
23 #define SCROLLBAR_SPACING(w) (GTK_SCROLLED_WINDOW_CLASS (GTK_OBJECT (w)->klass)->scrollbar_spacing)
24
25
26 static void gtk_scrolled_window_class_init         (GtkScrolledWindowClass *klass);
27 static void gtk_scrolled_window_init               (GtkScrolledWindow      *scrolled_window);
28 static void gtk_scrolled_window_destroy            (GtkObject              *object);
29 static void gtk_scrolled_window_finalize           (GtkObject              *object);
30 static void gtk_scrolled_window_map                (GtkWidget              *widget);
31 static void gtk_scrolled_window_unmap              (GtkWidget              *widget);
32 static void gtk_scrolled_window_draw               (GtkWidget              *widget,
33                                                     GdkRectangle           *area);
34 static void gtk_scrolled_window_size_request       (GtkWidget              *widget,
35                                                     GtkRequisition         *requisition);
36 static void gtk_scrolled_window_size_allocate      (GtkWidget              *widget,
37                                                     GtkAllocation          *allocation);
38 static void gtk_scrolled_window_add                (GtkContainer           *container,
39                                                     GtkWidget              *widget);
40 static void gtk_scrolled_window_remove             (GtkContainer           *container,
41                                                     GtkWidget              *widget);
42 static void gtk_scrolled_window_foreach            (GtkContainer           *container,
43                                                     GtkCallback             callback,
44                                                     gpointer                callback_data);
45 static void gtk_scrolled_window_viewport_allocate  (GtkWidget              *widget,
46                                                     GtkAllocation          *allocation);
47 static void gtk_scrolled_window_adjustment_changed (GtkAdjustment          *adjustment,
48                                                     gpointer                data);
49
50
51 static GtkContainerClass *parent_class = NULL;
52
53
54 guint
55 gtk_scrolled_window_get_type (void)
56 {
57   static guint scrolled_window_type = 0;
58
59   if (!scrolled_window_type)
60     {
61       GtkTypeInfo scrolled_window_info =
62       {
63         "GtkScrolledWindow",
64         sizeof (GtkScrolledWindow),
65         sizeof (GtkScrolledWindowClass),
66         (GtkClassInitFunc) gtk_scrolled_window_class_init,
67         (GtkObjectInitFunc) gtk_scrolled_window_init,
68         /* reserved_1 */ NULL,
69         /* reserved_2 */ NULL,
70         (GtkClassInitFunc) NULL,
71       };
72
73       scrolled_window_type = gtk_type_unique (gtk_container_get_type (), &scrolled_window_info);
74     }
75
76   return scrolled_window_type;
77 }
78
79 static void
80 gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
81 {
82   GtkObjectClass *object_class;
83   GtkWidgetClass *widget_class;
84   GtkContainerClass *container_class;
85
86   object_class = (GtkObjectClass*) class;
87   widget_class = (GtkWidgetClass*) class;
88   container_class = (GtkContainerClass*) class;
89
90   parent_class = gtk_type_class (gtk_container_get_type ());
91
92   object_class->destroy = gtk_scrolled_window_destroy;
93   object_class->finalize = gtk_scrolled_window_finalize;
94
95   widget_class->map = gtk_scrolled_window_map;
96   widget_class->unmap = gtk_scrolled_window_unmap;
97   widget_class->draw = gtk_scrolled_window_draw;
98   widget_class->size_request = gtk_scrolled_window_size_request;
99   widget_class->size_allocate = gtk_scrolled_window_size_allocate;
100
101   container_class->add = gtk_scrolled_window_add;
102   container_class->remove = gtk_scrolled_window_remove;
103   container_class->foreach = gtk_scrolled_window_foreach;
104
105   class->scrollbar_spacing = 5;
106 }
107
108 static void
109 gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
110 {
111   GTK_WIDGET_SET_FLAGS (scrolled_window, GTK_NO_WINDOW);
112
113   gtk_container_set_resize_mode (GTK_CONTAINER (scrolled_window), GTK_RESIZE_QUEUE);
114
115   scrolled_window->hscrollbar = NULL;
116   scrolled_window->vscrollbar = NULL;
117   scrolled_window->hscrollbar_policy = GTK_POLICY_ALWAYS;
118   scrolled_window->vscrollbar_policy = GTK_POLICY_ALWAYS;
119 }
120
121 GtkWidget*
122 gtk_scrolled_window_new (GtkAdjustment *hadjustment,
123                          GtkAdjustment *vadjustment)
124 {
125   GtkWidget *scrolled_window;
126
127   scrolled_window = gtk_type_new (gtk_scrolled_window_get_type ());
128
129   gtk_scrolled_window_construct (GTK_SCROLLED_WINDOW (scrolled_window), hadjustment, vadjustment);
130   
131   return scrolled_window;
132 }
133
134 void
135 gtk_scrolled_window_construct (GtkScrolledWindow *scrolled_window,
136                                GtkAdjustment     *hadjustment,
137                                GtkAdjustment     *vadjustment)
138 {
139   g_return_if_fail (scrolled_window != NULL);
140   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
141   g_return_if_fail (scrolled_window->viewport == NULL);
142
143   scrolled_window->viewport = gtk_viewport_new (hadjustment, vadjustment);
144   hadjustment = gtk_viewport_get_hadjustment (GTK_VIEWPORT (scrolled_window->viewport));
145   vadjustment = gtk_viewport_get_vadjustment (GTK_VIEWPORT (scrolled_window->viewport));
146   gtk_container_set_resize_mode (GTK_CONTAINER (scrolled_window->viewport), GTK_RESIZE_PARENT);
147
148   gtk_signal_connect (GTK_OBJECT (hadjustment), "changed",
149                       (GtkSignalFunc) gtk_scrolled_window_adjustment_changed,
150                       (gpointer) scrolled_window);
151   gtk_signal_connect (GTK_OBJECT (vadjustment), "changed",
152                       (GtkSignalFunc) gtk_scrolled_window_adjustment_changed,
153                       (gpointer) scrolled_window);
154
155   scrolled_window->hscrollbar = gtk_hscrollbar_new (hadjustment);
156   scrolled_window->vscrollbar = gtk_vscrollbar_new (vadjustment);
157
158   gtk_widget_set_parent (scrolled_window->viewport, GTK_WIDGET (scrolled_window));
159   gtk_widget_set_parent (scrolled_window->hscrollbar, GTK_WIDGET (scrolled_window));
160   gtk_widget_set_parent (scrolled_window->vscrollbar, GTK_WIDGET (scrolled_window));
161
162   gtk_widget_show (scrolled_window->viewport);
163   gtk_widget_show (scrolled_window->hscrollbar);
164   gtk_widget_show (scrolled_window->vscrollbar);
165   
166   gtk_widget_ref (scrolled_window->viewport);
167   gtk_widget_ref (scrolled_window->hscrollbar);
168   gtk_widget_ref (scrolled_window->vscrollbar);
169 }
170
171 GtkAdjustment*
172 gtk_scrolled_window_get_hadjustment (GtkScrolledWindow *scrolled_window)
173 {
174   g_return_val_if_fail (scrolled_window != NULL, NULL);
175   g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), NULL);
176
177   return gtk_range_get_adjustment (GTK_RANGE (scrolled_window->hscrollbar));
178 }
179
180 GtkAdjustment*
181 gtk_scrolled_window_get_vadjustment (GtkScrolledWindow *scrolled_window)
182 {
183   g_return_val_if_fail (scrolled_window != NULL, NULL);
184   g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), NULL);
185
186   return gtk_range_get_adjustment (GTK_RANGE (scrolled_window->vscrollbar));
187 }
188
189 void
190 gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
191                                 GtkPolicyType      hscrollbar_policy,
192                                 GtkPolicyType      vscrollbar_policy)
193 {
194   g_return_if_fail (scrolled_window != NULL);
195   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window));
196
197   if ((scrolled_window->hscrollbar_policy != hscrollbar_policy) ||
198       (scrolled_window->vscrollbar_policy != vscrollbar_policy))
199     {
200       scrolled_window->hscrollbar_policy = hscrollbar_policy;
201       scrolled_window->vscrollbar_policy = vscrollbar_policy;
202
203       if (GTK_WIDGET (scrolled_window)->parent)
204         gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
205     }
206 }
207
208
209 static void
210 gtk_scrolled_window_destroy (GtkObject *object)
211 {
212   GtkScrolledWindow *scrolled_window;
213
214   g_return_if_fail (object != NULL);
215   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (object));
216
217   scrolled_window = GTK_SCROLLED_WINDOW (object);
218
219   gtk_widget_destroy (scrolled_window->viewport);
220   gtk_widget_destroy (scrolled_window->hscrollbar);
221   gtk_widget_destroy (scrolled_window->vscrollbar);
222
223   if (GTK_OBJECT_CLASS (parent_class)->destroy)
224     (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
225 }
226
227 static void
228 gtk_scrolled_window_finalize (GtkObject *object)
229 {
230   GtkScrolledWindow *scrolled_window;
231
232   scrolled_window = GTK_SCROLLED_WINDOW (object);
233   gtk_widget_unref (scrolled_window->viewport);
234   gtk_widget_unref (scrolled_window->hscrollbar);
235   gtk_widget_unref (scrolled_window->vscrollbar);
236
237   GTK_OBJECT_CLASS (parent_class)->finalize (object);
238 }
239
240 static void
241 gtk_scrolled_window_map (GtkWidget *widget)
242 {
243   GtkScrolledWindow *scrolled_window;
244
245   g_return_if_fail (widget != NULL);
246   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
247
248   if (!GTK_WIDGET_MAPPED (widget))
249     {
250       GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED);
251       scrolled_window = GTK_SCROLLED_WINDOW (widget);
252
253       if (GTK_WIDGET_VISIBLE (scrolled_window->viewport) &&
254           !GTK_WIDGET_MAPPED (scrolled_window->viewport))
255         gtk_widget_map (scrolled_window->viewport);
256
257       if (GTK_WIDGET_VISIBLE (scrolled_window->hscrollbar) &&
258           !GTK_WIDGET_MAPPED (scrolled_window->hscrollbar))
259         gtk_widget_map (scrolled_window->hscrollbar);
260
261       if (GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar) &&
262           !GTK_WIDGET_MAPPED (scrolled_window->vscrollbar))
263         gtk_widget_map (scrolled_window->vscrollbar);
264     }
265 }
266
267 static void
268 gtk_scrolled_window_unmap (GtkWidget *widget)
269 {
270   GtkScrolledWindow *scrolled_window;
271
272   g_return_if_fail (widget != NULL);
273   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
274
275   if (GTK_WIDGET_MAPPED (widget))
276     {
277       GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED);
278       scrolled_window = GTK_SCROLLED_WINDOW (widget);
279
280       if (GTK_WIDGET_MAPPED (scrolled_window->viewport))
281         gtk_widget_unmap (scrolled_window->viewport);
282
283       if (GTK_WIDGET_MAPPED (scrolled_window->hscrollbar))
284         gtk_widget_unmap (scrolled_window->hscrollbar);
285
286       if (GTK_WIDGET_MAPPED (scrolled_window->vscrollbar))
287         gtk_widget_unmap (scrolled_window->vscrollbar);
288     }
289 }
290
291 static void
292 gtk_scrolled_window_draw (GtkWidget    *widget,
293                           GdkRectangle *area)
294 {
295   GtkScrolledWindow *scrolled_window;
296   GdkRectangle child_area;
297
298   g_return_if_fail (widget != NULL);
299   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
300   g_return_if_fail (area != NULL);
301
302   if (GTK_WIDGET_DRAWABLE (widget))
303     {
304       scrolled_window = GTK_SCROLLED_WINDOW (widget);
305
306       if (gtk_widget_intersect (scrolled_window->viewport, area, &child_area))
307         gtk_widget_draw (scrolled_window->viewport, &child_area);
308
309       if (gtk_widget_intersect (scrolled_window->hscrollbar, area, &child_area))
310         gtk_widget_draw (scrolled_window->hscrollbar, &child_area);
311
312       if (gtk_widget_intersect (scrolled_window->vscrollbar, area, &child_area))
313         gtk_widget_draw (scrolled_window->vscrollbar, &child_area);
314     }
315 }
316
317 static void
318 gtk_scrolled_window_size_request (GtkWidget      *widget,
319                                   GtkRequisition *requisition)
320 {
321   GtkScrolledWindow *scrolled_window;
322   gint extra_height;
323   gint extra_width;
324
325   g_return_if_fail (widget != NULL);
326   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
327   g_return_if_fail (requisition != NULL);
328
329   scrolled_window = GTK_SCROLLED_WINDOW (widget);
330
331   requisition->width = 0;
332   requisition->height = 0;
333
334   if (GTK_WIDGET_VISIBLE (scrolled_window->viewport))
335     {
336       gtk_widget_size_request (scrolled_window->viewport, &scrolled_window->viewport->requisition);
337
338       requisition->width += scrolled_window->viewport->requisition.width;
339       requisition->height += scrolled_window->viewport->requisition.height;
340     }
341
342   extra_width = 0;
343   extra_height = 0;
344
345   if ((scrolled_window->hscrollbar_policy == GTK_POLICY_AUTOMATIC) ||
346       GTK_WIDGET_VISIBLE (scrolled_window->hscrollbar))
347     {
348       gtk_widget_size_request (scrolled_window->hscrollbar,
349                                &scrolled_window->hscrollbar->requisition);
350
351       requisition->width = MAX (requisition->width, scrolled_window->hscrollbar->requisition.width);
352       extra_height = SCROLLBAR_SPACING (scrolled_window) + scrolled_window->hscrollbar->requisition.height;
353     }
354
355   if ((scrolled_window->vscrollbar_policy == GTK_POLICY_AUTOMATIC) ||
356       GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar))
357     {
358       gtk_widget_size_request (scrolled_window->vscrollbar,
359                                &scrolled_window->vscrollbar->requisition);
360
361       requisition->height = MAX (requisition->height, scrolled_window->vscrollbar->requisition.height);
362       extra_width = SCROLLBAR_SPACING (scrolled_window) + scrolled_window->vscrollbar->requisition.width;
363     }
364
365   requisition->width += GTK_CONTAINER (widget)->border_width * 2 + extra_width;
366   requisition->height += GTK_CONTAINER (widget)->border_width * 2 + extra_height;
367 }
368
369 static void
370 gtk_scrolled_window_size_allocate (GtkWidget     *widget,
371                                    GtkAllocation *allocation)
372 {
373   GtkScrolledWindow *scrolled_window;
374   GtkAllocation viewport_allocation;
375   GtkAllocation child_allocation;
376   guint previous_hvis;
377   guint previous_vvis;
378   gint count;
379   
380   g_return_if_fail (widget != NULL);
381   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
382   g_return_if_fail (allocation != NULL);
383
384   scrolled_window = GTK_SCROLLED_WINDOW (widget);
385   widget->allocation = *allocation;
386
387   if (scrolled_window->hscrollbar_policy == GTK_POLICY_ALWAYS)
388     scrolled_window->hscrollbar_visible = TRUE;
389   if (scrolled_window->vscrollbar_policy == GTK_POLICY_ALWAYS)
390     scrolled_window->vscrollbar_visible = TRUE;
391
392   if (GTK_WIDGET_VISIBLE (scrolled_window->viewport))
393     {
394       count = 0;
395
396       do {
397         gtk_scrolled_window_viewport_allocate (widget, &viewport_allocation);
398
399         child_allocation.x = viewport_allocation.x + allocation->x;
400         child_allocation.y = viewport_allocation.y + allocation->y;
401         child_allocation.width = viewport_allocation.width;
402         child_allocation.height = viewport_allocation.height;
403
404         previous_hvis = scrolled_window->hscrollbar_visible;
405         previous_vvis = scrolled_window->vscrollbar_visible;
406
407         gtk_widget_size_allocate (scrolled_window->viewport, &child_allocation);
408         /* If, after the first iteration, the hscrollbar and the
409          * vscrollbar flip visiblity, then we need both.
410          */
411         if ((count++) && 
412             (previous_hvis != scrolled_window->hscrollbar_visible) &&
413             (previous_vvis != scrolled_window->vscrollbar_visible))
414           {
415             scrolled_window->hscrollbar_visible = TRUE;
416             scrolled_window->vscrollbar_visible = TRUE;
417             break;
418           }
419
420         count++;
421       } while ((previous_hvis != scrolled_window->hscrollbar_visible) ||
422                (previous_vvis != scrolled_window->vscrollbar_visible));
423     }
424
425   if (scrolled_window->hscrollbar_visible)
426     {
427       if (!GTK_WIDGET_VISIBLE (scrolled_window->hscrollbar))
428         gtk_widget_show (scrolled_window->hscrollbar);
429
430       child_allocation.x = viewport_allocation.x;
431       child_allocation.y = viewport_allocation.y + viewport_allocation.height + SCROLLBAR_SPACING (scrolled_window);
432       child_allocation.width = viewport_allocation.width;
433       child_allocation.height = scrolled_window->hscrollbar->requisition.height;
434       child_allocation.x += allocation->x;
435       child_allocation.y += allocation->y;
436
437       gtk_widget_size_allocate (scrolled_window->hscrollbar, &child_allocation);
438     }
439   else
440     {
441       if (GTK_WIDGET_VISIBLE (scrolled_window->hscrollbar))
442         gtk_widget_hide (scrolled_window->hscrollbar);
443     }
444
445   if (scrolled_window->vscrollbar_visible)
446     {
447       if (!GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar))
448         gtk_widget_show (scrolled_window->vscrollbar);
449
450       child_allocation.x = viewport_allocation.x + viewport_allocation.width + SCROLLBAR_SPACING (scrolled_window);
451       child_allocation.y = viewport_allocation.y;
452       child_allocation.width = scrolled_window->vscrollbar->requisition.width;
453       child_allocation.height = viewport_allocation.height;
454       child_allocation.x += allocation->x;
455       child_allocation.y += allocation->y;
456
457       gtk_widget_size_allocate (scrolled_window->vscrollbar, &child_allocation);
458     }
459   else
460     {
461       if (GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar))
462         gtk_widget_hide (scrolled_window->vscrollbar);
463     }
464 }
465
466 static void
467 gtk_scrolled_window_add (GtkContainer *container,
468                          GtkWidget    *widget)
469 {
470   GtkScrolledWindow *scrolled_window;
471
472   g_return_if_fail (container != NULL);
473   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
474   g_return_if_fail (widget != NULL);
475
476   scrolled_window = GTK_SCROLLED_WINDOW (container);
477   gtk_container_add (GTK_CONTAINER (scrolled_window->viewport), widget);
478 }
479
480 static void
481 gtk_scrolled_window_remove (GtkContainer *container,
482                             GtkWidget    *widget)
483 {
484   GtkScrolledWindow *scrolled_window;
485
486   g_return_if_fail (container != NULL);
487   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
488   g_return_if_fail (widget != NULL);
489
490   scrolled_window = GTK_SCROLLED_WINDOW (container);
491
492   if (scrolled_window->viewport == widget ||
493       scrolled_window->hscrollbar == widget ||
494       scrolled_window->vscrollbar == widget)
495     {
496       /* this happens during destroy */
497       gtk_widget_unparent (widget);
498     }
499   else
500     gtk_container_remove (GTK_CONTAINER (scrolled_window->viewport), widget);
501 }
502
503 static void
504 gtk_scrolled_window_foreach (GtkContainer *container,
505                              GtkCallback   callback,
506                              gpointer      callback_data)
507 {
508   GtkScrolledWindow *scrolled_window;
509
510   g_return_if_fail (container != NULL);
511   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (container));
512   g_return_if_fail (callback != NULL);
513
514   scrolled_window = GTK_SCROLLED_WINDOW (container);
515
516   if (scrolled_window->viewport)
517     (* callback) (scrolled_window->viewport, callback_data);
518
519   (* callback) (scrolled_window->vscrollbar, callback_data);
520   (* callback) (scrolled_window->hscrollbar, callback_data);
521 }
522
523 static void
524 gtk_scrolled_window_viewport_allocate (GtkWidget     *widget,
525                                        GtkAllocation *allocation)
526 {
527   GtkScrolledWindow *scrolled_window;
528
529   g_return_if_fail (widget != NULL);
530   g_return_if_fail (allocation != NULL);
531
532   scrolled_window = GTK_SCROLLED_WINDOW (widget);
533
534   allocation->x = GTK_CONTAINER (widget)->border_width;
535   allocation->y = GTK_CONTAINER (widget)->border_width;
536   allocation->width = MAX (1, widget->allocation.width - allocation->x * 2);
537   allocation->height = MAX (1, widget->allocation.height - allocation->y * 2);
538
539   if (scrolled_window->vscrollbar_visible)
540     allocation->width = MAX (1,
541       allocation->width - (scrolled_window->vscrollbar->requisition.width + SCROLLBAR_SPACING (scrolled_window)));
542   if (scrolled_window->hscrollbar_visible)
543     allocation->height = MAX (1, 
544       allocation->height - (scrolled_window->hscrollbar->requisition.height + SCROLLBAR_SPACING (scrolled_window)));
545 }
546
547 static void
548 gtk_scrolled_window_adjustment_changed (GtkAdjustment *adjustment,
549                                         gpointer       data)
550 {
551   GtkScrolledWindow *scrolled_win;
552
553   g_return_if_fail (adjustment != NULL);
554   g_return_if_fail (data != NULL);
555
556   scrolled_win = GTK_SCROLLED_WINDOW (data);
557
558   if (adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_win->hscrollbar)))
559     {
560       if (scrolled_win->hscrollbar_policy == GTK_POLICY_AUTOMATIC)
561         {
562           scrolled_win->hscrollbar_visible =
563             ((adjustment->upper - adjustment->lower) > adjustment->page_size);
564         }
565     }
566   else if (adjustment == gtk_range_get_adjustment (GTK_RANGE (scrolled_win->vscrollbar)))
567     {
568       if (scrolled_win->vscrollbar_policy == GTK_POLICY_AUTOMATIC)
569         {
570           scrolled_win->vscrollbar_visible =
571             ((adjustment->upper - adjustment->lower) > adjustment->page_size);
572         }
573     }
574   else
575     {
576       g_warning ("could not determine which adjustment scrollbar received change signal for");
577       return;
578     }
579 }