[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