X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkmodifierstyle.c;h=4d3cc35194a7afa6b0e0a49ddd6e6e94d7408704;hb=507bf6e5cf9c88b8eed91a4449e4c4558c8c5f84;hp=a8f4d3d72952f0a5a6c6ca7ea02aa50a2cc84171;hpb=0d786985a368d88e8ab4e45fc3607efc5e773732;p=~andy%2Fgtk diff --git a/gtk/gtkmodifierstyle.c b/gtk/gtkmodifierstyle.c index a8f4d3d72..4d3cc3519 100644 --- a/gtk/gtkmodifierstyle.c +++ b/gtk/gtkmodifierstyle.c @@ -12,19 +12,17 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" #include "gtkmodifierstyle.h" +#include "gtkstyleproviderprivate.h" #include "gtkintl.h" -typedef struct GtkModifierStylePrivate GtkModifierStylePrivate; typedef struct StylePropertyValue StylePropertyValue; -struct GtkModifierStylePrivate +struct _GtkModifierStylePrivate { GtkStyleProperties *style; GHashTable *color_properties; @@ -37,15 +35,18 @@ enum { static guint signals [LAST_SIGNAL] = { 0 }; -static void gtk_modifier_style_provider_init (GtkStyleProviderIface *iface); -static void gtk_modifier_style_finalize (GObject *object); +static void gtk_modifier_style_provider_init (GtkStyleProviderIface *iface); +static void gtk_modifier_style_provider_private_init (GtkStyleProviderPrivateInterface *iface); +static void gtk_modifier_style_finalize (GObject *object); -G_DEFINE_TYPE_EXTENDED (GtkModifierStyle, gtk_modifier_style, G_TYPE_OBJECT, 0, +G_DEFINE_TYPE_EXTENDED (GtkModifierStyle, _gtk_modifier_style, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE (GTK_TYPE_STYLE_PROVIDER, - gtk_modifier_style_provider_init)); + gtk_modifier_style_provider_init) + G_IMPLEMENT_INTERFACE (GTK_TYPE_STYLE_PROVIDER_PRIVATE, + gtk_modifier_style_provider_private_init)); static void -gtk_modifier_style_class_init (GtkModifierStyleClass *klass) +_gtk_modifier_style_class_init (GtkModifierStyleClass *klass) { GObjectClass *object_class; @@ -65,7 +66,7 @@ gtk_modifier_style_class_init (GtkModifierStyleClass *klass) } static void -gtk_modifier_style_init (GtkModifierStyle *modifier_style) +_gtk_modifier_style_init (GtkModifierStyle *modifier_style) { GtkModifierStylePrivate *priv; @@ -80,16 +81,6 @@ gtk_modifier_style_init (GtkModifierStyle *modifier_style) priv->style = gtk_style_properties_new (); } -static GtkStyleProperties * -gtk_modifier_style_get_style (GtkStyleProvider *provider, - GtkWidgetPath *path) -{ - GtkModifierStylePrivate *priv; - - priv = GTK_MODIFIER_STYLE (provider)->priv; - return g_object_ref (priv->style); -} - static gboolean gtk_modifier_style_get_style_property (GtkStyleProvider *provider, GtkWidgetPath *path, @@ -98,7 +89,8 @@ gtk_modifier_style_get_style_property (GtkStyleProvider *provider, GValue *value) { GtkModifierStylePrivate *priv; - GdkColor *color; + GdkRGBA *rgba; + GdkColor color; gchar *str; /* Reject non-color types for now */ @@ -110,23 +102,65 @@ gtk_modifier_style_get_style_property (GtkStyleProvider *provider, g_type_name (pspec->owner_type), pspec->name); - color = g_hash_table_lookup (priv->color_properties, str); + rgba = g_hash_table_lookup (priv->color_properties, str); g_free (str); - if (!color) + if (!rgba) return FALSE; - g_value_set_boxed (value, color); + color.red = (guint) (rgba->red * 65535.) + 0.5; + color.green = (guint) (rgba->green * 65535.) + 0.5; + color.blue = (guint) (rgba->blue * 65535.) + 0.5; + + g_value_set_boxed (value, &color); return TRUE; } static void gtk_modifier_style_provider_init (GtkStyleProviderIface *iface) { - iface->get_style = gtk_modifier_style_get_style; iface->get_style_property = gtk_modifier_style_get_style_property; } +static GtkCssValue * +gtk_modifier_style_provider_get_color (GtkStyleProviderPrivate *provider, + const char *name) +{ + GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); + + return _gtk_style_provider_private_get_color (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), name); +} + +static void +gtk_modifier_style_provider_lookup (GtkStyleProviderPrivate *provider, + const GtkCssMatcher *matcher, + GtkCssLookup *lookup) +{ + GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); + + _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), + matcher, + lookup); +} + +static GtkCssChange +gtk_modifier_style_provider_get_change (GtkStyleProviderPrivate *provider, + const GtkCssMatcher *matcher) +{ + GtkModifierStyle *style = GTK_MODIFIER_STYLE (provider); + + return _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (style->priv->style), + matcher); +} + +static void +gtk_modifier_style_provider_private_init (GtkStyleProviderPrivateInterface *iface) +{ + iface->get_color = gtk_modifier_style_provider_get_color; + iface->lookup = gtk_modifier_style_provider_lookup; + iface->get_change = gtk_modifier_style_provider_get_change; +} + static void gtk_modifier_style_finalize (GObject *object) { @@ -136,11 +170,11 @@ gtk_modifier_style_finalize (GObject *object) g_hash_table_destroy (priv->color_properties); g_object_unref (priv->style); - G_OBJECT_CLASS (gtk_modifier_style_parent_class)->finalize (object); + G_OBJECT_CLASS (_gtk_modifier_style_parent_class)->finalize (object); } GtkModifierStyle * -gtk_modifier_style_new (void) +_gtk_modifier_style_new (void) { return g_object_new (GTK_TYPE_MODIFIER_STYLE, NULL); } @@ -152,21 +186,10 @@ modifier_style_set_color (GtkModifierStyle *style, const GdkRGBA *color) { GtkModifierStylePrivate *priv; - GdkRGBA *old_color; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); priv = style->priv; - gtk_style_properties_get (priv->style, state, - prop, &old_color, - NULL); - - if ((!color && !old_color) || - (color && old_color && gdk_rgba_equal (color, old_color))) - { - gdk_rgba_free (old_color); - return; - } if (color) gtk_style_properties_set (priv->style, state, @@ -176,13 +199,13 @@ modifier_style_set_color (GtkModifierStyle *style, gtk_style_properties_unset_property (priv->style, prop, state); g_signal_emit (style, signals[CHANGED], 0); - gdk_rgba_free (old_color); + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); } void -gtk_modifier_style_set_background_color (GtkModifierStyle *style, - GtkStateFlags state, - const GdkRGBA *color) +_gtk_modifier_style_set_background_color (GtkModifierStyle *style, + GtkStateFlags state, + const GdkRGBA *color) { g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); @@ -190,9 +213,9 @@ gtk_modifier_style_set_background_color (GtkModifierStyle *style, } void -gtk_modifier_style_set_color (GtkModifierStyle *style, - GtkStateFlags state, - const GdkRGBA *color) +_gtk_modifier_style_set_color (GtkModifierStyle *style, + GtkStateFlags state, + const GdkRGBA *color) { g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); @@ -200,23 +223,14 @@ gtk_modifier_style_set_color (GtkModifierStyle *style, } void -gtk_modifier_style_set_font (GtkModifierStyle *style, - const PangoFontDescription *font_desc) +_gtk_modifier_style_set_font (GtkModifierStyle *style, + const PangoFontDescription *font_desc) { GtkModifierStylePrivate *priv; - PangoFontDescription *old_font; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); priv = style->priv; - gtk_style_properties_get (priv->style, 0, - "font", &old_font, - NULL); - - if ((!old_font && !font_desc) || - (old_font && font_desc && - pango_font_description_equal (old_font, font_desc))) - return; if (font_desc) gtk_style_properties_set (priv->style, 0, @@ -226,12 +240,13 @@ gtk_modifier_style_set_font (GtkModifierStyle *style, gtk_style_properties_unset_property (priv->style, "font", 0); g_signal_emit (style, signals[CHANGED], 0); + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); } void -gtk_modifier_style_map_color (GtkModifierStyle *style, - const gchar *name, - const GdkRGBA *color) +_gtk_modifier_style_map_color (GtkModifierStyle *style, + const gchar *name, + const GdkRGBA *color) { GtkModifierStylePrivate *priv; GtkSymbolicColor *symbolic_color = NULL; @@ -241,23 +256,28 @@ gtk_modifier_style_map_color (GtkModifierStyle *style, priv = style->priv; + G_GNUC_BEGIN_IGNORE_DEPRECATIONS; + if (color) symbolic_color = gtk_symbolic_color_new_literal (color); gtk_style_properties_map_color (priv->style, name, symbolic_color); + G_GNUC_END_IGNORE_DEPRECATIONS; + g_signal_emit (style, signals[CHANGED], 0); + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); } void -gtk_modifier_style_set_color_property (GtkModifierStyle *style, - GType widget_type, - const gchar *prop_name, - const GdkColor *color) +_gtk_modifier_style_set_color_property (GtkModifierStyle *style, + GType widget_type, + const gchar *prop_name, + const GdkRGBA *color) { GtkModifierStylePrivate *priv; - const GdkColor *old_color; + const GdkRGBA *old_color; gchar *str; g_return_if_fail (GTK_IS_MODIFIER_STYLE (style)); @@ -270,18 +290,23 @@ gtk_modifier_style_set_color_property (GtkModifierStyle *style, old_color = g_hash_table_lookup (priv->color_properties, str); if ((!color && !old_color) || - (color && old_color && gdk_color_equal (color, old_color))) + (color && old_color && gdk_rgba_equal (color, old_color))) { g_free (str); return; } if (color) - g_hash_table_insert (priv->color_properties, str, - gdk_color_copy (color)); + { + g_hash_table_insert (priv->color_properties, str, + gdk_rgba_copy (color)); + } else - g_hash_table_remove (priv->color_properties, str); + { + g_hash_table_remove (priv->color_properties, str); + g_free (str); + } g_signal_emit (style, signals[CHANGED], 0); - g_free (str); + _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (style)); }