1 /* Notification plugin for Claws-Mail
2 * Copyright (C) 2005-2007 Holger Berndt and the Claws Mail Team.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 3 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 /* This module is of course inspired by the trayicon plugin which is
19 * shipped with Claws-Mail, copyrighted by the Claws-Mail Team. */
23 # include "claws-features.h"
27 #include <glib/gi18n.h>
29 #ifdef NOTIFICATION_TRAYICON
31 #include "notification_trayicon.h"
32 #include "notification_prefs.h"
33 #include "notification_core.h"
34 #include "notification_hotkeys.h"
35 #include "notification_pixbuf.h"
36 #include "notification_foldercheck.h"
40 #include "mainwindow.h"
41 #include "prefs_common.h"
42 #include "alertpanel.h"
44 #ifndef USE_ALT_ADDRBOOK
45 #include "addressbook.h"
46 #include "addrindex.h"
48 #include "addressbook-dbus.h"
51 #include "gtk/manage_window.h"
52 #include "common/utils.h"
53 #include "gtk/gtkutils.h"
55 static GdkPixbuf* notification_trayicon_create(void);
57 static void notification_trayicon_on_popup_menu(GtkStatusIcon*,guint,
59 static gboolean notification_trayicon_on_size_changed(GtkStatusIcon*,
62 static void trayicon_get_all_cb(GtkAction*, gpointer);
63 static void trayicon_compose_cb(GtkAction*, gpointer);
64 static void trayicon_compose_acc_cb(GtkMenuItem*, gpointer);
65 static void trayicon_addressbook_cb(GtkAction*, gpointer);
66 static void trayicon_exit_cb(GtkAction*,gpointer);
67 static void trayicon_toggle_offline_cb(GtkAction*,gpointer);
69 static void trayicon_toggle_notify_cb(GtkAction*,gpointer);
73 #include <libnotify/notify.h>
75 #ifndef NOTIFY_CHECK_VERSION
76 # define NOTIFY_CHECK_VERSION(a,b,c) 0
86 NotifyNotification *notification;
88 } NotificationTrayiconPopup;
90 static NotificationTrayiconPopup popup;
92 static gboolean notification_trayicon_popup_add_msg(MsgInfo*,
93 NotificationFolderType);
94 static gboolean notification_trayicon_popup_create(MsgInfo*,
95 NotificationFolderType);
96 static void popup_timeout_fun(NotifyNotification*, gpointer);
97 static void notification_trayicon_popup_free_func(gpointer);
98 static void notification_trayicon_popup_default_action_cb(NotifyNotification*,
100 static gchar* notification_trayicon_popup_assemble_summary(void);
101 static gchar* notification_trayicon_popup_assemble_body(MsgInfo*);
102 static void notification_trayicon_popup_count_msgs(NotificationFolderType);
104 G_LOCK_DEFINE_STATIC(trayicon_popup);
108 static GtkStatusIcon *trayicon;
109 static gboolean updating_menu = FALSE;
110 static GtkWidget *traymenu_popup;
111 static GtkWidget *focused_widget = NULL;
113 static GtkActionEntry trayicon_popup_menu_entries[] = {
114 {"SysTrayiconPopup", NULL, "SysTrayiconPopup" },
115 {"SysTrayiconPopup/GetMail", NULL, N_("_Get Mail"), NULL, NULL, G_CALLBACK(trayicon_get_all_cb) },
116 {"SysTrayiconPopup/---", NULL, "---" },
117 {"SysTrayiconPopup/Email", NULL, N_("_Email"), NULL, NULL, G_CALLBACK(trayicon_compose_cb) },
118 {"SysTrayiconPopup/EmailAcc", NULL, N_("E_mail from account"), NULL, NULL, NULL },
119 {"SysTrayiconPopup/OpenAB", NULL, N_("Open A_ddressbook"), NULL, NULL, G_CALLBACK(trayicon_addressbook_cb) },
120 {"SysTrayiconPopup/Exit", NULL, N_("E_xit Claws Mail"), NULL, NULL, G_CALLBACK(trayicon_exit_cb) },
123 static GtkToggleActionEntry trayicon_popup_toggle_menu_entries[] =
125 {"SysTrayiconPopup/ToggleOffline", NULL, N_("_Work Offline"), NULL, NULL, G_CALLBACK(trayicon_toggle_offline_cb) },
126 #ifdef HAVE_LIBNOTIFY
127 {"SysTrayiconPopup/ShowBubbles", NULL, N_("Show Trayicon Notifications"), NULL, NULL, G_CALLBACK(trayicon_toggle_notify_cb) },
132 void notification_trayicon_msg(MsgInfo *msginfo)
134 #ifndef HAVE_LIBNOTIFY
139 NotificationFolderType nftype;
142 nftype = F_TYPE_MAIL;
144 if(!msginfo || !notify_config.trayicon_enabled ||
145 !notify_config.trayicon_popup_enabled ||
146 !MSG_IS_NEW(msginfo->flags))
149 if(notify_config.trayicon_folder_specific) {
153 gboolean found = FALSE;
155 if(!(msginfo->folder))
158 identifier = folder_item_get_identifier(msginfo->folder);
161 notification_register_folder_specific_list
162 (TRAYICON_SPECIFIC_FOLDER_ID_STR);
163 list = notification_foldercheck_get_list(id);
164 for(; (list != NULL) && !found; list = g_slist_next(list)) {
165 gchar *list_identifier;
166 FolderItem *list_item = (FolderItem*) list->data;
168 list_identifier = folder_item_get_identifier(list_item);
169 if(!strcmp2(list_identifier, identifier))
172 g_free(list_identifier);
178 } /* folder specific */
180 ftype = msginfo->folder->folder->klass->type;
182 G_LOCK(trayicon_popup);
183 /* Check out which type to notify about */
189 nftype = F_TYPE_MAIL;
192 nftype = F_TYPE_NEWS;
195 if((uistr = msginfo->folder->folder->klass->uistr) == NULL) {
196 G_UNLOCK(trayicon_popup);
199 else if(!strcmp(uistr, "vCalendar"))
200 nftype = F_TYPE_CALENDAR;
201 else if(!strcmp(uistr, "RSSyl"))
204 debug_print("Notification Plugin: Unknown folder type %d\n",ftype);
205 G_UNLOCK(trayicon_popup);
210 debug_print("Notification Plugin: Unknown folder type %d\n",ftype);
211 G_UNLOCK(trayicon_popup);
216 notification_trayicon_popup_add_msg(msginfo, nftype);
218 G_UNLOCK(trayicon_popup);
220 #endif /* HAVE_LIBNOTIFY */
223 void notification_trayicon_destroy(void)
226 gtk_status_icon_set_visible(trayicon, FALSE);
227 g_object_unref(trayicon);
232 void notification_update_trayicon()
235 static GdkPixbuf *old_icon = NULL;
238 NotificationMsgCount count;
241 if(!notify_config.trayicon_enabled)
244 if(notify_config.trayicon_folder_specific) {
247 notification_register_folder_specific_list
248 (TRAYICON_SPECIFIC_FOLDER_ID_STR);
249 list = notification_foldercheck_get_list(id);
254 notification_core_get_msg_count(list, &count);
258 #ifdef NOTIFICATION_HOTKEYS
259 notification_hotkeys_update_bindings();
262 old_icon = notification_trayicon_create();
264 debug_print("Notification plugin: Could not create trayicon\n");
270 buf = g_strdup_printf(_("New %d, Unread: %d, Total: %d"),
271 count.new_msgs, count.unread_msgs,
273 gtk_status_icon_set_tooltip_text(trayicon, buf);
278 (prefs_common_get_prefs()->work_offline) ? (offset = 1) : (offset = 0);
280 if((count.new_msgs > 0) && (count.unreadmarked_msgs > 0))
282 notification_pixbuf_get(NOTIFICATION_TRAYICON_NEWMARKEDMAIL+offset);
283 else if(count.new_msgs > 0)
285 notification_pixbuf_get(NOTIFICATION_TRAYICON_NEWMAIL+offset);
286 else if(count.unreadmarked_msgs > 0)
288 notification_pixbuf_get(NOTIFICATION_TRAYICON_UNREADMARKEDMAIL+offset);
289 else if(count.unread_msgs > 0)
291 notification_pixbuf_get(NOTIFICATION_TRAYICON_UNREADMAIL+offset);
294 notification_pixbuf_get(NOTIFICATION_TRAYICON_NOMAIL+offset);
296 if(new_icon != old_icon) {
297 gtk_status_icon_set_from_pixbuf(trayicon, new_icon);
302 gboolean notification_trayicon_main_window_close(gpointer source, gpointer data)
304 if(!notify_config.trayicon_enabled)
308 gboolean *close_allowed = (gboolean*)source;
310 if(notify_config.trayicon_close_to_tray) {
311 MainWindow *mainwin = mainwindow_get_mainwindow();
313 *close_allowed = FALSE;
314 if(mainwin && gtk_widget_get_visible(GTK_WIDGET(mainwin->window))) {
315 focused_widget = gtk_window_get_focus(GTK_WINDOW(mainwin->window));
316 main_window_hide(mainwin);
323 gboolean notification_trayicon_main_window_got_iconified(gpointer source,
326 MainWindow *mainwin = mainwindow_get_mainwindow();
328 if(!notify_config.trayicon_enabled)
331 if(notify_config.trayicon_hide_when_iconified &&
332 mainwin && gtk_widget_get_visible(GTK_WIDGET(mainwin->window))
333 && !gtk_window_get_skip_taskbar_hint(GTK_WINDOW(mainwin->window))) {
334 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(mainwin->window), TRUE);
339 gboolean notification_trayicon_account_list_changed(gpointer source,
343 GtkWidget *menu, *submenu;
345 PrefsAccount *ac_prefs;
347 GList *account_list = account_get_list();
349 if(!notify_config.trayicon_enabled)
352 menu = gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/SysTrayiconPopup/EmailAcc");
353 gtk_widget_show(menu);
355 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), NULL);
356 submenu = gtk_menu_new();
358 for(cur_ac = account_list; cur_ac != NULL; cur_ac = cur_ac->next) {
359 ac_prefs = (PrefsAccount *)cur_ac->data;
361 menuitem = gtk_menu_item_new_with_label
362 (ac_prefs->account_name ? ac_prefs->account_name
364 gtk_widget_show(menuitem);
365 gtk_menu_shell_append(GTK_MENU_SHELL(submenu), menuitem);
366 g_signal_connect(G_OBJECT(menuitem), "activate",
367 G_CALLBACK(trayicon_compose_acc_cb),
370 gtk_widget_show(submenu);
371 gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu);
375 static GdkPixbuf* notification_trayicon_create(void)
377 GdkPixbuf *trayicon_nomail;
378 GtkActionGroup *action_group;
380 trayicon_nomail = notification_pixbuf_get(NOTIFICATION_TRAYICON_NOMAIL);
382 notification_trayicon_destroy();
384 trayicon = gtk_status_icon_new_from_pixbuf(trayicon_nomail);
386 g_signal_connect(G_OBJECT(trayicon), "activate",
387 G_CALLBACK(notification_trayicon_on_activate), NULL);
388 g_signal_connect(G_OBJECT(trayicon), "popup-menu",
389 G_CALLBACK(notification_trayicon_on_popup_menu), NULL);
390 g_signal_connect(G_OBJECT(trayicon), "size-changed",
391 G_CALLBACK(notification_trayicon_on_size_changed), NULL);
394 action_group = cm_menu_create_action_group("SysTrayiconPopup", trayicon_popup_menu_entries,
395 G_N_ELEMENTS(trayicon_popup_menu_entries), NULL);
396 gtk_action_group_add_toggle_actions(action_group, trayicon_popup_toggle_menu_entries,
397 G_N_ELEMENTS(trayicon_popup_toggle_menu_entries), NULL);
399 MENUITEM_ADDUI("/Menus", "SysTrayiconPopup", "SysTrayiconPopup", GTK_UI_MANAGER_MENU)
400 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "GetMail", "SysTrayiconPopup/GetMail", GTK_UI_MANAGER_MENUITEM)
401 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator1", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR)
402 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Email", "SysTrayiconPopup/Email", GTK_UI_MANAGER_MENUITEM)
403 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "EmailAcc", "SysTrayiconPopup/EmailAcc", GTK_UI_MANAGER_MENU)
404 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator2", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR)
405 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "OpenAB", "SysTrayiconPopup/OpenAB", GTK_UI_MANAGER_MENUITEM)
406 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator3", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR)
407 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "ToggleOffline", "SysTrayiconPopup/ToggleOffline", GTK_UI_MANAGER_MENUITEM)
408 #ifdef HAVE_LIBNOTIFY
409 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "ShowBubbles", "SysTrayiconPopup/ShowBubbles", GTK_UI_MANAGER_MENUITEM)
411 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator4", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR)
412 MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Exit", "SysTrayiconPopup/Exit", GTK_UI_MANAGER_MENUITEM)
414 traymenu_popup = gtk_menu_item_get_submenu(GTK_MENU_ITEM(
415 gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/SysTrayiconPopup")));
418 return trayicon_nomail;
421 void notification_trayicon_on_activate(GtkStatusIcon *status_icon, gpointer user_data)
423 MainWindow *mainwin = mainwindow_get_mainwindow();
425 if(mainwin && gtk_widget_get_visible(GTK_WIDGET(mainwin->window)) == TRUE)
426 focused_widget = gtk_window_get_focus(GTK_WINDOW(mainwin->window));
428 notification_toggle_hide_show_window();
430 if(mainwin && gtk_widget_get_visible(GTK_WIDGET(mainwin->window)) == TRUE)
431 gtk_window_set_focus(GTK_WINDOW(mainwin->window), focused_widget);
434 static void notification_trayicon_on_popup_menu(GtkStatusIcon *status_icon,
435 guint button, guint activate_time,
438 MainWindow *mainwin = mainwindow_get_mainwindow();
443 /* tell callbacks to skip any event */
444 updating_menu = TRUE;
445 /* initialize checkitems according to current states */
446 cm_toggle_menu_set_active("SysTrayiconPopup/ToggleOffline", prefs_common_get_prefs()->work_offline);
447 #ifdef HAVE_LIBNOTIFY
448 cm_toggle_menu_set_active("SysTrayiconPopup/ShowBubbles", notify_config.trayicon_popup_enabled);
450 cm_menu_set_sensitive("SysTrayiconPopup/GetMail", mainwin->lock_count == 0);
452 updating_menu = FALSE;
454 gtk_menu_popup(GTK_MENU(traymenu_popup), NULL, NULL, NULL, NULL,
455 button, activate_time);
458 static gboolean notification_trayicon_on_size_changed(GtkStatusIcon *icon,
462 notification_update_msg_counts(NULL);
466 /* popup menu callbacks */
467 static void trayicon_get_all_cb(GtkAction *action, gpointer data)
469 MainWindow *mainwin = mainwindow_get_mainwindow();
470 inc_all_account_mail_cb(mainwin, 0, NULL);
473 static void trayicon_compose_cb(GtkAction *action, gpointer data)
475 MainWindow *mainwin = mainwindow_get_mainwindow();
476 compose_mail_cb(mainwin, 0, NULL);
479 static void trayicon_compose_acc_cb(GtkMenuItem *menuitem, gpointer data)
481 compose_new((PrefsAccount *)data, NULL, NULL);
484 static void trayicon_addressbook_cb(GtkAction *action, gpointer data)
486 #ifndef USE_ALT_ADDRBOOK
487 addressbook_open(NULL);
489 GError* error = NULL;
491 addressbook_dbus_open(FALSE, &error);
493 g_warning("%s", error->message);
499 static void trayicon_toggle_offline_cb(GtkAction *action, gpointer data)
501 /* toggle offline mode if menu checkitem has been clicked */
503 MainWindow *mainwin = mainwindow_get_mainwindow();
504 main_window_toggle_work_offline(mainwin, !prefs_common_get_prefs()->work_offline, TRUE);
508 #ifdef HAVE_LIBNOTIFY
509 static void trayicon_toggle_notify_cb(GtkAction *action, gpointer data)
512 notify_config.trayicon_popup_enabled = !notify_config.trayicon_popup_enabled;
517 static void app_exit_cb(MainWindow *mainwin, guint action, GtkWidget *widget)
519 if(prefs_common_get_prefs()->confirm_on_exit) {
520 if(alertpanel(_("Exit"), _("Exit Claws Mail?"),
521 GTK_STOCK_CANCEL, GTK_STOCK_OK,
522 NULL) != G_ALERTALTERNATE) {
525 manage_window_focus_in(mainwin->window, NULL, NULL);
528 if (prefs_common_get_prefs()->clean_on_exit) {
529 if (!main_window_empty_trash(mainwin, prefs_common_get_prefs()->ask_on_clean, TRUE))
533 app_will_exit(NULL, mainwin);
536 static void trayicon_exit_cb(GtkAction *action, gpointer data)
538 MainWindow *mainwin = mainwindow_get_mainwindow();
540 if(mainwin->lock_count == 0) {
541 app_exit_cb(mainwin, 0, NULL);
545 #ifdef HAVE_LIBNOTIFY
546 static gboolean notification_trayicon_popup_add_msg(MsgInfo *msginfo,
547 NotificationFolderType nftype)
554 g_return_val_if_fail(msginfo, FALSE);
556 if(!popup.notification)
557 return notification_trayicon_popup_create(msginfo,nftype);
560 notification_trayicon_popup_count_msgs(nftype);
563 g_free(popup.msg_path);
564 popup.msg_path = NULL;
567 summary = notification_trayicon_popup_assemble_summary();
568 utf8_str = notification_trayicon_popup_assemble_body(msginfo);
570 /* make sure we show a logo on many msg arrival */
571 pixbuf = notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64);
573 notify_notification_set_icon_from_pixbuf(popup.notification, pixbuf);
575 retval = notify_notification_update(popup.notification, summary,
580 debug_print("Notification Plugin: Failed to update notification.\n");
584 notify_notification_set_hint_string(popup.notification, "desktop-entry", "claws-mail");
585 if(!notify_notification_show(popup.notification, &(popup.error))) {
586 debug_print("Notification Plugin: Failed to send updated notification: "
587 "%s\n", popup.error->message);
588 g_clear_error(&(popup.error));
592 debug_print("Notification Plugin: Popup successfully modified "
593 "with libnotify.\n");
598 static gboolean notification_trayicon_popup_create(MsgInfo *msginfo,
599 NotificationFolderType nftype)
601 gchar *summary = NULL;
602 gchar *utf8_str = NULL;
605 gboolean support_actions = FALSE;
607 /* init libnotify if necessary */
608 if(!notify_is_initted()) {
609 if(!notify_init("claws-mail")) {
610 debug_print("Notification Plugin: Failed to initialize libnotify. "
611 "No popups will be shown.\n");
617 notification_trayicon_popup_count_msgs(nftype);
619 summary = notification_trayicon_popup_assemble_summary();
620 utf8_str = notification_trayicon_popup_assemble_body(msginfo);
622 #if NOTIFY_CHECK_VERSION(0, 7, 0)
623 popup.notification = notify_notification_new(summary, utf8_str, NULL);
625 popup.notification = notify_notification_new(summary, utf8_str, NULL, NULL);
626 notify_notification_attach_to_status_icon(popup.notification, trayicon);
632 caps = notify_get_server_caps();
635 for(c = caps; c != NULL; c = c->next) {
636 if(strcmp((char*)c->data, "actions") == 0 ) {
637 support_actions = TRUE;
642 g_list_foreach(caps, (GFunc)g_free, NULL);
648 notify_notification_add_action(popup.notification,
649 "default", _("Present main window"),
650 (NotifyActionCallback)
651 notification_trayicon_popup_default_action_cb,
652 GINT_TO_POINTER(nftype),
653 notification_trayicon_popup_free_func);
655 if(popup.notification == NULL) {
656 debug_print("Notification Plugin: Failed to create a new notification.\n");
662 #ifndef USE_ALT_ADDRBOOK
663 if(msginfo && msginfo->from) {
665 icon_path = addrindex_get_picture_file(msginfo->from);
666 if(is_file_exist(icon_path)) {
667 GError *error = NULL;
670 gdk_pixbuf_get_file_info(icon_path, &w, &h);
671 if((w > 64) || (h > 64))
672 pixbuf = gdk_pixbuf_new_from_file_at_scale(icon_path,
673 64, 64, TRUE, &error);
675 pixbuf = gdk_pixbuf_new_from_file(icon_path, &error);
678 debug_print("Could not load picture file: %s\n",
679 error ? error->message : "no details");
684 debug_print("Picture path does not exist: %s\n",icon_path);
689 pixbuf = g_object_ref(notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64));
692 notify_notification_set_icon_from_pixbuf(popup.notification, pixbuf);
693 g_object_unref(pixbuf);
695 else /* This is not fatal */
696 debug_print("Notification plugin: Icon could not be loaded.\n");
699 notify_notification_set_timeout(popup.notification, notify_config.trayicon_popup_timeout);
702 notify_notification_set_category(popup.notification, "email.arrived");
704 /* get notified on bubble close */
705 g_signal_connect(G_OBJECT(popup.notification), "closed", G_CALLBACK(popup_timeout_fun), NULL);
708 notify_notification_set_hint_string(popup.notification, "desktop-entry", "claws-mail");
709 if(!notify_notification_show(popup.notification, &(popup.error))) {
710 debug_print("Notification Plugin: Failed to send notification: %s\n",
711 popup.error->message);
712 g_clear_error(&(popup.error));
713 g_object_unref(G_OBJECT(popup.notification));
714 popup.notification = NULL;
718 /* Store path to message */
719 if(nftype == F_TYPE_MAIL) {
720 if(msginfo && msginfo->folder) {
722 ident = folder_item_get_identifier(msginfo->folder);
723 popup.msg_path = g_strdup_printf("%s%s%u", ident,G_DIR_SEPARATOR_S,
728 popup.msg_path = NULL;
731 debug_print("Notification Plugin: Popup created with libnotify.\n");
736 static void popup_timeout_fun(NotifyNotification *nn, gpointer data)
738 G_LOCK(trayicon_popup);
740 g_object_unref(G_OBJECT(popup.notification));
742 popup.notification = NULL;
743 g_clear_error(&(popup.error));
748 popup.num_calendar = 0;
752 g_free(popup.msg_path);
753 popup.msg_path = NULL;
756 G_UNLOCK(trayicon_popup);
759 static void notification_trayicon_popup_free_func(gpointer data)
762 g_free(popup.msg_path);
763 popup.msg_path = NULL;
766 debug_print("Freed notification data\n");
769 static void notification_trayicon_popup_default_action_cb(NotifyNotification
774 if(strcmp("default", action))
778 mainwin = mainwindow_get_mainwindow();
780 NotificationFolderType nftype;
782 /* Let mainwindow pop up */
783 notification_show_mainwindow(mainwin);
784 /* If there is only one new mail message, jump to this message */
785 nftype = (NotificationFolderType)GPOINTER_TO_INT(user_data);
786 if((popup.count == 1) && (nftype == F_TYPE_MAIL)) {
788 G_LOCK(trayicon_popup);
789 select_str = g_strdup(popup.msg_path);
790 G_UNLOCK(trayicon_popup);
791 debug_print("Notification plugin: Select message %s\n", select_str);
792 mainwindow_jump_to(select_str, FALSE);
798 static void notification_trayicon_popup_count_msgs(NotificationFolderType nftype)
807 case F_TYPE_CALENDAR:
808 popup.num_calendar++;
814 debug_print("Notification plugin: Unknown folder type\n");
820 /* The returned value has to be freed by the caller */
821 static gchar* notification_trayicon_popup_assemble_summary(void)
823 gchar *summary = NULL;
825 if(popup.count == 1) {
827 summary = g_strdup(_("New mail message"));
828 else if(popup.num_news)
829 summary = g_strdup(_("New news post"));
830 else if(popup.num_calendar)
831 summary = g_strdup(_("New calendar message"));
833 summary = g_strdup(_("New article in RSS feed"));
834 } /* One new message */
836 summary = g_strdup(_("New messages arrived"));
837 } /* Many new messages */
842 /* The returned value has to be freed by the caller */
843 static gchar* notification_trayicon_popup_assemble_body(MsgInfo *msginfo)
847 if(popup.count == 1) {
848 if(popup.num_mail || popup.num_news) {
852 gchar *foldname = NULL;
854 from = notification_libnotify_sanitize_str(msginfo->from ?
857 subj = notification_libnotify_sanitize_str(msginfo->subject ?
860 if (notify_config.trayicon_display_folder_name) {
861 foldname = notification_libnotify_sanitize_str(msginfo->folder->path);
862 text = g_strconcat(from,"\n\n", subj, "\n\n", foldname, NULL);
865 text = g_strconcat(from, "\n\n",subj, NULL);
868 /* Make sure text is valid UTF8 */
869 utf8_str = notification_validate_utf8_str(text);
872 if(from) g_free(from);
873 if(subj) g_free(subj);
874 if(foldname) g_free(foldname);
876 else if(popup.num_calendar) {
877 utf8_str = g_strdup(_("A new calendar message arrived"));
880 utf8_str = g_strdup(_("A new article in a RSS feed arrived"));
887 gboolean str_empty = TRUE;
889 utf8_str = g_strdup("");
892 msg = g_strdup_printf(ngettext("%d new mail message arrived",
893 "%d new mail messages arrived",
896 tmp = g_strdup_printf("%s%s%s",utf8_str,str_empty?"":"\n",msg);
903 msg = g_strdup_printf(ngettext("%d new news post arrived",
904 "%d new news posts arrived",
907 tmp = g_strdup_printf("%s%s%s",utf8_str,str_empty?"":"\n",msg);
913 if(popup.num_calendar) {
914 msg = g_strdup_printf(ngettext("%d new calendar message arrived",
915 "%d new calendar messages arrived",
918 tmp = g_strdup_printf("%s%s%s",utf8_str,str_empty?"":"\n",msg);
925 msg = g_strdup_printf(ngettext("%d new article in RSS feeds arrived",
926 "%d new articles in RSS feeds arrived",
929 tmp = g_strdup_printf("%s%s%s",utf8_str,str_empty?"":"\n",msg);
935 } /* Many messages */
940 #endif /* HAVE_LIBNOTIFY */
942 gboolean notification_trayicon_is_available(void)
944 gboolean is_available;
945 is_available = FALSE;
948 if(gtk_status_icon_is_embedded(trayicon) &&
949 gtk_status_icon_get_visible(trayicon))
956 #endif /* NOTIFICATION_TRAYICON */