Mercurial > pidgin
changeset 12647:852df2d9d4f8
[gaim-migrate @ 14985]
SF Patch #1360831 from Sadrul
"The new mail notifications (the ones that show the
from/subject fields) are displayed in one dialog. So
things get less messy you are away and a lot of
mail-notifs come in."
committer: Tailor Script <tailor@pidgin.im>
author | Richard Laager <rlaager@wiktel.com> |
---|---|
date | Fri, 23 Dec 2005 21:10:24 +0000 |
parents | 5c5e03b9aed6 |
children | f293c4b3974f |
files | src/gtknotify.c src/notify.c src/notify.h |
diffstat | 3 files changed, 242 insertions(+), 97 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtknotify.c Fri Dec 23 19:50:39 2005 +0000 +++ b/src/gtknotify.c Fri Dec 23 21:10:24 2005 +0000 @@ -42,9 +42,8 @@ { GaimConnection *gc; char *url; - GtkWidget *dialog; GtkWidget *label; - + GtkTreeIter iter; } GaimNotifyMailData; typedef struct @@ -62,7 +61,29 @@ } GaimNotifySearchResultsButtonData; -static void *gaim_gtk_notify_emails(size_t count, gboolean detailed, +enum +{ + GAIM_MAIL_ICON, + GAIM_MAIL_TO, + GAIM_MAIL_FROM, + GAIM_MAIL_SUBJECT, + GAIM_MAIL_DATA, + COLUMNS_GAIM_MAIL +}; + +typedef struct _GaimMailDialog GaimMailDialog; + +struct _GaimMailDialog +{ + GtkWidget *dialog; + GtkWidget *treeview; + GtkTreeStore *treemodel; + GtkLabel *label; +}; + +static GaimMailDialog *mail_dialog = NULL; + +static void *gaim_gtk_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, const char **urls); @@ -74,12 +95,58 @@ } static void -email_response_cb(GtkDialog *dialog, gint id, GaimNotifyMailData *data) +email_nondetailed_cb(GtkDialog *dialog, gint id, GaimNotifyMailData *data) { + if (id == GTK_RESPONSE_OK) + gaim_notify_uri(NULL, data->url); + gaim_notify_close(GAIM_NOTIFY_EMAILS, data); + gtk_widget_destroy(GTK_WIDGET(dialog)); +} + +static void +email_response_cb(GtkDialog *dlg, gint id, GaimMailDialog *dialog) +{ + GaimNotifyMailData *data = NULL; + GtkTreeIter iter; + if (id == GTK_RESPONSE_YES) - gaim_notify_uri(NULL, data->url); + { + GtkTreeSelection *selection; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(dialog->treeview)); + + if (gtk_tree_selection_get_selected(selection, NULL, &iter)) + { + gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, + GAIM_MAIL_DATA, &data, -1); + gaim_notify_uri(NULL, data->url); + + gtk_tree_store_remove(dialog->treemodel, &iter); + gaim_notify_close(GAIM_NOTIFY_EMAILS, data); - gaim_notify_close(GAIM_NOTIFY_EMAILS, data); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) + return; + } + else + return; + } + else + { + while (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(mail_dialog->treemodel), &iter)) + { + gtk_tree_model_get(GTK_TREE_MODEL(dialog->treemodel), &iter, + GAIM_MAIL_DATA, &data, -1); + + if (id == GTK_RESPONSE_ACCEPT) + gaim_notify_uri(NULL, data->url); + + gtk_tree_store_remove(dialog->treemodel, &iter); + gaim_notify_close(GAIM_NOTIFY_EMAILS, data); + } + } + gtk_widget_destroy(dialog->dialog); + g_free(dialog); + mail_dialog = NULL; } static void @@ -202,10 +269,10 @@ } static void * -gaim_gtk_notify_email(const char *subject, const char *from, +gaim_gtk_notify_email(GaimConnection *gc, const char *subject, const char *from, const char *to, const char *url) { - return gaim_gtk_notify_emails(1, TRUE, + return gaim_gtk_notify_emails(gc, 1, (subject != NULL), (subject == NULL ? NULL : &subject), (from == NULL ? NULL : &from), (to == NULL ? NULL : &to), @@ -213,11 +280,11 @@ } static void * -gaim_gtk_notify_emails(size_t count, gboolean detailed, +gaim_gtk_notify_emails(GaimConnection *gc, size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, const char **urls) { - GaimNotifyMailData *data; + GaimNotifyMailData *data = NULL; GtkWidget *dialog; GtkWidget *vbox; GtkWidget *hbox; @@ -225,107 +292,185 @@ GtkWidget *img; char *detail_text; char *label_text; - - data = g_new0(GaimNotifyMailData, 1); - - data->url = g_strdup(urls[0]); + GtkTreeIter iter; + GaimAccount *account; - /* Create the dialog */ - dialog = gtk_dialog_new_with_buttons("New Mail", NULL, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - data->dialog = dialog; + account = gaim_connection_get_account(gc); - if (urls != NULL) - gtk_dialog_add_button(GTK_DIALOG(dialog), - GAIM_STOCK_OPEN_MAIL, GTK_RESPONSE_YES); - - g_signal_connect(G_OBJECT(dialog), "response", - G_CALLBACK(email_response_cb), data); - - /* Setup the dialog */ - gtk_container_set_border_width(GTK_CONTAINER(dialog), GAIM_HIG_BOX_SPACE); - gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), GAIM_HIG_BOX_SPACE); - gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); - gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); - gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), GAIM_HIG_BORDER); - - /* Setup the main horizontal box */ - hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); + if (mail_dialog == NULL || !detailed) + { + GtkCellRenderer *rend; + GtkTreeViewColumn *column; - /* Dialog icon */ - img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_INFO, - GTK_ICON_SIZE_DIALOG); - gtk_misc_set_alignment(GTK_MISC(img), 0, 0); - gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); - - /* Vertical box */ - vbox = gtk_vbox_new(FALSE, GAIM_HIG_BORDER); - - gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0); + dialog = gtk_dialog_new_with_buttons(_("New Mail"), NULL, 0, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + if (detailed) + gtk_window_set_role(GTK_WINDOW(dialog), "new_mail_detailed"); + else + gtk_window_set_role(GTK_WINDOW(dialog), "new_mail"); - /* Descriptive label */ - detail_text = g_strdup_printf(ngettext("%s has %d new message.", - "%s has %d new messages.", - (int)count), - *tos, (int)count); + if (!detailed && urls) + { + gtk_dialog_add_button(GTK_DIALOG(dialog), + GAIM_STOCK_OPEN_MAIL, GTK_RESPONSE_OK); + } + else if (detailed && mail_dialog == NULL) + { + gtk_dialog_add_button(GTK_DIALOG(dialog), + _("Open All Messages"), GTK_RESPONSE_ACCEPT); - if (count == 1) - { - char *from_text = NULL, *subject_text = NULL; - - if (froms != NULL) - { - char *from_enc; - from_enc = g_markup_escape_text(*froms, -1); - from_text = g_strdup_printf( - _("<span weight=\"bold\">From:</span> %s\n"), from_enc); - g_free(from_enc); + gtk_dialog_add_button(GTK_DIALOG(dialog), + GAIM_STOCK_OPEN_MAIL, GTK_RESPONSE_YES); } - if (subjects != NULL) + /* Setup the dialog */ + gtk_container_set_border_width(GTK_CONTAINER(dialog), GAIM_HIG_BOX_SPACE); + gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), GAIM_HIG_BOX_SPACE); + gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE); + gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), GAIM_HIG_BORDER); + + /* Setup the main horizontal box */ + hbox = gtk_hbox_new(FALSE, GAIM_HIG_BORDER); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), hbox); + + /* Dialog icon */ + img = gtk_image_new_from_stock(GAIM_STOCK_DIALOG_INFO, + GTK_ICON_SIZE_DIALOG); + gtk_misc_set_alignment(GTK_MISC(img), 0, 0); + gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0); + + /* Vertical box */ + vbox = gtk_vbox_new(FALSE, GAIM_HIG_BORDER); + + gtk_box_pack_start(GTK_BOX(hbox), vbox, TRUE, TRUE, 0); + + if (mail_dialog == NULL && detailed) { - char *subject_enc; - subject_enc = g_markup_escape_text(*subjects, -1); - subject_text = g_strdup_printf( - _("<span weight=\"bold\">Subject:</span> %s\n"), subject_enc); - g_free(subject_enc); - } + GtkWidget *sw; + + /* Golden ratio it up! */ + gtk_widget_set_size_request(dialog, 475, 200); + + sw = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + + mail_dialog = g_new0(GaimMailDialog, 1); + mail_dialog->dialog = dialog; + + mail_dialog->treemodel = gtk_tree_store_new(COLUMNS_GAIM_MAIL, + GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); + mail_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(mail_dialog->treemodel)); + + g_signal_connect(G_OBJECT(dialog), "response", + G_CALLBACK(email_response_cb), mail_dialog); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_title(column, _("Account")); + rend = gtk_cell_renderer_pixbuf_new(); + gtk_tree_view_column_pack_start(column, rend, FALSE); + gtk_tree_view_column_set_attributes(column, rend, "pixbuf", GAIM_MAIL_ICON, NULL); + rend = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, rend, TRUE); + gtk_tree_view_column_set_attributes(column, rend, "markup", GAIM_MAIL_TO, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); - label_text = g_strdup_printf( - _("<span weight=\"bold\" size=\"larger\">You have mail!</span>" - "\n\n%s%s%s%s"), - detail_text, - (from_text == NULL && subject_text == NULL ? "" : "\n\n"), - (from_text == NULL ? "" : from_text), - (subject_text == NULL ? "" : subject_text)); + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_title(column, _("From")); + rend = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, rend, TRUE); + gtk_tree_view_column_set_attributes(column, rend, "markup", GAIM_MAIL_FROM, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); + + column = gtk_tree_view_column_new(); + gtk_tree_view_column_set_resizable(column, TRUE); + gtk_tree_view_column_set_title(column, _("Subject")); + rend = gtk_cell_renderer_text_new(); + gtk_tree_view_column_pack_start(column, rend, TRUE); + gtk_tree_view_column_set_attributes(column, rend, "markup", GAIM_MAIL_SUBJECT, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(mail_dialog->treeview), column); + + gtk_container_add(GTK_CONTAINER(sw), mail_dialog->treeview); + + label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(label), _("<span weight=\"bold\" size=\"larger\">You have mail!</span>")); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0); + } + } - if (from_text != NULL) - g_free(from_text); + if (detailed) + { + dialog = mail_dialog->dialog; + while (count--) + { + char *from_text = NULL, *subject_text = NULL; + GdkPixbuf *pixbuf, *scale = NULL; + + if (froms != NULL) + from_text = g_markup_escape_text(*froms, -1); + + if (subjects != NULL) + subject_text = g_markup_escape_text(*subjects, -1); + + data = g_new0(GaimNotifyMailData, 1); + data->url = g_strdup(*urls); - if (subject_text != NULL) - g_free(subject_text); + pixbuf = gaim_gtk_create_prpl_icon(account); + if (pixbuf != NULL) + { + scale = gdk_pixbuf_scale_simple(pixbuf, 16, 16, + GDK_INTERP_BILINEAR); + g_object_unref(pixbuf); + } + + gtk_tree_store_append(mail_dialog->treemodel, &iter, NULL); + gtk_tree_store_set(mail_dialog->treemodel, &iter, + GAIM_MAIL_ICON, scale, + GAIM_MAIL_TO, *tos, + GAIM_MAIL_FROM, from_text, + GAIM_MAIL_SUBJECT, subject_text, + GAIM_MAIL_DATA, data, + -1); + data->iter = iter; + urls++; + froms++; + subjects++; + tos++; + } } else { + data = g_new0(GaimNotifyMailData, 1); + data->url = g_strdup(*urls); + + g_signal_connect(G_OBJECT(dialog), "response", + G_CALLBACK(email_nondetailed_cb), data); + + detail_text = g_strdup_printf(ngettext("%s has %d new message.", + "%s has %d new messages.", + (int)count), + *tos, (int)count); label_text = g_strdup_printf( _("<span weight=\"bold\" size=\"larger\">You have mail!</span>" "\n\n%s"), detail_text); - } - g_free(detail_text); - - label = gtk_label_new(NULL); + label = gtk_label_new(NULL); - gtk_label_set_markup(GTK_LABEL(label), label_text); - gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); - gtk_misc_set_alignment(GTK_MISC(label), 0, 0); - gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); + gtk_label_set_markup(GTK_LABEL(label), label_text); + gtk_label_set_line_wrap(GTK_LABEL(label), TRUE); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0); + gtk_box_pack_start(GTK_BOX(vbox), label, TRUE, TRUE, 0); - g_free(label_text); - - /* Show everything. */ + g_free(label_text); + g_free(detail_text); + gtk_window_set_resizable(GTK_WINDOW(dialog), FALSE); + } gtk_widget_show_all(dialog); return data; @@ -666,8 +811,6 @@ { GaimNotifyMailData *data = (GaimNotifyMailData *)ui_handle; - gtk_widget_destroy(data->dialog); - g_free(data->url); g_free(data); }
--- a/src/notify.c Fri Dec 23 19:50:39 2005 +0000 +++ b/src/notify.c Fri Dec 23 21:10:24 2005 +0000 @@ -81,7 +81,7 @@ info = g_new0(GaimNotifyInfo, 1); info->type = GAIM_NOTIFY_EMAIL; info->handle = handle; - info->ui_handle = ops->notify_email(subject, from, to, url); + info->ui_handle = ops->notify_email(handle, subject, from, to, url); info->cb = cb; info->cb_user_data = user_data; @@ -120,7 +120,7 @@ info = g_new0(GaimNotifyInfo, 1); info->type = GAIM_NOTIFY_EMAILS; info->handle = handle; - info->ui_handle = ops->notify_emails(count, detailed, subjects, + info->ui_handle = ops->notify_emails(handle, count, detailed, subjects, froms, tos, urls); info->cb = cb; info->cb_user_data = user_data;
--- a/src/notify.h Fri Dec 23 19:50:39 2005 +0000 +++ b/src/notify.h Fri Dec 23 21:10:24 2005 +0000 @@ -131,10 +131,12 @@ void *(*notify_message)(GaimNotifyMsgType type, const char *title, const char *primary, const char *secondary); - void *(*notify_email)(const char *subject, const char *from, + void *(*notify_email)(GaimConnection *gc, + const char *subject, const char *from, const char *to, const char *url); - void *(*notify_emails)(size_t count, gboolean detailed, + void *(*notify_emails)(GaimConnection *gc, + size_t count, gboolean detailed, const char **subjects, const char **froms, const char **tos, const char **urls);