summaryrefslogtreecommitdiffstats
path: root/meta/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff
diff options
context:
space:
mode:
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.diff451
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