]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/gtk+/gtk+-2.6.4-1.osso7/gtkdialog.c.diff
OE tree imported from monotone branch org.openembedded.oz354fam083 at revision 8b12e3...
[familiar-h63xx-build.git] / org.handhelds.familiar / packages / gtk+ / gtk+-2.6.4-1.osso7 / gtkdialog.c.diff
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