From 56c3d4b1be15e294eee8efe964b1307f7bceff29 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Sat, 18 Dec 2010 11:27:26 +0100 Subject: [PATCH] Remove dead Gtk[Rc]Style code Most code in gtkrc.c has been turned into a no-op, but that one reverting in public API (gtk_rc_scanner_new() and such). GtStyle is also more shallow, now fully relies in the backing GtkStyleContext and all connection to gtkrc.c has been removed. GtkBinding has been also affected, there is no replacement yet for custom keybindings in style files, so that piece of code that hooked into gtkrc has been replaced by a FIXME so in the future it may be added back. --- gtk/gtkbindings.c | 407 +--------- gtk/gtkrc.c | 1840 +-------------------------------------------- gtk/gtkrc.h | 18 - gtk/gtksettings.c | 2 - gtk/gtkstyle.c | 481 +----------- gtk/gtkstyle.h | 10 +- gtk/gtkwidget.c | 163 +--- 7 files changed, 117 insertions(+), 2804 deletions(-) diff --git a/gtk/gtkbindings.c b/gtk/gtkbindings.c index 6973a6a2b..fcf531618 100644 --- a/gtk/gtkbindings.c +++ b/gtk/gtkbindings.c @@ -47,7 +47,6 @@ typedef struct { GtkPathType type; GPatternSpec *pspec; - GSList *path; gpointer user_data; guint seq_id; } PatternSpec; @@ -65,7 +64,6 @@ static GQuark key_id_class_binding_set = 0; static void pattern_spec_free (PatternSpec *pspec) { - _gtk_rc_free_widget_class_path (pspec->path); if (pspec->pspec) g_pattern_spec_free (pspec->pspec); g_free (pspec); @@ -972,6 +970,8 @@ gtk_binding_entry_add_signal (GtkBindingSet *binding_set, * * This function is used internally by the GtkRC parsing mechanism to * assign match patterns to #GtkBindingSet structures. + * + * Deprecated: 3.0 */ void gtk_binding_set_add_path (GtkBindingSet *binding_set, @@ -1009,16 +1009,10 @@ gtk_binding_set_add_path (GtkBindingSet *binding_set, pspec = g_new (PatternSpec, 1); pspec->type = path_type; if (path_type == GTK_PATH_WIDGET_CLASS) - { - pspec->pspec = NULL; - pspec->path = _gtk_rc_parse_widget_class_path (path_pattern); - } + pspec->pspec = NULL; else - { - pspec->pspec = g_pattern_spec_new (path_pattern); - pspec->path = NULL; - } - + pspec->pspec = g_pattern_spec_new (path_pattern); + pspec->seq_id = priority << 28; pspec->user_data = binding_set; @@ -1070,13 +1064,8 @@ binding_match_activate (GSList *pspec_list, binding_set = NULL; pspec = slist->data; - - if (pspec->type == GTK_PATH_WIDGET_CLASS) - { - if (_gtk_rc_match_widget_class (pspec->path, path_length, path, path_reversed)) - binding_set = pspec->user_data; - } - else + + if (pspec->type != GTK_PATH_WIDGET_CLASS) { if (g_pattern_match (pspec->pspec, path_length, path, path_reversed)) binding_set = pspec->user_data; @@ -1175,47 +1164,12 @@ gtk_bindings_activate_list (GObject *object, GSList *entries, gboolean is_release) { - GtkWidget *widget = GTK_WIDGET (object); gboolean handled = FALSE; if (!entries) return FALSE; - if (!handled) - { - guint path_length; - gchar *path, *path_reversed; - GSList *patterns; - gboolean unbound; - - gtk_widget_path (widget, &path_length, &path, &path_reversed); - patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET, is_release); - handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound); - g_slist_free (patterns); - g_free (path); - g_free (path_reversed); - - if (unbound) - return FALSE; - } - - if (!handled) - { - guint path_length; - gchar *path, *path_reversed; - GSList *patterns; - gboolean unbound; - - gtk_widget_class_path (widget, &path_length, &path, &path_reversed); - patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET_CLASS, is_release); - handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound); - g_slist_free (patterns); - g_free (path); - g_free (path_reversed); - - if (unbound) - return FALSE; - } + /* FIXME: Add back binding parsing from user config files */ if (!handled) { @@ -1333,348 +1287,3 @@ gtk_bindings_activate_event (GObject *object, return handled; } - -static guint -gtk_binding_parse_signal (GScanner *scanner, - GtkBindingSet *binding_set, - guint keyval, - GdkModifierType modifiers) -{ - gchar *signal; - guint expected_token = 0; - GSList *args; - GSList *slist; - gboolean done; - gboolean negate; - gboolean need_arg; - gboolean seen_comma; - guint token; - - g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); - - g_scanner_get_next_token (scanner); - if (scanner->token != G_TOKEN_STRING) - return G_TOKEN_STRING; - g_scanner_peek_next_token (scanner); - if (scanner->next_token != '(') - { - g_scanner_get_next_token (scanner); - return '('; - } - signal = g_strdup (scanner->value.v_string); - g_scanner_get_next_token (scanner); - - negate = FALSE; - args = NULL; - done = FALSE; - need_arg = TRUE; - seen_comma = FALSE; - scanner->config->scan_symbols = FALSE; - do - { - if (need_arg) - expected_token = G_TOKEN_INT; - else - expected_token = ')'; - - token = g_scanner_get_next_token (scanner); - switch (token) - { - GtkBindingArg *arg; - - case G_TOKEN_FLOAT: - if (need_arg) - { - need_arg = FALSE; - arg = g_new (GtkBindingArg, 1); - arg->arg_type = G_TYPE_DOUBLE; - arg->d.double_data = scanner->value.v_float; - if (negate) - { - arg->d.double_data = - arg->d.double_data; - negate = FALSE; - } - args = g_slist_prepend (args, arg); - } - else - done = TRUE; - break; - case G_TOKEN_INT: - if (need_arg) - { - need_arg = FALSE; - arg = g_new (GtkBindingArg, 1); - arg->arg_type = G_TYPE_LONG; - arg->d.long_data = scanner->value.v_int; - if (negate) - { - arg->d.long_data = - arg->d.long_data; - negate = FALSE; - } - args = g_slist_prepend (args, arg); - } - else - done = TRUE; - break; - case G_TOKEN_STRING: - if (need_arg && !negate) - { - need_arg = FALSE; - arg = g_new (GtkBindingArg, 1); - arg->arg_type = G_TYPE_STRING; - arg->d.string_data = g_strdup (scanner->value.v_string); - args = g_slist_prepend (args, arg); - } - else - done = TRUE; - break; - case G_TOKEN_IDENTIFIER: - if (need_arg && !negate) - { - need_arg = FALSE; - arg = g_new (GtkBindingArg, 1); - arg->arg_type = GTK_TYPE_IDENTIFIER; - arg->d.string_data = g_strdup (scanner->value.v_identifier); - args = g_slist_prepend (args, arg); - } - else - done = TRUE; - break; - case '-': - if (!need_arg) - done = TRUE; - else if (negate) - { - expected_token = G_TOKEN_INT; - done = TRUE; - } - else - negate = TRUE; - break; - case ',': - seen_comma = TRUE; - if (need_arg) - done = TRUE; - else - need_arg = TRUE; - break; - case ')': - if (!(need_arg && seen_comma) && !negate) - { - args = g_slist_reverse (args); - _gtk_binding_entry_add_signall (binding_set, - keyval, - modifiers, - signal, - args); - expected_token = G_TOKEN_NONE; - } - done = TRUE; - break; - default: - done = TRUE; - break; - } - } - while (!done); - scanner->config->scan_symbols = TRUE; - - for (slist = args; slist; slist = slist->next) - { - GtkBindingArg *arg; - - arg = slist->data; - if (G_TYPE_FUNDAMENTAL (arg->arg_type) == G_TYPE_STRING) - g_free (arg->d.string_data); - g_free (arg); - } - g_slist_free (args); - g_free (signal); - - return expected_token; -} - -static inline guint -gtk_binding_parse_bind (GScanner *scanner, - GtkBindingSet *binding_set) -{ - guint keyval = 0; - GdkModifierType modifiers = 0; - gboolean unbind = FALSE; - guint token; - - g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); - - token = g_scanner_get_next_token (scanner); - if (token != GTK_RC_TOKEN_BIND && - token != GTK_RC_TOKEN_UNBIND) - return GTK_RC_TOKEN_BIND; - unbind = token == GTK_RC_TOKEN_UNBIND; - g_scanner_get_next_token (scanner); - if (scanner->token != G_TOKEN_STRING) - return G_TOKEN_STRING; - gtk_accelerator_parse (scanner->value.v_string, &keyval, &modifiers); - modifiers &= BINDING_MOD_MASK (); - if (keyval == 0) - return G_TOKEN_STRING; - - if (unbind) - { - gtk_binding_entry_skip (binding_set, keyval, modifiers); - return G_TOKEN_NONE; - } - - g_scanner_get_next_token (scanner); - - if (scanner->token != '{') - return '{'; - - gtk_binding_entry_clear_internal (binding_set, keyval, modifiers); - - g_scanner_peek_next_token (scanner); - while (scanner->next_token != '}') - { - switch (scanner->next_token) - { - guint expected_token; - - case G_TOKEN_STRING: - expected_token = gtk_binding_parse_signal (scanner, - binding_set, - keyval, - modifiers); - if (expected_token != G_TOKEN_NONE) - return expected_token; - break; - default: - g_scanner_get_next_token (scanner); - return '}'; - } - g_scanner_peek_next_token (scanner); - } - g_scanner_get_next_token (scanner); - - return G_TOKEN_NONE; -} - -guint -_gtk_binding_parse_binding (GScanner *scanner) -{ - GtkBindingSet *binding_set; - gchar *name; - guint token; - - g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR); - - token = g_scanner_get_next_token (scanner); - if (token != GTK_RC_TOKEN_BINDING) - return GTK_RC_TOKEN_BINDING; - g_scanner_get_next_token (scanner); - if (scanner->token != G_TOKEN_STRING) - return G_TOKEN_STRING; - name = g_strdup (scanner->value.v_string); - - g_scanner_get_next_token (scanner); - if (scanner->token != '{') - { - g_free (name); - return G_TOKEN_STRING; - } - - binding_set = gtk_binding_set_find (name); - if (!binding_set) - { - binding_set = gtk_binding_set_new (name); - binding_set->parsed = 1; - } - g_free (name); - - g_scanner_peek_next_token (scanner); - while (scanner->next_token != '}') - { - guint next_token = scanner->next_token; - switch (next_token) - { - guint expected_token; - - case GTK_RC_TOKEN_BIND: - case GTK_RC_TOKEN_UNBIND: - expected_token = gtk_binding_parse_bind (scanner, binding_set); - if (expected_token != G_TOKEN_NONE) - return expected_token; - break; - default: - g_scanner_get_next_token (scanner); - return '}'; - } - g_scanner_peek_next_token (scanner); - } - g_scanner_get_next_token (scanner); - - return G_TOKEN_NONE; -} - -static void -free_pattern_specs (GSList *pattern_specs) -{ - GSList *slist; - - for (slist = pattern_specs; slist; slist = slist->next) - { - PatternSpec *pspec; - - pspec = slist->data; - - pattern_spec_free (pspec); - } - - g_slist_free (pattern_specs); -} - -static void -binding_set_delete (GtkBindingSet *binding_set) -{ - GtkBindingEntry *entry, *next; - - entry = binding_set->entries; - while (entry) - { - next = entry->set_next; - binding_entry_destroy (entry); - entry = next; - } - - free_pattern_specs (binding_set->widget_path_pspecs); - free_pattern_specs (binding_set->widget_class_pspecs); - free_pattern_specs (binding_set->class_branch_pspecs); - - g_free (binding_set); -} - -/** - * _gtk_binding_reset_parsed: - * - * Remove all binding sets that were added by gtk_binding_parse_binding(). - */ -void -_gtk_binding_reset_parsed (void) -{ - GSList *slist, *next; - - slist = binding_set_list; - while (slist) - { - GtkBindingSet *binding_set; - - binding_set = slist->data; - next = slist->next; - - if (binding_set->parsed) - { - binding_set_list = g_slist_delete_link (binding_set_list, slist); - binding_set_delete (binding_set); - } - - slist = next; - } -} diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c index b0f239a97..5f726bd23 100644 --- a/gtk/gtkrc.c +++ b/gtk/gtkrc.c @@ -60,10 +60,6 @@ #include #endif -typedef struct _GtkRcSet GtkRcSet; -typedef struct _GtkRcNode GtkRcNode; -typedef struct _GtkRcFile GtkRcFile; - enum { PATH_ELT_PSPEC, @@ -82,54 +78,6 @@ typedef struct } elt; } PathElt; -struct _GtkRcSet -{ - GtkPathType type; - - GPatternSpec *pspec; - GSList *path; - - GtkRcStyle *rc_style; - gint priority; -}; - -struct _GtkRcFile -{ - time_t mtime; - gchar *name; - gchar *canonical_name; - gchar *directory; - guint reload : 1; - guint is_string : 1; /* If TRUE, name is a string to parse with gtk_rc_parse_string() */ -}; - - -struct _GtkRcContext -{ - GHashTable *rc_style_ht; - GtkSettings *settings; - GSList *rc_sets_widget; - GSList *rc_sets_widget_class; - GSList *rc_sets_class; - - /* The files we have parsed, to reread later if necessary */ - GSList *rc_files; - - gchar *theme_name; - gboolean prefer_dark_theme; - gchar *key_theme_name; - gchar *font_name; - - gchar **pixmap_path; - - gint default_priority; - GtkStyle *default_style; - - GHashTable *color_hash; - - guint reloading : 1; -}; - #define GTK_RC_STYLE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_RC_STYLE, GtkRcStylePrivate)) typedef struct _GtkRcStylePrivate GtkRcStylePrivate; @@ -139,51 +87,13 @@ struct _GtkRcStylePrivate GSList *color_hashes; }; -static GtkRcContext *gtk_rc_context_get (GtkSettings *settings); - -static guint gtk_rc_styles_hash (const GSList *rc_styles); -static gboolean gtk_rc_styles_equal (const GSList *a, - const GSList *b); -static GSList * gtk_rc_styles_match (GSList *rc_styles, - GSList *sets, - guint path_length, - gchar *path, - gchar *path_reversed); -static GtkStyle * gtk_rc_style_to_style (GtkRcContext *context, - GtkRcStyle *rc_style); -static GtkStyle* gtk_rc_init_style (GtkRcContext *context, - GSList *rc_styles); -static void gtk_rc_parse_default_files (GtkRcContext *context); -static gboolean gtk_rc_parse_named (GtkRcContext *context, - const gchar *name, - const gchar *type, - const gchar *variant); -static void gtk_rc_context_parse_file (GtkRcContext *context, - const gchar *filename, - gint priority, - gboolean reload); -static void gtk_rc_parse_any (GtkRcContext *context, - const gchar *input_name, - gint input_fd, - const gchar *input_string); - -static void gtk_rc_clear_hash_node (gpointer key, - gpointer data, - gpointer user_data); -static void gtk_rc_clear_styles (GtkRcContext *context); -static void gtk_rc_add_initial_default_files (void); - static void gtk_rc_style_finalize (GObject *object); static void gtk_rc_style_real_merge (GtkRcStyle *dest, GtkRcStyle *src); static GtkRcStyle* gtk_rc_style_real_create_rc_style (GtkRcStyle *rc_style); static GtkStyle* gtk_rc_style_real_create_style (GtkRcStyle *rc_style); -static void gtk_rc_style_copy_icons_and_colors(GtkRcStyle *rc_style, - GtkRcStyle *src_style, - GtkRcContext *context); static gint gtk_rc_properties_cmp (gconstpointer bsearch_node1, gconstpointer bsearch_node2); -static void gtk_rc_set_free (GtkRcSet *rc_set); static void insert_rc_property (GtkRcStyle *style, GtkRcProperty *property, @@ -319,23 +229,8 @@ static GHashTable *realized_style_ht = NULL; static gchar *im_module_file = NULL; -static gint max_default_files = 0; static gchar **gtk_rc_default_files = NULL; -/* A stack of information of RC files we are parsing currently. - * The directories for these files are implicitely added to the end of - * PIXMAP_PATHS. - */ -static GSList *current_files_stack = NULL; - -/* RC files and strings that are parsed for every context - */ -static GSList *global_rc_files = NULL; - -/* Keep list of all current RC contexts for convenience - */ -static GSList *rc_contexts; - /* RC file handling */ static gchar * @@ -436,55 +331,6 @@ gtk_rc_get_module_dir (void) return gtk_rc_make_default_dir ("engines"); } -static void -gtk_rc_add_initial_default_files (void) -{ - static gint init = FALSE; - const gchar *var; - gchar *str; - gchar **files; - gint i; - - if (init) - return; - - gtk_rc_default_files = g_new (gchar*, 10); - max_default_files = 10; - - gtk_rc_default_files[0] = NULL; - init = TRUE; - - var = g_getenv ("GTK2_RC_FILES"); - - if (var) - { - files = g_strsplit (var, G_SEARCHPATH_SEPARATOR_S, -1); - i=0; - while (files[i]) - { - gtk_rc_add_default_file (files[i]); - i++; - } - g_strfreev (files); - } - else - { - const gchar *home; - str = g_build_filename (GTK_SYSCONFDIR, "gtk-3.0", "gtkrc", NULL); - - gtk_rc_add_default_file (str); - g_free (str); - - home = g_get_home_dir (); - if (home) - { - str = g_build_filename (home, ".gtkrc-3.0", NULL); - gtk_rc_add_default_file (str); - g_free (str); - } - } -} - /** * gtk_rc_add_default_file: * @filename: the pathname to the file. If @filename is not absolute, it @@ -498,24 +344,6 @@ gtk_rc_add_initial_default_files (void) void gtk_rc_add_default_file (const gchar *filename) { - guint n; - - gtk_rc_add_initial_default_files (); - - for (n = 0; n < max_default_files; n++) - { - if (gtk_rc_default_files[n] == NULL) - break; - } - - if (n == max_default_files) - { - max_default_files += 10; - gtk_rc_default_files = g_renew (gchar*, gtk_rc_default_files, max_default_files); - } - - gtk_rc_default_files[n++] = g_strdup (filename); - gtk_rc_default_files[n] = NULL; } /** @@ -530,25 +358,6 @@ gtk_rc_add_default_file (const gchar *filename) void gtk_rc_set_default_files (gchar **filenames) { - gint i; - - gtk_rc_add_initial_default_files (); - - i = 0; - while (gtk_rc_default_files[i]) - { - g_free (gtk_rc_default_files[i]); - i++; - } - - gtk_rc_default_files[0] = NULL; - - i = 0; - while (filenames[i] != NULL) - { - gtk_rc_add_default_file (filenames[i]); - i++; - } } /** @@ -566,490 +375,19 @@ gtk_rc_set_default_files (gchar **filenames) gchar ** gtk_rc_get_default_files (void) { - gtk_rc_add_initial_default_files (); - return gtk_rc_default_files; } -static void -gtk_rc_settings_changed (GtkSettings *settings, - GParamSpec *pspec, - GtkRcContext *context) -{ - gchar *new_theme_name; - gchar *new_key_theme_name; - gboolean new_prefer_dark_theme; - - if (context->reloading) - return; - - g_object_get (settings, - "gtk-theme-name", &new_theme_name, - "gtk-key-theme-name", &new_key_theme_name, - "gtk-application-prefer-dark-theme", &new_prefer_dark_theme, - NULL); - - if ((new_theme_name != context->theme_name && - !(new_theme_name && context->theme_name && strcmp (new_theme_name, context->theme_name) == 0)) || - (new_key_theme_name != context->key_theme_name && - !(new_key_theme_name && context->key_theme_name && strcmp (new_key_theme_name, context->key_theme_name) == 0)) || - new_prefer_dark_theme != context->prefer_dark_theme) - { - gtk_rc_reparse_all_for_settings (settings, TRUE); - } - - g_free (new_theme_name); - g_free (new_key_theme_name); -} - -static void -gtk_rc_font_name_changed (GtkSettings *settings, - GParamSpec *pspec, - GtkRcContext *context) -{ - if (!context->reloading) - _gtk_rc_context_get_default_font_name (settings); -} - -static void -gtk_rc_color_hash_changed (GtkSettings *settings, - GParamSpec *pspec, - GtkRcContext *context) -{ - GHashTable *old_hash; - - old_hash = context->color_hash; - - g_object_get (settings, "color-hash", &context->color_hash, NULL); - - if (old_hash) - g_hash_table_unref (old_hash); - - gtk_rc_reparse_all_for_settings (settings, TRUE); -} - -static GtkRcContext * -gtk_rc_context_get (GtkSettings *settings) -{ - if (!settings->rc_context) - { - GtkRcContext *context = settings->rc_context = g_new (GtkRcContext, 1); - - context->settings = settings; - context->rc_style_ht = NULL; - context->rc_sets_widget = NULL; - context->rc_sets_widget_class = NULL; - context->rc_sets_class = NULL; - context->rc_files = NULL; - context->default_style = NULL; - context->reloading = FALSE; - - g_object_get (settings, - "gtk-theme-name", &context->theme_name, - "gtk-key-theme-name", &context->key_theme_name, - "gtk-font-name", &context->font_name, - "color-hash", &context->color_hash, - "gtk-application-prefer-dark-theme", &context->prefer_dark_theme, - NULL); - - g_signal_connect (settings, - "notify::gtk-theme-name", - G_CALLBACK (gtk_rc_settings_changed), - context); - g_signal_connect (settings, - "notify::gtk-key-theme-name", - G_CALLBACK (gtk_rc_settings_changed), - context); - g_signal_connect (settings, - "notify::gtk-font-name", - G_CALLBACK (gtk_rc_font_name_changed), - context); - g_signal_connect (settings, - "notify::color-hash", - G_CALLBACK (gtk_rc_color_hash_changed), - context); - g_signal_connect (settings, - "notify::gtk-application-prefer-dark-theme", - G_CALLBACK (gtk_rc_settings_changed), - context); - - context->pixmap_path = NULL; - - context->default_priority = GTK_PATH_PRIO_RC; - - rc_contexts = g_slist_prepend (rc_contexts, settings->rc_context); - } - - return settings->rc_context; -} - -static void -gtk_rc_clear_rc_files (GtkRcContext *context) -{ - GSList *list; - - list = context->rc_files; - while (list) - { - GtkRcFile *rc_file = list->data; - - if (rc_file->canonical_name != rc_file->name) - g_free (rc_file->canonical_name); - g_free (rc_file->directory); - g_free (rc_file->name); - g_free (rc_file); - - list = list->next; - } - - g_slist_free (context->rc_files); - context->rc_files = NULL; -} - -void -_gtk_rc_context_destroy (GtkSettings *settings) -{ - GtkRcContext *context; - - g_return_if_fail (GTK_IS_SETTINGS (settings)); - - context = settings->rc_context; - if (!context) - return; - - _gtk_settings_reset_rc_values (context->settings); - gtk_rc_clear_styles (context); - gtk_rc_clear_rc_files (context); - - if (context->default_style) - g_object_unref (context->default_style); - - g_strfreev (context->pixmap_path); - - g_free (context->theme_name); - g_free (context->key_theme_name); - g_free (context->font_name); - - if (context->color_hash) - g_hash_table_unref (context->color_hash); - - g_signal_handlers_disconnect_by_func (settings, - gtk_rc_settings_changed, context); - g_signal_handlers_disconnect_by_func (settings, - gtk_rc_font_name_changed, context); - g_signal_handlers_disconnect_by_func (settings, - gtk_rc_color_hash_changed, context); - - rc_contexts = g_slist_remove (rc_contexts, context); - - g_free (context); - - settings->rc_context = NULL; -} - -static gboolean -gtk_rc_parse_named (GtkRcContext *context, - const gchar *name, - const gchar *type, - const gchar *variant) -{ - gchar *path = NULL; - const gchar *home_dir; - gchar *subpath; - gboolean retval; - - retval = FALSE; - - if (type) - subpath = g_strconcat ("gtk-3.0-", type, - G_DIR_SEPARATOR_S "gtkrc", - NULL); - else - subpath = g_strconcat ("gtk-3.0" G_DIR_SEPARATOR_S "gtkrc", - variant, NULL); - - /* First look in the users home directory - */ - home_dir = g_get_home_dir (); - if (home_dir) - { - path = g_build_filename (home_dir, ".themes", name, subpath, NULL); - if (!g_file_test (path, G_FILE_TEST_EXISTS)) - { - g_free (path); - path = NULL; - } - } - - if (!path) - { - gchar *theme_dir = gtk_rc_get_theme_dir (); - path = g_build_filename (theme_dir, name, subpath, NULL); - g_free (theme_dir); - - if (!g_file_test (path, G_FILE_TEST_EXISTS)) - { - g_free (path); - path = NULL; - } - } - - if (path) - { - gtk_rc_context_parse_file (context, path, GTK_PATH_PRIO_THEME, FALSE); - g_free (path); - retval = TRUE; - } - - g_free (subpath); - - return retval; -} - -static void -gtk_rc_parse_default_files (GtkRcContext *context) -{ - gint i; - - gtk_rc_add_initial_default_files (); - - for (i = 0; gtk_rc_default_files[i] != NULL; i++) - gtk_rc_context_parse_file (context, gtk_rc_default_files[i], GTK_PATH_PRIO_RC, FALSE); -} - -void -_gtk_rc_init (void) -{ - static gboolean initialized = FALSE; - - if (!initialized) - { - initialized = TRUE; - - gtk_rc_add_initial_default_files (); - } - - /* Default RC string */ - gtk_rc_parse_string ("style \"gtk-default-tooltips-style\" {\n" - " bg[NORMAL] = \"#eee1b3\"\n" - " fg[NORMAL] = \"#000000\"\n" - "}\n" - "\n" - "style \"gtk-default-progress-bar-style\" {\n" - " bg[PRELIGHT] = \"#4b6983\"\n" - " fg[PRELIGHT] = \"#ffffff\"\n" - " bg[NORMAL] = \"#c4c2bd\"\n" - "}\n" - "\n" - "style \"gtk-default-entry-style\" {\n" - " bg[SELECTED] = \"#b7c3cd\"\n" - " fg[SELECTED] = \"#000000\"\n" - "}\n" - "\n" - "style \"gtk-default-menu-bar-item-style\" {\n" - " GtkMenuItem::horizontal_padding = 5\n" - "}\n" - "\n" - "style \"gtk-default-menu-item-style\" {\n" - " bg[PRELIGHT] = \"#4b6983\"\n" - " fg[PRELIGHT] = \"#ffffff\"\n" - " base[PRELIGHT] = \"#4b6983\"\n" - " text[PRELIGHT] = \"#ffffff\"\n" - "}\n" - "\n" - "class \"GtkProgressBar\" style : gtk \"gtk-default-progress-bar-style\"\n" - "class \"GtkEntry\" style : gtk \"gtk-default-entry-style\"\n" - "widget \"gtk-tooltip*\" style : gtk \"gtk-default-tooltips-style\"\n" - "widget_class \"**\" style : gtk \"gtk-default-menu-item-style\"\n" - "widget_class \"**\" style : gtk \"gtk-default-menu-bar-item-style\"\n" - ); -} - -static void -gtk_rc_context_parse_string (GtkRcContext *context, - const gchar *rc_string) -{ - gtk_rc_parse_any (context, "-", -1, rc_string); -} - void gtk_rc_parse_string (const gchar *rc_string) { -} - -static GtkRcFile * -add_to_rc_file_list (GSList **rc_file_list, - const char *filename, - gboolean reload) -{ - GSList *tmp_list; - GtkRcFile *rc_file; - - tmp_list = *rc_file_list; - while (tmp_list) - { - rc_file = tmp_list->data; - if (!strcmp (rc_file->name, filename)) - return rc_file; - - tmp_list = tmp_list->next; - } - - rc_file = g_new (GtkRcFile, 1); - rc_file->is_string = FALSE; - rc_file->name = g_strdup (filename); - rc_file->canonical_name = NULL; - rc_file->directory = NULL; - rc_file->mtime = 0; - rc_file->reload = reload; - - *rc_file_list = g_slist_append (*rc_file_list, rc_file); - - return rc_file; -} - -static void -gtk_rc_context_parse_one_file (GtkRcContext *context, - const gchar *filename, - gint priority, - gboolean reload) -{ - GtkRcFile *rc_file; - struct stat statbuf; - gint saved_priority; - - g_return_if_fail (filename != NULL); - - saved_priority = context->default_priority; - context->default_priority = priority; - - rc_file = add_to_rc_file_list (&context->rc_files, filename, reload); - - if (!rc_file->canonical_name) - { - /* Get the absolute pathname */ - - if (g_path_is_absolute (rc_file->name)) - rc_file->canonical_name = rc_file->name; - else - { - gchar *cwd; - - cwd = g_get_current_dir (); - rc_file->canonical_name = g_build_filename (cwd, rc_file->name, NULL); - g_free (cwd); - } - - rc_file->directory = g_path_get_dirname (rc_file->canonical_name); - } - - /* If the file is already being parsed (recursion), do nothing - */ - if (g_slist_find (current_files_stack, rc_file)) - return; - - if (!g_lstat (rc_file->canonical_name, &statbuf)) - { - gint fd; - - rc_file->mtime = statbuf.st_mtime; - - fd = g_open (rc_file->canonical_name, O_RDONLY, 0); - if (fd < 0) - goto out; - - /* Temporarily push information for this file on - * a stack of current files while parsing it. - */ - current_files_stack = g_slist_prepend (current_files_stack, rc_file); - gtk_rc_parse_any (context, filename, fd, NULL); - current_files_stack = g_slist_delete_link (current_files_stack, - current_files_stack); - - close (fd); - } - - out: - context->default_priority = saved_priority; -} - -static gchar * -strchr_len (const gchar *str, gint len, char c) -{ - while (len--) - { - if (*str == c) - return (gchar *)str; - - str++; - } - - return NULL; -} - -static void -gtk_rc_context_parse_file (GtkRcContext *context, - const gchar *filename, - gint priority, - gboolean reload) -{ - gchar *locale_suffixes[2]; - gint n_locale_suffixes = 0; - gchar *p; - gchar *locale; - gint length, j; - gboolean found = FALSE; - - locale = _gtk_get_lc_ctype (); - - if (strcmp (locale, "C") && strcmp (locale, "POSIX")) - { - /* Determine locale-specific suffixes for RC files. - */ - length = strlen (locale); - - p = strchr (locale, '@'); - if (p) - length = p - locale; - - p = strchr_len (locale, length, '.'); - if (p) - length = p - locale; - - locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length); - - p = strchr_len (locale, length, '_'); - if (p) - { - length = p - locale; - locale_suffixes[n_locale_suffixes++] = g_strndup (locale, length); - } - } - - g_free (locale); - - gtk_rc_context_parse_one_file (context, filename, priority, reload); - for (j = 0; j < n_locale_suffixes; j++) - { - if (!found) - { - gchar *name = g_strconcat (filename, ".", locale_suffixes[j], NULL); - if (g_file_test (name, G_FILE_TEST_EXISTS)) - { - gtk_rc_context_parse_one_file (context, name, priority, FALSE); - found = TRUE; - } - - g_free (name); - } - - g_free (locale_suffixes[j]); - } + g_return_if_fail (rc_string != NULL); } void gtk_rc_parse (const gchar *filename) { + g_return_if_fail (filename != NULL); } /* Handling of RC styles */ @@ -1206,85 +544,15 @@ gtk_rc_style_copy (GtkRcStyle *orig) style = GTK_RC_STYLE_GET_CLASS (orig)->create_rc_style (orig); GTK_RC_STYLE_GET_CLASS (style)->merge (style, orig); - gtk_rc_style_copy_icons_and_colors (style, orig, NULL); - return style; } -void -_gtk_rc_style_set_rc_property (GtkRcStyle *rc_style, - GtkRcProperty *property) -{ - g_return_if_fail (GTK_IS_RC_STYLE (rc_style)); - g_return_if_fail (property != NULL); - - insert_rc_property (rc_style, property, TRUE); -} - -void -_gtk_rc_style_unset_rc_property (GtkRcStyle *rc_style, - GQuark type_name, - GQuark property_name) -{ - GtkRcProperty *node; - - g_return_if_fail (GTK_IS_RC_STYLE (rc_style)); - - node = (GtkRcProperty *) _gtk_rc_style_lookup_rc_property (rc_style, - type_name, - property_name); - - if (node != NULL) - { - guint index = node - (GtkRcProperty *) rc_style->rc_properties->data; - g_value_unset (&node->value); - g_free (node->origin); - g_array_remove_index (rc_style->rc_properties, index); - } -} - static GtkRcStyle * gtk_rc_style_real_create_rc_style (GtkRcStyle *style) { return g_object_new (G_OBJECT_TYPE (style), NULL); } -GSList * -_gtk_rc_style_get_color_hashes (GtkRcStyle *rc_style) -{ - GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); - - return priv->color_hashes; -} - -static void gtk_rc_style_prepend_empty_color_hash (GtkRcStyle *rc_style); - -void -_gtk_rc_style_set_symbolic_color (GtkRcStyle *rc_style, - const gchar *name, - const GdkColor *color) -{ - GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); - GHashTable *our_hash = NULL; - - if (priv->color_hashes) - our_hash = priv->color_hashes->data; - - if (our_hash == NULL) - { - if (color == NULL) - return; - - gtk_rc_style_prepend_empty_color_hash (rc_style); - our_hash = priv->color_hashes->data; - } - - if (color) - g_hash_table_insert (our_hash, g_strdup (name), gdk_color_copy (color)); - else - g_hash_table_remove (our_hash, name); -} - static gint gtk_rc_properties_cmp (gconstpointer bsearch_node1, gconstpointer bsearch_node2) @@ -1417,195 +685,6 @@ gtk_rc_style_real_create_style (GtkRcStyle *rc_style) return gtk_style_new (); } -static void -gtk_rc_style_prepend_empty_icon_factory (GtkRcStyle *rc_style) -{ - GtkIconFactory *factory = gtk_icon_factory_new (); - - rc_style->icon_factories = g_slist_prepend (rc_style->icon_factories, factory); -} - -static void -gtk_rc_style_prepend_empty_color_hash (GtkRcStyle *rc_style) -{ - GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); - GHashTable *hash = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, - (GDestroyNotify) gdk_color_free); - - priv->color_hashes = g_slist_prepend (priv->color_hashes, hash); -} - -static void -gtk_rc_style_append_icon_factories (GtkRcStyle *rc_style, - GtkRcStyle *src_style) -{ - GSList *concat = g_slist_copy (src_style->icon_factories); - - g_slist_foreach (concat, (GFunc) g_object_ref, NULL); - - rc_style->icon_factories = g_slist_concat (rc_style->icon_factories, concat); -} - -static void -gtk_rc_style_append_color_hashes (GtkRcStyle *rc_style, - GtkRcStyle *src_style) -{ - GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); - GtkRcStylePrivate *src_priv = GTK_RC_STYLE_GET_PRIVATE (src_style); - GSList *concat = g_slist_copy (src_priv->color_hashes); - - g_slist_foreach (concat, (GFunc) g_hash_table_ref, NULL); - - priv->color_hashes = g_slist_concat (priv->color_hashes, concat); -} - -static void -gtk_rc_style_copy_icons_and_colors (GtkRcStyle *rc_style, - GtkRcStyle *src_style, - GtkRcContext *context) -{ - GtkRcStylePrivate *priv = GTK_RC_STYLE_GET_PRIVATE (rc_style); - - if (src_style) - { - GtkRcStylePrivate *src_priv = GTK_RC_STYLE_GET_PRIVATE (src_style); - - /* Append src_style's factories, adding a ref to them */ - if (src_style->icon_factories != NULL) - { - /* Add a factory for ourselves if we have none, - * in case we end up defining more stock icons. - * I see no real way around this; we need to maintain - * the invariant that the first factory in the list - * is always our_factory, the one belonging to us, - * and if we put src_style factories in the list we can't - * do that if the style is reopened. - */ - if (rc_style->icon_factories == NULL) - gtk_rc_style_prepend_empty_icon_factory (rc_style); - - gtk_rc_style_append_icon_factories (rc_style, src_style); - } - - /* Also append src_style's color hashes, adding a ref to them */ - if (src_priv->color_hashes != NULL) - { - /* See comment above .. */ - if (priv->color_hashes == NULL) - gtk_rc_style_prepend_empty_color_hash (rc_style); - - gtk_rc_style_append_color_hashes (rc_style, src_style); - } - } - - /* if we didn't get color hashes from the src_style, initialize - * the list with the settings' color scheme (if it exists) - */ - if (priv->color_hashes == NULL && context && context->color_hash != NULL) - { - gtk_rc_style_prepend_empty_color_hash (rc_style); - - priv->color_hashes = g_slist_append (priv->color_hashes, - g_hash_table_ref (context->color_hash)); - } -} - -static void -gtk_rc_clear_hash_node (gpointer key, - gpointer data, - gpointer user_data) -{ - g_object_unref (data); -} - -static void -gtk_rc_free_rc_sets (GSList *slist) -{ - while (slist) - { - GtkRcSet *rc_set; - - rc_set = slist->data; - gtk_rc_set_free (rc_set); - - slist = slist->next; - } -} - -static void -gtk_rc_clear_styles (GtkRcContext *context) -{ - /* Clear out all old rc_styles */ - - if (context->rc_style_ht) - { - g_hash_table_foreach (context->rc_style_ht, gtk_rc_clear_hash_node, NULL); - g_hash_table_destroy (context->rc_style_ht); - context->rc_style_ht = NULL; - } - - gtk_rc_free_rc_sets (context->rc_sets_widget); - g_slist_free (context->rc_sets_widget); - context->rc_sets_widget = NULL; - - gtk_rc_free_rc_sets (context->rc_sets_widget_class); - g_slist_free (context->rc_sets_widget_class); - context->rc_sets_widget_class = NULL; - - gtk_rc_free_rc_sets (context->rc_sets_class); - g_slist_free (context->rc_sets_class); - context->rc_sets_class = NULL; -} - -/* Reset all our widgets. Also, we have to invalidate cached icons in - * icon sets so they get re-rendered. - */ -static void -gtk_rc_reset_widgets (GtkSettings *settings) -{ - GList *list, *toplevels; - - _gtk_icon_set_invalidate_caches (); - - toplevels = gtk_window_list_toplevels (); - g_list_foreach (toplevels, (GFunc)g_object_ref, NULL); - - for (list = toplevels; list; list = list->next) - { - if (gtk_widget_get_screen (list->data) == settings->screen) - { - gtk_widget_reset_rc_styles (list->data); - } - - g_object_unref (list->data); - } - g_list_free (toplevels); -} - -static void -gtk_rc_clear_realized_style (gpointer key, - gpointer value, - gpointer data) -{ - GSList *rc_styles = key; - GtkStyle *style = value; - GSList *tmp_list = rc_styles; - - g_object_unref (style); - - while (tmp_list) - { - GtkRcStyle *rc_style = tmp_list->data; - - rc_style->rc_style_lists = g_slist_remove_all (rc_style->rc_style_lists, - rc_styles); - tmp_list = tmp_list->next; - } - - g_slist_free (rc_styles); -} - /** * gtk_rc_reset_styles: * @settings: a #GtkSettings @@ -1626,264 +705,40 @@ gtk_rc_clear_realized_style (gpointer key, void gtk_rc_reset_styles (GtkSettings *settings) { - GtkRcContext *context; - gboolean reset = FALSE; - - g_return_if_fail (GTK_IS_SETTINGS (settings)); - - context = gtk_rc_context_get (settings); - - if (context->default_style) - { - g_object_unref (context->default_style); - context->default_style = NULL; - reset = TRUE; - } - - /* Clear out styles that have been looked up already - */ - if (realized_style_ht) - { - g_hash_table_foreach (realized_style_ht, gtk_rc_clear_realized_style, NULL); - g_hash_table_destroy (realized_style_ht); - realized_style_ht = NULL; - reset = TRUE; - } - - if (reset) - gtk_rc_reset_widgets (settings); -} - -const gchar* -_gtk_rc_context_get_default_font_name (GtkSettings *settings) -{ - GtkRcContext *context; - gchar *new_font_name; - - g_return_val_if_fail (GTK_IS_SETTINGS (settings), NULL); - - context = gtk_rc_context_get (settings); - - g_object_get (context->settings, - "gtk-font-name", &new_font_name, - NULL); - - if (new_font_name != context->font_name && !(new_font_name && strcmp (context->font_name, new_font_name) == 0)) - { - g_free (context->font_name); - context->font_name = g_strdup (new_font_name); - - gtk_rc_reset_styles (settings); - } - - g_free (new_font_name); - - return context->font_name; + gtk_style_context_reset_widgets (_gtk_settings_get_screen (settings)); } /** * gtk_rc_reparse_all_for_settings: * @settings: a #GtkSettings - * @force_load: load whether or not anything changed - * - * If the modification time on any previously read file - * for the given #GtkSettings has changed, discard all style information - * and then reread all previously read RC files. - * - * Return value: %TRUE if the files were reread. - **/ -gboolean -gtk_rc_reparse_all_for_settings (GtkSettings *settings, - gboolean force_load) -{ - gboolean mtime_modified = FALSE; - GtkRcFile *rc_file; - GSList *tmp_list; - GtkRcContext *context; - struct stat statbuf; - - g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE); - - context = gtk_rc_context_get (settings); - - if (context->reloading) - return FALSE; - - if (!force_load) - { - /* Check through and see if any of the RC's have had their - * mtime modified. If so, reparse everything. - */ - tmp_list = context->rc_files; - while (tmp_list) - { - rc_file = tmp_list->data; - - if (!rc_file->is_string) - { - if (!g_lstat (rc_file->name, &statbuf) && - (statbuf.st_mtime != rc_file->mtime)) - { - mtime_modified = TRUE; - break; - } - } - - tmp_list = tmp_list->next; - } - } - - if (force_load || mtime_modified) - { - _gtk_binding_reset_parsed (); - gtk_rc_clear_styles (context); - context->reloading = TRUE; - - _gtk_settings_reset_rc_values (context->settings); - gtk_rc_clear_rc_files (context); - - gtk_rc_parse_default_files (context); - - tmp_list = global_rc_files; - while (tmp_list) - { - rc_file = tmp_list->data; - - if (rc_file->is_string) - gtk_rc_context_parse_string (context, rc_file->name); - else - gtk_rc_context_parse_file (context, rc_file->name, GTK_PATH_PRIO_RC, FALSE); - - tmp_list = tmp_list->next; - } - - g_free (context->theme_name); - g_free (context->key_theme_name); - - g_object_get (context->settings, - "gtk-theme-name", &context->theme_name, - "gtk-key-theme-name", &context->key_theme_name, - "gtk-application-prefer-dark-theme", &context->prefer_dark_theme, - NULL); - - if (context->theme_name && context->theme_name[0]) - { - if (context->prefer_dark_theme) - { - if (!gtk_rc_parse_named (context, context->theme_name, NULL, "-dark")) - gtk_rc_parse_named (context, context->theme_name, NULL, NULL); - } - else - { - gtk_rc_parse_named (context, context->theme_name, NULL, NULL); - } - } - if (context->key_theme_name && context->key_theme_name[0]) - gtk_rc_parse_named (context, context->key_theme_name, "key", NULL); - - context->reloading = FALSE; - - gtk_rc_reset_widgets (context->settings); - } - - return force_load || mtime_modified; -} - -/** - * gtk_rc_reparse_all: - * - * If the modification time on any previously read file for the - * default #GtkSettings has changed, discard all style information - * and then reread all previously read RC files. - * - * Return value: %TRUE if the files were reread. - **/ -gboolean -gtk_rc_reparse_all (void) -{ - GSList *tmp_list; - gboolean result = FALSE; - - for (tmp_list = rc_contexts; tmp_list; tmp_list = tmp_list->next) - { - GtkRcContext *context = tmp_list->data; - if (gtk_rc_reparse_all_for_settings (context->settings, FALSE)) - result = TRUE; - } - - return result; -} - -static GSList * -gtk_rc_styles_match (GSList *rc_styles, - GSList *sets, - guint path_length, - gchar *path, - gchar *path_reversed) - -{ - GtkRcSet *rc_set; - - while (sets) - { - rc_set = sets->data; - sets = sets->next; - - if (rc_set->type == GTK_PATH_WIDGET_CLASS) - { - if (_gtk_rc_match_widget_class (rc_set->path, path_length, path, path_reversed)) - rc_styles = g_slist_append (rc_styles, rc_set); - } - else - { - if (g_pattern_match (rc_set->pspec, path_length, path, path_reversed)) - rc_styles = g_slist_append (rc_styles, rc_set); - } - } - - return rc_styles; -} - -static gint -rc_set_compare (gconstpointer a, gconstpointer b) + * @force_load: load whether or not anything changed + * + * If the modification time on any previously read file + * for the given #GtkSettings has changed, discard all style information + * and then reread all previously read RC files. + * + * Return value: %TRUE if the files were reread. + **/ +gboolean +gtk_rc_reparse_all_for_settings (GtkSettings *settings, + gboolean force_load) { - const GtkRcSet *set_a = a; - const GtkRcSet *set_b = b; - - return (set_a->priority < set_b->priority) ? 1 : (set_a->priority == set_b->priority ? 0 : -1); + return FALSE; } -static GSList * -sort_and_dereference_sets (GSList *styles) +/** + * gtk_rc_reparse_all: + * + * If the modification time on any previously read file for the + * default #GtkSettings has changed, discard all style information + * and then reread all previously read RC files. + * + * Return value: %TRUE if the files were reread. + **/ +gboolean +gtk_rc_reparse_all (void) { - GSList *tmp_list; - - /* At this point, the list of sets is ordered by: - * - * a) 'widget' patterns are earlier than 'widget_class' patterns - * which are ealier than 'class' patterns. - * a) For two matches for class patterns, a match to a child type - * is before a match to a parent type - * c) a match later in the RC file (or in a later RC file) is before a - * match earlier in the RC file. - * - * With a) taking precedence over b) which takes precendence over c). - * - * Now sort by priority, which has the highest precendence for sort order - */ - styles = g_slist_sort (styles, rc_set_compare); - - /* Make styles->data = styles->data->rc_style - */ - tmp_list = styles; - while (tmp_list) - { - GtkRcSet *set = tmp_list->data; - tmp_list->data = set->rc_style; - tmp_list = tmp_list->next; - } - - return styles; + return FALSE; } /** @@ -1906,87 +761,11 @@ sort_and_dereference_sets (GSList *styles) GtkStyle * gtk_rc_get_style (GtkWidget *widget) { - GtkRcStyle *widget_rc_style; - GSList *rc_styles = NULL; - GtkRcContext *context; - - static guint rc_style_key_id = 0; - g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL); - context = gtk_rc_context_get (gtk_widget_get_settings (widget)); - - /* We allow the specification of a single rc style to be bound - * tightly to a widget, for application modifications - */ - if (!rc_style_key_id) - rc_style_key_id = g_quark_from_static_string ("gtk-rc-style"); - - if (context->rc_sets_widget) - { - gchar *path, *path_reversed; - guint path_length; - - gtk_widget_path (widget, &path_length, &path, &path_reversed); - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - } - - if (context->rc_sets_widget_class) - { - gchar *path, *path_reversed; - guint path_length; - - gtk_widget_class_path (widget, &path_length, &path, &path_reversed); - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget_class, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - } - - if (context->rc_sets_class) - { - GType type; - - type = G_TYPE_FROM_INSTANCE (widget); - while (type) - { - gchar *path; - gchar *path_reversed; - guint path_length; - - path = g_strdup (g_type_name (type)); - path_length = strlen (path); - path_reversed = g_strdup (path); - g_strreverse (path_reversed); - - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_class, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - - type = g_type_parent (type); - } - } - - rc_styles = sort_and_dereference_sets (rc_styles); - - widget_rc_style = g_object_get_qdata (G_OBJECT (widget), rc_style_key_id); - - if (widget_rc_style) - rc_styles = g_slist_prepend (rc_styles, widget_rc_style); - - if (rc_styles) - return gtk_rc_init_style (context, rc_styles); - else - { - if (!context->default_style) - { - context->default_style = gtk_style_new (); - _gtk_style_init_for_settings (context->default_style, context->settings); - } + gtk_widget_ensure_style (widget); - return context->default_style; - } + return gtk_widget_get_style (widget); } /** @@ -2028,75 +807,6 @@ gtk_rc_get_style_by_paths (GtkSettings *settings, const char *class_path, GType type) { - /* We duplicate the code from above to avoid slowing down the above - * by generating paths when we don't need them. I don't know if - * this is really worth it. - */ - GSList *rc_styles = NULL; - GtkRcContext *context; - - g_return_val_if_fail (GTK_IS_SETTINGS (settings), NULL); - - context = gtk_rc_context_get (settings); - - if (widget_path && context->rc_sets_widget) - { - gchar *path; - gchar *path_reversed; - guint path_length; - - path_length = strlen (widget_path); - path = g_strdup (widget_path); - path_reversed = g_strdup (widget_path); - g_strreverse (path_reversed); - - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - } - - if (class_path && context->rc_sets_widget_class) - { - gchar *path; - gchar *path_reversed; - guint path_length; - - path = g_strdup (class_path); - path_length = strlen (class_path); - path_reversed = g_strdup (class_path); - g_strreverse (path_reversed); - - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_widget_class, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - } - - if (type != G_TYPE_NONE && context->rc_sets_class) - { - while (type) - { - gchar *path; - gchar *path_reversed; - guint path_length; - - path = g_strdup (g_type_name (type)); - path_length = strlen (path); - path_reversed = g_strdup (path); - g_strreverse (path_reversed); - - rc_styles = gtk_rc_styles_match (rc_styles, context->rc_sets_class, path_length, path, path_reversed); - g_free (path); - g_free (path_reversed); - - type = g_type_parent (type); - } - } - - rc_styles = sort_and_dereference_sets (rc_styles); - - if (rc_styles) - return gtk_rc_init_style (context, rc_styles); - return NULL; } @@ -2111,144 +821,6 @@ gtk_rc_scanner_new (void) return g_scanner_new (>k_rc_scanner_config); } -static void -gtk_rc_parse_any (GtkRcContext *context, - const gchar *input_name, - gint input_fd, - const gchar *input_string) -{ -} - -static guint -gtk_rc_styles_hash (const GSList *rc_styles) -{ - guint result; - - result = 0; - while (rc_styles) - { - result += (result << 9) + GPOINTER_TO_UINT (rc_styles->data); - rc_styles = rc_styles->next; - } - - return result; -} - -static gboolean -gtk_rc_styles_equal (const GSList *a, - const GSList *b) -{ - while (a && b) - { - if (a->data != b->data) - return FALSE; - a = a->next; - b = b->next; - } - - return (a == b); -} - -static GtkStyle * -gtk_rc_style_to_style (GtkRcContext *context, - GtkRcStyle *rc_style) -{ - GtkStyle *style; - - style = GTK_RC_STYLE_GET_CLASS (rc_style)->create_style (rc_style); - _gtk_style_init_for_settings (style, context->settings); - - style->rc_style = g_object_ref (rc_style); - - GTK_STYLE_GET_CLASS (style)->init_from_rc (style, rc_style); - - return style; -} - -/* Reuses or frees rc_styles */ -static GtkStyle * -gtk_rc_init_style (GtkRcContext *context, - GSList *rc_styles) -{ - GtkStyle *style = NULL; - gint i; - - g_return_val_if_fail (rc_styles != NULL, NULL); - - if (!realized_style_ht) - realized_style_ht = g_hash_table_new ((GHashFunc) gtk_rc_styles_hash, - (GEqualFunc) gtk_rc_styles_equal); - - style = g_hash_table_lookup (realized_style_ht, rc_styles); - - if (!style) - { - GtkRcStyle *base_style = NULL; - GtkRcStyle *proto_style; - GtkRcStyleClass *proto_style_class; - GSList *tmp_styles; - GType rc_style_type = GTK_TYPE_RC_STYLE; - - /* Find the first style where the RC file specified engine "" {} - * or the first derived style and use that to create the - * merged style. If we only have raw GtkRcStyles, use the first - * style to create the merged style. - */ - base_style = rc_styles->data; - tmp_styles = rc_styles; - while (tmp_styles) - { - GtkRcStyle *rc_style = tmp_styles->data; - - if (rc_style->engine_specified || - G_OBJECT_TYPE (rc_style) != rc_style_type) - { - base_style = rc_style; - break; - } - - tmp_styles = tmp_styles->next; - } - - proto_style_class = GTK_RC_STYLE_GET_CLASS (base_style); - proto_style = proto_style_class->create_rc_style (base_style); - - tmp_styles = rc_styles; - while (tmp_styles) - { - GtkRcStyle *rc_style = tmp_styles->data; - - proto_style_class->merge (proto_style, rc_style); - - /* Point from each rc_style to the list of styles */ - if (!g_slist_find (rc_style->rc_style_lists, rc_styles)) - rc_style->rc_style_lists = g_slist_prepend (rc_style->rc_style_lists, rc_styles); - - gtk_rc_style_append_icon_factories (proto_style, rc_style); - gtk_rc_style_append_color_hashes (proto_style, rc_style); - - tmp_styles = tmp_styles->next; - } - - for (i = 0; i < 5; i++) - if (proto_style->bg_pixmap_name[i] && - (strcmp (proto_style->bg_pixmap_name[i], "") == 0)) - { - g_free (proto_style->bg_pixmap_name[i]); - proto_style->bg_pixmap_name[i] = NULL; - } - - style = gtk_rc_style_to_style (context, proto_style); - g_object_unref (proto_style); - - g_hash_table_insert (realized_style_ht, rc_styles, style); - } - else - g_slist_free (rc_styles); - - return style; -} - /********************* * Parsing functions * *********************/ @@ -2278,46 +850,6 @@ lookup_color (GtkRcStyle *style, return FALSE; } -const GtkRcProperty* -_gtk_rc_style_lookup_rc_property (GtkRcStyle *rc_style, - GQuark type_name, - GQuark property_name) -{ - GtkRcProperty *node = NULL; - - g_return_val_if_fail (GTK_IS_RC_STYLE (rc_style), NULL); - - if (rc_style->rc_properties) - { - GtkRcProperty key; - - key.type_name = type_name; - key.property_name = property_name; - - node = bsearch (&key, - rc_style->rc_properties->data, rc_style->rc_properties->len, - sizeof (GtkRcProperty), gtk_rc_properties_cmp); - } - - return node; -} - -static gchar* -gtk_rc_check_pixmap_dir (const gchar *dir, - const gchar *pixmap_file) -{ - gchar *buf; - - buf = g_build_filename (dir, pixmap_file, NULL); - - if (g_file_test (buf, G_FILE_TEST_EXISTS)) - return buf; - - g_free (buf); - - return NULL; - } - /** * gtk_rc_find_pixmap_in_path: * @settings: a #GtkSettings @@ -2336,39 +868,8 @@ gtk_rc_find_pixmap_in_path (GtkSettings *settings, GScanner *scanner, const gchar *pixmap_file) { - gint i; - gchar *filename; - GSList *tmp_list; - - GtkRcContext *context = gtk_rc_context_get (settings); - - if (context->pixmap_path) - for (i = 0; context->pixmap_path[i] != NULL; i++) - { - filename = gtk_rc_check_pixmap_dir (context->pixmap_path[i], pixmap_file); - if (filename) - return filename; - } - - tmp_list = current_files_stack; - while (tmp_list) - { - GtkRcFile *curfile = tmp_list->data; - filename = gtk_rc_check_pixmap_dir (curfile->directory, pixmap_file); - if (filename) - return filename; - - tmp_list = tmp_list->next; - } - - if (scanner) - g_scanner_warn (scanner, - _("Unable to locate image file in pixmap_path: \"%s\""), - pixmap_file); - else - g_warning (_("Unable to locate image file in pixmap_path: \"%s\""), - pixmap_file); - + g_warning (_("Unable to locate image file in pixmap_path: \"%s\""), + pixmap_file); return NULL; } @@ -2740,282 +1241,3 @@ gtk_rc_parse_color_full (GScanner *scanner, return G_TOKEN_STRING; } } - -GSList * -_gtk_rc_parse_widget_class_path (const gchar *pattern) -{ - GSList *result; - PathElt *path_elt; - const gchar *current; - const gchar *class_start; - const gchar *class_end; - const gchar *pattern_end; - const gchar *pattern_start; - gchar *sub_pattern; - - result = NULL; - current = pattern; - while ((class_start = strchr (current, '<')) && - (class_end = strchr (class_start, '>'))) - { - /* Add patterns, but ignore single dots */ - if (!(class_start == current || - (class_start == current + 1 && current[0] == '.'))) - { - pattern_end = class_start - 1; - pattern_start = current; - - path_elt = g_new (PathElt, 1); - - sub_pattern = g_strndup (pattern_start, pattern_end - pattern_start + 1); - path_elt->type = PATH_ELT_PSPEC; - path_elt->elt.pspec = g_pattern_spec_new (sub_pattern); - g_free (sub_pattern); - - result = g_slist_prepend (result, path_elt); - } - - path_elt = g_new (PathElt, 1); - - /* The < > need to be removed from the string. */ - sub_pattern = g_strndup (class_start + 1, class_end - class_start - 1); - - path_elt->type = PATH_ELT_UNRESOLVED; - path_elt->elt.class_name = sub_pattern; - - result = g_slist_prepend (result, path_elt); - - current = class_end + 1; - } - - /* Add the rest, if anything is left */ - if (strlen (current) > 0) - { - path_elt = g_new (PathElt, 1); - path_elt->type = PATH_ELT_PSPEC; - path_elt->elt.pspec = g_pattern_spec_new (current); - - result = g_slist_prepend (result, path_elt); - } - - return g_slist_reverse (result); -} - -static void -free_path_elt (gpointer data, - gpointer user_data) -{ - PathElt *path_elt = data; - - switch (path_elt->type) - { - case PATH_ELT_PSPEC: - g_pattern_spec_free (path_elt->elt.pspec); - break; - case PATH_ELT_UNRESOLVED: - g_free (path_elt->elt.class_name); - break; - case PATH_ELT_TYPE: - break; - default: - g_assert_not_reached (); - } - - g_free (path_elt); -} - -void -_gtk_rc_free_widget_class_path (GSList *list) -{ - g_slist_foreach (list, free_path_elt, NULL); - g_slist_free (list); -} - -static void -gtk_rc_set_free (GtkRcSet *rc_set) -{ - if (rc_set->pspec) - g_pattern_spec_free (rc_set->pspec); - - _gtk_rc_free_widget_class_path (rc_set->path); - - g_free (rc_set); -} - -static gboolean -match_class (PathElt *path_elt, - gchar *type_name) -{ - GType type; - - if (path_elt->type == PATH_ELT_UNRESOLVED) - { - type = g_type_from_name (path_elt->elt.class_name); - if (type != G_TYPE_INVALID) - { - g_free (path_elt->elt.class_name); - path_elt->elt.class_type = type; - path_elt->type = PATH_ELT_TYPE; - } - else - return g_str_equal (type_name, path_elt->elt.class_name); - } - - return g_type_is_a (g_type_from_name (type_name), path_elt->elt.class_type); -} - -static gboolean -match_widget_class_recursive (GSList *list, - guint length, - gchar *path, - gchar *path_reversed) -{ - PathElt *path_elt; - - /* break out if we cannot match anymore. */ - if (list == NULL) - { - if (length > 0) - return FALSE; - else - return TRUE; - } - - /* there are two possibilities: - * 1. The next pattern should match the class. - * 2. First normal matching, and then maybe a class */ - - path_elt = list->data; - - if (path_elt->type != PATH_ELT_PSPEC) - { - gchar *class_start = path; - gchar *class_end; - - /* ignore leading dot */ - if (class_start[0] == '.') - class_start++; - class_end = strchr (class_start, '.'); - - if (class_end == NULL) - { - if (!match_class (path_elt, class_start)) - return FALSE; - else - return match_widget_class_recursive (list->next, 0, "", ""); - } - else - { - class_end[0] = '\0'; - if (!match_class (path_elt, class_start)) - { - class_end[0] = '.'; - return FALSE; - } - else - { - gboolean result; - gint new_length = length - (class_end - path); - gchar old_char = path_reversed[new_length]; - - class_end[0] = '.'; - - path_reversed[new_length] = '\0'; - result = match_widget_class_recursive (list->next, new_length, class_end, path_reversed); - path_reversed[new_length] = old_char; - - return result; - } - } - } - else - { - PathElt *class_elt; - gchar *class_start; - gchar *class_end; - gboolean result = FALSE; - - /* If there is nothing after this (ie. no class match), - * just compare the pspec. - */ - if (list->next == NULL) - return g_pattern_match (path_elt->elt.pspec, length, path, path_reversed); - - class_elt = (PathElt *)list->next->data; - g_assert (class_elt->type != PATH_ELT_PSPEC); - - class_start = path; - if (class_start[0] == '.') - class_start++; - - while (TRUE) - { - class_end = strchr (class_start, '.'); - - /* It should be cheaper to match the class first. (either the pattern - * is simple, and will match most of the times, or it may be complex - * and matching is slow) - */ - if (class_end == NULL) - { - result = match_class (class_elt, class_start); - } - else - { - class_end[0] = '\0'; - result = match_class (class_elt, class_start); - class_end[0] = '.'; - } - - if (result) - { - gchar old_char; - result = FALSE; - - /* terminate the string in front of the class. It does not matter - * that the class becomes unusable, because it is not needed - * inside the recursion - */ - old_char = class_start[0]; - class_start[0] = '\0'; - - if (g_pattern_match (path_elt->elt.pspec, class_start - path, path, path_reversed + length - (class_start - path))) - { - if (class_end != NULL) - { - gint new_length = length - (class_end - path); - gchar path_reversed_char = path_reversed[new_length]; - - path_reversed[new_length] = '\0'; - - result = match_widget_class_recursive (list->next->next, new_length, class_end, path_reversed); - - path_reversed[new_length] = path_reversed_char; - } - else - result = match_widget_class_recursive (list->next->next, 0, "", ""); - } - - class_start[0] = old_char; - } - - if (result) - return TRUE; - - /* get next class in path, or break out */ - if (class_end != NULL) - class_start = class_end + 1; - else - return FALSE; - } - } -} - -gboolean -_gtk_rc_match_widget_class (GSList *list, - gint length, - gchar *path, - gchar *path_reversed) -{ - return match_widget_class_recursive (list, length, path, path_reversed); -} diff --git a/gtk/gtkrc.h b/gtk/gtkrc.h index 65635eebb..dc3abe763 100644 --- a/gtk/gtkrc.h +++ b/gtk/gtkrc.h @@ -123,7 +123,6 @@ struct _GtkRcStyleClass void (*_gtk_reserved4) (void); }; -void _gtk_rc_init (void); GSList* _gtk_rc_parse_widget_class_path (const gchar *pattern); void _gtk_rc_free_widget_class_path (GSList *list); gboolean _gtk_rc_match_widget_class (GSList *list, @@ -234,23 +233,6 @@ struct _GtkRcProperty gchar *origin; GValue value; }; -const GtkRcProperty* _gtk_rc_style_lookup_rc_property (GtkRcStyle *rc_style, - GQuark type_name, - GQuark property_name); -void _gtk_rc_style_set_rc_property (GtkRcStyle *rc_style, - GtkRcProperty *property); -void _gtk_rc_style_unset_rc_property (GtkRcStyle *rc_style, - GQuark type_name, - GQuark property_name); - -GSList * _gtk_rc_style_get_color_hashes (GtkRcStyle *rc_style); - -void _gtk_rc_style_set_symbolic_color (GtkRcStyle *rc_style, - const gchar *name, - const GdkColor *color); - -const gchar* _gtk_rc_context_get_default_font_name (GtkSettings *settings); -void _gtk_rc_context_destroy (GtkSettings *settings); G_END_DECLS diff --git a/gtk/gtksettings.c b/gtk/gtksettings.c index f84bc9b28..2e0f7d69a 100644 --- a/gtk/gtksettings.c +++ b/gtk/gtksettings.c @@ -1334,8 +1334,6 @@ gtk_settings_finalize (GObject *object) object_list = g_slist_remove (object_list, settings); - _gtk_rc_context_destroy (settings); - for (i = 0; i < class_n_properties; i++) g_value_unset (&settings->property_values[i].value); g_free (settings->property_values); diff --git a/gtk/gtkstyle.c b/gtk/gtkstyle.c index 87f72bebc..419b098ab 100644 --- a/gtk/gtkstyle.c +++ b/gtk/gtkstyle.c @@ -82,7 +82,6 @@ typedef struct { typedef struct _GtkStylePrivate GtkStylePrivate; struct _GtkStylePrivate { - GSList *color_hashes; GtkStyleContext *context; gulong context_changed_id; }; @@ -104,8 +103,6 @@ static void gtk_style_get_property (GObject *object, GValue *value, GParamSpec *pspec); -static void gtk_style_realize (GtkStyle *style, - GdkVisual *visual); static void gtk_style_real_realize (GtkStyle *style); static void gtk_style_real_unrealize (GtkStyle *style); static void gtk_style_real_copy (GtkStyle *style, @@ -334,8 +331,6 @@ static void hls_to_rgb (gdouble *h, gdouble *l, gdouble *s); -static void style_unrealize_cursors (GtkStyle *style); - static void transform_detail_string (const gchar *detail, GtkStyleContext *context); @@ -378,54 +373,13 @@ G_DEFINE_TYPE (GtkStyle, gtk_style, G_TYPE_OBJECT) /* --- functions --- */ -/** - * _gtk_style_init_for_settings: - * @style: a #GtkStyle - * @settings: a #GtkSettings - * - * Initializes the font description in @style according to the default - * font name of @settings. This is called for gtk_style_new() with - * the settings for the default screen (if any); if we are creating - * a style for a particular screen, we then call it again in a - * location where we know the correct settings. - * The reason for this is that gtk_rc_style_create_style() doesn't - * take the screen for an argument. - **/ -void -_gtk_style_init_for_settings (GtkStyle *style, - GtkSettings *settings) -{ - const gchar *font_name = _gtk_rc_context_get_default_font_name (settings); - - if (style->font_desc) - pango_font_description_free (style->font_desc); - - style->font_desc = pango_font_description_from_string (font_name); - - if (!pango_font_description_get_family (style->font_desc)) - { - g_warning ("Default font does not have a family set"); - pango_font_description_set_family (style->font_desc, "Sans"); - } - if (pango_font_description_get_size (style->font_desc) <= 0) - { - g_warning ("Default font does not have a positive size"); - pango_font_description_set_size (style->font_desc, 10 * PANGO_SCALE); - } -} - static void gtk_style_init (GtkStyle *style) { gint i; - - GtkSettings *settings = gtk_settings_get_default (); - - if (settings) - _gtk_style_init_for_settings (style, settings); - else - style->font_desc = pango_font_description_from_string ("Sans 10"); - + + style->font_desc = pango_font_description_from_string ("Sans 10"); + style->attach_count = 0; style->black.red = 0; @@ -556,25 +510,6 @@ gtk_style_class_init (GtkStyleClass *klass) G_TYPE_NONE, 0); } -static void -clear_property_cache (GtkStyle *style) -{ - if (style->property_cache) - { - guint i; - - for (i = 0; i < style->property_cache->len; i++) - { - PropertyValue *node = &g_array_index (style->property_cache, PropertyValue, i); - - g_param_spec_unref (node->pspec); - g_value_unset (&node->value); - } - g_array_free (style->property_cache, TRUE); - style->property_cache = NULL; - } -} - static void gtk_style_finalize (GObject *object) { @@ -583,8 +518,6 @@ gtk_style_finalize (GObject *object) g_return_if_fail (style->attach_count == 0); - clear_property_cache (style); - /* All the styles in the list have the same * style->styles pointer. If we delete the * *first* style from the list, we need to update @@ -612,9 +545,6 @@ gtk_style_finalize (GObject *object) g_slist_foreach (style->icon_factories, (GFunc) g_object_unref, NULL); g_slist_free (style->icon_factories); - g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_unref, NULL); - g_slist_free (priv->color_hashes); - pango_font_description_free (style->font_desc); if (style->private_font_desc) @@ -748,6 +678,7 @@ gtk_style_update_from_context (GtkStyle *style) GtkStylePrivate *priv; GtkStateType state; GtkBorder *padding; + gint i; priv = GTK_STYLE_GET_PRIVATE (style); @@ -792,6 +723,33 @@ gtk_style_update_from_context (GtkStyle *style) gtk_border_free (padding); } + + for (i = 0; i < 5; i++) + { + _gtk_style_shade (&style->bg[i], &style->light[i], LIGHTNESS_MULT); + _gtk_style_shade (&style->bg[i], &style->dark[i], DARKNESS_MULT); + + style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2; + style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2; + style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2; + + style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2; + style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2; + style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2; + } + + style->black.red = 0x0000; + style->black.green = 0x0000; + style->black.blue = 0x0000; + + style->white.red = 0xffff; + style->white.green = 0xffff; + style->white.blue = 0xffff; + + for (i = 0; i < 5; i++) + style->background[i] = cairo_pattern_create_rgb (style->bg[i].red / 65535.0, + style->bg[i].green / 65535.0, + style->bg[i].blue / 65535.0); } static void @@ -840,26 +798,6 @@ gtk_style_copy (GtkStyle *style) return new_style; } -static GtkStyle* -gtk_style_duplicate (GtkStyle *style) -{ - GtkStyle *new_style; - - g_return_val_if_fail (GTK_IS_STYLE (style), NULL); - - new_style = gtk_style_copy (style); - - /* All the styles in the list have the same - * style->styles pointer. When we insert a new - * style, we append it to the list to avoid having - * to update the existing ones. - */ - style->styles = g_slist_append (style->styles, new_style); - new_style->styles = style->styles; - - return new_style; -} - /** * gtk_style_new: * @returns: a new #GtkStyle. @@ -914,69 +852,10 @@ GtkStyle* gtk_style_attach (GtkStyle *style, GdkWindow *window) { - GSList *styles; - GtkStyle *new_style = NULL; - GdkVisual *visual; - g_return_val_if_fail (GTK_IS_STYLE (style), NULL); g_return_val_if_fail (window != NULL, NULL); - - visual = gdk_window_get_visual (window); - - if (!style->styles) - style->styles = g_slist_append (NULL, style); - - styles = style->styles; - while (styles) - { - new_style = styles->data; - - if (new_style->visual == visual) - break; - - new_style = NULL; - styles = styles->next; - } - if (!new_style) - { - styles = style->styles; - - while (styles) - { - new_style = styles->data; - - if (new_style->attach_count == 0) - { - gtk_style_realize (new_style, visual); - break; - } - - new_style = NULL; - styles = styles->next; - } - } - - if (!new_style) - { - new_style = gtk_style_duplicate (style); - gtk_style_realize (new_style, visual); - } - - /* A style gets a refcount from being attached */ - if (new_style->attach_count == 0) - g_object_ref (new_style); - - /* Another refcount belongs to the parent */ - if (style != new_style) - { - g_object_unref (style); - g_object_ref (new_style); - } - - new_style->attach_count++; - - return new_style; + return style; } /** @@ -992,35 +871,6 @@ void gtk_style_detach (GtkStyle *style) { g_return_if_fail (GTK_IS_STYLE (style)); - - if (style->attach_count == 0) - return; - - style->attach_count -= 1; - if (style->attach_count == 0) - { - g_signal_emit (style, unrealize_signal, 0); - - g_object_unref (style->visual); - style->visual = NULL; - - if (style->private_font_desc) - { - pango_font_description_free (style->private_font_desc); - style->private_font_desc = NULL; - } - - g_object_unref (style); - } -} - -static void -gtk_style_realize (GtkStyle *style, - GdkVisual *visual) -{ - style->visual = g_object_ref (visual); - - g_signal_emit (style, realize_signal, 0); } /** @@ -1141,8 +991,6 @@ static void gtk_style_real_copy (GtkStyle *style, GtkStyle *src) { - GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style); - GtkStylePrivate *src_priv = GTK_STYLE_GET_PRIVATE (src); gint i; for (i = 0; i < 5; i++) @@ -1179,64 +1027,12 @@ gtk_style_real_copy (GtkStyle *style, g_slist_free (style->icon_factories); style->icon_factories = g_slist_copy (src->icon_factories); g_slist_foreach (style->icon_factories, (GFunc) g_object_ref, NULL); - - g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_unref, NULL); - g_slist_free (priv->color_hashes); - priv->color_hashes = g_slist_copy (src_priv->color_hashes); - g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_ref, NULL); - - /* don't copy, just clear cache */ - clear_property_cache (style); } static void gtk_style_real_init_from_rc (GtkStyle *style, GtkRcStyle *rc_style) { - GtkStylePrivate *priv = GTK_STYLE_GET_PRIVATE (style); - gint i; - - /* cache _should_ be still empty */ - clear_property_cache (style); - - if (rc_style->font_desc) - pango_font_description_merge (style->font_desc, rc_style->font_desc, TRUE); - - for (i = 0; i < 5; i++) - { - if (rc_style->color_flags[i] & GTK_RC_FG) - style->fg[i] = rc_style->fg[i]; - if (rc_style->color_flags[i] & GTK_RC_BG) - style->bg[i] = rc_style->bg[i]; - if (rc_style->color_flags[i] & GTK_RC_TEXT) - style->text[i] = rc_style->text[i]; - if (rc_style->color_flags[i] & GTK_RC_BASE) - style->base[i] = rc_style->base[i]; - } - - if (rc_style->xthickness >= 0) - style->xthickness = rc_style->xthickness; - if (rc_style->ythickness >= 0) - style->ythickness = rc_style->ythickness; - - style->icon_factories = g_slist_copy (rc_style->icon_factories); - g_slist_foreach (style->icon_factories, (GFunc) g_object_ref, NULL); - - priv->color_hashes = g_slist_copy (_gtk_rc_style_get_color_hashes (rc_style)); - g_slist_foreach (priv->color_hashes, (GFunc) g_hash_table_ref, NULL); -} - -static gint -style_property_values_cmp (gconstpointer bsearch_node1, - gconstpointer bsearch_node2) -{ - const PropertyValue *val1 = bsearch_node1; - const PropertyValue *val2 = bsearch_node2; - - if (val1->widget_type == val2->widget_type) - return val1->pspec < val2->pspec ? -1 : val1->pspec == val2->pspec ? 0 : 1; - else - return val1->widget_type < val2->widget_type ? -1 : 1; } /** @@ -1258,9 +1054,9 @@ gtk_style_get_style_property (GtkStyle *style, const gchar *property_name, GValue *value) { + GtkStylePrivate *priv; GtkWidgetClass *klass; GParamSpec *pspec; - GtkRcPropertyParser parser; const GValue *peek_value; klass = g_type_class_ref (widget_type); @@ -1276,10 +1072,10 @@ gtk_style_get_style_property (GtkStyle *style, return; } - parser = g_param_spec_get_qdata (pspec, - g_quark_from_static_string ("gtk-rc-property-parser")); - - peek_value = _gtk_style_peek_property_value (style, widget_type, pspec, parser); + priv = GTK_STYLE_GET_PRIVATE (style); + peek_value = _gtk_style_context_peek_style_property (priv->context, + widget_type, + 0, pspec); if (G_VALUE_TYPE (value) == G_PARAM_SPEC_VALUE_TYPE (pspec)) g_value_copy (peek_value, value); @@ -1312,6 +1108,7 @@ gtk_style_get_valist (GtkStyle *style, const gchar *first_property_name, va_list var_args) { + GtkStylePrivate *priv; const char *property_name; GtkWidgetClass *klass; @@ -1319,11 +1116,11 @@ gtk_style_get_valist (GtkStyle *style, klass = g_type_class_ref (widget_type); + priv = GTK_STYLE_GET_PRIVATE (style); property_name = first_property_name; while (property_name) { GParamSpec *pspec; - GtkRcPropertyParser parser; const GValue *peek_value; gchar *error; @@ -1338,10 +1135,8 @@ gtk_style_get_valist (GtkStyle *style, break; } - parser = g_param_spec_get_qdata (pspec, - g_quark_from_static_string ("gtk-rc-property-parser")); - - peek_value = _gtk_style_peek_property_value (style, widget_type, pspec, parser); + peek_value = _gtk_style_context_peek_style_property (priv->context, widget_type, + 0, pspec); G_VALUE_LCOPY (peek_value, var_args, 0, &error); if (error) { @@ -1383,195 +1178,14 @@ gtk_style_get (GtkStyle *style, va_end (var_args); } -const GValue* -_gtk_style_peek_property_value (GtkStyle *style, - GType widget_type, - GParamSpec *pspec, - GtkRcPropertyParser parser) -{ - PropertyValue *pcache, key = { 0, NULL, { 0, } }; - const GtkRcProperty *rcprop = NULL; - guint i; - - g_return_val_if_fail (GTK_IS_STYLE (style), NULL); - g_return_val_if_fail (G_IS_PARAM_SPEC (pspec), NULL); - g_return_val_if_fail (g_type_is_a (pspec->owner_type, GTK_TYPE_WIDGET), NULL); - g_return_val_if_fail (g_type_is_a (widget_type, pspec->owner_type), NULL); - - key.widget_type = widget_type; - key.pspec = pspec; - - /* need value cache array */ - if (!style->property_cache) - style->property_cache = g_array_new (FALSE, FALSE, sizeof (PropertyValue)); - else - { - pcache = bsearch (&key, - style->property_cache->data, style->property_cache->len, - sizeof (PropertyValue), style_property_values_cmp); - if (pcache) - return &pcache->value; - } - - i = 0; - while (i < style->property_cache->len && - style_property_values_cmp (&key, &g_array_index (style->property_cache, PropertyValue, i)) >= 0) - i++; - - g_array_insert_val (style->property_cache, i, key); - pcache = &g_array_index (style->property_cache, PropertyValue, i); - - /* cache miss, initialize value type, then set contents */ - g_param_spec_ref (pcache->pspec); - g_value_init (&pcache->value, G_PARAM_SPEC_VALUE_TYPE (pspec)); - - /* value provided by rc style? */ - if (style->rc_style) - { - GQuark prop_quark = g_quark_from_string (pspec->name); - - do - { - rcprop = _gtk_rc_style_lookup_rc_property (style->rc_style, - g_type_qname (widget_type), - prop_quark); - if (rcprop) - break; - widget_type = g_type_parent (widget_type); - } - while (g_type_is_a (widget_type, pspec->owner_type)); - } - - /* when supplied by rc style, we need to convert */ - if (rcprop && !_gtk_settings_parse_convert (parser, &rcprop->value, - pspec, &pcache->value)) - { - gchar *contents = g_strdup_value_contents (&rcprop->value); - - g_message ("%s: failed to retrieve property `%s::%s' of type `%s' from rc file value \"%s\" of type `%s'", - rcprop->origin ? rcprop->origin : "(for origin information, set GTK_DEBUG)", - g_type_name (pspec->owner_type), pspec->name, - g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)), - contents, - G_VALUE_TYPE_NAME (&rcprop->value)); - g_free (contents); - rcprop = NULL; /* needs default */ - } - - /* not supplied by rc style (or conversion failed), revert to default */ - if (!rcprop) - g_param_value_set_default (pspec, &pcache->value); - - return &pcache->value; -} - -static cairo_pattern_t * -load_background (GdkVisual *visual, - GdkColor *bg_color, - const gchar *filename) -{ - if (filename == NULL) - { - return cairo_pattern_create_rgb (bg_color->red / 65535.0, - bg_color->green / 65535.0, - bg_color->blue / 65535.0); - } - if (strcmp (filename, "") == 0) - return NULL; - else - { - GdkPixbuf *pixbuf; - cairo_surface_t *surface; - cairo_pattern_t *pattern; - cairo_t *cr; - GdkScreen *screen = gdk_visual_get_screen (visual); - - pixbuf = gdk_pixbuf_new_from_file (filename, NULL); - if (!pixbuf) - return NULL; - - surface = gdk_window_create_similar_surface (gdk_screen_get_root_window (screen), - CAIRO_CONTENT_COLOR, - gdk_pixbuf_get_width (pixbuf), - gdk_pixbuf_get_height (pixbuf)); - - cr = cairo_create (surface); - - gdk_cairo_set_source_color (cr, bg_color); - cairo_paint (cr); - - gdk_cairo_set_source_pixbuf (cr, pixbuf, 0, 0); - cairo_paint (cr); - - cairo_destroy (cr); - g_object_unref (pixbuf); - - pattern = cairo_pattern_create_for_surface (surface); - - cairo_surface_destroy (surface); - - return pattern; - } -} - static void gtk_style_real_realize (GtkStyle *style) { - gint i; - - for (i = 0; i < 5; i++) - { - _gtk_style_shade (&style->bg[i], &style->light[i], LIGHTNESS_MULT); - _gtk_style_shade (&style->bg[i], &style->dark[i], DARKNESS_MULT); - - style->mid[i].red = (style->light[i].red + style->dark[i].red) / 2; - style->mid[i].green = (style->light[i].green + style->dark[i].green) / 2; - style->mid[i].blue = (style->light[i].blue + style->dark[i].blue) / 2; - - style->text_aa[i].red = (style->text[i].red + style->base[i].red) / 2; - style->text_aa[i].green = (style->text[i].green + style->base[i].green) / 2; - style->text_aa[i].blue = (style->text[i].blue + style->base[i].blue) / 2; - } - - style->black.red = 0x0000; - style->black.green = 0x0000; - style->black.blue = 0x0000; - - style->white.red = 0xffff; - style->white.green = 0xffff; - style->white.blue = 0xffff; - - for (i = 0; i < 5; i++) - { - const char *image_name; - - if (style->rc_style) - image_name = style->rc_style->bg_pixmap_name[i]; - else - image_name = NULL; - - style->background[i] = load_background (style->visual, - &style->bg[i], - image_name); - } } static void gtk_style_real_unrealize (GtkStyle *style) { - int i; - - for (i = 0; i < 5; i++) - { - if (style->background[i]) - { - cairo_pattern_destroy (style->background[i]); - style->background[i] = NULL; - } - - } - - style_unrealize_cursors (style); } static void @@ -4320,19 +3934,6 @@ struct _CursorInfo GdkColor secondary; }; -static void -style_unrealize_cursors (GtkStyle *style) -{ - CursorInfo * - - cursor_info = g_object_get_data (G_OBJECT (style), "gtk-style-cursor-info"); - if (cursor_info) - { - g_free (cursor_info); - g_object_set_data (G_OBJECT (style), I_("gtk-style-cursor-info"), NULL); - } -} - static const GdkColor * get_insertion_cursor_color (GtkWidget *widget, gboolean is_primary) diff --git a/gtk/gtkstyle.h b/gtk/gtkstyle.h index 3d44b1ffa..efd78a7cf 100644 --- a/gtk/gtkstyle.h +++ b/gtk/gtkstyle.h @@ -634,14 +634,6 @@ void gtk_style_get (GtkStyle *style, #endif /* --- private API --- */ -const GValue* _gtk_style_peek_property_value (GtkStyle *style, - GType widget_type, - GParamSpec *pspec, - GtkRcPropertyParser parser); - -void _gtk_style_init_for_settings (GtkStyle *style, - GtkSettings *settings); - void _gtk_style_shade (const GdkColor *a, GdkColor *b, gdouble k); @@ -655,7 +647,7 @@ void gtk_draw_insertion_cursor (GtkWidget *widget, void _gtk_widget_get_cursor_color (GtkWidget *widget, GdkColor *color); -gboolean gtk_style_has_context (GtkStyle *style); +gboolean gtk_style_has_context (GtkStyle *style); diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index ca61f04a2..ffdd76ddf 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -45,7 +45,6 @@ #include "gtkbindings.h" #include "gtkprivate.h" #include "gdk/gdk.h" -#include "gdk/gdkprivate.h" /* Used in gtk_reset_shapes_recurse to avoid copy */ #include #include #include @@ -560,10 +559,7 @@ static PangoContext* gtk_widget_peek_pango_context (GtkWidget *widget); static void gtk_widget_update_pango_context (GtkWidget *widget); static void gtk_widget_propagate_state (GtkWidget *widget, GtkStateData *data); -static void gtk_widget_reset_rc_style (GtkWidget *widget); -static void gtk_widget_set_style_internal (GtkWidget *widget, - GtkStyle *style, - gboolean initial_emission); +; static gint gtk_widget_event_internal (GtkWidget *widget, GdkEvent *event); static gboolean gtk_widget_real_mnemonic_activate (GtkWidget *widget, @@ -6290,9 +6286,29 @@ gtk_widget_real_query_tooltip (GtkWidget *widget, static void gtk_widget_real_style_updated (GtkWidget *widget) { + if (gtk_widget_get_realized (widget)) + { + /* Trigger ::style-set for old + * widgets not listening to this + */ + g_signal_emit (widget, + widget_signals[STYLE_SET], + 0, + widget->priv->style); + } + if (widget->priv->context) - gtk_style_context_invalidate (widget->priv->context); - gtk_widget_queue_resize (widget); + { + gtk_style_context_invalidate (widget->priv->context); + + if (gtk_widget_get_realized (widget) && + gtk_widget_get_has_window (widget)) + gtk_style_context_set_background (widget->priv->context, + widget->priv->window); + } + + if (widget->priv->anchored) + gtk_widget_queue_resize (widget); } static gboolean @@ -6734,9 +6750,6 @@ gtk_widget_set_name (GtkWidget *widget, if (priv->context) gtk_style_context_set_path (priv->context, priv->path); - if (priv->rc_style) - gtk_widget_reset_rc_style (widget); - g_object_notify (G_OBJECT (widget), "name"); } @@ -7658,23 +7671,6 @@ gtk_widget_set_style (GtkWidget *widget, GtkStyle *style) { g_return_if_fail (GTK_IS_WIDGET (widget)); - - if (style) - { - gboolean initial_emission; - - initial_emission = !widget->priv->rc_style && !widget->priv->user_style; - - widget->priv->rc_style = FALSE; - widget->priv->user_style = TRUE; - - gtk_widget_set_style_internal (widget, style, initial_emission); - } - else - { - if (widget->priv->user_style) - gtk_widget_reset_rc_style (widget); - } } /** @@ -7698,42 +7694,21 @@ gtk_widget_ensure_style (GtkWidget *widget) { GtkStyle *style; + if (widget->priv->style) + g_object_unref (widget->priv->style); + style = g_object_new (GTK_TYPE_STYLE, "context", gtk_widget_get_style_context (widget), NULL); - gtk_widget_set_style_internal (widget, style, TRUE); - g_object_unref (style); - } - -#if 0 - if (!widget->priv->rc_style && !widget->priv->user_style) - gtk_widget_reset_rc_style (widget); -#endif -} + widget->priv->style = g_object_ref (style); -/* Look up the RC style for this widget, unsetting any user style that - * may be in effect currently - **/ -static void -gtk_widget_reset_rc_style (GtkWidget *widget) -{ - GtkWidgetPrivate *priv = widget->priv; - GtkStyle *new_style = NULL; - gboolean initial_emission; - - initial_emission = !priv->rc_style && !priv->user_style; - - priv->user_style = FALSE; - priv->rc_style = TRUE; - - if (gtk_widget_has_screen (widget)) - new_style = gtk_rc_get_style (widget); - if (!new_style) - new_style = gtk_widget_get_default_style (); + g_signal_emit (widget, + widget_signals[STYLE_SET], + 0, NULL); - if (initial_emission || new_style != priv->style) - gtk_widget_set_style_internal (widget, new_style, initial_emission); + g_object_unref (style); + } } /** @@ -7790,13 +7765,6 @@ gtk_widget_modify_style (GtkWidget *widget, quark_rc_style, gtk_rc_style_copy (style), (GDestroyNotify) g_object_unref); - - /* note that "style" may be invalid here if it was the old - * modifier style and the only reference was our own. - */ - - if (widget->priv->rc_style) - gtk_widget_reset_rc_style (widget); } /** @@ -7888,11 +7856,6 @@ modifier_style_changed (GtkModifierStyle *style, context = gtk_widget_get_style_context (widget); gtk_style_context_invalidate (context); - - g_signal_emit (widget, - widget_signals[STYLE_SET], - 0, - widget->priv->style); } static GtkModifierStyle * @@ -8347,59 +8310,6 @@ static void gtk_widget_real_style_set (GtkWidget *widget, GtkStyle *previous_style) { - GtkWidgetPrivate *priv = widget->priv; - - if (gtk_widget_get_realized (widget) && - gtk_widget_get_has_window (widget)) - gtk_style_set_background (priv->style, priv->window, - gtk_widget_get_state (widget)); -} - -static void -gtk_widget_set_style_internal (GtkWidget *widget, - GtkStyle *style, - gboolean initial_emission) -{ - GtkWidgetPrivate *priv = widget->priv; - - g_object_ref (widget); - g_object_freeze_notify (G_OBJECT (widget)); - - if (priv->style != style) - { - GtkStyle *previous_style; - - if (gtk_widget_get_realized (widget)) - gtk_style_detach (priv->style); - - previous_style = priv->style; - priv->style = style; - g_object_ref (priv->style); - - if (gtk_widget_get_realized (widget)) - priv->style = gtk_style_attach (priv->style, priv->window); - - gtk_widget_update_pango_context (widget); - g_signal_emit (widget, - widget_signals[STYLE_SET], - 0, - initial_emission ? NULL : previous_style); - g_object_unref (previous_style); - - if (priv->anchored && !initial_emission) - gtk_widget_queue_resize (widget); - } - else if (initial_emission) - { - gtk_widget_update_pango_context (widget); - g_signal_emit (widget, - widget_signals[STYLE_SET], - 0, - NULL); - } - g_object_notify (G_OBJECT (widget), "style"); - g_object_thaw_notify (G_OBJECT (widget)); - g_object_unref (widget); } typedef struct { @@ -8594,11 +8504,6 @@ _gtk_widget_propagate_screen_changed (GtkWidget *widget, static void reset_style_recurse (GtkWidget *widget, gpointer data) { -#if 0 - if (widget->priv->rc_style) - gtk_widget_reset_rc_style (widget); -#endif - if (widget->priv->context) { _gtk_widget_update_path (widget); @@ -13797,7 +13702,11 @@ style_context_changed (GtkStyleContext *context, { GtkWidget *widget = user_data; + gtk_widget_update_pango_context (widget); g_signal_emit (widget, widget_signals[STYLE_UPDATED], 0); + + if (widget->priv->anchored) + gtk_widget_queue_resize (widget); } /** -- 2.43.2