[gtksourceview] Use the new .view style when applying a scheme style.



commit 03c393876b28f1c024c9c72b6e83474bfb00b8b1
Author: Ignacio Casal Quinteiro <icq gnome org>
Date:   Mon Jan 10 21:01:14 2011 +0100

    Use the new .view style when applying a scheme style.

 gtksourceview/gtksourcestylescheme.c |  198 +++++++++++++++++++++++++++-------
 gtksourceview/gtksourcestylescheme.h |    2 +
 gtksourceview/gtksourceview.c        |    4 +
 3 files changed, 163 insertions(+), 41 deletions(-)
---
diff --git a/gtksourceview/gtksourcestylescheme.c b/gtksourceview/gtksourcestylescheme.c
index cf6198b..c81bffc 100644
--- a/gtksourceview/gtksourcestylescheme.c
+++ b/gtksourceview/gtksourcestylescheme.c
@@ -80,6 +80,8 @@ struct _GtkSourceStyleSchemePrivate
 	GHashTable *defined_styles;
 	GHashTable *style_cache;
 	GHashTable *named_colors;
+
+	GtkCssProvider *css;
 };
 
 G_DEFINE_TYPE (GtkSourceStyleScheme, gtk_source_style_scheme, G_TYPE_OBJECT)
@@ -108,6 +110,11 @@ gtk_source_style_scheme_finalize (GObject *object)
 	if (scheme->priv->parent != NULL)
 		g_object_unref (scheme->priv->parent);
 
+	if (scheme->priv->css != NULL)
+	{
+		g_object_unref (scheme->priv->css);
+	}
+
 	G_OBJECT_CLASS (gtk_source_style_scheme_parent_class)->finalize (object);
 }
 
@@ -612,26 +619,135 @@ _gtk_source_style_scheme_get_current_line_color (GtkSourceStyleScheme *scheme,
 }
 
 static void
-set_text_style (GtkWidget      *widget,
-		GtkSourceStyle *style,
-		GtkStateFlags   state)
+get_css_color_style (GtkSourceStyle *style,
+                     gchar         **bg,
+                     gchar         **text)
 {
 	GdkRGBA color;
-	GdkRGBA *color_ptr;
+	gchar *bg_color, *text_color;
 
 	if (get_color (style, FALSE, &color))
-		color_ptr = &color;
+	{
+		bg_color = gdk_rgba_to_string (&color);
+	}
 	else
-		color_ptr = NULL;
-
-	gtk_widget_override_background_color (widget, state, color_ptr);
+	{
+		bg_color = NULL;
+	}
 
 	if (get_color (style, TRUE, &color))
-		color_ptr = &color;
+	{
+		text_color = gdk_rgba_to_string (&color);
+	}
+	else
+	{
+		text_color = NULL;
+	}
+
+	if (bg_color)
+	{
+		*bg = g_strdup_printf ("%s: %s;\n", "background-color", bg_color);
+	}
+	else
+	{
+		*bg = NULL;
+	}
+
+	if (text_color)
+	{
+		*text = g_strdup_printf ("%s: %s;\n", "color", text_color);
+	}
 	else
-		color_ptr = NULL;
+	{
+		*text = NULL;
+	}
+}
+
+static void
+append_css_style (GString        *string,
+                  GtkSourceStyle *style,
+                  const gchar    *state)
+{
+	gchar *bg, *text;
+	const gchar css_style[] =
+		".view%s {\n"
+		"	%s"
+		"	%s"
+		"}\n";
+
+	get_css_color_style (style, &bg, &text);
+
+	if (bg || text)
+	{
+		g_string_append_printf (string, css_style, state,
+		                        bg != NULL ? bg : "",
+		                        text != NULL ? text : "");
+	}
+}
+
+static void
+remove_generated_css (GtkSourceStyleScheme *scheme,
+                      GtkWidget            *widget)
+{
+	if (scheme->priv->css != NULL)
+	{
+		GtkStyleContext *context;
+
+		context = gtk_widget_get_style_context (GTK_WIDGET (widget));
+		gtk_style_context_remove_provider (context,
+		                                   GTK_STYLE_PROVIDER (scheme->priv->css));
 
-	gtk_widget_override_color (widget, state, color_ptr);
+		g_object_unref (scheme->priv->css);
+		scheme->priv->css = NULL;
+	}
+}
+
+static void
+generate_css_style (GtkSourceStyleScheme *scheme,
+                    GtkWidget            *widget)
+{
+	GString *final_style;
+	GtkSourceStyle *style, *style2;
+
+	final_style = g_string_new ("");
+
+	style = gtk_source_style_scheme_get_style (scheme, STYLE_TEXT);
+	append_css_style (final_style, style, "");
+
+	style = gtk_source_style_scheme_get_style (scheme, STYLE_SELECTED);
+	append_css_style (final_style, style, ":selected");
+
+	style2 = gtk_source_style_scheme_get_style (scheme, STYLE_SELECTED_UNFOCUSED);
+	if (style2 == NULL)
+		style2 = style;
+	append_css_style (final_style, style2, ":active");
+
+	/* if there is a previously applied css remove it first */
+	remove_generated_css (scheme, widget);
+
+	if (*final_style->str != '\0')
+	{
+		GError *error = NULL;
+
+		scheme->priv->css = gtk_css_provider_new ();
+		if (gtk_css_provider_load_from_data (scheme->priv->css, final_style->str,
+		                                     final_style->len, &error))
+		{
+			GtkStyleContext *context;
+
+			context = gtk_widget_get_style_context (GTK_WIDGET (widget));
+			gtk_style_context_add_provider (context,
+			                                GTK_STYLE_PROVIDER (scheme->priv->css),
+			                                GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+		}
+		else
+		{
+			g_warning ("%s", error->message);
+			g_error_free (error);
+		}
+	}
+
+	g_string_free (final_style, TRUE);
 }
 
 static void
@@ -651,7 +767,7 @@ set_line_numbers_style (GtkWidget      *widget,
 		bg_ptr = &bg;
 
 	/* Override the color no matter what the state is */
-	flags = ~0;
+	flags = 0;
 
 	gtk_widget_override_color (widget, flags, fg_ptr);
 	gtk_widget_override_background_color (widget, flags, bg_ptr);
@@ -701,41 +817,41 @@ void
 _gtk_source_style_scheme_apply (GtkSourceStyleScheme *scheme,
 				GtkWidget            *widget)
 {
-	g_return_if_fail (scheme == NULL || GTK_IS_SOURCE_STYLE_SCHEME (scheme));
-	g_return_if_fail (GTK_IS_WIDGET (widget));
+	GtkSourceStyle *style, *style2;
 
-	if (scheme != NULL)
-	{
-		GtkSourceStyle *style, *style2;
+	g_return_if_fail (GTK_IS_SOURCE_STYLE_SCHEME (scheme));
+	g_return_if_fail (GTK_IS_WIDGET (widget));
 
-		style = gtk_source_style_scheme_get_style (scheme, STYLE_TEXT);
-		set_text_style (widget, style, 0);
-		set_text_style (widget,
-				style,
-				GTK_STATE_FLAG_PRELIGHT | GTK_STATE_FLAG_INSENSITIVE);
+	/* we need to translate some of the style scheme properties in a CSS override */
+	generate_css_style (scheme, widget);
 
-		style = gtk_source_style_scheme_get_style (scheme, STYLE_SELECTED);
-		set_text_style (widget, style, GTK_STATE_FLAG_SELECTED);
+	style = gtk_source_style_scheme_get_style (scheme, STYLE_LINE_NUMBERS);
+	set_line_numbers_style (widget, style);
 
-		style2 = gtk_source_style_scheme_get_style (scheme, STYLE_SELECTED_UNFOCUSED);
-		if (style2 == NULL)
-			style2 = style;
-		set_text_style (widget, style2, GTK_STATE_FLAG_ACTIVE);
+	style = gtk_source_style_scheme_get_style (scheme, STYLE_CURSOR);
+	style2 = gtk_source_style_scheme_get_style (scheme, STYLE_SECONDARY_CURSOR);
+	update_cursor_colors (widget, style, style2);
+}
 
-		style = gtk_source_style_scheme_get_style (scheme, STYLE_LINE_NUMBERS);
-		set_line_numbers_style (widget, style);
+/**
+ * _gtk_source_style_scheme_unapply:
+ * @scheme: (allow-none): a #GtkSourceStyleScheme or %NULL.
+ * @widget: a #GtkWidget to unapply styles to.
+ *
+ * Removes the style from @scheme in the @widget.
+ *
+ * Since: 3.0
+ */
+void
+_gtk_source_style_scheme_unapply (GtkSourceStyleScheme *scheme,
+                                  GtkWidget            *widget)
+{
+	g_return_if_fail (GTK_IS_SOURCE_STYLE_SCHEME (scheme));
+	g_return_if_fail (GTK_IS_WIDGET (widget));
 
-		style = gtk_source_style_scheme_get_style (scheme, STYLE_CURSOR);
-		style2 = gtk_source_style_scheme_get_style (scheme, STYLE_SECONDARY_CURSOR);
-		update_cursor_colors (widget, style, style2);
-	}
-	else
-	{
-		/* reset */
-		set_text_style (widget, NULL, ~0);
-		set_line_numbers_style (widget, NULL);
-		gtk_widget_override_cursor (widget, NULL, NULL);
-	}
+	remove_generated_css (scheme, widget);
+	set_line_numbers_style (widget, NULL);
+	update_cursor_colors (widget, NULL, NULL);
 }
 
 /* --- PARSER ---------------------------------------------------------------- */
diff --git a/gtksourceview/gtksourcestylescheme.h b/gtksourceview/gtksourcestylescheme.h
index 4ba8dfc..501163c 100644
--- a/gtksourceview/gtksourcestylescheme.h
+++ b/gtksourceview/gtksourcestylescheme.h
@@ -78,6 +78,8 @@ void			 _gtk_source_style_scheme_set_parent	(GtkSourceStyleScheme *scheme,
 /* private */
 void			 _gtk_source_style_scheme_apply		(GtkSourceStyleScheme *scheme,
 								 GtkWidget            *widget);
+void			 _gtk_source_style_scheme_unapply	(GtkSourceStyleScheme *scheme,
+                                                                 GtkWidget            *widget);
 GtkSourceStyle		*_gtk_source_style_scheme_get_matching_brackets_style
 								(GtkSourceStyleScheme *scheme);
 GtkSourceStyle		*_gtk_source_style_scheme_get_right_margin_style
diff --git a/gtksourceview/gtksourceview.c b/gtksourceview/gtksourceview.c
index 3b92abb..8a7095d 100644
--- a/gtksourceview/gtksourceview.c
+++ b/gtksourceview/gtksourceview.c
@@ -4142,7 +4142,11 @@ gtk_source_view_update_style_scheme (GtkSourceView *view)
 	if (view->priv->style_scheme != new_scheme)
 	{
 		if (view->priv->style_scheme)
+		{
+			_gtk_source_style_scheme_unapply (view->priv->style_scheme, GTK_WIDGET (view));
 			g_object_unref (view->priv->style_scheme);
+		}
+
 		view->priv->style_scheme = new_scheme;
 		if (new_scheme)
 			g_object_ref (new_scheme);



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