+2006-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c (_gtk_rc_context_destroy): New function to
+ destroy an rc context.
+
+ * gtk/gtksettings.c (gtk_settings_finalize): Destroy the rc context.
+ (gtk_settings_get_for_screen): Unref the settings when the screen
+ goes away. (#348096, Chris Wilson)
+
2006-07-21 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkgc-quartz.c: (gdk_quartz_gc_get_values),
2006-07-21 Matthias Clasen <mclasen@redhat.com>
- * gtk/gtkstyle.c:
- * gtk/gtkrc.c:
- * gtk/gtkwidget.c: Replace gtk_rc_style_ref/unref by
- g_object_ref/unref.
-
* gtk/gtkimcontextsimple.c (gtk_im_context_simple_get_preedit_string):
0-terminate outbuf in all cases. (#348227, Nguyen Thái Ngoc Duy)
+2006-07-21 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtkrc.h:
+ * gtk/gtkrc.c (_gtk_rc_context_destroy): New function to
+ destroy an rc context.
+
+ * gtk/gtksettings.c (gtk_settings_finalize): Destroy the rc context.
+ (gtk_settings_get_for_screen): Unref the settings when the screen
+ goes away. (#348096, Chris Wilson)
+
2006-07-21 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkgc-quartz.c: (gdk_quartz_gc_get_values),
2006-07-21 Matthias Clasen <mclasen@redhat.com>
- * gtk/gtkstyle.c:
- * gtk/gtkrc.c:
- * gtk/gtkwidget.c: Replace gtk_rc_style_ref/unref by
- g_object_ref/unref.
-
* gtk/gtkimcontextsimple.c (gtk_im_context_simple_get_preedit_string):
0-terminate outbuf in all cases. (#348227, Nguyen Thái Ngoc Duy)
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 void
gtk_rc_parse_named (GtkRcContext *context,
const gchar *name,
GtkRcFile *rc_file;
GSList *tmp_list;
GtkRcContext *context;
-
struct stat statbuf;
g_return_val_if_fail (GTK_IS_SETTINGS (settings), FALSE);
context->reloading = TRUE;
_gtk_settings_reset_rc_values (context->settings);
- tmp_list = context->rc_files;
- while (tmp_list)
- {
- rc_file = tmp_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);
-
- tmp_list = tmp_list->next;
- }
-
- g_slist_free (context->rc_files);
- context->rc_files = NULL;
+ gtk_rc_clear_rc_files (context);
gtk_rc_parse_default_files (context);
g_value_unset (&settings->property_values[i].value);
g_free (settings->property_values);
+ _gtk_rc_context_destroy (settings);
+
g_datalist_clear (&settings->queued_settings);
G_OBJECT_CLASS (gtk_settings_parent_class)->finalize (object);
{
settings = g_object_new (GTK_TYPE_SETTINGS, NULL);
settings->screen = screen;
- g_object_set_data (G_OBJECT (screen), I_("gtk-settings"), settings);
+ g_object_set_data_full (G_OBJECT (screen), I_("gtk-settings"),
+ settings, g_object_unref);
gtk_rc_reparse_all_for_settings (settings, TRUE);
settings_update_double_click (settings);