summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/Makefile.am2
-rw-r--r--gtk/gtkcssiconthemevalue.c135
-rw-r--r--gtk/gtkcssiconthemevalueprivate.h32
-rw-r--r--gtk/gtkcssstylepropertyimpl.c19
-rw-r--r--gtk/gtkcsstypesprivate.h1
5 files changed, 189 insertions, 0 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am
index d44a4dcec8..2daf367432 100644
--- a/gtk/Makefile.am
+++ b/gtk/Makefile.am
@@ -377,6 +377,7 @@ gtk_private_h_sources = \
gtkcsseasevalueprivate.h \
gtkcssenginevalueprivate.h \
gtkcssenumvalueprivate.h \
+ gtkcssiconthemevalueprivate.h \
gtkcssimagebuiltinprivate.h \
gtkcssimagecrossfadeprivate.h \
gtkcssimagegradientprivate.h \
@@ -605,6 +606,7 @@ gtk_base_c_sources = \
gtkcsseasevalue.c \
gtkcssenumvalue.c \
gtkcssenginevalue.c \
+ gtkcssiconthemevalue.c \
gtkcssimage.c \
gtkcssimagebuiltin.c \
gtkcssimagecrossfade.c \
diff --git a/gtk/gtkcssiconthemevalue.c b/gtk/gtkcssiconthemevalue.c
new file mode 100644
index 0000000000..8422f2cbc6
--- /dev/null
+++ b/gtk/gtkcssiconthemevalue.c
@@ -0,0 +1,135 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2011 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkcssiconthemevalueprivate.h"
+
+#include "gtkicontheme.h"
+#include "gtksettingsprivate.h"
+#include "gtkstyleproviderprivate.h"
+
+/*
+ * The idea behind this value (and the '-gtk-icon-theme' CSS property) is
+ * to track changes to the icon theme.
+ *
+ * We create a new instance of this value whenever the icon theme changes
+ * (via emitting the changed signal). So as long as the icon theme does
+ * not change, we will compute the same value. We can then compare values
+ * by pointer to see if the icon theme changed.
+ */
+
+struct _GtkCssValue {
+ GTK_CSS_VALUE_BASE
+ GtkIconTheme *icontheme;
+ guint changed_id;
+};
+
+static void
+gtk_css_value_icon_theme_disconnect_handler (GtkCssValue *value)
+{
+ if (value->changed_id == 0)
+ return;
+
+ g_object_set_data (G_OBJECT (value->icontheme), "-gtk-css-value", NULL);
+
+ g_signal_handler_disconnect (value->icontheme, value->changed_id);
+ value->changed_id = 0;
+}
+
+static void
+gtk_css_value_icon_theme_changed_cb (GtkIconTheme *icontheme,
+ GtkCssValue *value)
+{
+ gtk_css_value_icon_theme_disconnect_handler (value);
+}
+
+static void
+gtk_css_value_icon_theme_free (GtkCssValue *value)
+{
+ gtk_css_value_icon_theme_disconnect_handler (value);
+
+ if (value->icontheme)
+ g_object_unref (value->icontheme);
+
+ g_slice_free (GtkCssValue, value);
+}
+
+static GtkCssValue *
+gtk_css_value_icon_theme_compute (GtkCssValue *icon_theme,
+ guint property_id,
+ GtkStyleProviderPrivate *provider,
+ int scale,
+ GtkCssStyle *style,
+ GtkCssStyle *parent_style,
+ GtkCssDependencies *dependencies)
+{
+ GtkCssValue *result;
+ GtkIconTheme *icontheme;
+
+ icontheme = gtk_icon_theme_get_for_screen (_gtk_settings_get_screen (_gtk_style_provider_private_get_settings (provider)));
+
+ result = g_object_get_data (G_OBJECT (icontheme), "-gtk-css-value");
+ if (result)
+ return _gtk_css_value_ref (result);
+
+ result = _gtk_css_icon_theme_value_new ();
+ result->icontheme = g_object_ref (icontheme);
+
+ g_object_set_data (G_OBJECT (icontheme), "-gtk-css-value", result);
+ result->changed_id = g_signal_connect (icontheme, "changed", G_CALLBACK (gtk_css_value_icon_theme_changed_cb), result);
+
+ return result;
+}
+
+static gboolean
+gtk_css_value_icon_theme_equal (const GtkCssValue *value1,
+ const GtkCssValue *value2)
+{
+ return FALSE;
+}
+
+static GtkCssValue *
+gtk_css_value_icon_theme_transition (GtkCssValue *start,
+ GtkCssValue *end,
+ guint property_id,
+ double progress)
+{
+ return NULL;
+}
+
+static void
+gtk_css_value_icon_theme_print (const GtkCssValue *icon_theme,
+ GString *string)
+{
+ g_string_append (string, "initial");
+}
+
+static const GtkCssValueClass GTK_CSS_VALUE_ICON_THEME = {
+ gtk_css_value_icon_theme_free,
+ gtk_css_value_icon_theme_compute,
+ gtk_css_value_icon_theme_equal,
+ gtk_css_value_icon_theme_transition,
+ gtk_css_value_icon_theme_print
+};
+
+GtkCssValue *
+_gtk_css_icon_theme_value_new (void)
+{
+ return _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_ICON_THEME);
+}
+
diff --git a/gtk/gtkcssiconthemevalueprivate.h b/gtk/gtkcssiconthemevalueprivate.h
new file mode 100644
index 0000000000..6acfdc6f3f
--- /dev/null
+++ b/gtk/gtkcssiconthemevalueprivate.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright © 2012 Red Hat Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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, see <http://www.gnu.org/licenses/>.
+ *
+ * Authors: Alexander Larsson <alexl@gnome.org>
+ */
+
+#ifndef __GTK_CSS_ICON_THEME_VALUE_PRIVATE_H__
+#define __GTK_CSS_ICON_THEME_VALUE_PRIVATE_H__
+
+#include "gtkcssparserprivate.h"
+#include "gtkcssvalueprivate.h"
+
+G_BEGIN_DECLS
+
+GtkCssValue * _gtk_css_icon_theme_value_new (void);
+
+G_END_DECLS
+
+#endif /* __GTK_CSS_ICON_THEME_VALUE_PRIVATE_H__ */
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index bc40a06357..9f6b48192d 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -45,6 +45,7 @@
#include "gtkcsscornervalueprivate.h"
#include "gtkcsseasevalueprivate.h"
#include "gtkcssenginevalueprivate.h"
+#include "gtkcssiconthemevalueprivate.h"
#include "gtkcssimageprivate.h"
#include "gtkcssimagebuiltinprivate.h"
#include "gtkcssimagegradientprivate.h"
@@ -945,6 +946,15 @@ background_position_parse (GtkCssStyleProperty *property,
return _gtk_css_array_value_parse (parser, _gtk_css_position_value_parse);
}
+static GtkCssValue *
+icon_theme_value_parse (GtkCssStyleProperty *property,
+ GtkCssParser *parser)
+{
+ _gtk_css_parser_error (parser, "Only 'inherit', 'initial' or 'unset' are allowed");
+
+ return NULL;
+}
+
/*** REGISTRATION ***/
void
@@ -975,6 +985,15 @@ _gtk_css_style_property_init_properties (void)
/* properties that aren't referenced when computing values
* start here */
+ gtk_css_style_property_register ("-gtk-icon-theme",
+ GTK_CSS_PROPERTY_ICON_THEME,
+ G_TYPE_NONE,
+ GTK_STYLE_PROPERTY_INHERIT,
+ GTK_CSS_AFFECTS_ICON,
+ icon_theme_value_parse,
+ NULL,
+ NULL,
+ _gtk_css_icon_theme_value_new());
gtk_css_style_property_register ("background-color",
GTK_CSS_PROPERTY_BACKGROUND_COLOR,
GDK_TYPE_RGBA,
diff --git a/gtk/gtkcsstypesprivate.h b/gtk/gtkcsstypesprivate.h
index 88bc6f647a..b586623185 100644
--- a/gtk/gtkcsstypesprivate.h
+++ b/gtk/gtkcsstypesprivate.h
@@ -111,6 +111,7 @@ typedef enum /*< skip >*/ {
enum { /*< skip >*/
GTK_CSS_PROPERTY_COLOR,
GTK_CSS_PROPERTY_FONT_SIZE,
+ GTK_CSS_PROPERTY_ICON_THEME,
GTK_CSS_PROPERTY_BACKGROUND_COLOR,
GTK_CSS_PROPERTY_FONT_FAMILY,
GTK_CSS_PROPERTY_FONT_STYLE,