[gnumeric] GUI: Plug leak.
- From: Morten Welinder <mortenw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnumeric] GUI: Plug leak.
- Date: Tue, 18 Mar 2014 19:19:49 +0000 (UTC)
commit 9546a88f46a7308e6bbd4994361b021394f8b7f5
Author: Morten Welinder <terra gnome org>
Date: Tue Mar 18 15:19:31 2014 -0400
GUI: Plug leak.
ChangeLog | 3 +++
src/wbc-gtk.c | 44 +++++++++++++++++++++++++++++++++-----------
test/common.supp | 8 ++++++++
3 files changed, 44 insertions(+), 11 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f53a015..96a44de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
2014-03-18 Morten Welinder <terra gnome org>
+ * src/wbc-gtk.c (cb_screen_changed): Plug leak by unloading css
+ providers from screens on exit.
+
* src/sheet-style.c (cell_tile_dump): Less debug chatter.
2014-03-17 Morten Welinder <terra gnome org>
diff --git a/src/wbc-gtk.c b/src/wbc-gtk.c
index 992d564..80200b0 100644
--- a/src/wbc-gtk.c
+++ b/src/wbc-gtk.c
@@ -2387,17 +2387,37 @@ cb_css_parse_error (GtkCssProvider *css, GtkCssSection *section, GError *err)
g_warning ("Theme parsing error: %s", err->message);
}
+struct css_provider_data {
+ GtkCssProvider *css;
+ GSList *screens;
+};
+
+static void
+cb_unload_providers (gpointer data_)
+{
+ struct css_provider_data *data = data_;
+ GSList *l;
+
+ for (l = data->screens; l; l = l->next) {
+ GdkScreen *screen = l->data;
+ gtk_style_context_remove_provider_for_screen
+ (screen, GTK_STYLE_PROVIDER (data->css));
+ }
+ g_slist_free (data->screens);
+ g_object_unref (data->css);
+ g_free (data);
+}
+
static void
cb_screen_changed (GtkWidget *widget)
{
GdkScreen *screen = gtk_widget_get_screen (widget);
- const char *key = "wbcg-screen-css";
GObject *app = gnm_app_get_app ();
const char *app_key = "css-provider";
- GtkCssProvider *css;
+ struct css_provider_data *data;
- css = g_object_get_data (app, app_key);
- if (!css) {
+ data = g_object_get_data (app, app_key);
+ if (!data) {
const char *resource = "gnm:gnumeric.css";
const char *csstext = go_rsm_lookup (resource, NULL);
gboolean debug = gnm_debug_flag ("css");
@@ -2412,28 +2432,30 @@ cb_screen_changed (GtkWidget *widget)
}
#endif
- css = gtk_css_provider_new ();
+ data = g_new (struct css_provider_data, 1);
+ data->css = gtk_css_provider_new ();
+ data->screens = NULL;
if (debug)
g_printerr ("Loading style from %s\n", resource);
else
- g_signal_connect (css, "parsing-error",
+ g_signal_connect (data->css, "parsing-error",
G_CALLBACK (cb_css_parse_error),
NULL);
- gtk_css_provider_load_from_data (css, csstext, -1, NULL);
- g_object_set_data_full (app, app_key, css, g_object_unref);
+ gtk_css_provider_load_from_data (data->css, csstext, -1, NULL);
+ g_object_set_data_full (app, app_key, data, cb_unload_providers);
#if !GTK_CHECK_VERSION(3,4,0)
g_free (csstext_copy);
#endif
}
- if (screen && !g_object_get_data (G_OBJECT (screen), key)) {
+ if (screen && !g_slist_find (data->screens, screen)) {
gtk_style_context_add_provider_for_screen
(screen,
- GTK_STYLE_PROVIDER (css),
+ GTK_STYLE_PROVIDER (data->css),
GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
- g_object_set_data (G_OBJECT (screen), key, css);
+ data->screens = g_slist_prepend (data->screens, screen);
}
}
diff --git a/test/common.supp b/test/common.supp
index 237f27d..04902a1 100644
--- a/test/common.supp
+++ b/test/common.supp
@@ -792,3 +792,11 @@
...
fun:g_settings_backend_get_default
}
+
+{
+ GLIB/G_QUARK_FROM_STRING
+ Memcheck:Leak
+ malloc
+ g_malloc
+ g_quark_from_string
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]