From 926ebeb42669e61d44281208349c66212f44eb3d Mon Sep 17 00:00:00 2001 From: Mikhail Efremov Date: Tue, 19 Apr 2011 21:20:21 +0400 Subject: [PATCH] Fix memory leaks. --- panel-plugin/xfce4-xkb-plugin.c | 2 +- panel-plugin/xkb-config.c | 27 ++++++++++++++++++++++----- panel-plugin/xkb-config.h | 1 + 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/panel-plugin/xfce4-xkb-plugin.c b/panel-plugin/xfce4-xkb-plugin.c index 554d613..cf754f1 100644 --- a/panel-plugin/xfce4-xkb-plugin.c +++ b/panel-plugin/xfce4-xkb-plugin.c @@ -224,7 +224,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); diff --git a/panel-plugin/xkb-config.c b/panel-plugin/xkb-config.c index 71b6627..5151400 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, @@ -136,6 +134,9 @@ xkb_config_initialize_xkb_options (t_xkb_settings *settings) gpointer pval; XklState *state = xkl_engine_get_current_state (config->engine); + + xkb_config_free (); + group = config->config_rec->layouts; config->group_count = 0; while (*group) @@ -144,8 +145,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); @@ -192,6 +191,18 @@ 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 () { @@ -199,6 +210,12 @@ xkb_config_free () g_assert (config != NULL); + if (config->group_names && config->variants) + for (i = 0; i < config->group_count; i++) + { + g_free (config->group_names[i]); + g_free (config->variants[i]); + } if (config->group_names) g_free (config->group_names); if (config->variants) g_free (config->variants); g_hash_table_destroy (config->variant_index_by_group); @@ -497,7 +514,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 d53eaa6..575c63e 100644 --- a/panel-plugin/xkb-config.h +++ b/panel-plugin/xkb-config.h @@ -65,6 +65,7 @@ typedef void (*XkbCallback) (gint current_group, gboolean xkb_config_initialize (t_xkb_settings *settings, XkbCallback callback, gpointer data); +void kbd_config_free (t_xkb_kbd_config *kbd_config); void xkb_config_finalize (); gboolean xkb_config_update_settings (t_xkb_settings *settings); gint xkb_config_get_group_count (); -- 1.7.4.4