diff options
Diffstat (limited to 'meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff')
-rw-r--r-- | meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff | 451 |
1 files changed, 451 insertions, 0 deletions
diff --git a/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff new file mode 100644 index 0000000000..39ecdf209b --- /dev/null +++ b/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff | |||
@@ -0,0 +1,451 @@ | |||
1 | --- gtk+-2.6.4/gtk/gtkdialog.c 2005-01-20 21:52:15.000000000 +0200 | ||
2 | +++ gtk+-2.6.4/gtk/gtkdialog.c 2005-04-06 16:19:36.416002288 +0300 | ||
3 | @@ -24,6 +24,9 @@ | ||
4 | * GTK+ at ftp://ftp.gtk.org/pub/gtk/. | ||
5 | */ | ||
6 | |||
7 | +/* Modified for Nokia Oyj during 2002-2003. See CHANGES file for list | ||
8 | + * of changes. | ||
9 | + */ | ||
10 | #include <config.h> | ||
11 | #include "gtkalias.h" | ||
12 | #include "gtkbutton.h" | ||
13 | @@ -37,11 +40,14 @@ | ||
14 | #include "gtkmain.h" | ||
15 | #include "gtkintl.h" | ||
16 | #include "gtkbindings.h" | ||
17 | +#include "gtkalignment.h" | ||
18 | |||
19 | #define GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_DIALOG, GtkDialogPrivate)) | ||
20 | |||
21 | typedef struct { | ||
22 | guint ignore_separator : 1; | ||
23 | + GtkWidget *first; | ||
24 | + GtkWidget *last; | ||
25 | } GtkDialogPrivate; | ||
26 | |||
27 | typedef struct _ResponseData ResponseData; | ||
28 | @@ -77,7 +83,18 @@ | ||
29 | static void gtk_dialog_close (GtkDialog *dialog); | ||
30 | |||
31 | static ResponseData* get_response_data (GtkWidget *widget, | ||
32 | - gboolean create); | ||
33 | + gboolean create); | ||
34 | + | ||
35 | +static gboolean gtk_dialog_handle_focus (GtkWidget *widget, | ||
36 | + GtkDirectionType dir, | ||
37 | + gpointer user_data); | ||
38 | + | ||
39 | +static gboolean gtk_dialog_move_to_next_active_button (GList *iter, | ||
40 | + gboolean forward); | ||
41 | + | ||
42 | +static GtkWidget *gtk_dialog_get_first_sensitive (GList *list); | ||
43 | +static GtkWidget *gtk_dialog_get_last_sensitive (GList *list); | ||
44 | + | ||
45 | |||
46 | enum { | ||
47 | PROP_0, | ||
48 | @@ -195,6 +212,23 @@ | ||
49 | 5, | ||
50 | G_PARAM_READABLE)); | ||
51 | |||
52 | + gtk_widget_class_install_style_property (widget_class, | ||
53 | + g_param_spec_int ("extended_left_border", | ||
54 | + _("Content area extra left border"), | ||
55 | + _("Width of extra left border around the main dialog area"), | ||
56 | + 0, | ||
57 | + G_MAXINT, | ||
58 | + 0, | ||
59 | + G_PARAM_READABLE)); | ||
60 | + gtk_widget_class_install_style_property (widget_class, | ||
61 | + g_param_spec_int ("extended_right_border", | ||
62 | + _("Content area extra right border"), | ||
63 | + _("Width of extra right border around the main dialog area"), | ||
64 | + 0, | ||
65 | + G_MAXINT, | ||
66 | + 0, | ||
67 | + G_PARAM_READABLE)); | ||
68 | + | ||
69 | binding_set = gtk_binding_set_by_class (class); | ||
70 | |||
71 | gtk_binding_entry_add_signal (binding_set, GDK_Escape, 0, | ||
72 | @@ -205,9 +239,15 @@ | ||
73 | update_spacings (GtkDialog *dialog) | ||
74 | { | ||
75 | GtkWidget *widget; | ||
76 | + GtkWidget *hbox; | ||
77 | + GtkWidget *left_padding; | ||
78 | + GtkWidget *right_padding; | ||
79 | gint content_area_border; | ||
80 | gint button_spacing; | ||
81 | gint action_area_border; | ||
82 | + | ||
83 | + gint extended_left_border; | ||
84 | + gint extended_right_border; | ||
85 | |||
86 | widget = GTK_WIDGET (dialog); | ||
87 | |||
88 | @@ -218,6 +258,10 @@ | ||
89 | &button_spacing, | ||
90 | "action_area_border", | ||
91 | &action_area_border, | ||
92 | + "extended_left_border", | ||
93 | + &extended_left_border, | ||
94 | + "extended_right_border", | ||
95 | + &extended_right_border, | ||
96 | NULL); | ||
97 | |||
98 | gtk_container_set_border_width (GTK_CONTAINER (dialog->vbox), | ||
99 | @@ -226,12 +270,36 @@ | ||
100 | button_spacing); | ||
101 | gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), | ||
102 | action_area_border); | ||
103 | + | ||
104 | + if ((extended_left_border == 0) && (extended_right_border == 0)) | ||
105 | + /* no extended borders, so we are done */ | ||
106 | + return; | ||
107 | + | ||
108 | + /* extended borders are in use, so reconstruct dialog */ | ||
109 | + hbox = gtk_hbox_new(FALSE, 0); | ||
110 | + left_padding = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); | ||
111 | + right_padding = gtk_alignment_new(0.0, 0.0, 0.0, 0.0); | ||
112 | + gtk_widget_set_size_request(left_padding, extended_left_border, 0); | ||
113 | + gtk_widget_set_size_request(right_padding, extended_right_border, 0); | ||
114 | + | ||
115 | + gtk_widget_ref(dialog->vbox); | ||
116 | + gtk_container_remove(GTK_CONTAINER(dialog), dialog->vbox); | ||
117 | + gtk_container_add(GTK_CONTAINER(hbox), left_padding); | ||
118 | + gtk_container_add(GTK_CONTAINER(hbox), dialog->vbox); | ||
119 | + gtk_container_add(GTK_CONTAINER(hbox), right_padding); | ||
120 | + gtk_container_add(GTK_CONTAINER(dialog), hbox); | ||
121 | + gtk_widget_unref(dialog->vbox); | ||
122 | + | ||
123 | + gtk_widget_show(left_padding); | ||
124 | + gtk_widget_show(right_padding); | ||
125 | + gtk_widget_show(hbox); | ||
126 | } | ||
127 | |||
128 | static void | ||
129 | gtk_dialog_init (GtkDialog *dialog) | ||
130 | { | ||
131 | GtkDialogPrivate *priv; | ||
132 | + GtkWidget *alignment; | ||
133 | |||
134 | priv = GET_PRIVATE (dialog); | ||
135 | priv->ignore_separator = FALSE; | ||
136 | @@ -250,14 +318,23 @@ | ||
137 | gtk_container_add (GTK_CONTAINER (dialog), dialog->vbox); | ||
138 | gtk_widget_show (dialog->vbox); | ||
139 | |||
140 | + /* Hildon : Here we add an alignment widget to gtk because | ||
141 | + * we want that the dialog buttons are all centered. */ | ||
142 | + alignment = gtk_alignment_new (0.5, 0.5, 0, 0); | ||
143 | + gtk_box_pack_end (GTK_BOX (dialog->vbox), alignment, FALSE, TRUE, 0); | ||
144 | + | ||
145 | dialog->action_area = gtk_hbutton_box_new (); | ||
146 | |||
147 | gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog->action_area), | ||
148 | GTK_BUTTONBOX_END); | ||
149 | |||
150 | - gtk_box_pack_end (GTK_BOX (dialog->vbox), dialog->action_area, | ||
151 | - FALSE, TRUE, 0); | ||
152 | + /* we need add-signal to allocate correct area for childs */ | ||
153 | + gtk_container_add (GTK_CONTAINER (alignment), dialog->action_area); | ||
154 | + /* gtk_box_pack_end (GTK_BOX (dialog->vbox), dialog->action_area, | ||
155 | + FALSE, TRUE, 0); */ | ||
156 | + | ||
157 | gtk_widget_show (dialog->action_area); | ||
158 | + gtk_widget_show (alignment); | ||
159 | |||
160 | dialog->separator = gtk_hseparator_new (); | ||
161 | gtk_box_pack_end (GTK_BOX (dialog->vbox), dialog->separator, FALSE, TRUE, 0); | ||
162 | @@ -616,9 +693,15 @@ | ||
163 | else | ||
164 | g_warning ("Only 'activatable' widgets can be packed into the action area of a GtkDialog"); | ||
165 | |||
166 | + gtk_container_add(GTK_CONTAINER(dialog->action_area), child); | ||
167 | +/* | ||
168 | gtk_box_pack_end (GTK_BOX (dialog->action_area), | ||
169 | child, | ||
170 | FALSE, TRUE, 0); | ||
171 | +*/ | ||
172 | + | ||
173 | + g_signal_connect (child, "focus", | ||
174 | + (GCallback)gtk_dialog_handle_focus, (gpointer)dialog); | ||
175 | |||
176 | if (response_id == GTK_RESPONSE_HELP) | ||
177 | gtk_button_box_set_child_secondary (GTK_BUTTON_BOX (dialog->action_area), child, TRUE); | ||
178 | @@ -637,7 +720,7 @@ | ||
179 | * you don't need it. | ||
180 | * | ||
181 | * Return value: the button widget that was added | ||
182 | - **/ | ||
183 | + **/ /*ROK*/ | ||
184 | GtkWidget* | ||
185 | gtk_dialog_add_button (GtkDialog *dialog, | ||
186 | const gchar *button_text, | ||
187 | @@ -653,7 +736,10 @@ | ||
188 | GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT); | ||
189 | |||
190 | gtk_widget_show (button); | ||
191 | - | ||
192 | + | ||
193 | + g_signal_connect (button, "focus", | ||
194 | + (GCallback)gtk_dialog_handle_focus, | ||
195 | + (gpointer)dialog); | ||
196 | gtk_dialog_add_action_widget (dialog, | ||
197 | button, | ||
198 | response_id); | ||
199 | @@ -990,6 +1076,8 @@ | ||
200 | gulong unmap_handler; | ||
201 | gulong destroy_handler; | ||
202 | gulong delete_handler; | ||
203 | + GtkDialogPrivate *priv; | ||
204 | + GList *list = NULL; | ||
205 | |||
206 | g_return_val_if_fail (GTK_IS_DIALOG (dialog), -1); | ||
207 | |||
208 | @@ -1001,6 +1089,27 @@ | ||
209 | |||
210 | if (!GTK_WIDGET_VISIBLE (dialog)) | ||
211 | gtk_widget_show (GTK_WIDGET (dialog)); | ||
212 | + | ||
213 | + priv = GET_PRIVATE (dialog); | ||
214 | + list = gtk_container_get_children (GTK_CONTAINER (dialog->vbox)); | ||
215 | + priv->first = gtk_dialog_get_first_sensitive (list); | ||
216 | + priv->last = gtk_dialog_get_last_sensitive (list); | ||
217 | + | ||
218 | + if (priv->first) | ||
219 | + { | ||
220 | + g_signal_connect (priv->first, "focus", | ||
221 | + (GCallback)gtk_dialog_handle_focus, | ||
222 | + (gpointer)dialog); | ||
223 | + } | ||
224 | + | ||
225 | + if (priv->last) | ||
226 | + { | ||
227 | + g_signal_connect (priv->last, "focus", | ||
228 | + (GCallback)gtk_dialog_handle_focus, | ||
229 | + (gpointer)dialog); | ||
230 | + } | ||
231 | + | ||
232 | + g_list_free (list); | ||
233 | |||
234 | response_handler = | ||
235 | g_signal_connect (dialog, | ||
236 | @@ -1236,4 +1345,215 @@ | ||
237 | gtk_box_reorder_child (GTK_BOX (dialog->action_area), child, position); | ||
238 | } | ||
239 | } | ||
240 | +static gboolean | ||
241 | +gtk_dialog_handle_focus (GtkWidget *widget, | ||
242 | + GtkDirectionType dir, | ||
243 | + gpointer user_data) | ||
244 | + { | ||
245 | + GtkDialog *dialog = NULL; | ||
246 | + GList *list = NULL; | ||
247 | + GList *iter = NULL; | ||
248 | + gint i = 0; | ||
249 | + gint list_length = 0; | ||
250 | + gboolean ret_val = FALSE; | ||
251 | + GtkDialogPrivate *priv; | ||
252 | + | ||
253 | + dialog = GTK_DIALOG(user_data); | ||
254 | + list = gtk_container_get_children (GTK_CONTAINER( | ||
255 | + GTK_DIALOG(user_data)->action_area)); | ||
256 | + iter = list; | ||
257 | + priv = GET_PRIVATE (dialog); | ||
258 | + | ||
259 | + if (GTK_WIDGET_HAS_FOCUS (widget)) | ||
260 | + if (widget == priv->first) | ||
261 | + { | ||
262 | + if (dir == GTK_DIR_UP) | ||
263 | + { | ||
264 | + ret_val = gtk_dialog_move_to_next_active_button (g_list_last (list), | ||
265 | + FALSE); | ||
266 | + } | ||
267 | + else if (dir == GTK_DIR_DOWN && priv->first == priv->last) | ||
268 | + ret_val = gtk_dialog_move_to_next_active_button (list, TRUE); | ||
269 | + else if (dir == GTK_DIR_DOWN) | ||
270 | + { | ||
271 | + } | ||
272 | + } | ||
273 | + else if (widget == priv->last) | ||
274 | + { | ||
275 | + if (dir == GTK_DIR_DOWN) | ||
276 | + { | ||
277 | + ret_val = gtk_dialog_move_to_next_active_button (list, TRUE); | ||
278 | + } | ||
279 | + else if (dir == GTK_DIR_UP) | ||
280 | + { | ||
281 | + } | ||
282 | + } | ||
283 | + else | ||
284 | + { | ||
285 | + list_length = g_list_length(list); | ||
286 | + while (iter != NULL) | ||
287 | + { | ||
288 | + ++i; | ||
289 | + if (iter->data == widget) | ||
290 | + { | ||
291 | + switch (dir) { | ||
292 | + case GTK_DIR_UP: | ||
293 | + /* If in the first item -> the default works like it should */ | ||
294 | + | ||
295 | + if (i > 1) | ||
296 | + { | ||
297 | + /* If not in the first button, but in the first active | ||
298 | + * button, the default should do, else handle movement | ||
299 | + * by yourself | ||
300 | + */ | ||
301 | + ret_val = gtk_dialog_move_to_next_active_button ( | ||
302 | + g_list_previous (iter), | ||
303 | + FALSE); | ||
304 | + } | ||
305 | + else | ||
306 | + { | ||
307 | + /* gtk_widget_grab_focus (priv->last);*/ | ||
308 | + g_signal_emit_by_name (dialog, "move-focus", | ||
309 | + GTK_DIR_TAB_BACKWARD); | ||
310 | + ret_val = TRUE; | ||
311 | + } | ||
312 | + break; | ||
313 | + | ||
314 | + /* If in the last item:jump to top, else select previous button */ | ||
315 | + case GTK_DIR_DOWN: | ||
316 | + if (i < list_length) | ||
317 | + { | ||
318 | + ret_val = gtk_dialog_move_to_next_active_button ( | ||
319 | + g_list_next (iter), | ||
320 | + TRUE); | ||
321 | + if (!ret_val) | ||
322 | + { | ||
323 | + g_signal_emit_by_name (dialog, "move-focus", | ||
324 | + GTK_DIR_TAB_FORWARD); | ||
325 | + ret_val = TRUE; | ||
326 | + } | ||
327 | + } | ||
328 | + else | ||
329 | + { | ||
330 | + g_signal_emit_by_name (dialog, "move-focus", | ||
331 | + GTK_DIR_TAB_FORWARD); | ||
332 | + ret_val = TRUE; | ||
333 | + } | ||
334 | + break; | ||
335 | + | ||
336 | + case GTK_DIR_TAB_BACKWARD: | ||
337 | + case GTK_DIR_TAB_FORWARD: | ||
338 | + case GTK_DIR_LEFT: | ||
339 | + case GTK_DIR_RIGHT: | ||
340 | + default: | ||
341 | + break; | ||
342 | + } | ||
343 | + break; | ||
344 | + } | ||
345 | + iter = g_list_next(iter); | ||
346 | + } | ||
347 | + } | ||
348 | + | ||
349 | + g_list_free (list); | ||
350 | + | ||
351 | + return ret_val; | ||
352 | + } | ||
353 | +static gboolean | ||
354 | +gtk_dialog_move_to_next_active_button (GList *iter, gboolean forward) | ||
355 | +{ | ||
356 | + gboolean active; | ||
357 | + gboolean visible; | ||
358 | + | ||
359 | + while (iter) | ||
360 | + { | ||
361 | + g_object_get (G_OBJECT (iter->data), "sensitive", &active, NULL); | ||
362 | + g_object_get (G_OBJECT (iter->data), "visible", &visible, NULL); | ||
363 | + if (active && visible) | ||
364 | + { | ||
365 | + gtk_widget_grab_focus (GTK_WIDGET (iter->data)); | ||
366 | + return TRUE; | ||
367 | + } | ||
368 | + | ||
369 | + if (forward) | ||
370 | + iter = g_list_next (iter); | ||
371 | + else | ||
372 | + iter = g_list_previous (iter); | ||
373 | + } | ||
374 | + | ||
375 | + return FALSE; | ||
376 | +} | ||
377 | +static GtkWidget* | ||
378 | +gtk_dialog_get_first_sensitive (GList *list) | ||
379 | +{ | ||
380 | + GList *sublist = NULL; | ||
381 | + GList *iter = NULL; | ||
382 | + GtkWidget *widget = NULL; | ||
383 | + gboolean active; | ||
384 | + gboolean visible; | ||
385 | + while (list) | ||
386 | + { | ||
387 | + widget = GTK_WIDGET (list->data); | ||
388 | + if (GTK_IS_CONTAINER (widget)) | ||
389 | + { | ||
390 | + sublist = gtk_container_get_children (GTK_CONTAINER(widget)); | ||
391 | + widget = gtk_dialog_get_first_sensitive (sublist); | ||
392 | + g_list_free (sublist); | ||
393 | + sublist = NULL; | ||
394 | + | ||
395 | + if (widget) | ||
396 | + return widget; | ||
397 | + } | ||
398 | + else | ||
399 | + { | ||
400 | + g_object_get (G_OBJECT (widget), "sensitive", &active, NULL); | ||
401 | + g_object_get (G_OBJECT (widget), "visible", &visible, NULL); | ||
402 | + if (active && visible && GTK_WIDGET_CAN_FOCUS (widget)) | ||
403 | + return widget; | ||
404 | + } | ||
405 | + | ||
406 | + list = g_list_next (list); | ||
407 | + } | ||
408 | + | ||
409 | + return NULL; | ||
410 | +} | ||
411 | + | ||
412 | +static GtkWidget* | ||
413 | +gtk_dialog_get_last_sensitive (GList *list) | ||
414 | +{ | ||
415 | + GList *sublist = NULL; | ||
416 | + GtkWidget *widget = NULL; | ||
417 | + gboolean active; | ||
418 | + gboolean visible; | ||
419 | + | ||
420 | + list = g_list_last (list); | ||
421 | + if (list && list->prev != NULL) | ||
422 | + list = g_list_previous (list); | ||
423 | + | ||
424 | + while (list) | ||
425 | + { | ||
426 | + widget = GTK_WIDGET (list->data); | ||
427 | + if (GTK_IS_CONTAINER (widget)) | ||
428 | + { | ||
429 | + sublist = gtk_container_get_children (GTK_CONTAINER(widget)); | ||
430 | + widget = gtk_dialog_get_last_sensitive (sublist); | ||
431 | + g_list_free (sublist); | ||
432 | + sublist = NULL; | ||
433 | + | ||
434 | + if (widget) | ||
435 | + return widget; | ||
436 | + } | ||
437 | + else | ||
438 | + { | ||
439 | + g_object_get (G_OBJECT (widget), "sensitive", &active, NULL); | ||
440 | + g_object_get (G_OBJECT (widget), "visible", &visible, NULL); | ||
441 | + if (active && visible && GTK_WIDGET_CAN_FOCUS (widget)) | ||
442 | + return widget; | ||
443 | + } | ||
444 | + | ||
445 | + list = g_list_previous (list); | ||
446 | + } | ||
447 | + | ||
448 | + return NULL; | ||
449 | +} | ||
450 | + | ||
451 | |||