]> pilppa.org Git - familiar-h63xx-build.git/blob - org.handhelds.familiar/packages/gtk+/gtk+-2.6.4-1.osso7/gtkrc.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 / gtkrc.c.diff
1 --- gtk+-2.6.4/gtk/gtkrc.c      2005-02-01 20:07:40.000000000 +0200
2 +++ gtk+-2.6.4/gtk/gtkrc.c      2005-04-06 16:19:37.848784472 +0300
3 @@ -56,6 +56,7 @@
4  #include "gtkprivate.h"
5  #include "gtksettings.h"
6  #include "gtkwindow.h"
7 +#include "gtkhashtable.h"
8  
9  #ifdef G_OS_WIN32
10  #include <io.h>
11 @@ -105,6 +106,14 @@
12    GtkStyle *default_style;
13  };
14  
15 +#define GTK_RC_STYLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RC_STYLE, GtkRcStylePrivate))
16 +
17 +typedef struct _GtkRcStylePrivate GtkRcStylePrivate;
18 +
19 +struct _GtkRcStylePrivate {
20 +  GSList *logical_color_hashes;
21 +};
22 +
23  static GtkRcContext *gtk_rc_context_get              (GtkSettings     *settings);
24  
25  static guint       gtk_rc_style_hash                 (const gchar     *name);
26 @@ -179,6 +188,13 @@
27                                                       GScanner        *scanner,
28                                                        GtkRcStyle      *rc_style,
29                                                        GtkIconFactory  *factory);
30 +static guint       gtk_rc_parse_logical_color        (GScanner        *scanner,
31 +                                                              GtkRcStyle      *rc_style,
32 +                                                             GtkHashTable    *hash);
33 +static guint       gtk_rc_parse_color_full           (GScanner        *scanner,
34 +                                                             GdkColor        *color,
35 +                                                             GtkRcStyle      *style);
36 +
37  static void        gtk_rc_clear_hash_node            (gpointer         key,
38                                                        gpointer         data,
39                                                        gpointer         user_data);
40 @@ -277,7 +293,8 @@
41    { "stock", GTK_RC_TOKEN_STOCK },
42    { "im_module_file", GTK_RC_TOKEN_IM_MODULE_FILE },
43    { "LTR", GTK_RC_TOKEN_LTR },
44 -  { "RTL", GTK_RC_TOKEN_RTL }
45 +  { "RTL", GTK_RC_TOKEN_RTL },
46 +  { "logical_color", GTK_RC_TOKEN_LOGICAL_COLOR }
47  };
48  
49  static GHashTable *realized_style_ht = NULL;
50 @@ -954,6 +971,7 @@
51  static void
52  gtk_rc_style_init (GtkRcStyle *style)
53  {
54 +  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (style);
55    guint i;
56  
57    style->name = NULL;
58 @@ -976,6 +994,7 @@
59  
60    style->rc_style_lists = NULL;
61    style->icon_factories = NULL;
62 +  priv->logical_color_hashes = NULL;
63  }
64  
65  static void
66 @@ -991,6 +1010,21 @@
67    klass->create_rc_style = gtk_rc_style_real_create_rc_style;
68    klass->merge = gtk_rc_style_real_merge;
69    klass->create_style = gtk_rc_style_real_create_style;
70 +
71 +  g_type_class_add_private (object_class, sizeof (GtkRcStylePrivate));
72 +}
73 +
74 +static void
75 +free_object_list (GSList *list)
76 +{
77 +  GSList *tmp_list = list;
78 +  while (tmp_list)
79 +    {
80 +      g_object_unref (tmp_list->data);
81 +      tmp_list = tmp_list->next;
82 +    }
83 +  g_slist_free (list);
84 +  
85  }
86  
87  static void
88 @@ -998,9 +1032,11 @@
89  {
90    GSList *tmp_list1, *tmp_list2;
91    GtkRcStyle *rc_style;
92 +  GtkRcStylePrivate *rc_priv;
93    gint i;
94  
95    rc_style = GTK_RC_STYLE (object);
96 +  rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
97    
98    if (rc_style->name)
99      g_free (rc_style->name);
100 @@ -1059,13 +1095,8 @@
101        rc_style->rc_properties = NULL;
102      }
103  
104 -  tmp_list1 = rc_style->icon_factories;
105 -  while (tmp_list1)
106 -    {
107 -      g_object_unref (tmp_list1->data);
108 -      tmp_list1 = tmp_list1->next;
109 -    }
110 -  g_slist_free (rc_style->icon_factories);
111 +  free_object_list (rc_style->icon_factories);
112 +  free_object_list (rc_priv->logical_color_hashes);
113    
114    G_OBJECT_CLASS (parent_class)->finalize (object);
115  }
116 @@ -1125,6 +1156,14 @@
117    return g_object_new (G_OBJECT_TYPE (style), NULL);
118  }
119  
120 +GSList *
121 +_gtk_rc_style_get_logical_color_hashes (GtkRcStyle *rc_style)
122 +{
123 +  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
124 +
125 +  return priv->logical_color_hashes;
126 +}
127 +
128  static gint
129  gtk_rc_properties_cmp (gconstpointer bsearch_node1,
130                        gconstpointer bsearch_node2)
131 @@ -1499,6 +1538,22 @@
132        context->rc_files = NULL;
133  
134        gtk_rc_parse_default_files (context);
135 +/*Hildon- Swapped these sections of code, so the styles from the
136 +  XSettings theme are available when parsing with gtk_rc_context_parse_string*/
137 +      g_free (context->theme_name);
138 +      g_free (context->key_theme_name);
139 +
140 +      g_object_get (context->settings,
141 +                   "gtk-theme-name", &context->theme_name,
142 +                   "gtk-key-theme-name", &context->key_theme_name,
143 +                   NULL);
144 +
145 +      if (context->theme_name && context->theme_name[0])
146 +       gtk_rc_parse_named (context, context->theme_name, NULL);
147 +      if (context->key_theme_name && context->key_theme_name[0])
148 +       gtk_rc_parse_named (context, context->key_theme_name, "key");
149
150 +/*****/
151  
152        tmp_list = global_rc_files;
153        while (tmp_list)
154 @@ -1512,19 +1567,6 @@
155  
156           tmp_list = tmp_list->next;
157         }
158 -
159 -      g_free (context->theme_name);
160 -      g_free (context->key_theme_name);
161 -
162 -      g_object_get (context->settings,
163 -                   "gtk-theme-name", &context->theme_name,
164 -                   "gtk-key-theme-name", &context->key_theme_name,
165 -                   NULL);
166 -
167 -      if (context->theme_name && context->theme_name[0])
168 -       gtk_rc_parse_named (context, context->theme_name, NULL);
169 -      if (context->key_theme_name && context->key_theme_name[0])
170 -       gtk_rc_parse_named (context, context->key_theme_name, "key");
171        
172        g_object_thaw_notify (G_OBJECT (context->settings));
173  
174 @@ -1905,10 +1947,19 @@
175  {
176    GScanner *scanner;
177    guint           i;
178 +  gchar    *name_str;
179    gboolean done;
180  
181    scanner = gtk_rc_scanner_new ();
182    
183 +  if (input_name != NULL)
184 +    {
185 +      name_str = (gchar *) g_malloc(strlen(input_name) + 7);
186 +      sprintf(name_str, "%s.cache", input_name);
187 +      /*osso_g_scanner_cache_open (scanner, name_str);*/
188 +      g_free(name_str);
189 +    }
190 +  
191    if (input_fd >= 0)
192      {
193        g_assert (input_string == NULL);
194 @@ -2062,6 +2113,29 @@
195    return style;
196  }
197  
198 +static GSList *
199 +concat_object_lists (GSList *list_a, GSList *list_b)
200 +{
201 +  GSList *copy;
202 +  
203 +  copy = g_slist_copy (list_b);
204 +  if (copy)
205 +    {
206 +      GSList *iter;
207 +              
208 +      iter = copy;
209 +      while (iter != NULL)
210 +        {
211 +          g_object_ref (iter->data);
212 +          iter = g_slist_next (iter);
213 +        }
214 +
215 +      return g_slist_concat (list_a, copy);
216 +    }
217 +  else
218 +    return list_a;
219 +}
220 +
221  /* Reuses or frees rc_styles */
222  static GtkStyle *
223  gtk_rc_init_style (GtkRcContext *context,
224 @@ -2083,6 +2157,7 @@
225        GtkRcStyle *base_style = NULL;
226        GtkRcStyle *proto_style;
227        GtkRcStyleClass *proto_style_class;
228 +      GtkRcStylePrivate *proto_priv;
229        GSList *tmp_styles;
230        GType rc_style_type = GTK_TYPE_RC_STYLE;
231  
232 @@ -2109,12 +2184,13 @@
233        
234        proto_style_class = GTK_RC_STYLE_GET_CLASS (base_style);
235        proto_style = proto_style_class->create_rc_style (base_style);
236 +      proto_priv = GTK_RC_STYLE_GET_PRIVATE (proto_style);
237        
238        tmp_styles = rc_styles;
239        while (tmp_styles)
240         {
241           GtkRcStyle *rc_style = tmp_styles->data;
242 -          GSList *factories;
243 +         GtkRcStylePrivate *rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
244            
245           proto_style_class->merge (proto_style, rc_style);       
246            
247 @@ -2122,22 +2198,12 @@
248           if (!g_slist_find (rc_style->rc_style_lists, rc_styles))
249             rc_style->rc_style_lists = g_slist_prepend (rc_style->rc_style_lists, rc_styles);
250  
251 -          factories = g_slist_copy (rc_style->icon_factories);
252 -          if (factories)
253 -            {
254 -              GSList *iter;
255 -              
256 -              iter = factories;
257 -              while (iter != NULL)
258 -                {
259 -                  g_object_ref (iter->data);
260 -                  iter = g_slist_next (iter);
261 -                }
262 -
263 -              proto_style->icon_factories = g_slist_concat (proto_style->icon_factories,
264 -                                                            factories);
265 -
266 -            }
267 +          proto_style->icon_factories =
268 +                concat_object_lists (proto_style->icon_factories,
269 +                                     rc_style->icon_factories);
270 +         proto_priv->logical_color_hashes =
271 +                concat_object_lists (proto_priv->logical_color_hashes,
272 +                                     rc_priv->logical_color_hashes);
273            
274           tmp_styles = tmp_styles->next;
275         }
276 @@ -2515,9 +2581,11 @@
277    GtkRcStyle *rc_style;
278    GtkRcStyle *orig_style;
279    GtkRcStyle *parent_style;
280 +  GtkRcStylePrivate *rc_priv = NULL;
281    guint token;
282    gint i;
283    GtkIconFactory *our_factory = NULL;
284 +  GtkHashTable *our_hash = NULL;
285    
286    token = g_scanner_get_next_token (scanner);
287    if (token != GTK_RC_TOKEN_STYLE)
288 @@ -2533,12 +2601,6 @@
289    else
290      orig_style = NULL;
291  
292 -  /* If there's a list, its first member is always the factory belonging
293 -   * to this RcStyle
294 -   */
295 -  if (rc_style && rc_style->icon_factories)
296 -    our_factory = rc_style->icon_factories->data;
297 -  
298    if (!rc_style)
299      {
300        rc_style = gtk_rc_style_new ();
301 @@ -2550,6 +2612,16 @@
302        for (i = 0; i < 5; i++)
303         rc_style->color_flags[i] = 0;
304      }
305 +  
306 +  rc_priv = GTK_RC_STYLE_GET_PRIVATE (rc_style);
307 +
308 +  /* If there's a list, its first member is always the factory belonging
309 +   * to this RcStyle
310 +   */
311 +  if (rc_style->icon_factories)
312 +    our_factory = rc_style->icon_factories->data;
313 +  if (rc_priv->logical_color_hashes)
314 +    our_hash = rc_priv->logical_color_hashes->data;
315  
316    token = g_scanner_peek_next_token (scanner);
317    if (token == G_TOKEN_EQUAL_SIGN)
318 @@ -2566,8 +2638,8 @@
319        parent_style = gtk_rc_style_find (context, scanner->value.v_string);
320        if (parent_style)
321         {
322 -          GSList *factories;
323 -          
324 +         GtkRcStylePrivate *parent_priv = GTK_RC_STYLE_GET_PRIVATE (parent_style); 
325 +
326           for (i = 0; i < 5; i++)
327             {
328               rc_style->color_flags[i] = parent_style->color_flags[i];
329 @@ -2621,17 +2693,24 @@
330                    rc_style->icon_factories = g_slist_prepend (rc_style->icon_factories,
331                                                                our_factory);
332                  }
333 -              
334 -              rc_style->icon_factories = g_slist_concat (rc_style->icon_factories,
335 -                                                         g_slist_copy (parent_style->icon_factories));
336 -              
337 -              factories = parent_style->icon_factories;
338 -              while (factories != NULL)
339 +              rc_style->icon_factories = concat_object_lists (rc_style->icon_factories,
340 +                                                              parent_style->icon_factories);
341 +            }
342 +
343 +         /* Also append parent's color hashes, adding a ref to them */
344 +          if (parent_priv->logical_color_hashes != NULL)
345 +            {
346 +             /* See comment above .. */
347 +              if (our_hash == NULL)
348                  {
349 -                  g_object_ref (factories->data);
350 -                  factories = factories->next;
351 +                  our_hash = _gtk_hash_table_new ();
352 +                  rc_priv->logical_color_hashes = g_slist_prepend (rc_priv->logical_color_hashes,
353 +                                                                    our_hash);
354                  }
355 -            }
356 +               
357 +              rc_priv->logical_color_hashes = concat_object_lists (rc_priv->logical_color_hashes,
358 +                                                                    parent_priv->logical_color_hashes);           
359 +          }
360         }
361      }
362    
363 @@ -2689,12 +2768,22 @@
364              }
365            token = gtk_rc_parse_stock (context, scanner, rc_style, our_factory);
366            break;
367 +    case GTK_RC_TOKEN_LOGICAL_COLOR:
368 +         if (our_hash == NULL)
369 +           {
370 +             our_hash = _gtk_hash_table_new ();
371 +             rc_priv->logical_color_hashes = g_slist_prepend (rc_priv->logical_color_hashes,
372 +                                                               our_hash);
373 +           }
374 +         token = gtk_rc_parse_logical_color (scanner, rc_style, our_hash);
375 +         break;
376         case G_TOKEN_IDENTIFIER:
377           if (is_c_identifier (scanner->next_value.v_identifier) &&
378               scanner->next_value.v_identifier[0] >= 'A' &&
379               scanner->next_value.v_identifier[0] <= 'Z') /* match namespaced type names */
380             {
381               GtkRcProperty prop = { 0, 0, NULL, { 0, }, };
382 +              gchar *name;
383               
384               g_scanner_get_next_token (scanner); /* eat type name */
385               prop.type_name = g_quark_from_string (scanner->value.v_identifier);
386 @@ -2712,8 +2801,10 @@
387                 }
388  
389               /* it's important that we do the same canonification as GParamSpecPool here */
390 -             g_strcanon (scanner->value.v_identifier, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-');
391 -             prop.property_name = g_quark_from_string (scanner->value.v_identifier);
392 +              name = g_strdup (scanner->value.v_identifier);
393 +              g_strcanon (name, G_CSET_A_2_Z G_CSET_a_2_z G_CSET_DIGITS "-", '-');
394 +              prop.property_name = g_quark_from_string (name);
395 +              g_free (name);
396  
397               token = gtk_rc_parse_assignment (scanner, &prop);
398               if (token == G_TOKEN_NONE)
399 @@ -2825,7 +2916,7 @@
400      return G_TOKEN_EQUAL_SIGN;
401  
402    style->color_flags[state] |= GTK_RC_BG;
403 -  return gtk_rc_parse_color (scanner, &style->bg[state]);
404 +  return gtk_rc_parse_color_full (scanner, &style->bg[state], style);
405  }
406  
407  static guint
408 @@ -2848,7 +2939,7 @@
409      return G_TOKEN_EQUAL_SIGN;
410    
411    style->color_flags[state] |= GTK_RC_FG;
412 -  return gtk_rc_parse_color (scanner, &style->fg[state]);
413 +  return gtk_rc_parse_color_full (scanner, &style->fg[state], style);
414  }
415  
416  static guint
417 @@ -2871,7 +2962,7 @@
418      return G_TOKEN_EQUAL_SIGN;
419    
420    style->color_flags[state] |= GTK_RC_TEXT;
421 -  return gtk_rc_parse_color (scanner, &style->text[state]);
422 +  return gtk_rc_parse_color_full (scanner, &style->text[state], style);
423  }
424  
425  static guint
426 @@ -2894,7 +2985,7 @@
427      return G_TOKEN_EQUAL_SIGN;
428  
429    style->color_flags[state] |= GTK_RC_BASE;
430 -  return gtk_rc_parse_color (scanner, &style->base[state]);
431 +  return gtk_rc_parse_color_full (scanner, &style->base[state], style);
432  }
433  
434  static guint
435 @@ -3345,11 +3436,45 @@
436  
437    return G_TOKEN_NONE;
438  }
439 +static gboolean
440 +lookup_logical_color (GtkRcStyle *style,
441 +                     const char *color_name,
442 +                     GdkColor   *color)
443 +{
444 +  GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (style);
445 +  GSList *iter;
446 +
447 +  iter = priv->logical_color_hashes;
448 +  while (iter != NULL)
449 +    {
450 +      GdkColor *match = g_hash_table_lookup (GTK_HASH_TABLE (iter->data)->hash,
451 +                                            color_name);
452 +      if (match)
453 +       {
454 +         color->red = match->red;
455 +         color->green = match->green;
456 +         color->blue = match->blue;
457 +         return TRUE;
458 +        }
459 +
460 +      iter = g_slist_next (iter);
461 +    }
462 +
463 +  return FALSE;
464 +}
465  
466  guint
467  gtk_rc_parse_color (GScanner *scanner,
468                     GdkColor *color)
469  {
470 +    return gtk_rc_parse_color_full (scanner, color, NULL);
471 +}
472 +
473 +static guint
474 +gtk_rc_parse_color_full (GScanner *scanner,
475 +                        GdkColor *color,
476 +                        GtkRcStyle *style)
477 +{
478    guint token;
479  
480    g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
481 @@ -3407,11 +3532,14 @@
482      case G_TOKEN_STRING:
483        if (!gdk_color_parse (scanner->value.v_string, color))
484         {
485 -         g_scanner_warn (scanner, "Invalid color constant '%s'",
486 -                         scanner->value.v_string);
487 -         return G_TOKEN_STRING;
488 +         if (!(style && lookup_logical_color (style, scanner->value.v_string, color)))
489 +           {
490 +             g_scanner_warn (scanner, "Invalid color constant '%s'",
491 +                             scanner->value.v_string);
492 +             return G_TOKEN_STRING;
493 +           }
494         }
495 -      else
496 +
497         return G_TOKEN_NONE;
498        
499      default:
500 @@ -3625,8 +3753,8 @@
501  }
502  
503  static guint
504 -gtk_rc_parse_stock_id (GScanner         *scanner,
505 -                       gchar    **stock_id)
506 +gtk_rc_parse_hash_key (GScanner *scanner,
507 +                       gchar    **hash_key)
508  {
509    guint token;
510    
511 @@ -3639,12 +3767,12 @@
512    if (token != G_TOKEN_STRING)
513      return G_TOKEN_STRING;
514    
515 -  *stock_id = g_strdup (scanner->value.v_string);
516 +  *hash_key = g_strdup (scanner->value.v_string);
517    
518    token = g_scanner_get_next_token (scanner);
519    if (token != G_TOKEN_RIGHT_BRACE)
520      {
521 -      g_free (*stock_id);
522 +      g_free (*hash_key);
523        return G_TOKEN_RIGHT_BRACE;
524      }
525    
526 @@ -3854,7 +3982,7 @@
527    if (token != GTK_RC_TOKEN_STOCK)
528      return GTK_RC_TOKEN_STOCK;
529    
530 -  token = gtk_rc_parse_stock_id (scanner, &stock_id);
531 +  token = gtk_rc_parse_hash_key (scanner, &stock_id);
532    if (token != G_TOKEN_NONE)
533      return token;
534    
535 @@ -3965,3 +4093,46 @@
536  }
537  
538  #endif
539 +
540 +static guint
541 +gtk_rc_parse_logical_color (GScanner     *scanner,
542 +               GtkRcStyle   *rc_style,
543 +               GtkHashTable *hash)
544 +{
545 +       gchar *color_id = NULL;
546 +       guint token;
547 +       GdkColor *color;
548 +
549 +       token = g_scanner_get_next_token (scanner);
550 +       if (token != GTK_RC_TOKEN_LOGICAL_COLOR)
551 +               return GTK_RC_TOKEN_LOGICAL_COLOR;
552 +
553 +       token = gtk_rc_parse_hash_key (scanner, &color_id);
554 +       if (token != G_TOKEN_NONE)
555 +               return token;
556 +
557 +       token = g_scanner_get_next_token (scanner);
558 +       if (token != G_TOKEN_EQUAL_SIGN)
559 +       {
560 +               g_free (color_id);
561 +               return G_TOKEN_EQUAL_SIGN;
562 +       }
563 +
564 +       color = g_new (GdkColor, 1);
565 +       token = gtk_rc_parse_color_full (scanner, color, rc_style);
566 +       if (token != G_TOKEN_NONE)
567 +       {
568 +               g_free (color_id);
569 +               g_free (color);
570 +               return token;
571 +       }
572 +
573 +       /* Because the hash is created with destroy functions,
574 +        * g_hash_table_insert will free any old values for us,
575 +        * if a mapping with the specified key already exists. */
576 +       g_hash_table_insert (hash->hash, color_id, color);
577 +
578 +       return G_TOKEN_NONE;
579 +}
580 +
581 +