X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtksettings.c;h=3c9036c434830ae067631f653bee701a5a50d175;hb=bb3c56abe2e7916126bd4f8234dee080b5381941;hp=47328f10497b43d67fd3d8955676d35010fc6375;hpb=b1ad5c8abc2ca054bbf19ffddfb0a0af7195e50c;p=~andy%2Fgtk diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index 47328f104..3c9036c43 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -32,7 +32,6 @@ #include "gtkprivate.h" #include "gtkcssproviderprivate.h" #include "gtkstyleproviderprivate.h" -#include "gtksymboliccolor.h" #include "gtktypebuiltins.h" #include "gtkversion.h" @@ -115,7 +114,6 @@ struct _GtkSettingsPrivate GdkScreen *screen; GtkCssProvider *theme_provider; GtkCssProvider *key_theme_provider; - GtkStyleProperties *style; }; typedef enum @@ -213,7 +211,8 @@ enum { PROP_IM_STATUS_STYLE, PROP_SHELL_SHOWS_APP_MENU, PROP_SHELL_SHOWS_MENUBAR, - PROP_ENABLE_PRIMARY_PASTE + PROP_ENABLE_PRIMARY_PASTE, + PROP_RECENT_FILES_ENABLED }; /* --- prototypes --- */ @@ -241,15 +240,9 @@ static void settings_update_cursor_theme (GtkSettings *setting static void settings_update_resolution (GtkSettings *settings); static void settings_update_font_options (GtkSettings *settings); static gboolean settings_update_fontconfig (GtkSettings *settings); -static void settings_update_color_scheme (GtkSettings *settings); static void settings_update_theme (GtkSettings *settings); static void settings_update_key_theme (GtkSettings *settings); -static void merge_color_scheme (GtkSettings *settings, - const GValue *value, - GtkSettingsSource source); -static gchar *get_color_scheme (GtkSettings *settings); -static GHashTable *get_color_hash (GtkSettings *settings); static void gtk_settings_load_from_key_file (GtkSettings *settings, const gchar *path, GtkSettingsSource source); @@ -694,6 +687,9 @@ gtk_settings_class_init (GtkSettingsClass *class) * * * Since: 2.10 + * + * Deprecated: 3.8: Color scheme support was dropped and is no longer supported. + * You can still set this property, but it will be ignored. */ result = settings_install_property_parser (class, g_param_spec_string ("gtk-color-scheme", @@ -869,6 +865,8 @@ gtk_settings_class_init (GtkSettingsClass *class) * setting, mapping color names to #GdkColors. * * Since: 2.10 + * + * Deprecated: 3.8: Will always return an empty hash table. */ result = settings_install_property_parser (class, g_param_spec_boxed ("color-hash", @@ -1409,152 +1407,49 @@ gtk_settings_class_init (GtkSettingsClass *class) NULL); g_assert (result == PROP_ENABLE_PRIMARY_PASTE); - g_type_class_add_private (class, sizeof (GtkSettingsPrivate)); -} - -static void -settings_ensure_style (GtkSettings *settings) -{ - GtkSettingsPrivate *priv = settings->priv; - PangoFontDescription *font_desc; - gchar *font_name, *color_scheme; - gchar **colors; - guint i; - - if (priv->style) - return; - - priv->style = gtk_style_properties_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++) - { - GtkSymbolicColor *color; - gchar *name, *pos; - GdkRGBA 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_rgba_parse (&col, pos)) - continue; - - color = gtk_symbolic_color_new_literal (&col); - gtk_style_properties_map_color (priv->style, name, color); - gtk_symbolic_color_unref (color); - } - - font_desc = pango_font_description_from_string (font_name); - - /* Unset normal attributes from this description, - * so they do not override theme values */ - if (pango_font_description_get_weight (font_desc) == PANGO_WEIGHT_NORMAL) - pango_font_description_unset_fields (font_desc, - PANGO_FONT_MASK_WEIGHT); - - if (pango_font_description_get_stretch (font_desc) == PANGO_STRETCH_NORMAL) - pango_font_description_unset_fields (font_desc, - PANGO_FONT_MASK_STRETCH); - - if (pango_font_description_get_variant (font_desc) == PANGO_VARIANT_NORMAL) - pango_font_description_unset_fields (font_desc, - PANGO_FONT_MASK_VARIANT); - - if (pango_font_description_get_style (font_desc) == PANGO_STYLE_NORMAL) - pango_font_description_unset_fields (font_desc, - PANGO_FONT_MASK_STYLE); - - gtk_style_properties_set (priv->style, 0, - "font", font_desc, - NULL); - - pango_font_description_free (font_desc); - g_strfreev (colors); - g_free (color_scheme); - g_free (font_name); -} - -static GtkStyleProperties * -gtk_settings_get_style (GtkStyleProvider *provider, - GtkWidgetPath *path) -{ - GtkSettings *settings; - - settings = GTK_SETTINGS (provider); - - settings_ensure_style (settings); + /** + * GtkSettings:gtk-recent-files-enabled: + * + * Whether GTK+ should keep track of items inside the recently used + * resources list. If set to %FALSE, the list will always be empty. + * + * Since: 3.8 + */ + result = settings_install_property_parser (class, + g_param_spec_boolean ("gtk-recent-files-enabled", + P_("Recent Files Enabled"), + P_("Whether GTK+ remembers recent files"), + TRUE, + GTK_PARAM_READWRITE), + NULL); + g_assert (result == PROP_RECENT_FILES_ENABLED); - return g_object_ref (settings->priv->style); + g_type_class_add_private (class, sizeof (GtkSettingsPrivate)); } static void gtk_settings_provider_iface_init (GtkStyleProviderIface *iface) { - iface->get_style = gtk_settings_get_style; -} - -static GtkSymbolicColor * -gtk_settings_style_provider_get_color (GtkStyleProviderPrivate *provider, - const char *name) -{ - GtkSettings *settings = GTK_SETTINGS (provider); - - settings_ensure_style (settings); - - return _gtk_style_provider_private_get_color (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style), name); -} - -static void -gtk_settings_style_provider_lookup (GtkStyleProviderPrivate *provider, - const GtkCssMatcher *matcher, - GtkCssLookup *lookup) -{ - GtkSettings *settings = GTK_SETTINGS (provider); - - settings_ensure_style (settings); - - _gtk_style_provider_private_lookup (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style), - matcher, - lookup); } static GtkCssChange gtk_settings_style_provider_get_change (GtkStyleProviderPrivate *provider, - const GtkCssMatcher *matcher) + const GtkCssMatcher *matcher) { - GtkSettings *settings = GTK_SETTINGS (provider); + return 0; +} - settings_ensure_style (settings); - return _gtk_style_provider_private_get_change (GTK_STYLE_PROVIDER_PRIVATE (settings->priv->style), - matcher); +static GtkSettings * +gtk_settings_style_provider_get_settings (GtkStyleProviderPrivate *provider) +{ + return GTK_SETTINGS (provider); } static void gtk_settings_provider_private_init (GtkStyleProviderPrivateInterface *iface) { - iface->get_color = gtk_settings_style_provider_get_color; - iface->lookup = gtk_settings_style_provider_lookup; + iface->get_settings = gtk_settings_style_provider_get_settings; iface->get_change = gtk_settings_style_provider_get_change; } @@ -1576,8 +1471,6 @@ gtk_settings_finalize (GObject *object) settings_update_provider (priv->screen, &priv->theme_provider, NULL); settings_update_provider (priv->screen, &priv->key_theme_provider, NULL); - g_clear_object (&priv->style); - G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object); } @@ -1661,7 +1554,6 @@ gtk_settings_get_for_screen (GdkScreen *screen) settings_update_cursor_theme (settings); settings_update_resolution (settings); settings_update_font_options (settings); - settings_update_color_scheme (settings); } return settings; @@ -1698,9 +1590,6 @@ gtk_settings_set_property (GObject *object, g_value_copy (value, &priv->property_values[property_id - 1].value); priv->property_values[property_id - 1].source = GTK_SETTINGS_SOURCE_APPLICATION; - - if (pspec->param_id == PROP_COLOR_SCHEME) - merge_color_scheme (settings, value, GTK_SETTINGS_SOURCE_APPLICATION); } static void @@ -1718,10 +1607,9 @@ gtk_settings_get_property (GObject *object, switch (property_id) { case PROP_COLOR_HASH: - g_value_set_boxed (value, get_color_hash (settings)); - return; - case PROP_COLOR_SCHEME: - g_value_take_string (value, get_color_scheme (settings)); + g_value_take_boxed (value, + g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, (GDestroyNotify) gdk_color_free)); return; default: ; } @@ -1788,14 +1676,6 @@ gtk_settings_get_property (GObject *object, static void settings_invalidate_style (GtkSettings *settings) { - GtkSettingsPrivate *priv = settings->priv; - - if (priv->style) - { - g_object_unref (priv->style); - priv->style = NULL; - } - _gtk_style_provider_private_changed (GTK_STYLE_PROVIDER_PRIVATE (settings)); } @@ -1819,11 +1699,6 @@ gtk_settings_notify (GObject *object, case PROP_DOUBLE_CLICK_DISTANCE: settings_update_double_click (settings); break; - case PROP_COLOR_SCHEME: - settings_update_color_scheme (settings); - settings_invalidate_style (settings); - gtk_style_context_reset_widgets (priv->screen); - break; case PROP_FONT_NAME: settings_invalidate_style (settings); gtk_style_context_reset_widgets (priv->screen); @@ -1854,6 +1729,9 @@ gtk_settings_notify (GObject *object, if (settings_update_fontconfig (settings)) gtk_style_context_reset_widgets (priv->screen); break; + case PROP_ENABLE_ANIMATIONS: + gtk_style_context_reset_widgets (priv->screen); + break; case PROP_CURSOR_THEME_NAME: case PROP_CURSOR_THEME_SIZE: settings_update_cursor_theme (settings); @@ -1942,9 +1820,6 @@ apply_queued_setting (GtkSettings *settings, if (_gtk_settings_parse_convert (parser, &qvalue->public.value, pspec, &tmp_value)) { - if (pspec->param_id == PROP_COLOR_SCHEME) - merge_color_scheme (settings, &tmp_value, qvalue->source); - if (priv->property_values[pspec->param_id - 1].source <= qvalue->source) { g_value_copy (&tmp_value, &priv->property_values[pspec->param_id - 1].value); @@ -2575,28 +2450,13 @@ _gtk_settings_handle_event (GdkEventSetting *event) GdkScreen *screen; GtkSettings *settings; GParamSpec *pspec; - guint property_id; screen = gdk_window_get_screen (event->window); settings = gtk_settings_get_for_screen (screen); pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (settings), event->name); if (pspec) - { - property_id = pspec->param_id; - - if (property_id == PROP_COLOR_SCHEME) - { - GValue value = G_VALUE_INIT; - - g_value_init (&value, G_TYPE_STRING); - if (!gdk_screen_get_setting (screen, pspec->name, &value)) - g_value_set_static_string (&value, ""); - merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); - g_value_unset (&value); - } - g_object_notify (G_OBJECT (settings), pspec->name); - } + g_object_notify (G_OBJECT (settings), pspec->name); } static void @@ -2844,54 +2704,6 @@ settings_update_resolution (GtkSettings *settings) gdk_screen_set_resolution (priv->screen, dpi); } -typedef struct -{ - GHashTable *color_hash; - GHashTable *tables[GTK_SETTINGS_SOURCE_APPLICATION + 1]; - gchar *lastentry[GTK_SETTINGS_SOURCE_APPLICATION + 1]; -} ColorSchemeData; - -static void -color_scheme_data_free (ColorSchemeData *data) -{ - gint i; - - g_hash_table_unref (data->color_hash); - - for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) - { - if (data->tables[i]) - g_hash_table_unref (data->tables[i]); - g_free (data->lastentry[i]); - } - - g_slice_free (ColorSchemeData, data); -} - -static void -settings_update_color_scheme (GtkSettings *settings) -{ - if (!g_object_get_data (G_OBJECT (settings), "gtk-color-scheme")) - { - GtkSettingsPrivate *priv = settings->priv; - ColorSchemeData *data; - GValue value = G_VALUE_INIT; - - data = g_slice_new0 (ColorSchemeData); - data->color_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify) gdk_color_free); - g_object_set_data_full (G_OBJECT (settings), "gtk-color-scheme", - data, (GDestroyNotify) color_scheme_data_free); - - g_value_init (&value, G_TYPE_STRING); - if (priv->screen && gdk_screen_get_setting (priv->screen, "gtk-color-scheme", &value)) - { - merge_color_scheme (settings, &value, GTK_SETTINGS_SOURCE_XSETTING); - g_value_unset (&value); - } - } -} - static void settings_update_provider (GdkScreen *screen, GtkCssProvider **old, @@ -2976,236 +2788,6 @@ settings_update_key_theme (GtkSettings *settings) g_free (key_theme_name); } -static gboolean -add_color_to_hash (gchar *name, - GdkColor *color, - GHashTable *target) -{ - GdkColor *old; - - old = g_hash_table_lookup (target, name); - if (!old || !gdk_color_equal (old, color)) - { - g_hash_table_insert (target, g_strdup (name), gdk_color_copy (color)); - - return TRUE; - } - - return FALSE; -} - -static gboolean -add_colors_to_hash_from_string (GHashTable *hash, - const gchar *colors) -{ - gchar *s, *p, *name; - GdkColor color; - gboolean changed = FALSE; - gchar *copy; - - copy = g_strdup (colors); - s = copy; - while (s && *s) - { - name = s; - p = strchr (s, ':'); - if (p) - { - *p = '\0'; - p++; - } - else - break; - - while (*p == ' ') - p++; - - s = p; - while (*s) - { - if (*s == '\n' || *s == ';') - { - *s = '\0'; - s++; - break; - } - s++; - } - - if (gdk_color_parse (p, &color)) - changed |= add_color_to_hash (name, &color, hash); - } - - g_free (copy); - - return changed; -} - -static gboolean -update_color_hash (ColorSchemeData *data, - const gchar *str, - GtkSettingsSource source) -{ - gboolean changed = FALSE; - gint i; - GHashTable *old_hash; - GHashTableIter iter; - gpointer name; - gpointer color; - - if ((str == NULL || *str == '\0') && - (data->lastentry[source] == NULL || data->lastentry[source][0] == '\0')) - return FALSE; - - if (str && data->lastentry[source] && strcmp (str, data->lastentry[source]) == 0) - return FALSE; - - /* For the THEME source we merge the values rather than over-writing - * them, since multiple rc files might define independent sets of colors - */ - if ((source != GTK_SETTINGS_SOURCE_THEME) && - data->tables[source] && g_hash_table_size (data->tables[source]) > 0) - { - g_hash_table_unref (data->tables[source]); - data->tables[source] = NULL; - changed = TRUE; /* We can't rely on the code below since str might be "" */ - } - - if (data->tables[source] == NULL) - data->tables[source] = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - (GDestroyNotify) gdk_color_free); - - g_free (data->lastentry[source]); - data->lastentry[source] = g_strdup (str); - - changed |= add_colors_to_hash_from_string (data->tables[source], str); - - if (!changed) - return FALSE; - - /* Rebuild the merged hash table. */ - if (data->color_hash) - { - old_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, - (GDestroyNotify) gdk_color_free); - - g_hash_table_iter_init (&iter, data->color_hash); - while (g_hash_table_iter_next (&iter, &name, &color)) - { - g_hash_table_insert (old_hash, name, color); - g_hash_table_iter_steal (&iter); - } - } - else - { - old_hash = NULL; - } - - for (i = 0; i <= GTK_SETTINGS_SOURCE_APPLICATION; i++) - { - if (data->tables[i]) - g_hash_table_foreach (data->tables[i], (GHFunc) add_color_to_hash, - data->color_hash); - } - - if (old_hash) - { - /* now check if the merged hash has changed */ - changed = FALSE; - if (g_hash_table_size (old_hash) != g_hash_table_size (data->color_hash)) - changed = TRUE; - else - { - GHashTableIter iter; - gpointer key, value, new_value; - - g_hash_table_iter_init (&iter, old_hash); - while (g_hash_table_iter_next (&iter, &key, &value)) - { - new_value = g_hash_table_lookup (data->color_hash, key); - if (!new_value || !gdk_color_equal (value, new_value)) - { - changed = TRUE; - break; - } - } - } - - g_hash_table_unref (old_hash); - } - else - changed = TRUE; - - return changed; -} - -static void -merge_color_scheme (GtkSettings *settings, - const GValue *value, - GtkSettingsSource source) -{ - ColorSchemeData *data; - const gchar *colors; - - g_object_freeze_notify (G_OBJECT (settings)); - - colors = g_value_get_string (value); - - settings_update_color_scheme (settings); - - data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), - "gtk-color-scheme"); - - if (update_color_hash (data, colors, source)) - g_object_notify (G_OBJECT (settings), "color-hash"); - - g_object_thaw_notify (G_OBJECT (settings)); -} - -static GHashTable * -get_color_hash (GtkSettings *settings) -{ - ColorSchemeData *data; - - settings_update_color_scheme (settings); - - data = (ColorSchemeData *)g_object_get_data (G_OBJECT (settings), - "gtk-color-scheme"); - - return data->color_hash; -} - -static void -append_color_scheme (gpointer key, - gpointer value, - gpointer data) -{ - gchar *name = (gchar *)key; - GdkColor *color = (GdkColor *)value; - GString *string = (GString *)data; - - g_string_append_printf (string, "%s: #%04x%04x%04x\n", - name, color->red, color->green, color->blue); -} - -static gchar * -get_color_scheme (GtkSettings *settings) -{ - ColorSchemeData *data; - GString *string; - - settings_update_color_scheme (settings); - - data = (ColorSchemeData *) g_object_get_data (G_OBJECT (settings), - "gtk-color-scheme"); - - string = g_string_new (""); - - g_hash_table_foreach (data->color_hash, append_color_scheme, string); - - return g_string_free (string, FALSE); -} GdkScreen * _gtk_settings_get_screen (GtkSettings *settings)