]> Pileus Git - ~andy/gtk/blob - gtk/a11y/gtkscalebuttonaccessible.c
Change FSF Address
[~andy/gtk] / gtk / a11y / gtkscalebuttonaccessible.c
1 /* GAIL - The GNOME Accessibility Implementation Library
2  * Copyright 2008 Jan Arne Petersen
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser 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  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
16  */
17
18 #include <config.h>
19
20 #include <gtk/gtk.h>
21 #include "gtkscalebuttonaccessible.h"
22
23 #include <string.h>
24
25
26 static void atk_action_interface_init (AtkActionIface *iface);
27 static void atk_value_interface_init  (AtkValueIface  *iface);
28
29 G_DEFINE_TYPE_WITH_CODE (GtkScaleButtonAccessible, _gtk_scale_button_accessible, GTK_TYPE_BUTTON_ACCESSIBLE,
30                          G_IMPLEMENT_INTERFACE (ATK_TYPE_ACTION, atk_action_interface_init)
31                          G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE, atk_value_interface_init));
32
33 static void
34 gtk_scale_button_accessible_value_changed (GtkAdjustment *adjustment,
35                                            gpointer       data)
36 {
37   g_object_notify (G_OBJECT (data), "accessible-value");
38 }
39
40 static void
41 gtk_scale_button_accessible_initialize (AtkObject *obj,
42                                         gpointer   data)
43 {
44   GtkAdjustment *adjustment;
45
46   ATK_OBJECT_CLASS (_gtk_scale_button_accessible_parent_class)->initialize (obj, data);
47
48   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (data));
49   if (adjustment)
50     g_signal_connect (adjustment,
51                       "value-changed",
52                       G_CALLBACK (gtk_scale_button_accessible_value_changed),
53                       obj);
54
55   obj->role = ATK_ROLE_SLIDER;
56 }
57
58 static void
59 gtk_scale_button_accessible_notify_gtk (GObject    *obj,
60                                         GParamSpec *pspec)
61 {
62   GtkScaleButton *scale_button;
63   GtkScaleButtonAccessible *accessible;
64
65   scale_button = GTK_SCALE_BUTTON (obj);
66   accessible = GTK_SCALE_BUTTON_ACCESSIBLE (gtk_widget_get_accessible (GTK_WIDGET (scale_button)));
67
68   if (strcmp (pspec->name, "adjustment") == 0)
69     {
70       GtkAdjustment* adjustment;
71
72       adjustment = gtk_scale_button_get_adjustment (scale_button);
73       g_signal_connect (adjustment,
74                         "value-changed",
75                         G_CALLBACK (gtk_scale_button_accessible_value_changed),
76                         accessible);
77     }
78   else
79     {
80       GTK_WIDGET_ACCESSIBLE_CLASS (_gtk_scale_button_accessible_parent_class)->notify_gtk (obj, pspec);
81     }
82 }
83
84 static void
85 _gtk_scale_button_accessible_class_init (GtkScaleButtonAccessibleClass *klass)
86 {
87   AtkObjectClass *atk_object_class = ATK_OBJECT_CLASS (klass);
88   GtkWidgetAccessibleClass *widget_class = GTK_WIDGET_ACCESSIBLE_CLASS (klass);
89
90   atk_object_class->initialize = gtk_scale_button_accessible_initialize;
91
92   widget_class->notify_gtk = gtk_scale_button_accessible_notify_gtk;
93 }
94
95 static void
96 _gtk_scale_button_accessible_init (GtkScaleButtonAccessible *button)
97 {
98 }
99
100 static gboolean
101 gtk_scale_button_accessible_do_action (AtkAction *action,
102                                        gint       i)
103 {
104   GtkWidget *widget;
105
106   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (action));
107   if (widget == NULL)
108     return FALSE;
109
110   if (!gtk_widget_is_sensitive (widget) || !gtk_widget_get_visible (widget))
111     return FALSE;
112
113   switch (i)
114     {
115     case 0:
116       g_signal_emit_by_name (widget, "popup");
117       return TRUE;
118     case 1:
119       g_signal_emit_by_name (widget, "popdown");
120       return TRUE;
121     default:
122       return FALSE;
123     }
124 }
125
126 static gint
127 gtk_scale_button_accessible_get_n_actions (AtkAction *action)
128 {
129   return 2;
130 }
131
132 static const gchar *
133 gtk_scale_button_accessible_get_description (AtkAction *action,
134                                              gint       i)
135 {
136   return NULL;
137 }
138
139 static const gchar *
140 gtk_scale_button_accessible_action_get_name (AtkAction *action,
141                                              gint       i)
142 {
143   switch (i)
144     {
145     case 0:
146       return "popup";
147     case 1:
148       return "popdown";
149     default:
150       return NULL;
151     }
152 }
153
154 static void
155 atk_action_interface_init (AtkActionIface *iface)
156 {
157   iface->do_action = gtk_scale_button_accessible_do_action;
158   iface->get_n_actions = gtk_scale_button_accessible_get_n_actions;
159   iface->get_description = gtk_scale_button_accessible_get_description;
160   iface->get_name = gtk_scale_button_accessible_action_get_name;
161 }
162
163 static void
164 gtk_scale_button_accessible_get_current_value (AtkValue *obj,
165                                                GValue   *value)
166 {
167   GtkWidget *widget;
168   GtkAdjustment *adjustment;
169
170   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
171   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
172   if (adjustment == NULL)
173     return;
174
175   memset (value,  0, sizeof (GValue));
176   g_value_init (value, G_TYPE_DOUBLE);
177   g_value_set_double (value, gtk_adjustment_get_value (adjustment));
178 }
179
180 static void
181 gtk_scale_button_accessible_get_maximum_value (AtkValue *obj,
182                                                GValue   *value)
183 {
184   GtkWidget *widget;
185   GtkAdjustment *adjustment;
186
187   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
188   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
189   if (adjustment == NULL)
190     return;
191
192   memset (value,  0, sizeof (GValue));
193   g_value_init (value, G_TYPE_DOUBLE);
194   g_value_set_double (value, gtk_adjustment_get_upper (adjustment));
195 }
196
197 static void
198 gtk_scale_button_accessible_get_minimum_value (AtkValue *obj,
199                                                GValue   *value)
200 {
201   GtkWidget *widget;
202   GtkAdjustment *adjustment;
203
204   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
205   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
206   if (adjustment == NULL)
207     return;
208
209   memset (value,  0, sizeof (GValue));
210   g_value_init (value, G_TYPE_DOUBLE);
211   g_value_set_double (value, gtk_adjustment_get_lower (adjustment));
212 }
213
214 static void
215 gtk_scale_button_accessible_get_minimum_increment (AtkValue *obj,
216                                                    GValue   *value)
217 {
218   GtkWidget *widget;
219   GtkAdjustment *adjustment;
220
221   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
222   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
223   if (adjustment == NULL)
224     return;
225
226   memset (value,  0, sizeof (GValue));
227   g_value_init (value, G_TYPE_DOUBLE);
228   g_value_set_double (value, gtk_adjustment_get_minimum_increment (adjustment));
229 }
230
231 static gboolean
232 gtk_scale_button_accessible_set_current_value (AtkValue     *obj,
233                                                const GValue *value)
234 {
235   GtkWidget *widget;
236   GtkAdjustment *adjustment;
237
238   widget = gtk_accessible_get_widget (GTK_ACCESSIBLE (obj));
239   adjustment = gtk_scale_button_get_adjustment (GTK_SCALE_BUTTON (widget));
240   if (adjustment == NULL)
241     return FALSE;
242
243   gtk_adjustment_set_value (adjustment, g_value_get_double (value));
244
245   return TRUE;
246 }
247
248 static void
249 atk_value_interface_init (AtkValueIface *iface)
250 {
251   iface->get_current_value = gtk_scale_button_accessible_get_current_value;
252   iface->get_maximum_value = gtk_scale_button_accessible_get_maximum_value;
253   iface->get_minimum_value = gtk_scale_button_accessible_get_minimum_value;
254   iface->get_minimum_increment = gtk_scale_button_accessible_get_minimum_increment;
255   iface->set_current_value = gtk_scale_button_accessible_set_current_value;
256 }