[gtk+/gtk-style-context: 317/490] GtkWidget: Add new set of methods to override style information.



commit 0fadd620ca55e6d365eec15623901e118eaae9af
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Nov 3 12:21:04 2010 +0100

    GtkWidget: Add new set of methods to override style information.
    
    gtk_widget_override_*() deprecates gtk_widget_modify_*(). There are
    only functions to modify fg/bg/font/symbolic color, If anything more
    fancy/complex is needed. There is the possibility of adding a
    GtkStyleProvider yourself.

 docs/reference/gtk/gtk3-sections.txt |    4 +
 gtk/gtk.symbols                      |    5 +-
 gtk/gtkwidget.c                      |  284 ++++++++++++++++++++++++++++++---
 gtk/gtkwidget.h                      |   18 ++-
 4 files changed, 281 insertions(+), 30 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 0707c16..1f67689 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -4893,6 +4893,10 @@ gtk_widget_input_shape_combine_region
 gtk_widget_path
 gtk_widget_class_path
 gtk_widget_get_composite_name
+gtk_widget_override_background_color
+gtk_widget_override_color
+gtk_widget_override_font
+gtk_widget_override_symbolic_color
 gtk_widget_modify_style
 gtk_widget_get_modifier_style
 gtk_widget_modify_fg
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index d81a8ab..072d366 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -4280,8 +4280,11 @@ gtk_widget_modify_cursor
 gtk_widget_modify_font
 gtk_widget_modify_style
 gtk_widget_modify_text
-gtk_widget_modify_symbolic_color
 gtk_widget_new
+gtk_widget_override_background_color
+gtk_widget_override_color
+gtk_widget_override_font
+gtk_widget_override_symbolic_color
 gtk_widget_path
 gtk_widget_pop_composite_child
 gtk_widget_push_composite_child
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 3c92ea4..63d119b 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -679,6 +679,7 @@ static GQuark		quark_tooltip_markup = 0;
 static GQuark		quark_has_tooltip = 0;
 static GQuark		quark_tooltip_window = 0;
 static GQuark		quark_visual = 0;
+static GQuark           quark_modifier_style = 0;
 GParamSpecPool         *_gtk_widget_child_property_pool = NULL;
 GObjectNotifyContext   *_gtk_widget_child_property_notify_context = NULL;
 
@@ -792,6 +793,7 @@ gtk_widget_class_init (GtkWidgetClass *klass)
   quark_has_tooltip = g_quark_from_static_string ("gtk-has-tooltip");
   quark_tooltip_window = g_quark_from_static_string ("gtk-tooltip-window");
   quark_visual = g_quark_from_static_string ("gtk-widget-visual");
+  quark_modifier_style = g_quark_from_static_string ("gtk-widget-modifier-style");
 
   style_property_spec_pool = g_param_spec_pool_new (FALSE);
   _gtk_widget_child_property_pool = g_param_spec_pool_new (TRUE);
@@ -7860,30 +7862,208 @@ gtk_widget_modify_color_component (GtkWidget      *widget,
   gtk_widget_modify_style (widget, rc_style);
 }
 
+static GtkStyleProperties *
+_gtk_widget_get_modifier_properties (GtkWidget *widget)
+{
+  GtkStyleProperties *properties;
+
+  properties = g_object_get_qdata (G_OBJECT (widget), quark_modifier_style);
+
+  if (G_UNLIKELY (!properties))
+    {
+      GtkStyleContext *context;
+
+      properties = gtk_style_properties_new ();
+      g_object_set_qdata_full (G_OBJECT (widget),
+                               quark_modifier_style,
+                               properties,
+                               (GDestroyNotify) g_object_unref);
+
+      context = gtk_widget_get_style_context (widget);
+
+      gtk_style_context_add_provider (context,
+                                      GTK_STYLE_PROVIDER (properties),
+                                      GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+    }
+
+  return properties;
+}
+
+/**
+ * gtk_widget_override_color:
+ * @widget: a #GtkWidget
+ * @state: the state for which to set the color
+ * @color: the color to assign, or %NULL to undo the effect
+ *         of previous calls to gtk_widget_override_color()
+ *
+ * Sets the color to use for a widget. All other style values are left
+ * untouched.
+ *
+ * <note>
+ * <para>
+ * This API is mostly meant as a quick way for applications to change a
+ * widget appearance. If you are developing a widgets library and intend
+ * this change to be themeable, it is better done by setting meaningful
+ * CSS classes and regions in your widget/container implementation through
+ * gtk_style_context_add_class() and gtk_style_context_add_region().
+ * </para>
+ * <para>
+ * This way, your widget library can install a #GtkCssProvider with the
+ * %GTK_STYLE_PROVIDER_PRIORITY_FALLBACK priority in order to provide a
+ * default styling for those widgets that need so, and this theming may
+ * fully overridden by the user's theme.
+ * </para>
+ * </note>
+ *
+ * <note>
+ * <para>
+ * Note that for complex widgets this may bring in
+ * undesired results (such as uniform background color everywhere),
+ * in these cases it is better to fully style such widgets through a
+ * #GtkCssProvider with the %GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
+ * priority.
+ * </para>
+ * </note>
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_override_color (GtkWidget     *widget,
+                           GtkStateFlags  state,
+                           const GdkRGBA *color)
+{
+  GtkStyleProperties *properties;
+  GtkStyleContext *context;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  properties = _gtk_widget_get_modifier_properties (widget);
+
+  gtk_style_properties_set (properties, state,
+                            "color", color,
+                            NULL);
+
+  context = gtk_widget_get_style_context (widget);
+  gtk_style_context_invalidate (context);
+
+  g_signal_emit (widget,
+                 widget_signals[STYLE_SET],
+                 0,
+                 widget->priv->style);
+}
+
 /**
- * gtk_widget_modify_symbolic_color:
+ * gtk_widget_override_background_color:
+ * @widget: a #GtkWidget
+ * @state: the state for which to set the background color
+ * @color: the color to assign, or %NULL to undo the effect
+ *         of previous calls to gtk_widget_override_background_color()
+ *
+ * Sets the background color to use for a widget. All other style values
+ * are left untouched. See gtk_widget_override_color().
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_override_background_color (GtkWidget     *widget,
+                                      GtkStateFlags  state,
+                                      const GdkRGBA *color)
+{
+  GtkStyleProperties *properties;
+  GtkStyleContext *context;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  properties = _gtk_widget_get_modifier_properties (widget);
+
+  gtk_style_properties_set (properties, state,
+                            "background-color", color,
+                            NULL);
+
+  context = gtk_widget_get_style_context (widget);
+  gtk_style_context_invalidate (context);
+
+  g_signal_emit (widget,
+                 widget_signals[STYLE_SET],
+                 0,
+                 widget->priv->style);
+}
+
+/**
+ * gtk_widget_override_font:
+ * @widget: a #GtkWidget
+ * @font_desc: the font descriptiong to use, or %NULL to undo
+ *             the effect of previous calls to
+ *             gtk_widget_override_font().
+ *
+ * Sets the font to use for a widget. All other style values are
+ * left untouched. See gtk_widget_override_color().
+ *
+ * Since: 3.0
+ **/
+void
+gtk_widget_override_font (GtkWidget                  *widget,
+                          const PangoFontDescription *font_desc)
+{
+  GtkStyleProperties *properties;
+  GtkStyleContext *context;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+
+  properties = _gtk_widget_get_modifier_properties (widget);
+
+  gtk_style_properties_set (properties, 0,
+                            "font", font_desc,
+                            NULL);
+
+  context = gtk_widget_get_style_context (widget);
+  gtk_style_context_invalidate (context);
+
+  g_signal_emit (widget,
+                 widget_signals[STYLE_SET],
+                 0,
+                 widget->priv->style);
+}
+
+/**
+ * gtk_widget_override_symbolic_color:
  * @widget: a #GtkWidget
  * @name: the name of the symbolic color to modify
  * @color: (allow-none): the color to assign (does not need to be allocated),
  *         or %NULL to undo the effect of previous calls to
- *         of gtk_widget_modify_symbolic_color().
+ *         gtk_widget_override_symbolic_color().
  *
- * Sets a symbolic color for a widget.
- * All other style values are left untouched. See also
- * gtk_widget_modify_style().
+ * Sets a symbolic color for a widget, All other style values are left
+ * untouched. See gtk_widget_override_color().
  *
  * Since: 3.0
  **/
 void
-gtk_widget_modify_symbolic_color (GtkWidget      *widget,
-                                  const gchar    *name,
-                                  const GdkColor *color)
+gtk_widget_override_symbolic_color (GtkWidget     *widget,
+                                    const gchar   *name,
+                                    const GdkRGBA *color)
 {
-  GtkRcStyle *rc_style = gtk_widget_get_modifier_style (widget);
+  GtkStyleProperties *properties;
+  GtkStyleContext *context;
+  GtkSymbolicColor *symbolic_color;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  _gtk_rc_style_set_symbolic_color (rc_style, name, color);
+  properties = _gtk_widget_get_modifier_properties (widget);
+  symbolic_color = gtk_symbolic_color_new_literal (color);
 
-  gtk_widget_modify_style (widget, rc_style);
+  gtk_style_properties_map_color (properties,
+                                  name, symbolic_color);
+
+  gtk_symbolic_color_unref (symbolic_color);
+
+  context = gtk_widget_get_style_context (widget);
+  gtk_style_context_invalidate (context);
+
+  g_signal_emit (widget,
+                 widget_signals[STYLE_SET],
+                 0,
+                 widget->priv->style);
 }
 
 /**
@@ -7903,10 +8083,42 @@ gtk_widget_modify_fg (GtkWidget      *widget,
 		      GtkStateType    state,
 		      const GdkColor *color)
 {
+  GtkStateFlags flags;
+  GdkRGBA rgba;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
 
-  gtk_widget_modify_color_component (widget, GTK_RC_FG, state, color);
+  switch (state)
+    {
+    case GTK_STATE_ACTIVE:
+      flags = GTK_STATE_FLAG_ACTIVE;
+      break;
+    case GTK_STATE_PRELIGHT:
+      flags = GTK_STATE_FLAG_PRELIGHT;
+      break;
+    case GTK_STATE_SELECTED:
+      flags = GTK_STATE_FLAG_SELECTED;
+      break;
+    case GTK_STATE_INSENSITIVE:
+      flags = GTK_STATE_FLAG_INSENSITIVE;
+      break;
+    case GTK_STATE_NORMAL:
+    default:
+      flags = 0;
+    }
+
+  if (color)
+    {
+      rgba.red = color->red / 65535.;
+      rgba.green = color->green / 65535.;
+      rgba.blue = color->blue / 65535.;
+      rgba.alpha = 1;
+
+      gtk_widget_override_color (widget, state, &rgba);
+    }
+  else
+    gtk_widget_override_color (widget, state, NULL);
 }
 
 /**
@@ -7934,10 +8146,42 @@ gtk_widget_modify_bg (GtkWidget      *widget,
 		      GtkStateType    state,
 		      const GdkColor *color)
 {
+  GtkStateFlags flags;
+  GdkRGBA rgba;
+
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (state >= GTK_STATE_NORMAL && state <= GTK_STATE_INSENSITIVE);
 
-  gtk_widget_modify_color_component (widget, GTK_RC_BG, state, color);
+  switch (state)
+    {
+    case GTK_STATE_ACTIVE:
+      flags = GTK_STATE_FLAG_ACTIVE;
+      break;
+    case GTK_STATE_PRELIGHT:
+      flags = GTK_STATE_FLAG_PRELIGHT;
+      break;
+    case GTK_STATE_SELECTED:
+      flags = GTK_STATE_FLAG_SELECTED;
+      break;
+    case GTK_STATE_INSENSITIVE:
+      flags = GTK_STATE_FLAG_INSENSITIVE;
+      break;
+    case GTK_STATE_NORMAL:
+    default:
+      flags = 0;
+    }
+
+  if (color)
+    {
+      rgba.red = color->red / 65535.;
+      rgba.green = color->green / 65535.;
+      rgba.blue = color->blue / 65535.;
+      rgba.alpha = 1;
+
+      gtk_widget_override_background_color (widget, state, &rgba);
+    }
+  else
+    gtk_widget_override_background_color (widget, state, NULL);
 }
 
 /**
@@ -8075,21 +8319,9 @@ void
 gtk_widget_modify_font (GtkWidget            *widget,
 			PangoFontDescription *font_desc)
 {
-  GtkRcStyle *rc_style;
-
   g_return_if_fail (GTK_IS_WIDGET (widget));
 
-  rc_style = gtk_widget_get_modifier_style (widget);
-
-  if (rc_style->font_desc)
-    pango_font_description_free (rc_style->font_desc);
-
-  if (font_desc)
-    rc_style->font_desc = pango_font_description_copy (font_desc);
-  else
-    rc_style->font_desc = NULL;
-
-  gtk_widget_modify_style (widget, rc_style);
+  gtk_widget_override_font (widget, font_desc);
 }
 
 static void
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 8e3a2c4..3907dfb 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -760,6 +760,21 @@ gboolean     gtk_widget_translate_coordinates (GtkWidget  *src_widget,
  */
 gboolean     gtk_widget_hide_on_delete	(GtkWidget	*widget);
 
+/* Functions to override widget styling */
+void         gtk_widget_override_color            (GtkWidget     *widget,
+                                                   GtkStateFlags  state,
+                                                   const GdkRGBA *color);
+void         gtk_widget_override_background_color (GtkWidget     *widget,
+                                                   GtkStateFlags  state,
+                                                   const GdkRGBA *color);
+
+void         gtk_widget_override_font (GtkWidget                  *widget,
+                                       const PangoFontDescription *font_desc);
+
+void         gtk_widget_override_symbolic_color (GtkWidget         *widget,
+                                                 const gchar       *name,
+                                                 const GdkRGBA     *color);
+
 /* Widget styles.
  */
 void        gtk_widget_style_attach       (GtkWidget            *widget);
@@ -790,9 +805,6 @@ void        gtk_widget_modify_cursor      (GtkWidget            *widget,
 					   const GdkColor       *secondary);
 void        gtk_widget_modify_font        (GtkWidget            *widget,
 					   PangoFontDescription *font_desc);
-void        gtk_widget_modify_symbolic_color (GtkWidget         *widget,
-                                           const gchar          *name,
-                                           const GdkColor       *color);
 
 PangoContext *gtk_widget_create_pango_context (GtkWidget   *widget);
 PangoContext *gtk_widget_get_pango_context    (GtkWidget   *widget);



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