1 /* Murrine theme engine
2 * Copyright (C) 2006-2007-2008-2009 Andrea Cimitan
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library 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 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 *
19 */
20
21 #include "murrine_style.h"
22 #include "murrine_rc_style.h"
23
24 #include "animation.h"
25
26 #ifdef HAVE_ANIMATION
27 static void murrine_rc_style_finalize (GObject *object);
28 #endif
29 static GtkStyle *murrine_rc_style_create_style (GtkRcStyle *rc_style);
30 static guint murrine_rc_style_parse (GtkRcStyle *rc_style,
31 GtkSettings *settings,
32 GScanner *scanner);
33 static void murrine_rc_style_merge (GtkRcStyle *dest,
34 GtkRcStyle *src);
35
36 enum
37 {
38 TOKEN_ANIMATION = G_TOKEN_LAST + 1,
39 TOKEN_ARROWSTYLE,
40 TOKEN_BORDER_COLORS,
41 TOKEN_BORDER_SHADES,
42 TOKEN_COLORIZE_SCROLLBAR,
43 TOKEN_CELLSTYLE,
44 TOKEN_COMBOBOXSTYLE,
45 TOKEN_CONTRAST,
46 TOKEN_DEFAULT_BUTTON_COLOR,
47 TOKEN_EXPANDERSTYLE,
48 TOKEN_FOCUS_COLOR,
49 TOKEN_FOCUSSTYLE,
50 TOKEN_GLAZESTYLE,
51 TOKEN_GLOW_SHADE,
52 TOKEN_GLOWSTYLE,
53 TOKEN_GRADIENT_COLORS,
54 TOKEN_GRADIENT_SHADES,
55 TOKEN_HANDLESTYLE,
56 TOKEN_HIGHLIGHT_SHADE,
57 TOKEN_LIGHTBORDER_SHADE,
58 TOKEN_LIGHTBORDERSTYLE,
59 TOKEN_LISTVIEWHEADERSTYLE,
60 TOKEN_LISTVIEWSTYLE,
61 TOKEN_MENUBARITEMSTYLE,
62 TOKEN_MENUBARSTYLE,
63 TOKEN_MENUITEMSTYLE,
64 TOKEN_MENUSTYLE,
65 TOKEN_PRELIGHT_SHADE,
66 TOKEN_PROGRESSBARSTYLE,
67 TOKEN_RELIEFSTYLE,
68 TOKEN_RGBA,
69 TOKEN_ROUNDNESS,
70 TOKEN_SCROLLBARSTYLE,
71 TOKEN_SEPARATORSTYLE,
72 TOKEN_SHADOW_SHADES,
73 TOKEN_SLIDERSTYLE,
74 TOKEN_SPINBUTTONSTYLE,
75 TOKEN_STEPPERSTYLE,
76 TOKEN_TEXTSTYLE,
77 TOKEN_TEXT_SHADE,
78 TOKEN_TOOLBARSTYLE,
79 TOKEN_TROUGH_BORDER_SHADES,
80 TOKEN_TROUGH_SHADES,
81
82 TOKEN_TRUE,
83 TOKEN_FALSE,
84
85 /* stuff to ignore */
86 TOKEN_GRADIENTS,
87 TOKEN_HILIGHT_RATIO,
88 TOKEN_HIGHLIGHT_RATIO,
89 TOKEN_LIGHTBORDER_RATIO,
90 TOKEN_PROFILE,
91 TOKEN_SCROLLBAR_COLOR,
92 TOKEN_SQUAREDSTYLE,
93 TOKEN_STYLE
94 };
95
96 static struct
97 {
98 const gchar *name;
99 guint token;
100 }
101 theme_symbols[] =
102 {
103 { "animation", TOKEN_ANIMATION },
104 { "arrowstyle", TOKEN_ARROWSTYLE },
105 { "border_colors", TOKEN_BORDER_COLORS },
106 { "border_shades", TOKEN_BORDER_SHADES },
107 { "colorize_scrollbar", TOKEN_COLORIZE_SCROLLBAR },
108 { "cellstyle", TOKEN_CELLSTYLE },
109 { "comboboxstyle", TOKEN_COMBOBOXSTYLE },
110 { "contrast", TOKEN_CONTRAST },
111 { "default_button_color", TOKEN_DEFAULT_BUTTON_COLOR },
112 { "expanderstyle", TOKEN_EXPANDERSTYLE },
113 { "focus_color", TOKEN_FOCUS_COLOR },
114 { "focusstyle", TOKEN_FOCUSSTYLE },
115 { "glazestyle", TOKEN_GLAZESTYLE },
116 { "glow_shade", TOKEN_GLOW_SHADE },
117 { "glowstyle", TOKEN_GLOWSTYLE },
118 { "gradient_colors", TOKEN_GRADIENT_COLORS },
119 { "gradient_shades", TOKEN_GRADIENT_SHADES },
120 { "handlestyle", TOKEN_HANDLESTYLE },
121 { "highlight_shade", TOKEN_HIGHLIGHT_SHADE },
122 { "lightborder_shade", TOKEN_LIGHTBORDER_SHADE },
123 { "lightborderstyle", TOKEN_LIGHTBORDERSTYLE },
124 { "listviewheaderstyle", TOKEN_LISTVIEWHEADERSTYLE },
125 { "listviewstyle", TOKEN_LISTVIEWSTYLE },
126 { "menubaritemstyle", TOKEN_MENUBARITEMSTYLE },
127 { "menubarstyle", TOKEN_MENUBARSTYLE },
128 { "menuitemstyle", TOKEN_MENUITEMSTYLE },
129 { "menustyle", TOKEN_MENUSTYLE },
130 { "prelight_shade", TOKEN_PRELIGHT_SHADE },
131 { "progressbarstyle", TOKEN_PROGRESSBARSTYLE },
132 { "reliefstyle", TOKEN_RELIEFSTYLE },
133 { "rgba", TOKEN_RGBA },
134 { "roundness", TOKEN_ROUNDNESS },
135 { "scrollbarstyle", TOKEN_SCROLLBARSTYLE },
136 { "separatorstyle", TOKEN_SEPARATORSTYLE },
137 { "shadow_shades", TOKEN_SHADOW_SHADES },
138 { "sliderstyle", TOKEN_SLIDERSTYLE },
139 { "spinbuttonstyle", TOKEN_SPINBUTTONSTYLE },
140 { "stepperstyle", TOKEN_STEPPERSTYLE },
141 { "textstyle", TOKEN_TEXTSTYLE },
142 { "text_shade", TOKEN_TEXT_SHADE },
143 { "toolbarstyle", TOKEN_TOOLBARSTYLE },
144 { "trough_border_shades", TOKEN_TROUGH_BORDER_SHADES },
145 { "trough_shades", TOKEN_TROUGH_SHADES },
146
147 { "TRUE", TOKEN_TRUE },
148 { "FALSE", TOKEN_FALSE },
149
150 /* stuff to ignore */
151 { "gradients", TOKEN_GRADIENTS },
152 { "hilight_ratio", TOKEN_HILIGHT_RATIO },
153 { "highlight_ratio", TOKEN_HIGHLIGHT_RATIO },
154 { "lightborder_ratio", TOKEN_LIGHTBORDER_RATIO },
155 { "profile", TOKEN_PROFILE },
156 { "scrollbar_color", TOKEN_SCROLLBAR_COLOR },
157 { "squaredstyle", TOKEN_SQUAREDSTYLE },
158 { "style", TOKEN_STYLE }
159 };
160
G_DEFINE_DYNAMIC_TYPE(MurrineRcStyle,murrine_rc_style,GTK_TYPE_RC_STYLE)161 G_DEFINE_DYNAMIC_TYPE (MurrineRcStyle, murrine_rc_style, GTK_TYPE_RC_STYLE)
162
163 void
164 murrine_rc_style_register_types (GTypeModule *module)
165 {
166 murrine_rc_style_register_type (module);
167 }
168
169 static void
murrine_rc_style_init(MurrineRcStyle * murrine_rc)170 murrine_rc_style_init (MurrineRcStyle *murrine_rc)
171 {
172 murrine_rc->flags = 0;
173
174 murrine_rc->animation = FALSE;
175 murrine_rc->arrowstyle = 0;
176 murrine_rc->border_shades[0] = 1.0;
177 murrine_rc->border_shades[1] = 1.0;
178 murrine_rc->cellstyle = 1;
179 murrine_rc->colorize_scrollbar = TRUE;
180 murrine_rc->comboboxstyle = 0;
181 murrine_rc->contrast = 1.0;
182 murrine_rc->expanderstyle = 0;
183 murrine_rc->focusstyle = 2;
184 murrine_rc->has_border_colors = FALSE;
185 murrine_rc->has_default_button_color = FALSE;
186 murrine_rc->has_gradient_colors = FALSE;
187 murrine_rc->handlestyle = 0;
188 murrine_rc->glazestyle = 1;
189 murrine_rc->glow_shade = 1.0;
190 murrine_rc->glowstyle = 0;
191 murrine_rc->gradient_shades[0] = 1.1;
192 murrine_rc->gradient_shades[1] = 1.0;
193 murrine_rc->gradient_shades[2] = 1.0;
194 murrine_rc->gradient_shades[3] = 1.1;
195 murrine_rc->highlight_shade = 1.1;
196 murrine_rc->lightborder_shade = 1.1;
197 murrine_rc->lightborderstyle = 0;
198 murrine_rc->listviewheaderstyle = 1;
199 murrine_rc->listviewstyle = 0;
200 murrine_rc->menubaritemstyle = 0;
201 murrine_rc->menubarstyle = 0;
202 murrine_rc->menuitemstyle = 1;
203 murrine_rc->menustyle = 1;
204 murrine_rc->prelight_shade = 1.04;
205 murrine_rc->progressbarstyle = 1;
206 murrine_rc->reliefstyle = 2;
207 murrine_rc->rgba = FALSE;
208 murrine_rc->roundness = 1;
209 murrine_rc->scrollbarstyle = 0;
210 murrine_rc->separatorstyle = 0;
211 murrine_rc->shadow_shades[0] = 1.0;
212 murrine_rc->shadow_shades[1] = 1.0;
213 murrine_rc->sliderstyle = 0;
214 murrine_rc->spinbuttonstyle = 0;
215 murrine_rc->stepperstyle = 0;
216 murrine_rc->textstyle = 0;
217 murrine_rc->text_shade = 1.12;
218 murrine_rc->toolbarstyle = 0;
219 murrine_rc->trough_border_shades[0] = 1.0;
220 murrine_rc->trough_border_shades[1] = 1.0;
221 murrine_rc->trough_shades[0] = 1.0;
222 murrine_rc->trough_shades[1] = 1.0;
223 }
224
225 #ifdef HAVE_ANIMATION
226 static void
murrine_rc_style_finalize(GObject * object)227 murrine_rc_style_finalize (GObject *object)
228 {
229 /* cleanup all the animation stuff */
230 murrine_animation_cleanup ();
231
232 if (G_OBJECT_CLASS (murrine_rc_style_parent_class)->finalize != NULL)
233 G_OBJECT_CLASS (murrine_rc_style_parent_class)->finalize(object);
234 }
235 #endif
236
237
238 static void
murrine_rc_style_class_init(MurrineRcStyleClass * klass)239 murrine_rc_style_class_init (MurrineRcStyleClass *klass)
240 {
241 GtkRcStyleClass *rc_style_class = GTK_RC_STYLE_CLASS (klass);
242 #ifdef HAVE_ANIMATION
243 GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
244 #endif
245
246 rc_style_class->parse = murrine_rc_style_parse;
247 rc_style_class->create_style = murrine_rc_style_create_style;
248 rc_style_class->merge = murrine_rc_style_merge;
249
250 #ifdef HAVE_ANIMATION
251 g_object_class->finalize = murrine_rc_style_finalize;
252 #endif
253 }
254
255 static void
murrine_rc_style_class_finalize(MurrineRcStyleClass * klass)256 murrine_rc_style_class_finalize (MurrineRcStyleClass *klass)
257 {
258 }
259
260 static guint
theme_parse_boolean(GtkSettings * settings,GScanner * scanner,gboolean * retval)261 theme_parse_boolean (GtkSettings *settings,
262 GScanner *scanner,
263 gboolean *retval)
264 {
265 guint token;
266
267 /* Skip 'ANIMATION' */
268 token = g_scanner_get_next_token(scanner);
269
270 token = g_scanner_get_next_token(scanner);
271 if (token != G_TOKEN_EQUAL_SIGN)
272 return G_TOKEN_EQUAL_SIGN;
273
274 token = g_scanner_get_next_token(scanner);
275 if (token == TOKEN_TRUE)
276 *retval = TRUE;
277 else if (token == TOKEN_FALSE)
278 *retval = FALSE;
279 else
280 return TOKEN_TRUE;
281
282 return G_TOKEN_NONE;
283 }
284
285 static guint
theme_parse_color(GtkSettings * settings,GScanner * scanner,GtkRcStyle * style,GdkColor * color)286 theme_parse_color (GtkSettings *settings,
287 GScanner *scanner,
288 GtkRcStyle *style,
289 GdkColor *color)
290 {
291 guint token;
292
293 /* Skip 'blah_color' */
294 token = g_scanner_get_next_token(scanner);
295
296 token = g_scanner_get_next_token(scanner);
297 if (token != G_TOKEN_EQUAL_SIGN)
298 return G_TOKEN_EQUAL_SIGN;
299
300 return gtk_rc_parse_color_full (scanner, style, color);
301 }
302
303 static guint
murrine_gtk2_rc_parse_dummy_color(GtkSettings * settings,GScanner * scanner,gchar * name,GtkRcStyle * style,GdkColor * color)304 murrine_gtk2_rc_parse_dummy_color (GtkSettings *settings,
305 GScanner *scanner,
306 gchar *name,
307 GtkRcStyle *style,
308 GdkColor *color)
309 {
310 guint token;
311
312 /* Skip option */
313 token = g_scanner_get_next_token (scanner);
314
315 /* print a warning. Isn't there a way to get the string from the scanner? */
316 g_scanner_warn (scanner, "Murrine configuration option \"%s\" is no longer supported and will be ignored.", name);
317
318 /* equal sign */
319 /* Skip 'blah_color' */
320 token = g_scanner_get_next_token(scanner);
321 if (token != G_TOKEN_EQUAL_SIGN)
322 return G_TOKEN_EQUAL_SIGN;
323
324 return gtk_rc_parse_color_full (scanner, style, color);
325 }
326
327 static guint
theme_parse_shade(GtkSettings * settings,GScanner * scanner,double * ratio)328 theme_parse_shade (GtkSettings *settings,
329 GScanner *scanner,
330 double *ratio)
331 {
332 guint token;
333
334 /* Skip 'ratio' */
335 token = g_scanner_get_next_token(scanner);
336
337 token = g_scanner_get_next_token(scanner);
338 if (token != G_TOKEN_EQUAL_SIGN)
339 return G_TOKEN_EQUAL_SIGN;
340
341 token = g_scanner_get_next_token(scanner);
342 if (token != G_TOKEN_FLOAT)
343 return G_TOKEN_FLOAT;
344
345 *ratio = scanner->value.v_float;
346
347 return G_TOKEN_NONE;
348 }
349
350 static guint
theme_parse_int(GtkSettings * settings,GScanner * scanner,guint8 * style)351 theme_parse_int (GtkSettings *settings,
352 GScanner *scanner,
353 guint8 *style)
354 {
355 guint token;
356
357 /* Skip '*style' */
358 token = g_scanner_get_next_token(scanner);
359
360 token = g_scanner_get_next_token(scanner);
361 if (token != G_TOKEN_EQUAL_SIGN)
362 return G_TOKEN_EQUAL_SIGN;
363
364 token = g_scanner_get_next_token(scanner);
365 if (token != G_TOKEN_INT)
366 return G_TOKEN_INT;
367
368 *style = scanner->value.v_int;
369
370 return G_TOKEN_NONE;
371 }
372
373 static guint
theme_parse_gradient(GtkSettings * settings,GScanner * scanner,double gradient_shades[4])374 theme_parse_gradient (GtkSettings *settings,
375 GScanner *scanner,
376 double gradient_shades[4])
377 {
378 guint token;
379
380 /* Skip 'blah_border' */
381 token = g_scanner_get_next_token(scanner);
382
383 token = g_scanner_get_next_token(scanner);
384 if (token != G_TOKEN_EQUAL_SIGN)
385 return G_TOKEN_EQUAL_SIGN;
386
387 token = g_scanner_get_next_token(scanner);
388 if (token != G_TOKEN_LEFT_CURLY)
389 return G_TOKEN_LEFT_CURLY;
390
391 token = g_scanner_get_next_token(scanner);
392 if (token != G_TOKEN_FLOAT)
393 return G_TOKEN_FLOAT;
394 gradient_shades[0] = scanner->value.v_float;
395 token = g_scanner_get_next_token(scanner);
396 if (token != G_TOKEN_COMMA)
397 return G_TOKEN_COMMA;
398
399 token = g_scanner_get_next_token(scanner);
400 if (token != G_TOKEN_FLOAT)
401 return G_TOKEN_FLOAT;
402 gradient_shades[1] = scanner->value.v_float;
403 token = g_scanner_get_next_token(scanner);
404 if (token != G_TOKEN_COMMA)
405 return G_TOKEN_COMMA;
406
407 token = g_scanner_get_next_token(scanner);
408 if (token != G_TOKEN_FLOAT)
409 return G_TOKEN_FLOAT;
410 gradient_shades[2] = scanner->value.v_float;
411 token = g_scanner_get_next_token(scanner);
412 if (token != G_TOKEN_COMMA)
413 return G_TOKEN_COMMA;
414
415 token = g_scanner_get_next_token(scanner);
416 if (token != G_TOKEN_FLOAT)
417 return G_TOKEN_FLOAT;
418 gradient_shades[3] = scanner->value.v_float;
419
420 token = g_scanner_get_next_token(scanner);
421 if (token != G_TOKEN_RIGHT_CURLY)
422 return G_TOKEN_RIGHT_CURLY;
423
424 /* save those values */
425
426 return G_TOKEN_NONE;
427 }
428
429 static guint
theme_parse_gradient_colors(GtkSettings * settings,GScanner * scanner,GtkRcStyle * style,gboolean * retval,GdkColor gradient_colors[4])430 theme_parse_gradient_colors (GtkSettings *settings,
431 GScanner *scanner,
432 GtkRcStyle *style,
433 gboolean *retval,
434 GdkColor gradient_colors[4])
435 {
436 guint token;
437 *retval = TRUE;
438
439 /* Skip 'blah_border' */
440 token = g_scanner_get_next_token(scanner);
441
442 token = g_scanner_get_next_token(scanner);
443 if (token != G_TOKEN_EQUAL_SIGN)
444 return G_TOKEN_EQUAL_SIGN;
445
446 token = g_scanner_get_next_token(scanner);
447 if (token == TOKEN_FALSE)
448 {
449 *retval = FALSE;
450 return G_TOKEN_NONE;
451 }
452 else if (token != G_TOKEN_LEFT_CURLY)
453 return G_TOKEN_LEFT_CURLY;
454
455 gtk_rc_parse_color_full (scanner, style, &gradient_colors[0]);
456 token = g_scanner_get_next_token(scanner);
457 if (token != G_TOKEN_COMMA)
458 return G_TOKEN_COMMA;
459
460 gtk_rc_parse_color_full (scanner, style, &gradient_colors[1]);
461 token = g_scanner_get_next_token(scanner);
462 if (token != G_TOKEN_COMMA)
463 return G_TOKEN_COMMA;
464
465 gtk_rc_parse_color_full (scanner, style, &gradient_colors[2]);
466 token = g_scanner_get_next_token(scanner);
467 if (token != G_TOKEN_COMMA)
468 return G_TOKEN_COMMA;
469
470 gtk_rc_parse_color_full (scanner, style, &gradient_colors[3]);
471
472 token = g_scanner_get_next_token(scanner);
473 if (token != G_TOKEN_RIGHT_CURLY)
474 return G_TOKEN_RIGHT_CURLY;
475
476 /* save those values */
477
478 return G_TOKEN_NONE;
479 }
480
481 static guint
theme_parse_border_colors(GtkSettings * settings,GScanner * scanner,GtkRcStyle * style,gboolean * retval,GdkColor border_colors[2])482 theme_parse_border_colors (GtkSettings *settings,
483 GScanner *scanner,
484 GtkRcStyle *style,
485 gboolean *retval,
486 GdkColor border_colors[2])
487 {
488 guint token;
489 *retval = TRUE;
490
491 /* Skip 'blah_border' */
492 token = g_scanner_get_next_token(scanner);
493
494 token = g_scanner_get_next_token(scanner);
495 if (token != G_TOKEN_EQUAL_SIGN)
496 return G_TOKEN_EQUAL_SIGN;
497
498 token = g_scanner_get_next_token(scanner);
499 if (token == TOKEN_FALSE)
500 {
501 *retval = FALSE;
502 return G_TOKEN_NONE;
503 }
504 else if (token != G_TOKEN_LEFT_CURLY)
505 return G_TOKEN_LEFT_CURLY;
506
507 gtk_rc_parse_color_full (scanner, style, &border_colors[0]);
508 token = g_scanner_get_next_token(scanner);
509 if (token != G_TOKEN_COMMA)
510 return G_TOKEN_COMMA;
511
512 gtk_rc_parse_color_full (scanner, style, &border_colors[1]);
513
514 token = g_scanner_get_next_token(scanner);
515 if (token != G_TOKEN_RIGHT_CURLY)
516 return G_TOKEN_RIGHT_CURLY;
517
518 /* save those values */
519
520 return G_TOKEN_NONE;
521 }
522
523 static guint
theme_parse_border(GtkSettings * settings,GScanner * scanner,double border_shades[2])524 theme_parse_border (GtkSettings *settings,
525 GScanner *scanner,
526 double border_shades[2])
527 {
528 guint token;
529
530 /* Skip 'blah_border' */
531 token = g_scanner_get_next_token(scanner);
532
533 token = g_scanner_get_next_token(scanner);
534 if (token != G_TOKEN_EQUAL_SIGN)
535 return G_TOKEN_EQUAL_SIGN;
536
537 token = g_scanner_get_next_token(scanner);
538 if (token != G_TOKEN_LEFT_CURLY)
539 return G_TOKEN_LEFT_CURLY;
540
541 token = g_scanner_get_next_token(scanner);
542 if (token != G_TOKEN_FLOAT)
543 return G_TOKEN_FLOAT;
544 border_shades[0] = scanner->value.v_float;
545 token = g_scanner_get_next_token(scanner);
546 if (token != G_TOKEN_COMMA)
547 return G_TOKEN_COMMA;
548
549 token = g_scanner_get_next_token(scanner);
550 if (token != G_TOKEN_FLOAT)
551 return G_TOKEN_FLOAT;
552 border_shades[1] = scanner->value.v_float;
553
554 token = g_scanner_get_next_token(scanner);
555 if (token != G_TOKEN_RIGHT_CURLY)
556 return G_TOKEN_RIGHT_CURLY;
557
558 /* save those values */
559
560 return G_TOKEN_NONE;
561 }
562
563 static guint
murrine_gtk2_rc_parse_dummy(GtkSettings * settings,GScanner * scanner,gchar * name)564 murrine_gtk2_rc_parse_dummy (GtkSettings *settings,
565 GScanner *scanner,
566 gchar *name)
567 {
568 guint token;
569
570 /* Skip option */
571 token = g_scanner_get_next_token (scanner);
572
573 /* print a warning. Isn't there a way to get the string from the scanner? */
574 g_scanner_warn (scanner, "Murrine configuration option \"%s\" is no longer supported and will be ignored.", name);
575
576 /* equal sign */
577 token = g_scanner_get_next_token (scanner);
578 if (token != G_TOKEN_EQUAL_SIGN)
579 return G_TOKEN_EQUAL_SIGN;
580
581 /* eat whatever comes next */
582 token = g_scanner_get_next_token (scanner);
583
584 return G_TOKEN_NONE;
585 }
586
587 static guint
murrine_rc_style_parse(GtkRcStyle * rc_style,GtkSettings * settings,GScanner * scanner)588 murrine_rc_style_parse (GtkRcStyle *rc_style,
589 GtkSettings *settings,
590 GScanner *scanner)
591 {
592 static GQuark scope_id = 0;
593 MurrineRcStyle *murrine_style = MURRINE_RC_STYLE (rc_style);
594
595 guint old_scope;
596 guint token;
597 guint i;
598
599 /* Set up a new scope in this scanner. */
600
601 if (!scope_id)
602 scope_id = g_quark_from_string("murrine_theme_engine");
603
604 /* If we bail out due to errors, we *don't* reset the scope, so the
605 * error messaging code can make sense of our tokens.
606 */
607 old_scope = g_scanner_set_scope(scanner, scope_id);
608
609 /* Now check if we already added our symbols to this scope
610 * (in some previous call to murrine_rc_style_parse for the
611 * same scanner.
612 */
613
614 if (!g_scanner_lookup_symbol(scanner, theme_symbols[0].name))
615 {
616 g_scanner_freeze_symbol_table(scanner);
617 for (i = 0; i < G_N_ELEMENTS (theme_symbols); i++)
618 g_scanner_scope_add_symbol(scanner, scope_id, theme_symbols[i].name, GINT_TO_POINTER(theme_symbols[i].token));
619 g_scanner_thaw_symbol_table(scanner);
620 }
621
622 /* We're ready to go, now parse the top level */
623 token = g_scanner_peek_next_token(scanner);
624 while (token != G_TOKEN_RIGHT_CURLY)
625 {
626 switch (token)
627 {
628 case TOKEN_ANIMATION:
629 token = theme_parse_boolean (settings, scanner, &murrine_style->animation);
630 murrine_style->bflags |= MRN_FLAG_ANIMATION;
631 break;
632 case TOKEN_ARROWSTYLE:
633 token = theme_parse_int (settings, scanner, &murrine_style->arrowstyle);
634 murrine_style->flags |= MRN_FLAG_ARROWSTYLE;
635 break;
636 case TOKEN_BORDER_COLORS:
637 token = theme_parse_border_colors (settings, scanner, rc_style, &murrine_style->has_border_colors, murrine_style->border_colors);
638 murrine_style->gflags |= MRN_FLAG_BORDER_COLORS;
639 break;
640 case TOKEN_BORDER_SHADES:
641 token = theme_parse_border (settings, scanner, murrine_style->border_shades);
642 murrine_style->gflags |= MRN_FLAG_BORDER_SHADES;
643 break;
644 case TOKEN_CELLSTYLE:
645 token = theme_parse_int (settings, scanner, &murrine_style->cellstyle);
646 murrine_style->flags |= MRN_FLAG_CELLSTYLE;
647 break;
648 case TOKEN_COLORIZE_SCROLLBAR:
649 token = theme_parse_boolean (settings, scanner, &murrine_style->colorize_scrollbar);
650 murrine_style->bflags |= MRN_FLAG_COLORIZE_SCROLLBAR;
651 break;
652 case TOKEN_COMBOBOXSTYLE:
653 token = theme_parse_int (settings, scanner, &murrine_style->comboboxstyle);
654 murrine_style->flags |= MRN_FLAG_COMBOBOXSTYLE;
655 break;
656 case TOKEN_CONTRAST:
657 token = theme_parse_shade (settings, scanner, &murrine_style->contrast);
658 murrine_style->bflags |= MRN_FLAG_CONTRAST;
659 break;
660 case TOKEN_DEFAULT_BUTTON_COLOR:
661 token = theme_parse_color (settings, scanner, rc_style, &murrine_style->default_button_color);
662 murrine_style->flags |= MRN_FLAG_DEFAULT_BUTTON_COLOR;
663 break;
664 case TOKEN_EXPANDERSTYLE:
665 token = theme_parse_int (settings, scanner, &murrine_style->expanderstyle);
666 murrine_style->flags |= MRN_FLAG_EXPANDERSTYLE;
667 break;
668 case TOKEN_FOCUS_COLOR:
669 token = theme_parse_color (settings, scanner, rc_style, &murrine_style->focus_color);
670 murrine_style->flags |= MRN_FLAG_FOCUS_COLOR;
671 break;
672 case TOKEN_FOCUSSTYLE:
673 token = theme_parse_int (settings, scanner, &murrine_style->focusstyle);
674 murrine_style->flags |= MRN_FLAG_FOCUSSTYLE;
675 break;
676 case TOKEN_GLAZESTYLE:
677 token = theme_parse_int (settings, scanner, &murrine_style->glazestyle);
678 murrine_style->flags |= MRN_FLAG_GLAZESTYLE;
679 break;
680 case TOKEN_GLOW_SHADE:
681 token = theme_parse_shade (settings, scanner, &murrine_style->glow_shade);
682 murrine_style->flags |= MRN_FLAG_GLOW_SHADE;
683 break;
684 case TOKEN_GLOWSTYLE:
685 token = theme_parse_int (settings, scanner, &murrine_style->glowstyle);
686 murrine_style->flags |= MRN_FLAG_GLOWSTYLE;
687 break;
688 case TOKEN_GRADIENT_COLORS:
689 token = theme_parse_gradient_colors (settings, scanner, rc_style, &murrine_style->has_gradient_colors, murrine_style->gradient_colors);
690 murrine_style->gflags |= MRN_FLAG_GRADIENT_COLORS;
691 break;
692 case TOKEN_GRADIENT_SHADES:
693 token = theme_parse_gradient (settings, scanner, murrine_style->gradient_shades);
694 murrine_style->gflags |= MRN_FLAG_GRADIENT_SHADES;
695 break;
696 case TOKEN_HANDLESTYLE:
697 token = theme_parse_int (settings, scanner, &murrine_style->handlestyle);
698 murrine_style->flags |= MRN_FLAG_HANDLESTYLE;
699 break;
700 case TOKEN_HIGHLIGHT_SHADE:
701 token = theme_parse_shade (settings, scanner, &murrine_style->highlight_shade);
702 murrine_style->flags |= MRN_FLAG_HIGHLIGHT_SHADE;
703 break;
704 case TOKEN_LIGHTBORDER_SHADE:
705 token = theme_parse_shade (settings, scanner, &murrine_style->lightborder_shade);
706 murrine_style->flags |= MRN_FLAG_LIGHTBORDER_SHADE;
707 break;
708 case TOKEN_LIGHTBORDERSTYLE:
709 token = theme_parse_int (settings, scanner, &murrine_style->lightborderstyle);
710 murrine_style->flags |= MRN_FLAG_LIGHTBORDERSTYLE;
711 break;
712 case TOKEN_LISTVIEWHEADERSTYLE:
713 token = theme_parse_int (settings, scanner, &murrine_style->listviewheaderstyle);
714 murrine_style->flags |= MRN_FLAG_LISTVIEWHEADERSTYLE;
715 break;
716 case TOKEN_LISTVIEWSTYLE:
717 token = theme_parse_int (settings, scanner, &murrine_style->listviewstyle);
718 murrine_style->flags |= MRN_FLAG_LISTVIEWSTYLE;
719 break;
720 case TOKEN_MENUBARITEMSTYLE:
721 token = theme_parse_int (settings, scanner, &murrine_style->menubaritemstyle);
722 murrine_style->flags |= MRN_FLAG_MENUBARITEMSTYLE;
723 break;
724 case TOKEN_MENUBARSTYLE:
725 token = theme_parse_int (settings, scanner, &murrine_style->menubarstyle);
726 murrine_style->flags |= MRN_FLAG_MENUBARSTYLE;
727 break;
728 case TOKEN_MENUITEMSTYLE:
729 token = theme_parse_int (settings, scanner, &murrine_style->menuitemstyle);
730 murrine_style->flags |= MRN_FLAG_MENUITEMSTYLE;
731 break;
732 case TOKEN_MENUSTYLE:
733 token = theme_parse_int (settings, scanner, &murrine_style->menustyle);
734 murrine_style->flags |= MRN_FLAG_MENUSTYLE;
735 break;
736 case TOKEN_PRELIGHT_SHADE:
737 token = theme_parse_shade (settings, scanner, &murrine_style->prelight_shade);
738 murrine_style->flags |= MRN_FLAG_PRELIGHT_SHADE;
739 break;
740 case TOKEN_PROGRESSBARSTYLE:
741 token = theme_parse_int (settings, scanner, &murrine_style->progressbarstyle);
742 murrine_style->flags |= MRN_FLAG_PROGRESSBARSTYLE;
743 break;
744 case TOKEN_RELIEFSTYLE:
745 token = theme_parse_int (settings, scanner, &murrine_style->reliefstyle);
746 murrine_style->flags |= MRN_FLAG_RELIEFSTYLE;
747 break;
748 case TOKEN_RGBA:
749 token = theme_parse_boolean (settings, scanner, &murrine_style->rgba);
750 murrine_style->bflags |= MRN_FLAG_RGBA;
751 break;
752 case TOKEN_ROUNDNESS:
753 token = theme_parse_int (settings, scanner, &murrine_style->roundness);
754 murrine_style->bflags |= MRN_FLAG_ROUNDNESS;
755 break;
756 case TOKEN_SCROLLBARSTYLE:
757 token = theme_parse_int (settings, scanner, &murrine_style->scrollbarstyle);
758 murrine_style->flags |= MRN_FLAG_SCROLLBARSTYLE;
759 break;
760 case TOKEN_SEPARATORSTYLE:
761 token = theme_parse_int (settings, scanner, &murrine_style->separatorstyle);
762 murrine_style->flags |= MRN_FLAG_SEPARATORSTYLE;
763 break;
764 case TOKEN_SHADOW_SHADES:
765 token = theme_parse_border (settings, scanner, murrine_style->shadow_shades);
766 murrine_style->gflags |= MRN_FLAG_SHADOW_SHADES;
767 break;
768 case TOKEN_SLIDERSTYLE:
769 token = theme_parse_int (settings, scanner, &murrine_style->sliderstyle);
770 murrine_style->flags |= MRN_FLAG_SLIDERSTYLE;
771 break;
772 case TOKEN_SPINBUTTONSTYLE:
773 token = theme_parse_int (settings, scanner, &murrine_style->spinbuttonstyle);
774 murrine_style->flags |= MRN_FLAG_SPINBUTTONSTYLE;
775 break;
776 case TOKEN_STEPPERSTYLE:
777 token = theme_parse_int (settings, scanner, &murrine_style->stepperstyle);
778 murrine_style->flags |= MRN_FLAG_STEPPERSTYLE;
779 break;
780 case TOKEN_TEXTSTYLE:
781 token = theme_parse_int (settings, scanner, &murrine_style->textstyle);
782 murrine_style->flags |= MRN_FLAG_TEXTSTYLE;
783 break;
784 case TOKEN_TEXT_SHADE:
785 token = theme_parse_shade (settings, scanner, &murrine_style->text_shade);
786 murrine_style->flags |= MRN_FLAG_TEXT_SHADE;
787 break;
788 case TOKEN_TOOLBARSTYLE:
789 token = theme_parse_int (settings, scanner, &murrine_style->toolbarstyle);
790 murrine_style->flags |= MRN_FLAG_TOOLBARSTYLE;
791 break;
792 case TOKEN_TROUGH_BORDER_SHADES:
793 token = theme_parse_border (settings, scanner, murrine_style->trough_border_shades);
794 murrine_style->gflags |= MRN_FLAG_TROUGH_BORDER_SHADES;
795 break;
796 case TOKEN_TROUGH_SHADES:
797 token = theme_parse_border (settings, scanner, murrine_style->trough_shades);
798 murrine_style->gflags |= MRN_FLAG_TROUGH_SHADES;
799 break;
800
801 /* stuff to ignore */
802 case TOKEN_GRADIENTS:
803 token = murrine_gtk2_rc_parse_dummy (settings, scanner, "gradients");
804 break;
805 case TOKEN_HILIGHT_RATIO:
806 g_scanner_warn (scanner, "Murrine configuration option \"hilight_ratio\" will be deprecated in future releases. Please use \"highlight_shade\" instead.", "hilight_ratio");
807 double hilight_ratio;
808 token = theme_parse_shade (settings, scanner, &hilight_ratio);
809 murrine_style->highlight_shade = hilight_ratio/0.909090;
810 murrine_style->flags |= MRN_FLAG_HIGHLIGHT_SHADE;
811 break;
812 case TOKEN_HIGHLIGHT_RATIO:
813 g_scanner_warn (scanner, "Murrine configuration option \"highlight_ratio\" will be deprecated in future releases. Please use \"highlight_shade\" instead.", "highlight_ratio");
814 token = theme_parse_shade (settings, scanner, &murrine_style->highlight_shade);
815 murrine_style->flags |= MRN_FLAG_HIGHLIGHT_SHADE;
816 break;
817 case TOKEN_LIGHTBORDER_RATIO:
818 g_scanner_warn (scanner, "Murrine configuration option \"lightborder_ratio\" will be deprecated in future releases. Please use \"lightborder_shade\" instead.", "lightborder_ratio");
819 token = theme_parse_shade (settings, scanner, &murrine_style->lightborder_shade);
820 murrine_style->flags |= MRN_FLAG_LIGHTBORDER_SHADE;
821 break;
822 case TOKEN_PROFILE:
823 token = murrine_gtk2_rc_parse_dummy (settings, scanner, "profile");
824 break;
825 case TOKEN_SCROLLBAR_COLOR:
826 {
827 GdkColor dummy_color;
828 token = murrine_gtk2_rc_parse_dummy_color (settings, scanner, "scrollbar_color", rc_style, &dummy_color);
829 break;
830 }
831 case TOKEN_SQUAREDSTYLE:
832 token = murrine_gtk2_rc_parse_dummy (settings, scanner, "squaredstyle");
833 break;
834 case TOKEN_STYLE:
835 token = murrine_gtk2_rc_parse_dummy (settings, scanner, "style");
836 break;
837
838 default:
839 g_scanner_get_next_token(scanner);
840 token = G_TOKEN_RIGHT_CURLY;
841 break;
842 }
843
844 if (token != G_TOKEN_NONE)
845 return token;
846
847 token = g_scanner_peek_next_token(scanner);
848 }
849
850 g_scanner_get_next_token(scanner);
851
852 g_scanner_set_scope(scanner, old_scope);
853
854 return G_TOKEN_NONE;
855 }
856
857 static void
murrine_rc_style_merge(GtkRcStyle * dest,GtkRcStyle * src)858 murrine_rc_style_merge (GtkRcStyle *dest,
859 GtkRcStyle *src)
860 {
861 MurrineRcStyle *dest_w, *src_w;
862 MurrineRcFlags flags;
863 MurrineRcBasicFlags bflags;
864 MurrineRcGradientFlags gflags;
865
866 GTK_RC_STYLE_CLASS (murrine_rc_style_parent_class)->merge (dest, src);
867
868 if (!MURRINE_IS_RC_STYLE (src))
869 return;
870
871 src_w = MURRINE_RC_STYLE (src);
872 dest_w = MURRINE_RC_STYLE (dest);
873
874 /* Flags */
875 flags = (~dest_w->flags) & src_w->flags;
876
877 if (flags & MRN_FLAG_ARROWSTYLE)
878 dest_w->arrowstyle = src_w->arrowstyle;
879 if (flags & MRN_FLAG_CELLSTYLE)
880 dest_w->cellstyle = src_w->cellstyle;
881 if (flags & MRN_FLAG_COMBOBOXSTYLE)
882 dest_w->comboboxstyle = src_w->comboboxstyle;
883 if (flags & MRN_FLAG_DEFAULT_BUTTON_COLOR)
884 {
885 dest_w->has_default_button_color = src_w->has_default_button_color;
886 dest_w->default_button_color = src_w->default_button_color;
887 }
888 if (flags & MRN_FLAG_EXPANDERSTYLE)
889 dest_w->expanderstyle = src_w->expanderstyle;
890 if (flags & MRN_FLAG_FOCUS_COLOR)
891 {
892 dest_w->has_focus_color = src_w->has_focus_color;
893 dest_w->focus_color = src_w->focus_color;
894 }
895 if (flags & MRN_FLAG_FOCUSSTYLE)
896 dest_w->focusstyle = src_w->focusstyle;
897 if (flags & MRN_FLAG_GLAZESTYLE)
898 dest_w->glazestyle = src_w->glazestyle;
899 if (flags & MRN_FLAG_GLOW_SHADE)
900 dest_w->glow_shade = src_w->glow_shade;
901 if (flags & MRN_FLAG_GLOWSTYLE)
902 dest_w->glowstyle = src_w->glowstyle;
903 if (flags & MRN_FLAG_HANDLESTYLE)
904 dest_w->handlestyle = src_w->handlestyle;
905 if (flags & MRN_FLAG_HIGHLIGHT_SHADE)
906 dest_w->highlight_shade = src_w->highlight_shade;
907 if (flags & MRN_FLAG_LIGHTBORDER_SHADE)
908 dest_w->lightborder_shade = src_w->lightborder_shade;
909 if (flags & MRN_FLAG_LIGHTBORDERSTYLE)
910 dest_w->lightborderstyle = src_w->lightborderstyle;
911 if (flags & MRN_FLAG_LISTVIEWHEADERSTYLE)
912 dest_w->listviewheaderstyle = src_w->listviewheaderstyle;
913 if (flags & MRN_FLAG_LISTVIEWSTYLE)
914 dest_w->listviewstyle = src_w->listviewstyle;
915 if (flags & MRN_FLAG_MENUBARITEMSTYLE)
916 dest_w->menubaritemstyle = src_w->menubaritemstyle;
917 if (flags & MRN_FLAG_MENUBARSTYLE)
918 dest_w->menubarstyle = src_w->menubarstyle;
919 if (flags & MRN_FLAG_MENUITEMSTYLE)
920 dest_w->menuitemstyle = src_w->menuitemstyle;
921 if (flags & MRN_FLAG_MENUSTYLE)
922 dest_w->menustyle = src_w->menustyle;
923 if (flags & MRN_FLAG_PRELIGHT_SHADE)
924 dest_w->prelight_shade = src_w->prelight_shade;
925 if (flags & MRN_FLAG_PROGRESSBARSTYLE)
926 dest_w->progressbarstyle = src_w->progressbarstyle;
927 if (flags & MRN_FLAG_RELIEFSTYLE)
928 dest_w->reliefstyle = src_w->reliefstyle;
929 if (flags & MRN_FLAG_SCROLLBARSTYLE)
930 dest_w->scrollbarstyle = src_w->scrollbarstyle;
931 if (flags & MRN_FLAG_SEPARATORSTYLE)
932 dest_w->separatorstyle = src_w->separatorstyle;
933 if (flags & MRN_FLAG_SLIDERSTYLE)
934 dest_w->sliderstyle = src_w->sliderstyle;
935 if (flags & MRN_FLAG_SPINBUTTONSTYLE)
936 dest_w->spinbuttonstyle = src_w->spinbuttonstyle;
937 if (flags & MRN_FLAG_STEPPERSTYLE)
938 dest_w->stepperstyle = src_w->stepperstyle;
939 if (flags & MRN_FLAG_TEXTSTYLE)
940 dest_w->textstyle = src_w->textstyle;
941 if (flags & MRN_FLAG_TEXT_SHADE)
942 dest_w->text_shade = src_w->text_shade;
943 if (flags & MRN_FLAG_TOOLBARSTYLE)
944 dest_w->toolbarstyle = src_w->toolbarstyle;
945
946 dest_w->flags |= src_w->flags;
947
948 /* Basic Flags */
949 bflags = (~dest_w->bflags) & src_w->bflags;
950
951 if (bflags & MRN_FLAG_ANIMATION)
952 dest_w->animation = src_w->animation;
953 if (bflags & MRN_FLAG_COLORIZE_SCROLLBAR)
954 dest_w->colorize_scrollbar = src_w->colorize_scrollbar;
955 if (bflags & MRN_FLAG_CONTRAST)
956 dest_w->contrast = src_w->contrast;
957 if (bflags & MRN_FLAG_RGBA)
958 dest_w->rgba = src_w->rgba;
959 if (bflags & MRN_FLAG_ROUNDNESS)
960 dest_w->roundness = src_w->roundness;
961
962 dest_w->bflags |= src_w->bflags;
963
964 /* Gradient Flags */
965 gflags = (~dest_w->gflags) & src_w->gflags;
966
967 if (gflags & MRN_FLAG_BORDER_COLORS)
968 {
969 dest_w->has_border_colors = src_w->has_border_colors;
970 dest_w->border_colors[0] = src_w->border_colors[0];
971 dest_w->border_colors[1] = src_w->border_colors[1];
972 }
973 if (gflags & MRN_FLAG_BORDER_SHADES)
974 {
975 dest_w->border_shades[0] = src_w->border_shades[0];
976 dest_w->border_shades[1] = src_w->border_shades[1];
977 }
978 if (gflags & MRN_FLAG_GRADIENT_COLORS)
979 {
980 dest_w->has_gradient_colors = src_w->has_gradient_colors;
981 dest_w->gradient_colors[0] = src_w->gradient_colors[0];
982 dest_w->gradient_colors[1] = src_w->gradient_colors[1];
983 dest_w->gradient_colors[2] = src_w->gradient_colors[2];
984 dest_w->gradient_colors[3] = src_w->gradient_colors[3];
985 }
986 if (gflags & MRN_FLAG_GRADIENT_SHADES)
987 {
988 dest_w->gradient_shades[0] = src_w->gradient_shades[0];
989 dest_w->gradient_shades[1] = src_w->gradient_shades[1];
990 dest_w->gradient_shades[2] = src_w->gradient_shades[2];
991 dest_w->gradient_shades[3] = src_w->gradient_shades[3];
992 }
993 if (gflags & MRN_FLAG_SHADOW_SHADES)
994 {
995 dest_w->shadow_shades[0] = src_w->shadow_shades[0];
996 dest_w->shadow_shades[1] = src_w->shadow_shades[1];
997 }
998 if (gflags & MRN_FLAG_TROUGH_BORDER_SHADES)
999 {
1000 dest_w->trough_border_shades[0] = src_w->trough_border_shades[0];
1001 dest_w->trough_border_shades[1] = src_w->trough_border_shades[1];
1002 }
1003 if (gflags & MRN_FLAG_TROUGH_SHADES)
1004 {
1005 dest_w->trough_shades[0] = src_w->trough_shades[0];
1006 dest_w->trough_shades[1] = src_w->trough_shades[1];
1007 }
1008
1009 dest_w->gflags |= src_w->gflags;
1010 }
1011
1012 /* Create an empty style suitable to this RC style
1013 */
1014 static GtkStyle *
murrine_rc_style_create_style(GtkRcStyle * rc_style)1015 murrine_rc_style_create_style (GtkRcStyle *rc_style)
1016 {
1017 return GTK_STYLE (g_object_new (MURRINE_TYPE_STYLE, NULL));
1018 }
1019