[Xfce4-commits] <xfce4-xkb-plugin:master> Massive memleak plugging (bug #7363).

Jérôme Guelfucci noreply at xfce.org
Thu Apr 28 23:56:01 CEST 2011


Updating branch refs/heads/master
         to 4eead9775d4688104e1b77cf443381734b1fa652 (commit)
       from eb41705d86c299ec67469be16f87f5f75457ae69 (commit)

commit 4eead9775d4688104e1b77cf443381734b1fa652
Author: Jérôme Guelfucci <jeromeg at xfce.org>
Date:   Thu Apr 28 22:58:15 2011 +0200

    Massive memleak plugging (bug #7363).
    
    Based on an original patch by Mikhail Efremov.
    
    May need some additionnal work.

 panel-plugin/xfce4-xkb-plugin.c    |   20 ++++---
 panel-plugin/xkb-cairo.c           |    2 +
 panel-plugin/xkb-config.c          |   59 ++++++++++++++----
 panel-plugin/xkb-config.h          |    1 +
 panel-plugin/xkb-settings-dialog.c |  115 +++++++++++++++++++++++++----------
 5 files changed, 143 insertions(+), 54 deletions(-)

diff --git a/panel-plugin/xfce4-xkb-plugin.c b/panel-plugin/xfce4-xkb-plugin.c
index da8bfa5..5392fcd 100644
--- a/panel-plugin/xfce4-xkb-plugin.c
+++ b/panel-plugin/xfce4-xkb-plugin.c
@@ -222,7 +222,7 @@ xkb_free (t_xkb *xkb)
     xkb_config_finalize ();
 
     if (xkb->settings->kbd_config)
-        g_free (xkb->settings->kbd_config);
+        kbd_config_free (xkb->settings->kbd_config);
 
     g_free (xkb->settings);
 
@@ -365,20 +365,24 @@ xkb_initialize_menu (t_xkb *xkb)
     xkb->popup = gtk_menu_new ();
     for (i = 0; i < xkb_config_get_group_count (); i++)
     {
-        imgfilename = xkb_util_get_flag_filename (xkb_config_get_group_name (i));
+        gchar *layout_string;
 
+        imgfilename = xkb_util_get_flag_filename (xkb_config_get_group_name (i));
         handle = rsvg_handle_new_from_file (imgfilename, NULL);
+        g_free (imgfilename);
+
         if (handle)
         {
             tmp = rsvg_handle_get_pixbuf (handle);
         }
 
-        menu_item = gtk_image_menu_item_new_with_label (
-                xkb_util_get_layout_string (
-                    xkb_config_get_group_name (i),
-                    xkb_config_get_variant (i)
-                    )
-                );
+        layout_string =
+            xkb_util_get_layout_string (xkb_config_get_group_name (i),
+                                        xkb_config_get_variant (i));
+
+        menu_item = gtk_image_menu_item_new_with_label (layout_string);
+        g_free (layout_string);
+
         g_signal_connect (G_OBJECT (menu_item), "activate",
                 G_CALLBACK (xkb_plugin_set_group), GINT_TO_POINTER (i));
 
diff --git a/panel-plugin/xkb-cairo.c b/panel-plugin/xkb-cairo.c
index 6c6c91e..e5f1df1 100644
--- a/panel-plugin/xkb-cairo.c
+++ b/panel-plugin/xkb-cairo.c
@@ -88,6 +88,8 @@ xkb_cairo_draw_flag (cairo_t *cr,
 
     filename = xkb_util_get_flag_filename (group_name);
     handle = rsvg_handle_new_from_file (filename, NULL);
+    g_free (filename);
+
     if (!handle)
     {
         xkb_cairo_draw_label (cr, group_name,
diff --git a/panel-plugin/xkb-config.c b/panel-plugin/xkb-config.c
index 8d33f8b..78fb9e5 100644
--- a/panel-plugin/xkb-config.c
+++ b/panel-plugin/xkb-config.c
@@ -107,8 +107,6 @@ xkb_config_initialize (t_xkb_settings *settings,
 
     xkl_engine_set_group_per_toplevel_window (config->engine, FALSE);
 
-    xkb_config_initialize_xkb_options (settings);
-
     xkl_engine_start_listen (config->engine, XKLL_TRACK_KEYBOARD_STATE);
 
     g_signal_connect (config->engine,
@@ -135,6 +133,8 @@ xkb_config_initialize_xkb_options (t_xkb_settings *settings)
     gint val;
     gpointer pval;
 
+    xkb_config_free ();
+
     group = config->config_rec->layouts;
     config->group_count = 0;
     while (*group)
@@ -143,8 +143,6 @@ xkb_config_initialize_xkb_options (t_xkb_settings *settings)
         config->group_count++;
     }
 
-    xkb_config_free ();
-
     config->window_map = g_hash_table_new (g_direct_hash, NULL);
     config->application_map = g_hash_table_new (g_direct_hash, NULL);
 
@@ -191,13 +189,39 @@ xkb_config_initialize_xkb_options (t_xkb_settings *settings)
     g_hash_table_destroy (index_variants);
 }
 
+void
+kbd_config_free (t_xkb_kbd_config *kbd_config)
+{
+    g_free (kbd_config->model);
+    g_free (kbd_config->layouts);
+    g_free (kbd_config->variants);
+    g_free (kbd_config->toggle_option);
+    g_free (kbd_config->compose_key_position);
+
+    g_free (kbd_config);
+}
+
 static void
 xkb_config_free (void)
 {
+    gint i;
+
     g_assert (config != NULL);
 
-    if (config->group_names) g_free (config->group_names);
-    if (config->variants) g_free (config->variants);
+    if (config->group_names)
+    {
+        for (i = 0; i < config->group_count; i++)
+            g_free (config->group_names[i]);
+        g_free (config->group_names);
+    }
+
+    if (config->variants)
+    {
+        for (i = 0; i < config->group_count; i++)
+            g_free (config->variants[i]);
+        g_free (config->variants);
+    }
+
     g_hash_table_destroy (config->variant_index_by_group);
 
     g_hash_table_destroy (config->window_map);
@@ -209,6 +233,8 @@ xkb_config_finalize (void)
 {
     xkb_config_free ();
 
+    g_free (config);
+
     gdk_window_remove_filter (NULL, (GdkFilterFunc) handle_xevent, NULL);
 
     xkl_engine_stop_listen (config->engine, XKLL_TRACK_KEYBOARD_STATE);
@@ -252,7 +278,6 @@ xkb_config_update_settings (t_xkb_settings *settings)
 
     gchar **opt;
     gchar **prefix;
-    gchar *options;
 
     g_assert (config != NULL);
     g_assert (settings != NULL);
@@ -271,17 +296,20 @@ xkb_config_update_settings (t_xkb_settings *settings)
         settings->kbd_config->model = g_strdup (config->config_rec->model);
         settings->kbd_config->layouts = g_strjoinv (",", config->config_rec->layouts);
         settings->kbd_config->variants = g_strjoinv (",", config->config_rec->variants);
-        options = g_strjoinv (",", config->config_rec->options);
-        if (strcmp ("", options) == 0)
-        {
-            options = NULL;
-        }
     }
     else
     {
+        gchar *options;
+
         activate_settings = TRUE;
+
+        g_free (config->config_rec->model);
         config->config_rec->model = g_strdup (settings->kbd_config->model);
+
+        g_strfreev (config->config_rec->layouts);
         config->config_rec->layouts = g_strsplit_set (settings->kbd_config->layouts, ",", 0);
+
+        g_strfreev (config->config_rec->variants);
         config->config_rec->variants = g_strsplit_set (settings->kbd_config->variants, ",", 0);
 
         if (settings->kbd_config->toggle_option
@@ -296,7 +324,10 @@ xkb_config_update_settings (t_xkb_settings *settings)
             options = g_strconcat (options, ",", settings->kbd_config->compose_key_position, NULL);
             g_free (tmp);
         }
+
+        g_strfreev (config->config_rec->options);
         config->config_rec->options = g_strsplit_set (options, ",", 0);
+        g_free (options);
     }
 
     /* select the first "grp" option and use it (should be fixed to support more options) */
@@ -317,6 +348,8 @@ xkb_config_update_settings (t_xkb_settings *settings)
         {
             settings->kbd_config->compose_key_position = g_strdup (*opt);
         }
+
+        g_strfreev (prefix);
         opt++;
     }
 
@@ -493,7 +526,7 @@ xkb_config_state_changed (XklEngine *engine,
 void
 xkb_config_xkl_config_changed (XklEngine *engine)
 {
-    g_free (config->settings->kbd_config);
+    kbd_config_free (config->settings->kbd_config);
     config->settings->kbd_config = NULL;
     xkb_config_update_settings (config->settings);
 
diff --git a/panel-plugin/xkb-config.h b/panel-plugin/xkb-config.h
index a0b73eb..fb87184 100644
--- a/panel-plugin/xkb-config.h
+++ b/panel-plugin/xkb-config.h
@@ -66,6 +66,7 @@ gboolean    xkb_config_initialize                   (t_xkb_settings *settings,
                                                      XkbCallback callback,
                                                      gpointer data);
 void        xkb_config_finalize                     (void);
+void        kbd_config_free                         (t_xkb_kbd_config *kbd_config);
 gboolean    xkb_config_update_settings              (t_xkb_settings *settings);
 gint        xkb_config_get_group_count              (void);
 gchar*      xkb_config_get_group_name               (gint group);
diff --git a/panel-plugin/xkb-settings-dialog.c b/panel-plugin/xkb-settings-dialog.c
index 4d8564e..28ee9d4 100644
--- a/panel-plugin/xkb-settings-dialog.c
+++ b/panel-plugin/xkb-settings-dialog.c
@@ -123,6 +123,9 @@ xkb_settings_fill_layout_tree_model_with_config (t_xkb *xkb)
                             -1);
         layout_nb += 1;
     }
+
+    g_strfreev (layouts);
+    g_strfreev (variants);
 }
 
 static void
@@ -196,16 +199,19 @@ xkb_settings_set_toggle_option_combo_default_value (t_xkb *xkb)
     t_xkb_kbd_config *config = xkb->settings->kbd_config;
 
     model = GTK_TREE_MODEL (xkb->toggle_options_store);
-    gtk_tree_model_get_iter_first (model, &iter);
+    if (!gtk_tree_model_get_iter_first (model, &iter))
+        return;
+
     gtk_tree_model_get (model, &iter, NOM, &id, -1);
 
     if (config->toggle_option == NULL)
     {
         gtk_combo_box_set_active_iter (GTK_COMBO_BOX (xkb->toggle_options_combo), &iter);
+        g_free (id);
         return;
     }
 
-    if (strcmp (id, config->toggle_option) == 0 )
+    if (strcmp (id, config->toggle_option) == 0)
     {
         gtk_combo_box_set_active_iter (GTK_COMBO_BOX (xkb->toggle_options_combo), &iter);
     }
@@ -213,6 +219,7 @@ xkb_settings_set_toggle_option_combo_default_value (t_xkb *xkb)
     {
         while (gtk_tree_model_iter_next(model, &iter))
         {
+            g_free (id);
             gtk_tree_model_get (model, &iter, NOM, &id, -1);
 
             if (strcmp (id, config->toggle_option) == 0)
@@ -234,12 +241,14 @@ xkb_settings_set_compose_key_position_combo_default_value (t_xkb *xkb)
     t_xkb_kbd_config *config = xkb->settings->kbd_config;
 
     model = GTK_TREE_MODEL (xkb->compose_key_options_store);
-    gtk_tree_model_get_iter_first (model, &iter);
+    if (!gtk_tree_model_get_iter_first (model, &iter))
+        return;
     gtk_tree_model_get (model, &iter, NOM, &id, -1);
 
     if (config->compose_key_position == NULL)
     {
         /* select the empty option if compose_key_position is null */
+        g_free (id);
         gtk_combo_box_set_active_iter (GTK_COMBO_BOX (xkb->compose_key_options_combo), &iter);
         return;
     }
@@ -252,6 +261,7 @@ xkb_settings_set_compose_key_position_combo_default_value (t_xkb *xkb)
     {
         while (gtk_tree_model_iter_next (model, &iter))
         {
+            g_free (id);
             gtk_tree_model_get (model, &iter, NOM, &id, -1);
 
             if (strcmp (id, config->compose_key_position) == 0)
@@ -272,7 +282,9 @@ xkb_settings_set_kbd_combo_default_value (t_xkb *xkb)
     t_xkb_kbd_config *config = xkb->settings->kbd_config;
 
     model = GTK_TREE_MODEL (xkb->combo_store);
-    gtk_tree_model_get_iter_first (model, &iter);
+    if (!gtk_tree_model_get_iter_first (model, &iter))
+        return;
+
     gtk_tree_model_get (model, &iter, NOM, &id, -1);
     if (strcmp (id, config->model) == 0 )
         gtk_combo_box_set_active_iter (GTK_COMBO_BOX (xkb->kbd_model_combo), &iter);
@@ -280,6 +292,7 @@ xkb_settings_set_kbd_combo_default_value (t_xkb *xkb)
     {
         while (gtk_tree_model_iter_next(model, &iter))
         {
+            g_free (id);
             gtk_tree_model_get (model, &iter, NOM, &id, -1);
 
             if (strcmp (id, config->model) == 0)
@@ -349,7 +362,7 @@ xkb_settings_edit_layout (GtkWidget *widget, t_xkb *xkb)
                             VARIANTS, strings[1],
                             -1);
         xkb_settings_update_from_ui (xkb);
-        g_free(strings);
+        g_strfreev (strings);
     }
     g_free(c);
     xkb_settings_edit_layout_btn_show (GTK_TREE_VIEW (xkb->layout_tree_view), xkb);
@@ -373,7 +386,7 @@ xkb_settings_add_layout (GtkWidget *widget, t_xkb *xkb)
                         -1);
         xkb_settings_show_hide_layout_buttons (xkb);
         xkb_settings_update_from_ui (xkb);
-        g_free (strings);
+        g_strfreev (strings);
     }
     g_free (c);
     xkb_settings_edit_layout_btn_show (GTK_TREE_VIEW (xkb->layout_tree_view), xkb);
@@ -800,33 +813,46 @@ xkb_settings_layout_dialog_run (void)
     if (response == GTK_RESPONSE_OK)
     {
         gchar *id;
-        gchar *strings[2];
+        gchar *result;
 
         selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree_view));
 
-        gtk_tree_selection_get_selected (selection, &model, &iter);
+        if (!gtk_tree_selection_get_selected (selection, &model, &iter))
+            return NULL;
         gtk_tree_model_get (model, &iter, AVAIL_LAYOUT_TREE_COL_ID, &id, -1);
 
+        /* TODO: tree_path must be leaked here... */
         tree_path = gtk_tree_model_get_path (model, &iter);
         if (gtk_tree_path_get_depth (tree_path) == 1)
-        {
-            strings[0] = id;
-            strings[1] = "";
-        }
+            result = g_strconcat(id, ",", NULL);
         else
         {
-            strings[1] = id;
-            gtk_tree_path_up(tree_path);
-            gtk_tree_model_get_iter(model, &iter, tree_path);
-            gtk_tree_model_get (model, &iter, AVAIL_LAYOUT_TREE_COL_ID, &id, -1);
-            strings[0] = id;
+            gchar *tmp;
+
+            if (!gtk_tree_path_up(tree_path))
+            {
+                g_free (id);
+                return NULL;
+            }
+
+            if (!gtk_tree_model_get_iter(model, &iter, tree_path))
+            {
+                g_free (id);
+                return NULL;
+            }
+
+            gtk_tree_model_get (model, &iter, AVAIL_LAYOUT_TREE_COL_ID, &tmp, -1);
+            result = g_strconcat (tmp, ",", id, NULL);
+            g_free (tmp);
         }
 
         gtk_widget_destroy (dialog);
-        return g_strconcat(strings[0], ",", strings[1], NULL);
+        g_free (id);
 
+        return result;
     }
     gtk_widget_destroy (dialog);
+
     return NULL;
 }
 
@@ -843,6 +869,7 @@ xkb_settings_update_from_ui (t_xkb *xkb)
     if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (xkb->kbd_model_combo), &iter))
     {
         gtk_tree_model_get (model, &iter, NOM, &kbdmodel, -1);
+        g_free (kbd_config->model);
         kbd_config->model = kbdmodel;
     }
 
@@ -854,6 +881,8 @@ xkb_settings_update_from_ui (t_xkb *xkb)
         if (strcmp ("", toggle_option) == 0)
             kbd_config->toggle_option = NULL;
         else kbd_config->toggle_option = g_strdup (toggle_option);
+
+        g_free (toggle_option);
     }
 
     model = GTK_TREE_MODEL (xkb->compose_key_options_store);
@@ -865,31 +894,51 @@ xkb_settings_update_from_ui (t_xkb *xkb)
             kbd_config->compose_key_position = NULL;
         else kbd_config->compose_key_position = g_strdup (compose_key_position);
 
+        g_free (compose_key_position);
     }
 
     model = GTK_TREE_MODEL (xkb->layout_store);
-    gtk_tree_model_get_iter_first (model, &iter);
-    gtk_tree_model_get (model, &iter, DEFAULT_LAYOUT, &is_default, LAYOUTS, &layouts, VARIANTS, &variants, -1);
-    if (is_default) xkb->settings->default_group = i;
-    kbd_config->layouts = layouts;
-    if (variants != NULL)
-        kbd_config->variants = variants;
-    else
-        kbd_config->variants = "";
-
-    i = 1;
-    while (gtk_tree_model_iter_next (model, &iter))
+    if (gtk_tree_model_get_iter_first (model, &iter))
     {
         gtk_tree_model_get (model, &iter, DEFAULT_LAYOUT, &is_default, LAYOUTS, &layouts, VARIANTS, &variants, -1);
         if (is_default) xkb->settings->default_group = i;
-        i++;
 
-        kbd_config->layouts = g_strconcat(kbd_config->layouts, ",", layouts, NULL);
+        g_free (kbd_config->layouts);
+        kbd_config->layouts = layouts;
+
+        g_free (kbd_config->variants);
         if (variants != NULL)
-            kbd_config->variants = g_strconcat(kbd_config->variants, ",", variants, NULL);
+            kbd_config->variants = variants;
         else
-            kbd_config->variants = g_strconcat(kbd_config->variants, ",", NULL);
+            kbd_config->variants = g_strdup ("");
+
+        i = 1;
+        while (gtk_tree_model_iter_next (model, &iter))
+        {
+            gchar *tmp;
+
+            gtk_tree_model_get (model, &iter, DEFAULT_LAYOUT, &is_default, LAYOUTS, &layouts, VARIANTS, &variants, -1);
+            if (is_default) xkb->settings->default_group = i;
+            i++;
+
+            tmp = g_strconcat(kbd_config->layouts, ",", layouts, NULL);
+            g_free (kbd_config->layouts);
+            kbd_config->layouts = g_strdup (tmp);
+            g_free (tmp);
+            g_free (layouts);
+
+            if (variants != NULL)
+                tmp = g_strconcat(kbd_config->variants, ",", variants, NULL);
+            else
+                tmp = g_strconcat(kbd_config->variants, ",", NULL);
+
+            g_free (kbd_config->variants);
+            kbd_config->variants = g_strdup (tmp);
+            g_free (tmp);
+            g_free (variants);
+        }
     }
+
     xkb_config_update_settings (xkb->settings);
     xkb_refresh_gui (xkb);
 }



More information about the Xfce4-commits mailing list