diff options
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 7 | ||||
-rw-r--r-- | calendar/gui/e-comp-editor-registry.c | 90 | ||||
-rw-r--r-- | calendar/gui/e-comp-editor-registry.h | 29 |
3 files changed, 69 insertions, 57 deletions
diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 805cf550a4..d204de56e8 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -522,6 +522,13 @@ close_dialog (CompEditor *editor) priv = editor->priv; + /* FIXME Unfortunately we do this here because otherwise corba + calls happen during destruction and we might get a change + notification back when we are in an inconsistent state */ + if (priv->view) + g_signal_handlers_disconnect_matched (G_OBJECT (priv->view), + G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, editor); + gtk_widget_destroy (GTK_WIDGET (editor)); } diff --git a/calendar/gui/e-comp-editor-registry.c b/calendar/gui/e-comp-editor-registry.c index 9e2a63bd48..c576ea7465 100644 --- a/calendar/gui/e-comp-editor-registry.c +++ b/calendar/gui/e-comp-editor-registry.c @@ -34,6 +34,7 @@ struct _ECompEditorRegistryPrivate { struct _ECompEditorRegistryData { + ECompEditorRegistry *registry; CompEditor *editor; char *uid; }; @@ -41,42 +42,63 @@ struct _ECompEditorRegistryData typedef struct _ECompEditorRegistryData ECompEditorRegistryData; typedef struct _ECompEditorRegistryForeachData ECompEditorRegistryForeachData; -static GtkObjectClass *parent_class = NULL; +static GObjectClass *parent_class = NULL; -static void editor_destroy_cb (GtkWidget *widget, gpointer data); +static void editor_destroy_cb (gpointer data, GObject *where_object_was); static void -destroy (GtkObject *obj) +registry_data_free (gpointer data) +{ + ECompEditorRegistryData *rdata = data; + + if (rdata->editor) + g_object_weak_unref (G_OBJECT (rdata->editor), editor_destroy_cb, rdata); + g_free (rdata->uid); + g_free (rdata); +} + +static void +dispose (GObject *obj) { ECompEditorRegistry *reg; ECompEditorRegistryPrivate *priv; reg = E_COMP_EDITOR_REGISTRY (obj); priv = reg->priv; + + if (priv->editors) { + g_hash_table_destroy (priv->editors); + priv->editors = NULL; + } - if (priv) { - if (priv->editors) { - g_hash_table_destroy (priv->editors); - priv->editors = NULL; - } + (* G_OBJECT_CLASS (parent_class)->dispose) (obj); +} - g_free (priv); - reg->priv = NULL; - } +static void +finalize (GObject *obj) +{ + ECompEditorRegistry *reg; + ECompEditorRegistryPrivate *priv; + + reg = E_COMP_EDITOR_REGISTRY (obj); + priv = reg->priv; - (* GTK_OBJECT_CLASS (parent_class)->destroy) (obj); + g_free (priv); + + (* G_OBJECT_CLASS (parent_class)->finalize) (obj); } static void class_init (ECompEditorRegistryClass *klass) { - GtkObjectClass *object_class; + GObjectClass *object_class; - object_class = GTK_OBJECT_CLASS (klass); + object_class = G_OBJECT_CLASS (klass); parent_class = g_type_class_peek_parent (klass); - object_class->destroy = destroy; + object_class->dispose = dispose; + object_class->finalize = finalize; } static void @@ -87,16 +109,15 @@ init (ECompEditorRegistry *reg) priv = g_new0 (ECompEditorRegistryPrivate, 1); reg->priv = priv; - - priv->editors = g_hash_table_new (g_str_hash, g_str_equal); + priv->editors = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, registry_data_free); } E_MAKE_TYPE (e_comp_editor_registry, "ECompEditorRegistry", ECompEditorRegistry, - class_init, init, gtk_object_get_type ()); + class_init, init, G_TYPE_OBJECT); -GtkObject * +GObject * e_comp_editor_registry_new (void) { return g_object_new (E_TYPE_COMP_EDITOR_REGISTRY, NULL); @@ -122,12 +143,14 @@ e_comp_editor_registry_add (ECompEditorRegistry *reg, CompEditor *editor, gboole rdata = g_new0 (ECompEditorRegistryData, 1); + rdata->registry = reg; rdata->editor = editor; rdata->uid = g_strdup (uid); - g_hash_table_insert (priv->editors, rdata->uid, rdata); - g_signal_connect (editor, "destroy", G_CALLBACK (editor_destroy_cb), reg); + g_hash_table_insert (priv->editors, g_strdup (uid), rdata); + /* FIXME Need to know when uid on the editor changes (if the component changes locations) */ + g_object_weak_ref (G_OBJECT (editor), editor_destroy_cb, rdata); } CompEditor * @@ -188,25 +211,12 @@ e_comp_editor_registry_close_all (ECompEditorRegistry *reg) } static void -editor_destroy_cb (GtkWidget *widget, gpointer data) +editor_destroy_cb (gpointer data, GObject *where_object_was) { - ECompEditorRegistry *reg; - ECompEditorRegistryPrivate *priv; - ECompEditorRegistryData *rdata; - ECalComponent *comp; - const char *uid; - - reg = E_COMP_EDITOR_REGISTRY (data); - priv = reg->priv; - - comp = comp_editor_get_comp (COMP_EDITOR (widget)); - e_cal_component_get_uid (comp, &uid); - - rdata = g_hash_table_lookup (priv->editors, uid); + ECompEditorRegistryData *rdata = data; - if (rdata != NULL) { - g_hash_table_remove (priv->editors, rdata->uid); - g_free (rdata->uid); - g_free (rdata); - } + /* We null it out because its dead, so we won't try to weak + * unref it in the hash destroyer */ + rdata->editor = NULL; + g_hash_table_remove (rdata->registry->priv->editors, rdata->uid); } diff --git a/calendar/gui/e-comp-editor-registry.h b/calendar/gui/e-comp-editor-registry.h index dfcc1b21bc..6ddf2f34e5 100644 --- a/calendar/gui/e-comp-editor-registry.h +++ b/calendar/gui/e-comp-editor-registry.h @@ -27,19 +27,16 @@ #include <config.h> #endif -#include <gtk/gtk.h> +#include <glib-object.h> #include <dialogs/comp-editor.h> -#ifdef __cplusplus -extern "C" { -#pragma } -#endif /* __cplusplus */ +G_BEGIN_DECLS -#define E_TYPE_COMP_EDITOR_REGISTRY (e_comp_editor_registry_get_type ()) -#define E_COMP_EDITOR_REGISTRY(obj) (GTK_CHECK_CAST ((obj), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistry)) -#define E_COMP_EDITOR_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistryClass)) -#define E_IS_COMP_EDITOR_REGISTRY(obj) (GTK_CHECK_TYPE ((obj), E_TYPE_COMP_EDITOR_REGISTRY)) -#define E_IS_COMP_EDITOR_REGISTRY_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((obj), E_TYPE_COMP_EDITOR_REGISTRY)) +#define E_TYPE_COMP_EDITOR_REGISTRY (e_comp_editor_registry_get_type ()) +#define E_COMP_EDITOR_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistry)) +#define E_COMP_EDITOR_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), E_TYPE_COMP_EDITOR_REGISTRY, ECompEditorRegistryClass)) +#define E_IS_COMP_EDITOR_REGISTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), E_TYPE_COMP_EDITOR_REGISTRY)) +#define E_IS_COMP_EDITOR_REGISTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), E_TYPE_COMP_EDITOR_REGISTRY)) typedef struct _ECompEditorRegistry ECompEditorRegistry; @@ -47,13 +44,13 @@ typedef struct _ECompEditorRegistryPrivate ECompEditorRegistryPrivate; typedef struct _ECompEditorRegistryClass ECompEditorRegistryClass; struct _ECompEditorRegistry { - GtkObject parent; + GObject parent; ECompEditorRegistryPrivate *priv; }; struct _ECompEditorRegistryClass { - GtkObjectClass parent_class; + GObjectClass parent_class; }; typedef void (* ECompEditorRegistryForeachFn) (CompEditor *editor, gpointer data); @@ -61,8 +58,8 @@ typedef void (* ECompEditorRegistryForeachFn) (CompEditor *editor, gpointer data -GtkType e_comp_editor_registry_get_type (void); -GtkObject *e_comp_editor_registry_new (void); +GType e_comp_editor_registry_get_type (void); +GObject *e_comp_editor_registry_new (void); void e_comp_editor_registry_add (ECompEditorRegistry *reg, CompEditor *editor, gboolean remote); @@ -70,9 +67,7 @@ CompEditor *e_comp_editor_registry_find (ECompEditorRegistry *reg, const char *uid); gboolean e_comp_editor_registry_close_all (ECompEditorRegistry *reg); -#ifdef __cplusplus -} -#endif /* __cplusplus */ +G_END_DECLS #endif /* _E_COMP_EDITOR_REGISTRY_H_ */ |