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