gtk-css-engine r209 - in trunk: . src



Author: robsta
Date: Wed Dec 17 16:25:01 2008
New Revision: 209
URL: http://svn.gnome.org/viewvc/gtk-css-engine?rev=209&view=rev

Log:
* src/gce-rc-style.c (create_style), (parse_href),
(parse_selector), (parse), (merge), (finalize), (instance_init):
* src/gce-style.c (rectangle), (gap), (line), (draw_hline),
(draw_vline), (draw_shadow), (draw_box), (draw_flat_box),
(draw_check), (draw_option), (draw_shadow_gap), (draw_box_gap),
(draw_extension), (draw_slider), (draw_handle), (draw_resize_grip),
(draw_focus), (draw_expander), (draw_diamond), (draw_arrow),
(draw_tab), (finalize), (instance_init):
* src/gce-style.h:
Support drawing with NULL widget pointer.



Modified:
   trunk/ChangeLog
   trunk/src/gce-rc-style.c
   trunk/src/gce-style.c
   trunk/src/gce-style.h

Modified: trunk/src/gce-rc-style.c
==============================================================================
--- trunk/src/gce-rc-style.c	(original)
+++ trunk/src/gce-rc-style.c	Wed Dec 17 16:25:01 2008
@@ -27,6 +27,7 @@
 struct _GceRcStyle {
 	GtkRcStyle		 parent;
 	ccss_stylesheet_t	*stylesheet;
+	char			*selector;
 };
 
 struct _GceRcStyleClass {
@@ -53,9 +54,91 @@
 			   rc_style ? (void *) rc_style->stylesheet : NULL);
 	}
 
+	style->selector = g_strdup (rc_style->selector);
+
 	return GTK_STYLE (style);
 }
 
+/* FIXME: do more robust parsing. */
+static void
+parse_href (GtkRcStyle	*rc_style,
+	    GtkSettings	*settings, 
+	    GScanner	*scanner)
+{
+	ccss_grammar_t		*grammar;
+	ccss_stylesheet_t	*stylesheet;
+	char			*gce_file;
+	guint			 token;
+
+	token = g_scanner_get_next_token (scanner);
+	g_assert (token == '=');
+
+	token = g_scanner_get_next_token (scanner);
+	g_assert (token == G_TOKEN_STRING);
+
+	/* TODO use default settings here, or the ones passed to GtkRcStyle::parse */
+	gce_file = gtk_rc_find_pixmap_in_path (gtk_settings_get_default (),
+			scanner, scanner->value.v_string);
+
+	grammar = ccss_gtk_grammar_create ();
+	ccss_grammar_add_functions (grammar, gce_functions_get_vtable ());
+	stylesheet = ccss_grammar_create_stylesheet_from_file (grammar,
+							gce_file, NULL);
+	if (stylesheet) {
+		ccss_grammar_destroy (grammar), grammar = NULL;
+	} else {
+		g_critical ("Could not create stylesheet `%s'", gce_file);
+	}
+	g_free (gce_file), gce_file = NULL;
+	/* ccss_stylesheet_dump (_stylesheet); */
+
+	/* User-agent stylesheet */
+	stylesheet = ccss_stylesheet_add_from_file (stylesheet, GCE_UA_STYLESHEET,
+						    CCSS_STYLESHEET_USER_AGENT,
+						    NULL);
+	if (stylesheet) {
+
+		GceRcStyle *gce_rc_style;
+
+		gce_rc_style = GCE_RC_STYLE (rc_style);
+		if (gce_rc_style) {
+			gce_rc_style->stylesheet = ccss_stylesheet_reference (stylesheet);
+		}
+
+		if (g_getenv ("GCE_PREVIEW") != NULL) {
+			char *rc_string;
+			rc_string = ccss_gtk_stylesheet_to_gtkrc (stylesheet);
+			if (rc_string) {
+				gtk_rc_parse_string (rc_string);
+				g_free (rc_string), rc_string = NULL;
+			}
+		}
+
+		ccss_stylesheet_destroy (stylesheet), stylesheet = NULL;
+	} else {
+		g_critical ("Could not add user-agent stylesheet `%s'",
+			    GCE_UA_STYLESHEET);
+	}
+}
+
+/* FIXME: do more robust parsing. */
+static void
+parse_selector (GtkRcStyle	*rc_style,
+		GtkSettings	*settings, 
+		GScanner	*scanner)
+{
+	guint token;
+
+	token = g_scanner_get_next_token (scanner);
+	g_assert (token == '=');
+
+	token = g_scanner_get_next_token (scanner);
+	g_assert (token == G_TOKEN_STRING);
+
+	GCE_RC_STYLE (rc_style)->selector = g_strdup (scanner->value.v_string);
+}
+
+/* FIXME: do more robust parsing. */
 static guint 
 parse (GtkRcStyle  *rc_style, 
        GtkSettings *settings, 
@@ -63,10 +146,6 @@
 {
 	static GQuark scope_id = 0;
 
-	ccss_grammar_t		*grammar;
-	ccss_stylesheet_t	*stylesheet;
-
-	char	*gce_file;
 	guint	 old_scope;
 	guint	 token;
 		
@@ -79,53 +158,18 @@
 	if (token != G_TOKEN_RIGHT_CURLY) {
 
 		token = g_scanner_get_next_token (scanner);
-		g_assert (token == G_TOKEN_IDENTIFIER && 
-			  0 == strcmp ("href", scanner->value.v_identifier));
+		if (G_TOKEN_IDENTIFIER == token &&
+		    0 == g_strcmp0 ("href", scanner->value.v_identifier)) {
 
-		token = g_scanner_get_next_token (scanner);
-		g_assert (token == '=');
+			parse_href (rc_style, settings, scanner);
 
-		token = g_scanner_get_next_token (scanner);
-		g_assert (token == G_TOKEN_STRING);
+		} else if (G_TOKEN_IDENTIFIER == token &&
+			   0 == g_strcmp0 ("selector", scanner->value.v_identifier)) {
 
-		gce_file = gtk_rc_find_pixmap_in_path (gtk_settings_get_default (), 
-				scanner, scanner->value.v_string);
+			parse_selector (rc_style, settings, scanner);
 
-		grammar = ccss_gtk_grammar_create ();
-		ccss_grammar_add_functions (grammar, gce_functions_get_vtable ());
-		stylesheet = ccss_grammar_create_stylesheet_from_file (grammar,
-								gce_file, NULL);
-		if (stylesheet) {
-			ccss_grammar_destroy (grammar), grammar = NULL;
 		} else {
-			g_critical ("Could not create stylesheet `%s'", gce_file);
-		}
-		g_free (gce_file), gce_file = NULL;
-		/* ccss_stylesheet_dump (_stylesheet); */
-
-		/* User-agent stylesheet */
-		stylesheet = ccss_stylesheet_add_from_file (stylesheet, GCE_UA_STYLESHEET,
-							    CCSS_STYLESHEET_USER_AGENT,
-							    NULL);
-		if (stylesheet) {
-			GceRcStyle *gce_rc_style;
-			gce_rc_style = GCE_RC_STYLE (rc_style);
-			if (gce_rc_style) {
-				gce_rc_style->stylesheet = ccss_stylesheet_reference (stylesheet);
-			}
-			ccss_stylesheet_destroy (stylesheet), stylesheet = NULL;
-		} else {
-			g_critical ("Could not add user-agent stylesheet `%s'",
-				    GCE_UA_STYLESHEET);
-		}
-
-		if (g_getenv ("GCE_PREVIEW") != NULL) {
-			char *rc_string;
-			rc_string = ccss_gtk_stylesheet_to_gtkrc (stylesheet);
-			if (rc_string) {
-				gtk_rc_parse_string (rc_string);
-				g_free (rc_string), rc_string = NULL;
-			}
+			g_warning ("unknown token `%d'", token);
 		}
 	}
 
@@ -151,9 +195,9 @@
 		if (from->stylesheet != NULL &&
 		    to->stylesheet == NULL) {
 			to->stylesheet = ccss_stylesheet_reference (from->stylesheet);
-		} else if (from->stylesheet == NULL) {
-			g_warning ("no stylesheet");
 		}
+
+		to->selector = g_strdup (from->selector);
 	}
 
 	gce_rc_style_parent_class->merge (dest, src);
@@ -171,6 +215,11 @@
 		self->stylesheet = NULL;
 	}
 
+	if (self->selector) {
+		g_free (self->selector);
+		self->selector = NULL;
+	}
+
 	G_OBJECT_CLASS (gce_rc_style_parent_class)->finalize (instance);
 }
 
@@ -178,6 +227,7 @@
 instance_init (GceRcStyle *self)
 {
 	self->stylesheet = NULL;
+	self->selector = NULL;
 }
 
 static void 

Modified: trunk/src/gce-style.c
==============================================================================
--- trunk/src/gce-style.c	(original)
+++ trunk/src/gce-style.c	Wed Dec 17 16:25:01 2008
@@ -38,12 +38,17 @@
 	   gint			 height,
 	   gboolean		 fill)
 {
-	ccss_style_t		*style;
-	cairo_t			*cr;
+	cairo_t		*cr;
+	ccss_style_t	*style = NULL;
 
 	g_return_if_fail (self);
 
-	style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	if (node) {
+		style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	} else if (self->selector) {
+		style = ccss_stylesheet_query_type (self->stylesheet, self->selector);
+	}
+
 	if (style) {
 		cr = gdk_cairo_create (window);
 
@@ -67,8 +72,8 @@
 		}
 
 		cairo_destroy (cr), cr = NULL;
+		ccss_style_destroy (style), style = NULL;
 	}
-	ccss_style_destroy (style), style = NULL;
 }
 
 static void
@@ -85,12 +90,17 @@
      gint		 gap_start,
      gint		 gap_width)
 {
-	ccss_style_t		*style;
-	cairo_t			*cr;
+	cairo_t		*cr;
+	ccss_style_t	*style = NULL;
 
 	g_return_if_fail (self);
 
-	style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	if (node) {
+		style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	} else if (self->selector) {
+		style = ccss_stylesheet_query_type (self->stylesheet, self->selector);
+	}
+
 	if (style) {
 		cr = gdk_cairo_create (window);
 
@@ -112,8 +122,8 @@
 							  gap_side, gap_start, gap_width);
 
 		cairo_destroy (cr), cr = NULL;
+		ccss_style_destroy (style), style = NULL;
 	}
-	ccss_style_destroy (style), style = NULL;
 }
 
 static void
@@ -127,12 +137,17 @@
       gint		 y1, 
       gint		 y2)
 {
-	ccss_style_t		*style;
-	cairo_t			*cr;
+	cairo_t		*cr;
+	ccss_style_t	*style = NULL;
 
 	g_return_if_fail (self);
 
-	style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	if (node) {
+		style = ccss_stylesheet_query (self->stylesheet, (ccss_node_t const *) node);
+	} else if (self->selector) {
+		style = ccss_stylesheet_query_type (self->stylesheet, self->selector);
+	}
+
 	if (style) {
 		cr = gdk_cairo_create (window);
 
@@ -144,8 +159,8 @@
 		ccss_cairo_style_draw_line (style, cr, x1, x2, y1, y2);
 
 		cairo_destroy (cr), cr = NULL;
+		ccss_style_destroy (style), style = NULL;
 	}
-	ccss_style_destroy (style), style = NULL;
 }
 
 static void 
@@ -159,13 +174,14 @@
 	    gint		 x2, 
 	    gint		 y)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "hline", -1, detail, x1, y, x2 - x1, -1);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			NULL, NULL, NULL, NULL, NULL,
@@ -187,13 +203,14 @@
 	    gint		 y2, 
 	    gint		 x)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "vline", -1, detail, x, y1, -1, y2 - y1);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			NULL, NULL, NULL, NULL, NULL,
@@ -218,13 +235,14 @@
 	     gint		 width, 
 	     gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "shadow", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -250,13 +268,14 @@
 	  gint			 width,
 	  gint			 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "box", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -282,13 +301,14 @@
 	       gint		 width,
 	       gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "flat-box", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -314,13 +334,14 @@
 	    gint		 width,
 	    gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "check", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -346,13 +367,14 @@
 	     gint		 width,
 	     gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "option", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -381,13 +403,14 @@
 		 gint			 gap_start,
 		 gint			 gap_width)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "shadow-gap", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -416,13 +439,14 @@
 	      gint			 gap_start,
 	      gint			 gap_width)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "box-gap", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -449,14 +473,15 @@
 		gint		 height,
 		GtkPositionType	 gap_side)
 {
-	GceNode		*node;
 	char const	*role;
 	gint		 gap_width;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "extension", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget, 
+	if (widget)
+		node = gce_node_cache_fetch_node (widget, 
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -494,13 +519,14 @@
 	     gint		 height,
 	     GtkOrientation	 orientation)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "slider", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -528,13 +554,14 @@
 	     gint		 height,
 	     GtkOrientation	 orientation)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "handle", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -561,13 +588,14 @@
 		  gint			 width,
 		  gint			 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "resize-grip", -1, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			NULL, NULL, NULL, gce_maps_get_window_edge (edge), NULL,
@@ -591,13 +619,14 @@
 	    gint		 width,
 	    gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "focus", -1, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			NULL, NULL, NULL, NULL, NULL,
@@ -621,9 +650,9 @@
 	       GtkExpanderStyle	 style)
 {
 #define DEFAULT_EXPANDER_SIZE 12
-	GceNode		*node;
 	char const	*role;
 	gint		 expander_size;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "expander", -1, detail, x, y, -1, -1);
 	detail = gce_maps_get_detail (detail);
@@ -638,7 +667,8 @@
 		expander_size = DEFAULT_EXPANDER_SIZE;
 	}
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			NULL, NULL, NULL, NULL, gce_maps_get_expander_style (style),
@@ -664,13 +694,14 @@
 	      gint		 width,
 	      gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "diamond", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -701,13 +732,14 @@
 	    gint		 width,
 	    gint		 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "arrow", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -734,13 +766,14 @@
 	  gint			 width,
 	  gint			 height)
 {
-	GceNode		*node;
 	char const	*role;
+	GceNode		*node = NULL;
 
 	role = gce_maps_match_role (widget, "tab", shadow, detail, x, y, width, height);
 	detail = gce_maps_get_detail (detail);
 
-	node = gce_node_cache_fetch_node (widget,
+	if (widget)
+		node = gce_node_cache_fetch_node (widget,
 			detail,
 			gce_maps_get_state (state),
 			gce_maps_get_shadow (shadow),
@@ -765,6 +798,11 @@
 		self->stylesheet = NULL;
 	}
 
+	if (self->selector) {
+		g_free (self->selector);
+		self->selector = NULL;
+	}
+
 	G_OBJECT_CLASS (gce_style_parent_class)->finalize (instance);
 }
 
@@ -772,6 +810,7 @@
 instance_init (GceStyle *self)
 {
 	self->stylesheet = NULL;
+	self->selector = NULL;
 }
 
 static void 

Modified: trunk/src/gce-style.h
==============================================================================
--- trunk/src/gce-style.h	(original)
+++ trunk/src/gce-style.h	Wed Dec 17 16:25:01 2008
@@ -39,6 +39,7 @@
 struct GceStyle_ {
 	GtkStyle		 parent;
 	ccss_stylesheet_t	*stylesheet;
+	char			*selector;
 };
 
 struct GceStyleClass_ {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]