]> Pileus Git - ~andy/gtk/blob - gtk/gtkadjustment.c
configure.in acheader.h gdk/gdkwindow.c Check for Shape extension both on
[~andy/gtk] / gtk / gtkadjustment.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 "gtkadjustment.h"
20 #include "gtksignal.h"
21
22
23 enum {
24   CHANGED,
25   VALUE_CHANGED,
26   LAST_SIGNAL
27 };
28
29
30 static void gtk_adjustment_class_init (GtkAdjustmentClass *klass);
31 static void gtk_adjustment_init       (GtkAdjustment      *adjustment);
32
33
34 static guint adjustment_signals[LAST_SIGNAL] = { 0 };
35
36
37 GtkType
38 gtk_adjustment_get_type (void)
39 {
40   static GtkType adjustment_type = 0;
41
42   if (!adjustment_type)
43     {
44       GtkTypeInfo adjustment_info =
45       {
46         "GtkAdjustment",
47         sizeof (GtkAdjustment),
48         sizeof (GtkAdjustmentClass),
49         (GtkClassInitFunc) gtk_adjustment_class_init,
50         (GtkObjectInitFunc) gtk_adjustment_init,
51         (GtkArgSetFunc) NULL,
52         (GtkArgGetFunc) NULL,
53       };
54
55       adjustment_type = gtk_type_unique (gtk_data_get_type (), &adjustment_info);
56     }
57
58   return adjustment_type;
59 }
60
61 static void
62 gtk_adjustment_class_init (GtkAdjustmentClass *class)
63 {
64   GtkObjectClass *object_class;
65
66   object_class = (GtkObjectClass*) class;
67
68   adjustment_signals[CHANGED] =
69     gtk_signal_new ("changed",
70                     GTK_RUN_FIRST | GTK_RUN_NO_RECURSE,
71                     object_class->type,
72                     GTK_SIGNAL_OFFSET (GtkAdjustmentClass, changed),
73                     gtk_signal_default_marshaller,
74                     GTK_TYPE_NONE, 0);
75   adjustment_signals[VALUE_CHANGED] =
76     gtk_signal_new ("value_changed",
77                     GTK_RUN_FIRST | GTK_RUN_NO_RECURSE,
78                     object_class->type,
79                     GTK_SIGNAL_OFFSET (GtkAdjustmentClass, value_changed),
80                     gtk_signal_default_marshaller,
81                     GTK_TYPE_NONE, 0);
82
83   gtk_object_class_add_signals (object_class, adjustment_signals, LAST_SIGNAL);
84
85   class->changed = NULL;
86   class->value_changed = NULL;
87 }
88
89 static void
90 gtk_adjustment_init (GtkAdjustment *adjustment)
91 {
92   adjustment->value = 0.0;
93   adjustment->lower = 0.0;
94   adjustment->upper = 0.0;
95   adjustment->step_increment = 0.0;
96   adjustment->page_increment = 0.0;
97   adjustment->page_size = 0.0;
98 }
99
100 GtkObject*
101 gtk_adjustment_new (gfloat value,
102                     gfloat lower,
103                     gfloat upper,
104                     gfloat step_increment,
105                     gfloat page_increment,
106                     gfloat page_size)
107 {
108   GtkAdjustment *adjustment;
109
110   adjustment = gtk_type_new (gtk_adjustment_get_type ());
111
112   adjustment->value = value;
113   adjustment->lower = lower;
114   adjustment->upper = upper;
115   adjustment->step_increment = step_increment;
116   adjustment->page_increment = page_increment;
117   adjustment->page_size = page_size;
118
119   return GTK_OBJECT (adjustment);
120 }
121
122 void
123 gtk_adjustment_set_value (GtkAdjustment        *adjustment,
124                           gfloat                value)
125 {
126   g_return_if_fail (adjustment != NULL);
127   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
128
129   value = CLAMP (value, adjustment->lower, adjustment->upper);
130
131   if (value != adjustment->value)
132     {
133       adjustment->value = value;
134
135       gtk_adjustment_value_changed (adjustment);
136     }
137 }
138
139 void
140 gtk_adjustment_changed (GtkAdjustment        *adjustment)
141 {
142   g_return_if_fail (adjustment != NULL);
143   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
144
145   gtk_signal_emit (GTK_OBJECT (adjustment), adjustment_signals[CHANGED]);
146 }
147
148 void
149 gtk_adjustment_value_changed (GtkAdjustment        *adjustment)
150 {
151   g_return_if_fail (adjustment != NULL);
152   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
153
154   gtk_signal_emit (GTK_OBJECT (adjustment), adjustment_signals[VALUE_CHANGED]);
155 }
156
157 void
158 gtk_adjustment_clamp_page (GtkAdjustment *adjustment,
159                            gfloat         lower,
160                            gfloat         upper)
161 {
162   gint need_emission;
163
164   g_return_if_fail (adjustment != NULL);
165   g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
166
167   lower = CLAMP (lower, adjustment->lower, adjustment->upper);
168   upper = CLAMP (upper, adjustment->lower, adjustment->upper);
169
170   need_emission = FALSE;
171
172   if (adjustment->value + adjustment->page_size < upper)
173     {
174       adjustment->value = upper - adjustment->page_size;
175       need_emission = TRUE;
176     }
177   if (adjustment->value > lower)
178     {
179       adjustment->value = lower;
180       need_emission = TRUE;
181     }
182
183   if (need_emission)
184     gtk_adjustment_value_changed (adjustment);
185 }