aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--shell/ChangeLog99
-rw-r--r--shell/e-activity-handler.c18
-rw-r--r--shell/e-shell-config-autocompletion.c10
-rw-r--r--shell/e-shell-config-default-folders.c10
-rw-r--r--shell/e-shell-config-offline.c8
-rw-r--r--shell/e-shell-folder-creation-dialog.c25
-rw-r--r--shell/e-shell-folder-selection-dialog.c6
-rw-r--r--shell/e-shell-importer.c39
-rw-r--r--shell/e-shell-shared-folder-picker-dialog.c35
-rw-r--r--shell/e-shell-startup-wizard.c2
-rw-r--r--shell/e-shell.c34
-rw-r--r--shell/e-shortcuts.c14
-rw-r--r--shell/evolution-test-component.c7
-rw-r--r--shell/main.c21
14 files changed, 197 insertions, 131 deletions
diff --git a/shell/ChangeLog b/shell/ChangeLog
index e13943aaf2..89f67988a5 100644
--- a/shell/ChangeLog
+++ b/shell/ChangeLog
@@ -1,3 +1,102 @@
+2002-11-14 Ettore Perazzoli <ettore@ximian.com>
+
+ * main.c (quit_box_destroyed_callback): Removed.
+ (no_views_left_cb): Use g_object_add_weak_pointer() instad of
+ connecting to the "destroy" signal.
+ (destroy_cb): Removed.
+ (shell_weak_notify): New.
+ (idle_cb): Use g_object_weak_ref() on the shell object instead of
+ connecting to the "destroy" signal.
+
+ * evolution-test-component.c (dialog_destroy_callback): Removed.
+ (dialog_weak_notify): New.
+ (create_new_folder_selector): Use g_object_weak_ref() on the
+ dialog instead of connecting the "destroy" signal.
+
+ * e-shortcuts.c (view_destroyed_cb): Removed.
+ (view_weak_notify): New.
+ (e_shortcuts_new_view): g_object_weak_ref() the new view instead
+ of connecting the "destroy" signal.
+ (impl_dispose): Free the ->views and g_object_weak_unref() all the
+ items.
+
+ * e-shell.c (view_destroy_cb): Removed.
+ (view_weak_notify): New.
+ (create_view): Use g_object_weak_ref() on the newly created view
+ instead of connecting to the "destroy" signal.
+ (impl_dispose): g_object_weak_unref() the views.
+ (e_shell_show_settings): Use g_object_add_weak_pointer() on the
+ settings_dialog instead of connecting to the "destroy" signal.
+ (settings_dialog_destroy_cb): Removed.
+
+ * e-shell-shared-folder-picker-dialog.c
+ (progress_bar_weak_notify): New.
+ (progress_bar_destroy_callback): Removed.
+ (create_progress_dialog): Use g_object_weak_ref() on the progress
+ bar object instead of connecting to its "destroy" signal.
+ (shell_destroy_callback): Removed.
+ (shell_view_destroy_callback): Removed.
+ (storage_destroy_callback): Removed.
+ (shell_weak_notify): New.
+ (shell_view_weak_notify): New.
+ (storage_weak_notify): New.
+ (discover_folder): Use g_object_weak_ref() on the shell, parent,
+ storage objects instead of connecting to their "destroy" signals.
+
+ * e-shell-importer.c: Removed member destroyed from
+ ImporterComponentData.
+ (import_cb): Instead of checking if ->destroyed is TRUE, check if
+ ->dialog is NULL to decide whether the dialog has been destroyed
+ or not.
+ (dialog_destroy_cb): Removed.
+ (start_import): Use g_object_weak_ref() on the dialog object
+ instead of connecting to its "destroy" signal.
+ (dialog_close): Removed.
+ (dialog_weak_notify): New.
+ (show_import_wizard): Use g_object_weak_ref() on the dialog object
+ instead of connecting to its "destroy" signal.
+ (import_druid_destroy): New.
+ (import_druid_weak_notify): New.
+ (show_import_wizard): Use g_object_weak_ref() on the druid object
+ instead of connecting to its "destroy" signal.
+
+ * e-shell-folder-selection-dialog.c
+ (e_shell_folder_selection_dialog_construct): g_object_weak_ref()
+ the shell object instead of connecting to its "destroy" signal.
+
+ * e-shell-folder-creation-dialog.c (dialog_destroy_cb): Removed.
+ (dialog_destroy_notify): New.
+ (e_shell_show_folder_creation_dialog): g_object_weak_ref() the
+ dialog instead of connecting to its "destroy" signal.
+ (shell_destroy_cb): Removed.
+ (shell_destroy_notify): New.
+ (e_shell_show_folder_creation_dialog): g_object_weak_ref() the
+ shell object instead of connecting to its "destroy" signal.
+
+ * e-shell-config-offline.c (config_control_destroy_callback):
+ Removed.
+ (config_control_destroy_notify): New.
+ (e_shell_config_offline_create_widget): g_object_weak_ref() the
+ config_control instead of connecting to its "destroy" signal.
+
+ * e-shell-config-default-folders.c
+ (config_control_destroy_callback): Removed.
+ (config_control_destroy_notify): New.
+ (e_shell_config_default_folders_create_widget):
+ g_object_weak_ref() instead of connecting to the "destroy" signal.
+
+ * e-shell-config-autocompletion.c (config_control_destroy_notify):
+ New.
+ (config_control_destroy_callback): Removed.
+ (e_shell_config_autocompletion_create_widget):
+ g_object_weak_ref() instead of connecting to the "destroy" signal.
+
+ * e-activity-handler.c (task_bar_destroy_cb): Removed.
+ (task_bar_destroy_notify): New.
+ (e_activity_handler_attach_task_bar): Weak_ref the task_bar using
+ task_bar_destroy_notify.
+ (impl_dispose): Weak_unref the task bars in priv->task_bars.
+
2002-11-13 Ettore Perazzoli <ettore@ximian.com>
* e-shell-startup-wizard.c: Change type of member etd in
diff --git a/shell/e-activity-handler.c b/shell/e-activity-handler.c
index aab5216e69..b85f9cb06b 100644
--- a/shell/e-activity-handler.c
+++ b/shell/e-activity-handler.c
@@ -308,19 +308,16 @@ setup_task_bar (EActivityHandler *activity_handler,
}
static void
-task_bar_destroy_callback (GtkObject *task_bar_object,
- void *data)
+task_bar_destroy_notify (void *data,
+ GObject *task_bar_instance)
{
- ETaskBar *task_bar;
EActivityHandler *activity_handler;
EActivityHandlerPrivate *priv;
- task_bar = E_TASK_BAR (task_bar_object);
-
activity_handler = E_ACTIVITY_HANDLER (data);
priv = activity_handler->priv;
- priv->task_bars = g_slist_remove (priv->task_bars, task_bar);
+ priv->task_bars = g_slist_remove (priv->task_bars, task_bar_instance);
}
@@ -332,6 +329,7 @@ impl_dispose (GObject *object)
EActivityHandler *handler;
EActivityHandlerPrivate *priv;
GList *p;
+ GSList *sp;
handler = E_ACTIVITY_HANDLER (object);
priv = handler->priv;
@@ -346,6 +344,10 @@ impl_dispose (GObject *object)
g_list_free (priv->activity_infos);
priv->activity_infos = NULL;
+ for (sp = priv->task_bars; sp != NULL; sp = sp->next)
+ g_object_weak_unref (G_OBJECT (sp->data), task_bar_destroy_notify, sp->data);
+ priv->task_bars = NULL;
+
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
@@ -588,9 +590,7 @@ e_activity_handler_attach_task_bar (EActivityHandler *activity_handler,
priv = activity_handler->priv;
- g_signal_connect_object (task_bar, "destroy",
- G_CALLBACK (task_bar_destroy_callback),
- G_OBJECT (activity_handler), 0);
+ g_object_weak_ref (G_OBJECT (task_bar), task_bar_destroy_notify, activity_handler);
priv->task_bars = g_slist_prepend (priv->task_bars, task_bar);
diff --git a/shell/e-shell-config-autocompletion.c b/shell/e-shell-config-autocompletion.c
index 37ea318681..b3b72bb954 100644
--- a/shell/e-shell-config-autocompletion.c
+++ b/shell/e-shell-config-autocompletion.c
@@ -56,9 +56,11 @@ folder_list_changed_callback (EFolderList *efl,
}
static void
-config_control_destroy_callback (EvolutionConfigControl *config_control,
- EvolutionAutocompletionConfig *ac)
+config_control_destroy_notify (void *data,
+ GObject *where_the_config_control_was)
{
+ EvolutionAutocompletionConfig *ac = (EvolutionAutocompletionConfig *) data;
+
g_object_unref (ac->shell_client);
g_object_unref (ac->config_listener);
@@ -114,8 +116,8 @@ e_shell_config_autocompletion_create_widget (EShell *shell, EvolutionConfigContr
G_CALLBACK (folder_list_changed_callback), ac);
g_signal_connect (ac->config_control, "apply",
G_CALLBACK (config_control_apply_callback), ac);
- g_signal_connect (ac->config_control, "destroy",
- G_CALLBACK (config_control_destroy_callback), ac);
+
+ g_object_weak_ref (G_OBJECT (ac->config_control), config_control_destroy_notify, ac);
CORBA_exception_free (&ev);
diff --git a/shell/e-shell-config-default-folders.c b/shell/e-shell-config-default-folders.c
index 776bb015de..45bfe87a4d 100644
--- a/shell/e-shell-config-default-folders.c
+++ b/shell/e-shell-config-default-folders.c
@@ -95,9 +95,11 @@ config_control_apply_cb (EvolutionConfigControl *control,
}
static void
-config_control_destroy_cb (EvolutionConfigControl *config_control,
- EvolutionDefaultFolderConfig *dfc)
+config_control_destroy_notify (void *data,
+ GObject *where_the_config_control_was)
{
+ EvolutionDefaultFolderConfig *dfc = (EvolutionDefaultFolderConfig *) data;
+
g_object_unref (dfc->config_listener);
g_free (dfc->mail_uri);
@@ -188,8 +190,8 @@ e_shell_config_default_folders_create_widget (EShell *shell, EvolutionConfigCont
g_signal_connect (dfc->config_control, "apply",
G_CALLBACK (config_control_apply_cb), dfc);
- g_signal_connect (dfc->config_control, "destroy",
- G_CALLBACK (config_control_destroy_cb), dfc);
+
+ g_object_weak_ref (G_OBJECT (dfc->config_control), config_control_destroy_notify, dfc);
return widget;
}
diff --git a/shell/e-shell-config-offline.c b/shell/e-shell-config-offline.c
index 405426b36d..d331fbbc01 100644
--- a/shell/e-shell-config-offline.c
+++ b/shell/e-shell-config-offline.c
@@ -53,8 +53,8 @@ typedef struct _PageData PageData;
/* Callbacks. */
static void
-config_control_destroy_callback (GtkObject *object,
- void *data)
+config_control_destroy_notify (void *data,
+ GObject *where_the_config_control_was)
{
PageData *page_data;
@@ -207,10 +207,10 @@ e_shell_config_offline_create_widget (EShell *shell, EvolutionConfigControl *con
page_data->config_control = control;
- g_signal_connect (page_data->config_control, "destroy",
- G_CALLBACK (config_control_destroy_callback), page_data);
g_signal_connect (page_data->config_control, "apply",
G_CALLBACK (config_control_apply_callback), page_data);
+ g_object_weak_ref (G_OBJECT (page_data->config_control), config_control_destroy_notify, page_data);
+
return scroll_frame;
}
diff --git a/shell/e-shell-folder-creation-dialog.c b/shell/e-shell-folder-creation-dialog.c
index c7664d866b..09bd3d725d 100644
--- a/shell/e-shell-folder-creation-dialog.c
+++ b/shell/e-shell-folder-creation-dialog.c
@@ -211,8 +211,8 @@ dialog_response_cb (GnomeDialog *dialog,
}
static void
-dialog_destroy_cb (GtkObject *object,
- void *data)
+dialog_destroy_notify (void *data,
+ GObject *where_the_dialog_was)
{
DialogData *dialog_data;
@@ -266,17 +266,15 @@ storage_set_view_folder_selected_cb (EStorageSetView *storage_set_view,
/* Shell signal callbacks. */
-#if 0
static void
-shell_destroy_cb (GtkObject *object,
- void *data)
+shell_destroy_notify (void *data,
+ GObject *where_the_shell_was)
{
- GnomeDialog *dialog;
+ DialogData *dialog_data = (DialogData *) data;
- dialog = GNOME_DIALOG (data);
- gtk_widget_destroy (GTK_WIDGET (dialog));
+ dialog_data->shell = NULL;
+ gtk_widget_destroy (GTK_WIDGET (dialog_data->dialog));
}
-#endif
/* Dialog setup. */
@@ -528,8 +526,7 @@ e_shell_show_folder_creation_dialog (EShell *shell,
g_signal_connect (dialog, "response",
G_CALLBACK (dialog_response_cb), dialog_data);
- g_signal_connect (dialog, "destroy",
- G_CALLBACK (dialog_destroy_cb), dialog_data);
+ g_object_weak_ref (G_OBJECT (dialog), dialog_destroy_notify, dialog_data);
g_signal_connect (dialog_data->folder_name_entry, "changed",
G_CALLBACK (folder_name_entry_changed_cb), dialog_data);
@@ -537,11 +534,7 @@ e_shell_show_folder_creation_dialog (EShell *shell,
g_signal_connect (dialog_data->storage_set_view, "folder_selected",
G_CALLBACK (storage_set_view_folder_selected_cb), dialog_data);
-#if 0 /* FIXME */
- g_signal_connect_object (GTK_OBJECT (shell), "destroy",
- G_CALLBACK (shell_destroy_cb), dialog_data,
- GTK_OBJECT (dialog));
-#endif
+ g_object_weak_ref (G_OBJECT (shell), shell_destroy_notify, dialog_data);
g_object_unref (gui);
}
diff --git a/shell/e-shell-folder-selection-dialog.c b/shell/e-shell-folder-selection-dialog.c
index 76e943a24c..0d04899e78 100644
--- a/shell/e-shell-folder-selection-dialog.c
+++ b/shell/e-shell-folder-selection-dialog.c
@@ -419,11 +419,7 @@ e_shell_folder_selection_dialog_construct (EShellFolderSelectionDialog *folder_s
/* Make sure we get destroyed if the shell gets destroyed. */
priv->shell = shell;
-#if 0
- gtk_signal_connect_object_while_alive (GTK_OBJECT (shell), "destroy",
- G_CALLBACK (gtk_widget_destroy),
- GTK_OBJECT (folder_selection_dialog));
-#endif
+ g_object_weak_ref (G_OBJECT (shell), (GWeakNotify) gtk_widget_destroy, folder_selection_dialog);
/* Set up the label. */
diff --git a/shell/e-shell-importer.c b/shell/e-shell-importer.c
index 9cfedb9dc0..b2bb3b00c1 100644
--- a/shell/e-shell-importer.c
+++ b/shell/e-shell-importer.c
@@ -216,7 +216,6 @@ typedef struct _ImporterComponentData {
int item;
gboolean stop;
- gboolean destroyed;
} ImporterComponentData;
static gboolean importer_timeout_fn (gpointer data);
@@ -259,8 +258,8 @@ import_cb (EvolutionImporterListener *listener,
}
g_free (icd->filename);
- if (!icd->destroyed)
- gtk_object_destroy (GTK_OBJECT (icd->dialog));
+ if (icd->dialog != NULL)
+ gtk_widget_destroy (icd->dialog);
bonobo_object_unref (BONOBO_OBJECT (icd->listener));
g_object_unref (icd->client);
g_free (icd);
@@ -299,11 +298,13 @@ dialog_clicked_cb (GnomeDialog *dialog,
}
static void
-dialog_destroy_cb (GtkObject *object,
- ImporterComponentData *icd)
+dialog_destroy_notify (void *data,
+ GObject *where_the_dialog_was)
{
+ ImporterComponentData *icd = (ImporterComponentData *) data;
+
+ icd->dialog = NULL;
icd->stop = TRUE;
- icd->destroyed = TRUE;
}
struct _IIDInfo {
@@ -505,15 +506,14 @@ start_import (const char *folderpath,
icd = g_new (ImporterComponentData, 1);
icd->stop = FALSE;
- icd->destroyed = FALSE;
icd->dialog = GNOME_DIALOG (gnome_dialog_new (_("Importing"),
GNOME_STOCK_BUTTON_CANCEL,
NULL));
g_signal_connect (icd->dialog, "clicked",
G_CALLBACK (dialog_clicked_cb), icd);
- g_signal_connect (icd->dialog, "destroy",
- G_CALLBACK (dialog_destroy_cb), icd);
-
+
+ g_object_weak_ref (icd->dialog, dialog_destroy_notify, icd);
+
label = g_strdup_printf (_("Importing %s.\nStarting %s"),
filename, real_iid);
icd->contents = gtk_label_new (label);
@@ -937,9 +937,11 @@ import_druid_cancel (GnomeDruid *druid,
}
static void
-import_druid_destroy (GtkObject *object,
- ImportData *data)
+import_druid_weak_notify (void *data,
+ GObject *where_the_object_was)
{
+ ImportData *data = (ImportData *) data;
+
g_object_unref (data->wizard);
g_free (data->choosen_iid);
g_free (data);
@@ -1186,9 +1188,11 @@ druid_finish_button_change (GnomeDruid *druid)
}
static void
-close_dialog (GtkWidget *dialog,
- gboolean *dialog_open)
+close_dialog (void *data,
+ GObject *where_the_dialog_was)
{
+ gboolean *dialog_open = (gboolean *) data;
+
*dialog_open = FALSE;
}
@@ -1214,8 +1218,7 @@ show_import_wizard (BonoboUIComponent *component,
gtk_window_set_wmclass (GTK_WINDOW (data->dialog), "importdruid",
"Evolution:shell");
gtk_window_set_transient_for (GTK_WINDOW (data->dialog), GTK_WINDOW (user_data));
- g_signal_connect (data->dialog, "destroy",
- G_CALLBACK (close_dialog), &dialog_open);
+ g_object_weak_ref (data->dialog, dialog_weak_notify, &dialog_open);
gnome_dialog_close_hides (GNOME_DIALOG (data->dialog), TRUE);
data->druid = glade_xml_get_widget (data->wizard, "druid1");
@@ -1274,8 +1277,8 @@ show_import_wizard (BonoboUIComponent *component,
/* Finish page */
g_signal_connect (data->finish, "finish",
G_CALLBACK (import_druid_finish), data);
- g_signal_connect (data->dialog, "destroy",
- G_CALLBACK (import_druid_destroy), data);
+
+ g_object_weak_ref (data->dialog, import_druid_weak_notify, data);
gtk_widget_show_all (data->dialog);
}
diff --git a/shell/e-shell-shared-folder-picker-dialog.c b/shell/e-shell-shared-folder-picker-dialog.c
index 16fee71c10..3c8065709c 100644
--- a/shell/e-shell-shared-folder-picker-dialog.c
+++ b/shell/e-shell-shared-folder-picker-dialog.c
@@ -296,8 +296,8 @@ progress_bar_timeout_callback (void *data)
}
static void
-progress_bar_destroy_callback (GtkObject *object,
- void *data)
+progress_bar_weak_notify (void *data,
+ GObject *where_the_object_was)
{
int timeout_id;
@@ -375,21 +375,17 @@ create_progress_dialog (EShell *shell,
gtk_box_pack_start (GTK_BOX (GNOME_DIALOG (dialog)->vbox), progress_bar, FALSE, TRUE, 0);
timeout_id = g_timeout_add (50, progress_bar_timeout_callback, progress_bar);
- g_signal_connect (progress_bar, "destroy",
- G_CALLBACK (progress_bar_destroy_callback),
- GINT_TO_POINTER (timeout_id));
+ g_object_weak_ref (G_OBJECT (progress_bar), progress_bar_weak_notify, GINT_TO_POINTER (timeout_id));
timeout_id = g_timeout_add (PROGRESS_DIALOG_DELAY, progress_dialog_show_timeout_callback, dialog);
- g_signal_connect (progress_bar, "destroy",
- G_CALLBACK (progress_bar_destroy_callback),
- GINT_TO_POINTER (timeout_id));
+ g_object_weak_ref (G_OBJECT (progress_bar), progress_bar_weak_notify, GINT_TO_POINTER (timeout_id));
return dialog;
}
static void
-shell_destroy_callback (GtkObject *object,
- void *data)
+shell_weak_notify (void *data,
+ GObject *where_the_object_was)
{
DiscoveryData *discovery_data;
@@ -398,8 +394,8 @@ shell_destroy_callback (GtkObject *object,
}
static void
-shell_view_destroy_callback (GtkObject *object,
- void *data)
+shell_view_weak_notify (void *data,
+ GObject *where_the_object_was)
{
DiscoveryData *discovery_data;
@@ -408,8 +404,8 @@ shell_view_destroy_callback (GtkObject *object,
}
static void
-storage_destroy_callback (GtkObject *object,
- void *data)
+storage_weak_notify (void *data,
+ GObject *where_the_object_was)
{
DiscoveryData *discovery_data;
@@ -487,14 +483,9 @@ discover_folder (EShell *shell,
discovery_data->storage = storage;
g_object_ref (storage);
- g_signal_connect (shell, "destroy",
- G_CALLBACK (shell_destroy_callback), discovery_data);
-
- g_signal_connect (parent, "destroy",
- G_CALLBACK (shell_view_destroy_callback), discovery_data);
-
- g_signal_connect (storage, "destroy",
- G_CALLBACK (storage_destroy_callback), discovery_data);
+ g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, discovery_data);
+ g_object_weak_ref (G_OBJECT (parent), shell_view_weak_notify, discovery_data);
+ g_object_weak_ref (G_OBJECT (storage), storage_weak_notify, discovery_data);
g_signal_connect (dialog, "clicked",
G_CALLBACK (progress_dialog_clicked_callback), discovery_data);
diff --git a/shell/e-shell-startup-wizard.c b/shell/e-shell-startup-wizard.c
index fa955184ed..9a04b651c1 100644
--- a/shell/e-shell-startup-wizard.c
+++ b/shell/e-shell-startup-wizard.c
@@ -846,6 +846,8 @@ e_shell_startup_wizard_create (void)
SWData *data;
int num_accounts;
+ return TRUE;
+
data = g_new0 (SWData, 1);
data->config_listener = e_config_listener_new();
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 42beaa9280..6ac6061970 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -1,7 +1,7 @@
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* e-shell.c
*
- * Copyright (C) 2000, 2001 Ximian, Inc.
+ * Copyright (C) 2000, 2001, 2002 Ximian, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of version 2 of the GNU General Public
@@ -957,14 +957,12 @@ view_delete_event_cb (GtkWidget *widget,
}
static void
-view_destroy_cb (GtkObject *object,
- void *data)
+view_weak_notify (void *data,
+ GObject *where_the_object_was)
{
EShell *shell;
int num_views;
- g_assert (E_IS_SHELL_VIEW (object));
-
shell = E_SHELL (data);
num_views = g_list_length (shell->priv->views);
@@ -975,7 +973,7 @@ view_destroy_cb (GtkObject *object,
if (num_views - 1 == 0)
e_shell_save_settings (shell);
- shell->priv->views = g_list_remove (shell->priv->views, object);
+ shell->priv->views = g_list_remove (shell->priv->views, where_the_object_was);
if (shell->priv->views == NULL) {
set_interactive (shell, FALSE);
@@ -1001,8 +999,8 @@ create_view (EShell *shell,
g_signal_connect (view, "delete_event",
G_CALLBACK (view_delete_event_cb), shell);
- g_signal_connect (view, "destroy",
- G_CALLBACK (view_destroy_cb), shell);
+
+ g_object_weak_ref (G_OBJECT (view), view_weak_notify, shell);
if (uri != NULL)
e_shell_view_display_uri (E_SHELL_VIEW (view), uri, TRUE);
@@ -1085,9 +1083,8 @@ impl_dispose (GObject *object)
gtk_signal_disconnect_by_func (GTK_OBJECT (view),
G_CALLBACK (view_delete_event_cb),
shell);
- gtk_signal_disconnect_by_func (GTK_OBJECT (view),
- G_CALLBACK (view_destroy_cb),
- shell);
+
+ g_object_weak_unref (G_OBJECT (view), view_weak_notify, shell);
gtk_object_destroy (GTK_OBJECT (view));
}
@@ -2079,18 +2076,6 @@ e_shell_send_receive (EShell *shell)
e_free_string_list (id_list);
}
-static void
-settings_dialog_destroy_cb (GtkWidget *widget, void *data)
-{
- EShell *shell;
- EShellPrivate *priv;
-
- shell = E_SHELL (data);
- priv = shell->priv;
-
- priv->settings_dialog = NULL;
-}
-
void
e_shell_show_settings (EShell *shell, const char *type, EShellView *shell_view)
{
@@ -2112,8 +2097,7 @@ e_shell_show_settings (EShell *shell, const char *type, EShellView *shell_view)
if (type != NULL)
e_shell_settings_dialog_show_type (E_SHELL_SETTINGS_DIALOG (priv->settings_dialog), type);
- g_signal_connect (priv->settings_dialog, "destroy",
- G_CALLBACK (settings_dialog_destroy_cb), shell);
+ g_object_add_weak_pointer (G_OBJECT (priv->settings_dialog), (void **) & priv->settings_dialog);
gtk_widget_show (priv->settings_dialog);
}
diff --git a/shell/e-shortcuts.c b/shell/e-shortcuts.c
index 2561ce91bb..a1cd88a272 100644
--- a/shell/e-shortcuts.c
+++ b/shell/e-shortcuts.c
@@ -579,8 +579,8 @@ get_item (EShortcuts *shortcuts,
/* Signal handlers for the views. */
static void
-view_destroyed_cb (GtkObject *object,
- gpointer data)
+view_weak_notify (void *data,
+ GObject *where_the_object_was)
{
EShortcuts *shortcuts;
EShortcutsPrivate *priv;
@@ -588,7 +588,7 @@ view_destroyed_cb (GtkObject *object,
shortcuts = E_SHORTCUTS (data);
priv = shortcuts->priv;
- priv->views = g_slist_remove (priv->views, object);
+ priv->views = g_slist_remove (priv->views, where_the_object_was);
}
@@ -626,6 +626,7 @@ impl_dispose (GObject *object)
{
EShortcuts *shortcuts;
EShortcutsPrivate *priv;
+ GSList *p;
shortcuts = E_SHORTCUTS (object);
priv = shortcuts->priv;
@@ -643,6 +644,11 @@ impl_dispose (GObject *object)
priv->dirty = FALSE;
}
+ for (p = priv->views; p != NULL; p = p->next)
+ g_object_weak_unref (G_OBJECT (p->data), view_weak_notify, shortcuts);
+ g_slist_free (priv->views);
+ priv->views = NULL;
+
(* G_OBJECT_CLASS (parent_class)->dispose) (object);
}
@@ -885,7 +891,7 @@ e_shortcuts_new_view (EShortcuts *shortcuts)
new = e_shortcuts_view_new (shortcuts);
priv->views = g_slist_prepend (priv->views, new);
- gtk_signal_connect (GTK_OBJECT (new), "destroy", GTK_SIGNAL_FUNC (view_destroyed_cb), shortcuts);
+ g_object_weak_ref (G_OBJECT (new), view_weak_notify, shortcuts);
return new;
}
diff --git a/shell/evolution-test-component.c b/shell/evolution-test-component.c
index 0e96bad012..39cfb11ceb 100644
--- a/shell/evolution-test-component.c
+++ b/shell/evolution-test-component.c
@@ -206,8 +206,8 @@ dialog_clicked_callback (GtkDialog *dialog,
}
static void
-dialog_destroy_callback (GtkObject *object,
- void *data)
+dialog_weak_notify (void *data,
+ GObject *where_the_object_was)
{
GNOME_Evolution_StorageSetView storage_set_view_iface;
CORBA_Environment ev;
@@ -266,8 +266,7 @@ create_new_folder_selector (EvolutionShellComponent *shell_component)
/* This is necessary to unref the StorageSetView iface once we are done
with it. */
- g_signal_connect (dialog, "destroy",
- G_CALLBACK (dialog_destroy_callback), storage_set_view_iface);
+ g_object_weak_ref (G_OBJECT (dialog), dialog_weak_notify, storage_set_view_iface);
gtk_widget_show (control_widget);
gtk_widget_show (dialog);
diff --git a/shell/main.c b/shell/main.c
index 2261aa84d1..36a5648763 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -129,22 +129,12 @@ quit_box_new (void)
}
static void
-quit_box_destroyed_callback (GtkObject *object,
- void *data)
-{
- GtkWidget **p;
-
- p = (GtkWidget **) data;
- *p = NULL;
-}
-
-static void
no_views_left_cb (EShell *shell, gpointer data)
{
GtkWidget *quit_box;
quit_box = quit_box_new ();
- g_signal_connect (quit_box, "destroy", G_CALLBACK (quit_box_destroyed_callback), &quit_box);
+ g_object_add_weak_pointer (G_OBJECT (quit_box), (void **) &quit_box);
/* FIXME: This is wrong. We should exit only when the shell is
destroyed. But refcounting is broken at present, so this is a
@@ -184,7 +174,8 @@ no_views_left_cb (EShell *shell, gpointer data)
}
static void
-destroy_cb (GtkObject *object, gpointer data)
+shell_weak_notify (void *data,
+ GObject *where_the_object_was)
{
gtk_main_quit ();
}
@@ -368,10 +359,8 @@ idle_cb (void *data)
case E_SHELL_CONSTRUCT_RESULT_OK:
e_shell_config_factory_register (shell);
- g_signal_connect (shell, "no_views_left",
- G_CALLBACK (no_views_left_cb), NULL);
- g_signal_connect (shell, "destroy",
- G_CALLBACK (destroy_cb), NULL);
+ g_signal_connect (shell, "no_views_left", G_CALLBACK (no_views_left_cb), NULL);
+ g_object_weak_ref (G_OBJECT (shell), shell_weak_notify, NULL);
if (!getenv ("EVOLVE_ME_HARDER"))
g_signal_connect (shell, "new_view_created",