static gboolean show_retrieving_banner (gpointer user_data);
+static void on_window_destroy (GtkObject *widget,
+ gpointer userdata);
+
typedef struct _ModestMainWindowPrivate ModestMainWindowPrivate;
struct _ModestMainWindowPrivate {
GtkWidget *msg_paned;
return NULL;
}
- return widget ? GTK_WIDGET(widget) : NULL;
+ /* Note that the window could have been destroyed, and so
+ their children, but still have some references */
+ return (widget && GTK_IS_WIDGET(widget)) ? GTK_WIDGET(widget) : NULL;
}
static gboolean
display_name = g_strdup_printf (_("mcen_me_toolbar_sendreceive_mailbox_n"),
modest_account_settings_get_display_name (settings));
}
+
+
/* Create action and add it to the action group. The
action name must be the account name, this way we
gchar* item_name, *refresh_action_name;
guint8 merge_id = 0;
GtkAction *view_account_action, *refresh_account_action;
+ gchar *escaped_display_name;
+
+ escaped_display_name = modest_text_utils_escape_mnemonics (display_name);
view_account_action = GTK_ACTION (gtk_radio_action_new (account_name,
- display_name, NULL, NULL, 0));
+ escaped_display_name, NULL, NULL, 0));
+ g_free (escaped_display_name);
gtk_action_group_add_action (priv->view_additions_group, view_account_action);
gtk_radio_action_set_group (GTK_RADIO_ACTION (view_account_action), radio_group);
radio_group = gtk_radio_action_get_group (GTK_RADIO_ACTION (view_account_action));
modest_signal_mgr_connect (priv->sighandlers,G_OBJECT (self), "window-state-event",
G_CALLBACK (modest_main_window_window_state_event),
NULL);
+ /* we don't register this in sighandlers, as it should be run after disconnecting all signals,
+ * in destroy stage */
+ g_signal_connect (G_OBJECT (self), "destroy", G_CALLBACK (on_window_destroy), NULL);
/* Mail Operation Queue */
priv->sighandlers =
/* Transport accounts and local ones (MMC and the Local
folders account do now cause menu changes */
if (TNY_IS_STORE_ACCOUNT (account) &&
- modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+ modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account))) {
+ /* Update menus */
update_menus (MODEST_MAIN_WINDOW (user_data));
+ }
}
static void
gpointer user_data)
{
ModestMainWindow *win = MODEST_MAIN_WINDOW (user_data);
-
- /* We need to refresh the details widget because it could have changed */
- if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS) {
- modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
- }
- /* Update the menus as well, the account name could be
- changed. Transport accounts and local ones (MMC and the
- Local folders account do now cause menu changes */
- if (TNY_IS_STORE_ACCOUNT (account) &&
- modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
- update_menus (MODEST_MAIN_WINDOW (user_data));
+ /* Transport accounts and local ones (MMC and the Local
+ folders account do now cause menu changes */
+ if (TNY_IS_STORE_ACCOUNT (account)) {
+ /* We need to refresh the details widget because it could have changed */
+ if (modest_main_window_get_contents_style(win) == MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS)
+ modest_main_window_set_contents_style (win, MODEST_MAIN_WINDOW_CONTENTS_STYLE_DETAILS);
+
+ /* Update the menus as well, name could change */
+ if (modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (account)))
+ update_menus (MODEST_MAIN_WINDOW (user_data));
+ }
}
/*
{
ModestMainWindowPrivate *priv;
+ if (event->type == GDK_KEY_RELEASE)
+ return FALSE;
+
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (user_data);
/* Do nothing if we're in SIMPLE style */
/* Checks the dimming rules */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (self));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (self));
/* Show and hide toolbar items */
switch (mode) {
ModestToolBarModes mode;
GSList *tmp;
gboolean mode_changed = FALSE;
- TnyAccount *account;
+ TnyAccount *account = NULL;
self = MODEST_MAIN_WINDOW (user_data);
priv = MODEST_MAIN_WINDOW_GET_PRIVATE (self);
priv->retrieving_banner_timeout =
g_timeout_add (2000, show_retrieving_banner, self);
}
- g_object_unref (account);
+
+ /* Not every mail operation has account, noop does not */
+ if (account)
+ g_object_unref (account);
/* Get toolbar mode from operation id*/
mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
GSList *tmp = NULL;
ModestMainWindow *self;
gboolean mode_changed;
- TnyAccount *account;
+ TnyAccount *account = NULL;
ModestMainWindowPrivate *priv;
self = MODEST_MAIN_WINDOW (user_data);
priv->retrieving_banner = NULL;
}
}
- g_object_unref (account);
+
+ /* Not every mail operation has account, noop does not */
+ if (account)
+ g_object_unref (account);
/* Get toolbar mode from operation id*/
mode = get_toolbar_mode_from_mail_operation (self, mail_op, &mode_changed);
/* If account_name == NULL, we must update all (option All) */
if (!account_name)
- modest_ui_actions_do_send_receive_all (win, TRUE);
+ modest_ui_actions_do_send_receive_all (win, TRUE, TRUE, TRUE);
else
- modest_ui_actions_do_send_receive (account_name, TRUE, win);
+ modest_ui_actions_do_send_receive (account_name, TRUE, TRUE, TRUE, win);
}
/* Update toolbar dimming state */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
return FALSE;
}
/* Update toolbar dimming state */
modest_ui_actions_check_toolbar_dimming_rules (MODEST_WINDOW (main_window));
+ modest_ui_actions_check_menu_dimming_rules (MODEST_WINDOW (main_window));
return FALSE;
}
return (priv->display_state == OSSO_DISPLAY_ON) ? TRUE : FALSE;
}
+static void
+on_window_destroy (GtkObject *widget, gpointer userdata)
+{
+ ModestMainWindowPrivate *priv;
+
+ priv = MODEST_MAIN_WINDOW_GET_PRIVATE (widget);
+
+ if (priv->retrieving_banner_timeout > 0) {
+ g_source_remove (priv->retrieving_banner_timeout);
+ priv->retrieving_banner_timeout = 0;
+ }
+
+ if (priv->retrieving_banner != NULL) {
+ gtk_widget_destroy (priv->retrieving_banner);
+ priv->retrieving_banner = NULL;
+ }
+
+ if (priv->updating_banner_timeout > 0) {
+ g_source_remove (priv->updating_banner_timeout);
+ priv->updating_banner_timeout = 0;
+ }
+
+ if (priv->updating_banner != NULL) {
+ gtk_widget_destroy (priv->updating_banner);
+ priv->updating_banner = NULL;
+ }
+
+}
+
static gboolean
show_retrieving_banner (gpointer user_data)
{