static gboolean notification_trayicon_popup_add_msg(MsgInfo *msginfo, NotificationFolderType nftype) { gchar *summary; gchar *utf8_str; gboolean retval; GdkPixbuf *pixbuf; g_return_val_if_fail(msginfo, FALSE); if(!popup.notification) return notification_trayicon_popup_create(msginfo,nftype); /* Count messages */ notification_trayicon_popup_count_msgs(nftype); if(popup.msg_path) { g_free(popup.msg_path); popup.msg_path = NULL; } summary = notification_trayicon_popup_assemble_summary(); utf8_str = notification_trayicon_popup_assemble_body(msginfo); /* make sure we show a logo on many msg arrival */ pixbuf = notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64); if(pixbuf) notify_notification_set_icon_from_pixbuf(popup.notification, pixbuf); retval = notify_notification_update(popup.notification, summary, utf8_str, NULL); g_free(summary); g_free(utf8_str); if(!retval) { debug_print("Notification Plugin: Failed to update notification.\n"); return FALSE; } /* Show the popup */ notify_notification_set_hint_string(popup.notification, "desktop-entry", "claws-mail"); if(!notify_notification_show(popup.notification, &(popup.error))) { debug_print("Notification Plugin: Failed to send updated notification: " "%s\n", popup.error->message); g_clear_error(&(popup.error)); return FALSE; } debug_print("Notification Plugin: Popup successfully modified " "with libnotify.\n"); return TRUE; }
static GdkPixbuf* notification_trayicon_create(void) { GdkPixbuf *trayicon_nomail; GtkActionGroup *action_group; trayicon_nomail = notification_pixbuf_get(NOTIFICATION_TRAYICON_NOMAIL); notification_trayicon_destroy(); trayicon = gtk_status_icon_new_from_pixbuf(trayicon_nomail); g_signal_connect(G_OBJECT(trayicon), "activate", G_CALLBACK(notification_trayicon_on_activate), NULL); g_signal_connect(G_OBJECT(trayicon), "popup-menu", G_CALLBACK(notification_trayicon_on_popup_menu), NULL); g_signal_connect(G_OBJECT(trayicon), "size-changed", G_CALLBACK(notification_trayicon_on_size_changed), NULL); /* Popup-Menu */ action_group = cm_menu_create_action_group("SysTrayiconPopup", trayicon_popup_menu_entries, G_N_ELEMENTS(trayicon_popup_menu_entries), NULL); gtk_action_group_add_toggle_actions(action_group, trayicon_popup_toggle_menu_entries, G_N_ELEMENTS(trayicon_popup_toggle_menu_entries), NULL); MENUITEM_ADDUI("/Menus", "SysTrayiconPopup", "SysTrayiconPopup", GTK_UI_MANAGER_MENU) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "GetMail", "SysTrayiconPopup/GetMail", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "GetMailAcc", "SysTrayiconPopup/GetMailAcc", GTK_UI_MANAGER_MENU) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator1", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Email", "SysTrayiconPopup/Email", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "EmailAcc", "SysTrayiconPopup/EmailAcc", GTK_UI_MANAGER_MENU) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator2", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "OpenAB", "SysTrayiconPopup/OpenAB", GTK_UI_MANAGER_MENUITEM) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator3", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "ToggleOffline", "SysTrayiconPopup/ToggleOffline", GTK_UI_MANAGER_MENUITEM) #ifdef HAVE_LIBNOTIFY MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "ShowBubbles", "SysTrayiconPopup/ShowBubbles", GTK_UI_MANAGER_MENUITEM) #endif MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Separator4", "SysTrayiconPopup/---", GTK_UI_MANAGER_SEPARATOR) MENUITEM_ADDUI("/Menus/SysTrayiconPopup", "Exit", "SysTrayiconPopup/Exit", GTK_UI_MANAGER_MENUITEM) traymenu_popup = gtk_menu_item_get_submenu(GTK_MENU_ITEM( gtk_ui_manager_get_widget(gtkut_ui_manager(), "/Menus/SysTrayiconPopup"))); return trayicon_nomail; }
static gboolean notification_trayicon_popup_create(MsgInfo *msginfo, NotificationFolderType nftype) { gchar *summary = NULL; gchar *utf8_str = NULL; GdkPixbuf *pixbuf; GList *caps = NULL; gboolean support_actions = FALSE; /* init libnotify if necessary */ if(!notify_is_initted()) { if(!notify_init("claws-mail")) { debug_print("Notification Plugin: Failed to initialize libnotify. " "No popups will be shown.\n"); return FALSE; } } /* Count messages */ notification_trayicon_popup_count_msgs(nftype); summary = notification_trayicon_popup_assemble_summary(); utf8_str = notification_trayicon_popup_assemble_body(msginfo); #if NOTIFY_CHECK_VERSION(0, 7, 0) popup.notification = notify_notification_new(summary, utf8_str, NULL); #else popup.notification = notify_notification_new(summary, utf8_str, NULL, NULL); notify_notification_attach_to_status_icon(popup.notification, trayicon); #endif g_free(summary); g_free(utf8_str); caps = notify_get_server_caps(); if(caps != NULL) { GList *c; for(c = caps; c != NULL; c = c->next) { if(strcmp((char*)c->data, "actions") == 0 ) { support_actions = TRUE; break; } } g_list_foreach(caps, (GFunc)g_free, NULL); g_list_free(caps); } /* Default action */ if (support_actions) notify_notification_add_action(popup.notification, "default", "Present main window", (NotifyActionCallback) notification_trayicon_popup_default_action_cb, GINT_TO_POINTER(nftype), notification_trayicon_popup_free_func); if(popup.notification == NULL) { debug_print("Notification Plugin: Failed to create a new notification.\n"); return FALSE; } /* Icon */ pixbuf = NULL; #ifndef USE_NEW_ADDRBOOK if(msginfo && msginfo->from) { gchar *icon_path; icon_path = addrindex_get_picture_file(msginfo->from); if(is_file_exist(icon_path)) { GError *error = NULL; gint w, h; gdk_pixbuf_get_file_info(icon_path, &w, &h); if((w > 64) || (h > 64)) pixbuf = gdk_pixbuf_new_from_file_at_scale(icon_path, 64, 64, TRUE, &error); else pixbuf = gdk_pixbuf_new_from_file(icon_path, &error); if(!pixbuf) { debug_print("Could not load picture file: %s\n", error ? error->message : "no details"); g_error_free(error); } } else debug_print("Picture path does not exist: %s\n",icon_path); g_free(icon_path); } #endif if(!pixbuf) pixbuf = g_object_ref(notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64)); if(pixbuf) { notify_notification_set_icon_from_pixbuf(popup.notification, pixbuf); g_object_unref(pixbuf); } else /* This is not fatal */ debug_print("Notification plugin: Icon could not be loaded.\n"); /* timeout */ notify_notification_set_timeout(popup.notification, notify_config.trayicon_popup_timeout); /* Category */ notify_notification_set_category(popup.notification, "email.arrived"); /* get notified on bubble close */ g_signal_connect(G_OBJECT(popup.notification), "closed", G_CALLBACK(popup_timeout_fun), NULL); /* Show the popup */ notify_notification_set_hint_string(popup.notification, "desktop-entry", "claws-mail"); if(!notify_notification_show(popup.notification, &(popup.error))) { debug_print("Notification Plugin: Failed to send notification: %s\n", popup.error->message); g_clear_error(&(popup.error)); g_object_unref(G_OBJECT(popup.notification)); popup.notification = NULL; return FALSE; } /* Store path to message */ if(nftype == F_TYPE_MAIL) { if(msginfo->folder && msginfo->folder) { gchar *ident; ident = folder_item_get_identifier(msginfo->folder); popup.msg_path = g_strdup_printf("%s%s%u", ident,G_DIR_SEPARATOR_S, msginfo->msgnum); g_free(ident); } else popup.msg_path = NULL; } debug_print("Notification Plugin: Popup created with libnotify.\n"); return TRUE; }
void notification_update_trayicon() { gchar *buf; static GdkPixbuf *old_icon = NULL; GdkPixbuf *new_icon; gint offset; NotificationMsgCount count; GSList *list; if(!notify_config.trayicon_enabled) return; if(notify_config.trayicon_folder_specific) { guint id; id = notification_register_folder_specific_list (TRAYICON_SPECIFIC_FOLDER_ID_STR); list = notification_foldercheck_get_list(id); } else list = NULL; notification_core_get_msg_count(list, &count); if(!trayicon) { #ifdef NOTIFICATION_HOTKEYS notification_hotkeys_update_bindings(); #endif old_icon = notification_trayicon_create(); if(!trayicon) { debug_print("Notification plugin: Could not create trayicon\n"); return; } } /* Tooltip */ buf = g_strdup_printf(_("New %d, Unread: %d, Total: %d"), count.new_msgs, count.unread_msgs, count.total_msgs); #if GTK_CHECK_VERSION(2,16,0) gtk_status_icon_set_tooltip_text(trayicon, buf); #else gtk_status_icon_set_tooltip(trayicon, buf); #endif g_free(buf); /* Pixmap */ (prefs_common_get_prefs()->work_offline) ? (offset = 1) : (offset = 0); if((count.new_msgs > 0) && (count.unreadmarked_msgs > 0)) new_icon = notification_pixbuf_get(NOTIFICATION_TRAYICON_NEWMARKEDMAIL+offset); else if(count.new_msgs > 0) new_icon = notification_pixbuf_get(NOTIFICATION_TRAYICON_NEWMAIL+offset); else if(count.unreadmarked_msgs > 0) new_icon = notification_pixbuf_get(NOTIFICATION_TRAYICON_UNREADMARKEDMAIL+offset); else if(count.unread_msgs > 0) new_icon = notification_pixbuf_get(NOTIFICATION_TRAYICON_UNREADMAIL+offset); else new_icon = notification_pixbuf_get(NOTIFICATION_TRAYICON_NOMAIL+offset); if(new_icon != old_icon) { gtk_status_icon_set_from_pixbuf(trayicon, new_icon); old_icon = new_icon; } }
static gboolean notification_libnotify_add_msg(MsgInfo *msginfo, NotificationFolderType nftype) { gchar *summary; gchar *text; gboolean retval; NotificationPopup *ppopup; GdkPixbuf *pixbuf; ppopup = &(popup[nftype]); if(!ppopup->notification) return notification_libnotify_create(msginfo,nftype); ppopup->count++; if(ppopup->msg_path) { g_free(ppopup->msg_path); ppopup->msg_path = NULL; } /* make sure we show a logo on many msg arrival */ pixbuf = notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64); if(pixbuf) notify_notification_set_icon_from_pixbuf(ppopup->notification, pixbuf); switch(nftype) { case F_TYPE_MAIL: summary = _("Mail message"); text = g_strdup_printf(ngettext("%d new message arrived", "%d new messages arrived", ppopup->count), ppopup->count); break; case F_TYPE_NEWS: summary = _("News message"); text = g_strdup_printf(ngettext("%d new message arrived", "%d new messages arrived", ppopup->count), ppopup->count); break; case F_TYPE_CALENDAR: summary = _("Calendar message"); text = g_strdup_printf(ngettext("%d new calendar message arrived", "%d new calendar messages arrived", ppopup->count), ppopup->count); break; case F_TYPE_RSS: summary = _("RSS news feed"); text = g_strdup_printf(ngettext("%d new article in a RSS feed arrived", "%d new articles in a RSS feed arrived", ppopup->count), ppopup->count); break; default: /* Should not happen */ debug_print("Notification Plugin: Unknown folder type ignored\n"); return FALSE; } retval = notify_notification_update(ppopup->notification, summary, text, NULL); g_free(text); if(!retval) { debug_print("Notification Plugin: Failed to update notification.\n"); return FALSE; } /* Show the popup */ notify_notification_set_hint_string(ppopup->notification, "desktop-entry", "claws-mail"); if(!notify_notification_show(ppopup->notification, &(ppopup->error))) { debug_print("Notification Plugin: Failed to send updated notification: " "%s\n", ppopup->error->message); g_clear_error(&(ppopup->error)); return FALSE; } debug_print("Notification Plugin: Popup successfully modified " "with libnotify.\n"); return TRUE; }
static gboolean notification_libnotify_create(MsgInfo *msginfo, NotificationFolderType nftype) { GdkPixbuf *pixbuf; NotificationPopup *ppopup; gchar *summary = NULL; gchar *text = NULL; gchar *utf8_str = NULL; gchar *subj = NULL; gchar *from = NULL; gchar *foldname = NULL; GList *caps = NULL; gboolean support_actions = FALSE; g_return_val_if_fail(msginfo, FALSE); ppopup = &(popup[nftype]); /* init libnotify if necessary */ if(!notify_is_initted()) { if(!notify_init("claws-mail")) { debug_print("Notification Plugin: Failed to initialize libnotify. " "No popup will be shown.\n"); return FALSE; } } switch(nftype) { case F_TYPE_MAIL: summary = _("New Mail message"); from = notification_libnotify_sanitize_str(msginfo->from ? msginfo->from : _("(No From)")); subj = notification_libnotify_sanitize_str(msginfo->subject ? msginfo->subject : _("(No Subject)")); if (notify_config.popup_display_folder_name) { foldname = notification_libnotify_sanitize_str(msginfo->folder->path); text = g_strconcat(from,"\n\n", subj, "\n\n", foldname, NULL); } else text = g_strconcat(from, "\n\n",subj, NULL); /* Make sure text is valid UTF8 */ utf8_str = notification_validate_utf8_str(text); g_free(text); if(from) g_free(from); if(subj) g_free(subj); if(foldname) g_free(foldname); break; case F_TYPE_NEWS: summary = _("New News post"); utf8_str = g_strdup(_("A new message arrived")); break; case F_TYPE_CALENDAR: summary = _("New Calendar message"); utf8_str = g_strdup(_("A new calendar message arrived")); break; case F_TYPE_RSS: summary = _("New RSS feed article"); utf8_str = g_strdup(_("A new article in a RSS feed arrived")); break; default: summary = _("New unknown message"); utf8_str = g_strdup(_("Unknown message type arrived")); break; } ppopup->notification = notify_notification_new(summary, utf8_str, NULL #if !NOTIFY_CHECK_VERSION(0, 7, 0) , NULL #endif ); g_free(utf8_str); if(ppopup->notification == NULL) { debug_print("Notification Plugin: Failed to create a new " "notification.\n"); return FALSE; } caps = notify_get_server_caps(); if(caps != NULL) { GList *c; for(c = caps; c != NULL; c = c->next) { if(strcmp((char*)c->data, "actions") == 0 ) { support_actions = TRUE; break; } } g_list_foreach(caps, (GFunc)g_free, NULL); g_list_free(caps); } /* Default action */ if (support_actions) notify_notification_add_action(ppopup->notification, "default", _("Present main window"), (NotifyActionCallback)default_action_cb, GINT_TO_POINTER(nftype), notification_libnotify_free_func); /* Icon */ pixbuf = NULL; #ifndef USE_ALT_ADDRBOOK if(msginfo && msginfo->from) { gchar *icon_path; icon_path = addrindex_get_picture_file(msginfo->from); if(is_file_exist(icon_path)) { GError *error = NULL; gint w, h; gdk_pixbuf_get_file_info(icon_path, &w, &h); if((w > 64) || (h > 64)) pixbuf = gdk_pixbuf_new_from_file_at_scale(icon_path, 64, 64, TRUE, &error); else pixbuf = gdk_pixbuf_new_from_file(icon_path, &error); if(!pixbuf) { debug_print("Could not load picture file: %s\n", error ? error->message : "no details"); g_error_free(error); } } else debug_print("Picture path does not exist: %s\n",icon_path); g_free(icon_path); } #endif if(!pixbuf) pixbuf = g_object_ref(notification_pixbuf_get(NOTIFICATION_CM_LOGO_64x64)); if(pixbuf) { notify_notification_set_icon_from_pixbuf(ppopup->notification, pixbuf); g_object_unref(pixbuf); } else /* This is not fatal */ debug_print("Notification plugin: Icon could not be loaded.\n"); /* timeout */ notify_notification_set_timeout(ppopup->notification, notify_config.popup_timeout); /* Category */ notify_notification_set_category(ppopup->notification, "email.arrived"); /* get notified on bubble close */ g_signal_connect(G_OBJECT(popup->notification), "closed", G_CALLBACK(popup_timeout_fun), NULL); /* Show the popup */ notify_notification_set_hint_string(ppopup->notification, "desktop-entry", "claws-mail"); if(!notify_notification_show(ppopup->notification, &(ppopup->error))) { debug_print("Notification Plugin: Failed to send notification: %s\n", ppopup->error->message); g_clear_error(&(ppopup->error)); g_object_unref(G_OBJECT(ppopup->notification)); ppopup->notification = NULL; return FALSE; } debug_print("Notification Plugin: Popup created with libnotify.\n"); ppopup->count = 1; /* Store path to message */ if(nftype == F_TYPE_MAIL) { if(msginfo && msginfo->folder) { gchar *ident; ident = folder_item_get_identifier(msginfo->folder); ppopup->msg_path = g_strdup_printf("%s%s%u", ident,G_DIR_SEPARATOR_S, msginfo->msgnum); g_free(ident); } else ppopup->msg_path = NULL; } return TRUE; }