};
/* --- prototypes --- */
+static void gtk_settings_provider_iface_init (GtkStyleProviderIface *iface);
+
static void gtk_settings_finalize (GObject *object);
static void gtk_settings_get_property (GObject *object,
guint property_id,
static guint class_n_properties = 0;
-G_DEFINE_TYPE (GtkSettings, gtk_settings, G_TYPE_OBJECT)
+G_DEFINE_TYPE_EXTENDED (GtkSettings, gtk_settings, G_TYPE_OBJECT, 0,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_STYLE_PROVIDER,
+ gtk_settings_provider_iface_init));
/* --- functions --- */
static void
g_assert (result == PROP_IM_STATUS_STYLE);
}
+static GtkStyleSet *
+gtk_settings_get_style (GtkStyleProvider *provider,
+ GtkWidgetPath *path)
+{
+ PangoFontDescription *font_desc;
+ gchar *font_name, *color_scheme;
+ GtkSettings *settings;
+ GtkStyleSet *set;
+ gchar **colors;
+ guint i;
+
+ settings = GTK_SETTINGS (provider);
+ set = gtk_style_set_new ();
+
+ g_object_get (settings,
+ "gtk-font-name", &font_name,
+ "gtk-color-scheme", &color_scheme,
+ NULL);
+
+ colors = g_strsplit_set (color_scheme, "\n;", -1);
+
+ for (i = 0; colors[i]; i++)
+ {
+ gchar *name, *pos;
+ GdkColor col;
+
+ if (!*colors[i])
+ continue;
+
+ name = colors[i];
+ pos = strchr (colors[i], ':');
+
+ if (!pos)
+ continue;
+
+ /* Set NUL after color name */
+ *pos = '\0';
+ pos++;
+
+ /* Find start of color string */
+ while (*pos == ' ')
+ pos++;
+
+ if (!*pos || !gdk_color_parse (pos, &col))
+ continue;
+
+ gtk_style_set_map_color (set, name,
+ gtk_symbolic_color_new_literal (&col));
+ }
+
+ font_desc = pango_font_description_from_string (font_name);
+
+ gtk_style_set_set (set, 0,
+ "font", font_desc,
+ NULL);
+
+ pango_font_description_free (font_desc);
+ g_strfreev (colors);
+ g_free (color_scheme);
+ g_free (font_name);
+
+ return set;
+}
+
+static void
+gtk_settings_provider_iface_init (GtkStyleProviderIface *iface)
+{
+ iface->get_style = gtk_settings_get_style;
+}
+
static void
gtk_settings_finalize (GObject *object)
{
#define GTK_STYLE_PROVIDER_PRIORITY_FALLBACK 1
#define GTK_STYLE_PROVIDER_PRIORITY_DEFAULT 200
-#define GTK_STYLE_PROVIDER_PRIORITY_APPLICATION 400
-#define GTK_STYLE_PROVIDER_PRIORITY_USER 600
+#define GTK_STYLE_PROVIDER_PRIORITY_SETTINGS 400
+#define GTK_STYLE_PROVIDER_PRIORITY_APPLICATION 600
+#define GTK_STYLE_PROVIDER_PRIORITY_USER 800
typedef struct GtkStyleProviderIface GtkStyleProviderIface;
typedef struct GtkStyleProvider GtkStyleProvider; /* dummy typedef */
static GtkCssProvider *css_provider = NULL;
GtkCssProvider *default_provider;
GtkWidgetPath *path;
+ GtkSettings *settings;
context = g_object_new (GTK_TYPE_STYLE_CONTEXT,
"direction", gtk_widget_get_direction (widget),
GTK_STYLE_PROVIDER (default_provider),
GTK_STYLE_PROVIDER_PRIORITY_FALLBACK);
+ settings = gtk_widget_get_settings (widget);
+ gtk_style_context_add_provider (context,
+ GTK_STYLE_PROVIDER (settings),
+ GTK_STYLE_PROVIDER_PRIORITY_SETTINGS);
+
path = gtk_widget_get_path (widget);
gtk_style_context_set_path (context, path);
gtk_widget_path_free (path);