aboutsummaryrefslogtreecommitdiffstats
path: root/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'widgets')
-rw-r--r--widgets/table/ChangeLog8
-rw-r--r--widgets/table/e-table-extras.c89
-rw-r--r--widgets/table/e-table-selection-model.c12
3 files changed, 42 insertions, 67 deletions
diff --git a/widgets/table/ChangeLog b/widgets/table/ChangeLog
index 764d76c139..2ee5268d62 100644
--- a/widgets/table/ChangeLog
+++ b/widgets/table/ChangeLog
@@ -1,3 +1,11 @@
+2007-10-02 Matthew Barnes <mbarnes@redhat.com>
+
+ ** Fixes part of bug #469657
+
+ * e-table-extras.c:
+ * e-table-selection-model.c:
+ Use destroy functions in GHashTables to simplify memory management.
+
2007-10-01 Milan Crha <mcrha@redhat.com>
** Fix for bug #470837
diff --git a/widgets/table/e-table-extras.c b/widgets/table/e-table-extras.c
index 312e19a0c5..25fb69e322 100644
--- a/widgets/table/e-table-extras.c
+++ b/widgets/table/e-table-extras.c
@@ -44,16 +44,6 @@
G_DEFINE_TYPE (ETableExtras, ete, G_TYPE_OBJECT)
static void
-cell_hash_free(gchar *key,
- ECell *cell,
- gpointer user_data)
-{
- g_free(key);
- if (cell)
- g_object_unref(cell);
-}
-
-static void
pixbuf_hash_free(gchar *key,
GdkPixbuf *pixbuf,
gpointer user_data)
@@ -69,30 +59,25 @@ ete_finalize (GObject *object)
ETableExtras *ete = E_TABLE_EXTRAS (object);
if (ete->cells) {
- g_hash_table_foreach (ete->cells, (GHFunc) cell_hash_free, NULL);
g_hash_table_destroy (ete->cells);
+ ete->cells = NULL;
}
if (ete->compares) {
- g_hash_table_foreach (ete->compares, (GHFunc) g_free, NULL);
g_hash_table_destroy (ete->compares);
+ ete->compares = NULL;
}
if (ete->searches) {
- g_hash_table_foreach (ete->searches, (GHFunc) g_free, NULL);
g_hash_table_destroy (ete->searches);
+ ete->searches = NULL;
}
if (ete->pixbufs) {
- g_hash_table_foreach (ete->pixbufs, (GHFunc) pixbuf_hash_free, NULL);
g_hash_table_destroy (ete->pixbufs);
+ ete->pixbufs = NULL;
}
- ete->cells = NULL;
- ete->compares = NULL;
- ete->searches = NULL;
- ete->pixbufs = NULL;
-
G_OBJECT_CLASS (ete_parent_class)->finalize (object);
}
@@ -162,12 +147,34 @@ e_string_search(gconstpointer haystack, const char *needle)
}
static void
+safe_unref (gpointer object)
+{
+ if (object != NULL)
+ g_object_unref (object);
+}
+
+static void
ete_init (ETableExtras *extras)
{
- extras->cells = g_hash_table_new(g_str_hash, g_str_equal);
- extras->compares = g_hash_table_new(g_str_hash, g_str_equal);
- extras->searches = g_hash_table_new(g_str_hash, g_str_equal);
- extras->pixbufs = g_hash_table_new(g_str_hash, g_str_equal);
+ extras->cells = g_hash_table_new_full (
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) safe_unref);
+
+ extras->compares = g_hash_table_new_full (
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) NULL);
+
+ extras->searches = g_hash_table_new_full (
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) NULL);
+
+ extras->pixbufs = g_hash_table_new_full (
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) safe_unref);
e_table_extras_add_compare(extras, "string", e_str_compare);
e_table_extras_add_compare(extras, "stringcase", e_str_case_compare);
@@ -199,16 +206,6 @@ e_table_extras_add_cell (ETableExtras *extras,
char *id,
ECell *cell)
{
- gchar *old_key;
- ECell *old_cell;
-
- if (g_hash_table_lookup_extended (extras->cells, id, (gpointer *)&old_key, (gpointer *)&old_cell)) {
- g_hash_table_remove (extras->cells, old_key);
- g_free (old_key);
- if (old_cell)
- g_object_unref (old_cell);
- }
-
if (cell)
g_object_ref_sink (cell);
g_hash_table_insert (extras->cells, g_strdup(id), cell);
@@ -226,14 +223,6 @@ e_table_extras_add_compare (ETableExtras *extras,
char *id,
GCompareFunc compare)
{
- gchar *old_key;
- GCompareFunc old_compare;
-
- if (g_hash_table_lookup_extended (extras->compares, id, (gpointer *)&old_key, (gpointer *)&old_compare)) {
- g_hash_table_remove (extras->compares, old_key);
- g_free (old_key);
- }
-
g_hash_table_insert(extras->compares, g_strdup(id), (gpointer) compare);
}
@@ -249,14 +238,6 @@ e_table_extras_add_search (ETableExtras *extras,
char *id,
ETableSearchFunc search)
{
- gchar *old_key;
- ETableSearchFunc old_search;
-
- if (g_hash_table_lookup_extended (extras->searches, id, (gpointer *)&old_key, (gpointer *)&old_search)) {
- g_hash_table_remove (extras->searches, old_key);
- g_free (old_key);
- }
-
g_hash_table_insert(extras->searches, g_strdup(id), search);
}
@@ -272,16 +253,6 @@ e_table_extras_add_pixbuf (ETableExtras *extras,
char *id,
GdkPixbuf *pixbuf)
{
- gchar *old_key;
- GdkPixbuf *old_pixbuf;
-
- if (g_hash_table_lookup_extended (extras->pixbufs, id, (gpointer *)&old_key, (gpointer *)&old_pixbuf)) {
- g_hash_table_remove (extras->cells, old_key);
- g_free (old_key);
- if (old_pixbuf)
- g_object_unref (old_pixbuf);
- }
-
if (pixbuf)
g_object_ref(pixbuf);
g_hash_table_insert (extras->pixbufs, g_strdup(id), pixbuf);
diff --git a/widgets/table/e-table-selection-model.c b/widgets/table/e-table-selection-model.c
index 76983106f6..2b8ec0fa99 100644
--- a/widgets/table/e-table-selection-model.c
+++ b/widgets/table/e-table-selection-model.c
@@ -52,16 +52,9 @@ save_to_hash(int model_row, gpointer closure)
}
static void
-free_key(gpointer key, gpointer value, gpointer closure)
-{
- g_free(key);
-}
-
-static void
free_hash(ETableSelectionModel *etsm)
{
if (etsm->hash) {
- g_hash_table_foreach(etsm->hash, free_key, NULL);
g_hash_table_destroy(etsm->hash);
etsm->hash = NULL;
}
@@ -78,7 +71,10 @@ model_pre_change (ETableModel *etm, ETableSelectionModel *etsm)
if (etsm->model && e_table_model_has_save_id (etsm->model)) {
gint cursor_row;
- etsm->hash = g_hash_table_new(g_str_hash, g_str_equal);
+ etsm->hash = g_hash_table_new_full(
+ g_str_hash, g_str_equal,
+ (GDestroyNotify) g_free,
+ (GDestroyNotify) NULL);
e_selection_model_foreach(E_SELECTION_MODEL(etsm), save_to_hash, etsm);
g_object_get(etsm,