X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-window-mgr.c;h=f4ab9155cdaa14a978d1e24962bd362b499d0ec0;hb=2cdfabbab55f149d58e6990fccae90456b6d059d;hp=228e036c788a059a67dd63c5f5f536d2399beb26;hpb=0665dc4b8ea24124da9764016328e2fb9efe11de;p=modest diff --git a/src/widgets/modest-window-mgr.c b/src/widgets/modest-window-mgr.c index 228e036..f4ab915 100644 --- a/src/widgets/modest-window-mgr.c +++ b/src/widgets/modest-window-mgr.c @@ -37,6 +37,7 @@ #include "widgets/modest-msg-edit-window.h" #include "widgets/modest-msg-view-window.h" #include "modest-debug.h" +#include /* 'private'/'protected' functions */ @@ -65,13 +66,26 @@ static gboolean modest_window_mgr_close_all_windows_default (ModestWindowMgr *se static gboolean modest_window_mgr_find_registered_header_default (ModestWindowMgr *self, TnyHeader *header, ModestWindow **win); +static gboolean modest_window_mgr_find_registered_message_uid_default (ModestWindowMgr *self, + const gchar *msg_uid, + ModestWindow **win); static GList *modest_window_mgr_get_window_list_default (ModestWindowMgr *self); static ModestWindow *modest_window_mgr_show_initial_window_default (ModestWindowMgr *self); static ModestWindow *modest_window_mgr_get_current_top_default (ModestWindowMgr *self); +static gboolean modest_window_mgr_screen_is_on_default (ModestWindowMgr *self); +static void modest_window_mgr_on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestWindowMgr *self); +static void on_mail_operation_started (ModestMailOperation *mail_op, + gpointer user_data); +static void on_mail_operation_finished (ModestMailOperation *mail_op, + gpointer user_data); /* list my signals */ enum { WINDOW_LIST_EMPTY_SIGNAL, + PROGRESS_LIST_CHANGED_SIGNAL, NUM_SIGNALS }; @@ -90,6 +104,10 @@ struct _ModestWindowMgrPrivate { GtkWidget *cached_editor; guint idle_load_view_id; guint idle_load_editor_id; + + guint queue_change_handler; + TnyList *progress_operations; + GSList *sighandlers; }; #define MODEST_WINDOW_MGR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -146,9 +164,11 @@ modest_window_mgr_class_init (ModestWindowMgrClass *klass) mgr_class->set_modal = modest_window_mgr_set_modal_default; mgr_class->close_all_windows = modest_window_mgr_close_all_windows_default; mgr_class->find_registered_header = modest_window_mgr_find_registered_header_default; + mgr_class->find_registered_message_uid = modest_window_mgr_find_registered_message_uid_default; mgr_class->get_window_list = modest_window_mgr_get_window_list_default; mgr_class->show_initial_window = modest_window_mgr_show_initial_window_default; mgr_class->get_current_top = modest_window_mgr_get_current_top_default; + mgr_class->screen_is_on = modest_window_mgr_screen_is_on_default; g_type_class_add_private (gobject_class, sizeof(ModestWindowMgrPrivate)); @@ -168,6 +188,22 @@ modest_window_mgr_class_init (ModestWindowMgrClass *klass) NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + + /** + * ModestWindowMgr::progress-list-changed + * @self: the #ModestWindowMgr that emits the signal + * @user_data: user data set when the signal handler was connected + * + * Issued whenever the progress mail operations list becomes changed + */ + signals[PROGRESS_LIST_CHANGED_SIGNAL] = + g_signal_new ("progress-list-changed", + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET (ModestWindowMgrClass, progress_list_changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } static gboolean @@ -223,6 +259,9 @@ modest_window_mgr_init (ModestWindowMgr *obj) priv->cached_editor = NULL; priv->windows_that_prevent_hibernation = NULL; + + priv->queue_change_handler = 0; + priv->progress_operations = TNY_LIST (tny_simple_list_new ()); } static void @@ -254,6 +293,20 @@ modest_window_mgr_finalize (GObject *obj) priv->cached_editor = NULL; } + modest_signal_mgr_disconnect_all_and_destroy (priv->sighandlers); + priv->sighandlers = NULL; + + if (priv->queue_change_handler > 0) { + g_signal_handler_disconnect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + priv->queue_change_handler); + priv->queue_change_handler = 0; + } + + if (priv->progress_operations) { + g_object_unref (priv->progress_operations); + priv->progress_operations = NULL; + } + g_slist_foreach (priv->preregistered_uids, (GFunc)g_free, NULL); g_slist_free (priv->preregistered_uids); @@ -420,21 +473,41 @@ static gboolean modest_window_mgr_find_registered_header_default (ModestWindowMgr *self, TnyHeader *header, ModestWindow **win) { + gchar* uid = NULL; + + g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE); + g_return_val_if_fail (TNY_IS_HEADER(header), FALSE); + + uid = modest_tny_folder_get_header_unique_id (header); + + return modest_window_mgr_find_registered_message_uid (self, uid, win); +} + +gboolean +modest_window_mgr_find_registered_message_uid (ModestWindowMgr *self, const gchar *msg_uid, + ModestWindow **win) +{ + return MODEST_WINDOW_MGR_GET_CLASS (self)->find_registered_message_uid (self, msg_uid, win); +} + +static gboolean +modest_window_mgr_find_registered_message_uid_default (ModestWindowMgr *self, const gchar *msg_uid, + ModestWindow **win) +{ ModestWindowMgrPrivate *priv = NULL; gchar* uid = NULL; gboolean has_header = FALSE; g_return_val_if_fail (MODEST_IS_WINDOW_MGR (self), FALSE); - g_return_val_if_fail (TNY_IS_HEADER(header), FALSE); - + g_return_val_if_fail (msg_uid && msg_uid[0] != '\0', FALSE); + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); - uid = modest_tny_folder_get_header_unique_id (header); - if (win) *win = NULL; - has_header = has_uid (priv->preregistered_uids, uid); + has_header = has_uid (priv->preregistered_uids, msg_uid); + g_free (uid); return has_header; } @@ -471,6 +544,14 @@ modest_window_mgr_register_window_default (ModestWindowMgr *self, priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + /* We set up the queue change handler */ + if (priv->queue_change_handler == 0) { + priv->queue_change_handler = g_signal_connect (G_OBJECT (modest_runtime_get_mail_operation_queue ()), + "queue-changed", + G_CALLBACK (modest_window_mgr_on_queue_changed), + self); + } + /* Check that it's not a second main window */ if (MODEST_IS_MAIN_WINDOW (window)) { if (priv->main_window) { @@ -524,13 +605,9 @@ static void modest_window_mgr_unregister_window_default (ModestWindowMgr *self, ModestWindow *window) { - ModestWindowMgrPrivate *priv; - g_return_if_fail (MODEST_IS_WINDOW_MGR (self)); g_return_if_fail (MODEST_IS_WINDOW (window)); - priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); - /* Save state */ modest_window_save_state (window); @@ -849,8 +926,11 @@ modest_window_mgr_show_initial_window (ModestWindowMgr *self) /* If there are no accounts then show the account wizard */ mgr = modest_runtime_get_account_mgr(); - if (!modest_account_mgr_has_accounts (mgr, TRUE)) - modest_ui_actions_run_account_setup_wizard (window); + if (!modest_account_mgr_has_accounts (mgr, TRUE)) { + if (!modest_ui_actions_run_account_setup_wizard (window)) { + g_debug ("%s: couldn't show account setup wizard", __FUNCTION__); + } + } } return window; @@ -877,3 +957,171 @@ modest_window_mgr_get_current_top_default (ModestWindowMgr *self) { g_return_val_if_reached (NULL); } + +gboolean +modest_window_mgr_screen_is_on (ModestWindowMgr *self) +{ + return MODEST_WINDOW_MGR_GET_CLASS (self)->screen_is_on (self); +} + +static gboolean +modest_window_mgr_screen_is_on_default (ModestWindowMgr *self) +{ + /* Default implementation is assuming screen is always on */ + + return TRUE; +} + +static gboolean +tny_list_find (TnyList *list, GObject *item) +{ + TnyIterator *iterator; + gboolean found = FALSE; + + for (iterator = tny_list_create_iterator (list); + !tny_iterator_is_done (iterator) && !found; + tny_iterator_next (iterator)) { + GObject *current = tny_iterator_get_current (iterator); + if (current == item) + found = TRUE; + g_object_unref (current); + } + g_object_unref (iterator); + + return found; +} + +static void +modest_window_mgr_on_queue_changed (ModestMailOperationQueue *queue, + ModestMailOperation *mail_op, + ModestMailOperationQueueNotification type, + ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv; + + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + /* We register to track progress */ + if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_ADDED) { + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-started", + G_CALLBACK (on_mail_operation_started), + self); + priv->sighandlers = modest_signal_mgr_connect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-finished", + G_CALLBACK (on_mail_operation_finished), + self); + } else if (type == MODEST_MAIL_OPERATION_QUEUE_OPERATION_REMOVED) { + priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-started"); + priv->sighandlers = modest_signal_mgr_disconnect (priv->sighandlers, + G_OBJECT (mail_op), + "operation-finished"); + if (tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) { + tny_list_remove (priv->progress_operations, G_OBJECT (mail_op)); + g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0); + } + } +} + +static void +on_mail_operation_started (ModestMailOperation *mail_op, + gpointer user_data) +{ + ModestWindowMgr *self; + ModestWindowMgrPrivate *priv; + ModestMailOperationTypeOperation op_type; + + self = MODEST_WINDOW_MGR (user_data); + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + /* First we check if the operation is a send receive operation, + * If now, we don't handle this */ + op_type = modest_mail_operation_get_type_operation (mail_op); + if (op_type != MODEST_MAIL_OPERATION_TYPE_SEND && + op_type != MODEST_MAIL_OPERATION_TYPE_SEND_AND_RECEIVE) { + return; + } + + if (!tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) { + tny_list_prepend (priv->progress_operations, G_OBJECT (mail_op)); + g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0); + } +} + +static void +on_mail_operation_finished (ModestMailOperation *mail_op, + gpointer user_data) +{ + ModestWindowMgr *self; + ModestWindowMgrPrivate *priv; + + self = MODEST_WINDOW_MGR (user_data); + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + if (tny_list_find (priv->progress_operations, G_OBJECT (mail_op))) { + tny_list_remove (priv->progress_operations, G_OBJECT (mail_op)); + g_signal_emit (self, signals[PROGRESS_LIST_CHANGED_SIGNAL], 0); + } +} + +TnyList * +modest_window_mgr_get_progress_operations (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv; + + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + return tny_list_copy (priv->progress_operations); +} + +gboolean +modest_window_mgr_has_progress_operation (ModestWindowMgr *self) +{ + ModestWindowMgrPrivate *priv; + + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + return tny_list_get_length (priv->progress_operations) > 0; +} + +gboolean +modest_window_mgr_has_progress_operation_on_account (ModestWindowMgr *self, + const gchar *account_name) +{ + ModestWindowMgrPrivate *priv; + gint account_ops = 0; + TnyIterator *iterator; + + priv = MODEST_WINDOW_MGR_GET_PRIVATE (self); + + if (account_name == NULL) + return 0; + + for (iterator = tny_list_create_iterator (priv->progress_operations); + !tny_iterator_is_done (iterator); + tny_iterator_next (iterator)) { + ModestMailOperation *mail_op; + TnyAccount *account; + + mail_op= MODEST_MAIL_OPERATION (tny_iterator_get_current (iterator)); + account = modest_mail_operation_get_account (mail_op); + + if (account != NULL) { + const gchar *current_name; + + current_name = tny_account_get_id (account); + if (current_name && strcmp (current_name, account_name) == 0) + account_ops ++; + g_object_unref (account); + } + + g_object_unref (mail_op); + } + g_object_unref (iterator); + + return account_ops; +}