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