/* Callback for the folder selection dialog. Basically a wrapper around * folder_checked that first resolves the name to an ID first. */ void notification_foldercheck_sel_folders_cb(GtkButton *button, gpointer data) { guint id; gchar *name = (gchar*) data; id = notification_register_folder_specific_list(name); folder_checked(id); }
void notification_update_banner(void) { notification_collected_msgs_free(banner_collected_msgs); banner_collected_msgs = NULL; if(notify_config.banner_show != NOTIFY_BANNER_SHOW_NEVER) { guint id; GSList *folder_list = NULL; if(notify_config.banner_folder_specific) { id = notification_register_folder_specific_list (BANNER_SPECIFIC_FOLDER_ID_STR); folder_list = notification_foldercheck_get_list(id); } if(!(notify_config.banner_folder_specific && (folder_list == NULL))) banner_collected_msgs = notification_collect_msgs(notify_config.banner_include_unread, notify_config.banner_folder_specific ? folder_list : NULL, notify_config.banner_max_msgs); } notification_banner_show(banner_collected_msgs); }
/* Read selections from a common xml-file. Called when loading the plugin. * Returns TRUE if data has been read, FALSE if no data is available * or an error occurred. * This is analog to folder.h::folder_read_list. */ gboolean notification_foldercheck_read_array(void) { gchar *path; GNode *rootnode, *node, *branchnode; XMLNode *xmlnode; gboolean success = FALSE; path = foldercheck_get_array_path(); if(!is_file_exist(path)) { path = NULL; return FALSE; } /* We don't do merging, so if the file existed, clear what we have stored in memory right now.. */ notification_free_folder_specific_array(); /* .. and evaluate the file */ rootnode = xml_parse_file(path); path = NULL; if(!rootnode) return FALSE; xmlnode = rootnode->data; /* Check that root entry is "foldercheckarray" */ if(strcmp2(xmlnode->tag->tag, "foldercheckarray") != 0) { g_warning("wrong foldercheck array file"); xml_free_tree(rootnode); return FALSE; } /* Process branch entries */ for(branchnode = rootnode->children; branchnode != NULL; branchnode = branchnode->next) { GList *list; guint id; SpecificFolderArrayEntry *entry = NULL; xmlnode = branchnode->data; if(strcmp2(xmlnode->tag->tag, "branch") != 0) { g_warning("tag name != \"branch\""); return FALSE; } /* Attributes of the branch nodes */ list = xmlnode->tag->attr; for(; list != NULL; list = list->next) { XMLAttr *attr = list->data; if(attr && attr->name && attr->value && !strcmp2(attr->name, "name")) { id = notification_register_folder_specific_list(attr->value); entry = foldercheck_get_entry_from_id(id); /* We have found something */ success = TRUE; break; } } if((list == NULL) || (entry == NULL)) { g_warning("Did not find attribute \"name\" in tag \"branch\""); continue; /* with next branch */ } /* Now descent into the children of the brach, which are the folderitems */ for(node = branchnode->children; node != NULL; node = node->next) { FolderItem *item = NULL; /* These should all be leaves. */ if(!G_NODE_IS_LEAF(node)) g_warning("Subnodes in \"branch\" nodes should all be leaves. " "Ignoring deeper subnodes."); /* Check if tag is "folderitem" */ xmlnode = node->data; if(strcmp2(xmlnode->tag->tag, "folderitem") != 0) { g_warning("tag name != \"folderitem\""); continue; /* to next node in branch */ } /* Attributes of the leaf nodes */ list = xmlnode->tag->attr; for(; list != NULL; list = list->next) { XMLAttr *attr = list->data; if(attr && attr->name && attr->value && !strcmp2(attr->name, "identifier")) { item = folder_find_item_from_identifier(attr->value); break; } } if((list == NULL) || (item == NULL)) { g_warning("Did not find attribute \"identifier\" in tag " "\"folderitem\""); continue; /* with next leaf node */ } /* Store all FolderItems in the list */ /* We started with a cleared array, so we don't need to check if it's already in there. */ entry->list = g_slist_prepend(entry->list, item); } /* for all subnodes in branch */ } /* for all branches */ return success; }
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; } }
void notification_trayicon_msg(MsgInfo *msginfo) { #ifndef HAVE_LIBNOTIFY return; #else FolderType ftype; NotificationFolderType nftype; gchar *uistr; nftype = F_TYPE_MAIL; if(!msginfo || !notify_config.trayicon_enabled || !notify_config.trayicon_popup_enabled || !MSG_IS_NEW(msginfo->flags)) return; if(notify_config.trayicon_folder_specific) { guint id; GSList *list; gchar *identifier; gboolean found = FALSE; if(!(msginfo->folder)) return; identifier = folder_item_get_identifier(msginfo->folder); id = notification_register_folder_specific_list (TRAYICON_SPECIFIC_FOLDER_ID_STR); list = notification_foldercheck_get_list(id); for(; (list != NULL) && !found; list = g_slist_next(list)) { gchar *list_identifier; FolderItem *list_item = (FolderItem*) list->data; list_identifier = folder_item_get_identifier(list_item); if(!strcmp2(list_identifier, identifier)) found = TRUE; g_free(list_identifier); } g_free(identifier); if(!found) return; } /* folder specific */ ftype = msginfo->folder->folder->klass->type; G_LOCK(trayicon_popup); /* Check out which type to notify about */ switch(ftype) { case F_MH: case F_MBOX: case F_MAILDIR: case F_IMAP: nftype = F_TYPE_MAIL; break; case F_NEWS: nftype = F_TYPE_NEWS; break; case F_UNKNOWN: if((uistr = msginfo->folder->folder->klass->uistr) == NULL) { G_UNLOCK(trayicon_popup); return; } else if(!strcmp(uistr, "vCalendar")) nftype = F_TYPE_CALENDAR; else if(!strcmp(uistr, "RSSyl")) nftype = F_TYPE_RSS; else { debug_print("Notification Plugin: Unknown folder type %d\n",ftype); G_UNLOCK(trayicon_popup); return; } break; default: debug_print("Notification Plugin: Unknown folder type %d\n",ftype); G_UNLOCK(trayicon_popup); return; } notification_trayicon_popup_add_msg(msginfo, nftype); G_UNLOCK(trayicon_popup); #endif /* HAVE_LIBNOTIFY */ }
void notification_popup_msg(MsgInfo *msginfo) { FolderType ftype; #if HAVE_LIBNOTIFY gchar *uistr; #else NotificationPopup *ppopup; gboolean retval; #endif NotificationFolderType nftype; nftype = F_TYPE_MAIL; if(!msginfo || !notify_config.popup_show) return; if(notify_config.popup_folder_specific) { guint id; GSList *list; gchar *identifier; gboolean found = FALSE; if(!(msginfo->folder)) return; identifier = folder_item_get_identifier(msginfo->folder); id = notification_register_folder_specific_list(POPUP_SPECIFIC_FOLDER_ID_STR); list = notification_foldercheck_get_list(id); for(; (list != NULL) && !found; list = g_slist_next(list)) { gchar *list_identifier; FolderItem *list_item = (FolderItem*) list->data; list_identifier = folder_item_get_identifier(list_item); if(!strcmp2(list_identifier, identifier)) found = TRUE; g_free(list_identifier); } g_free(identifier); if(!found) return; } ftype = msginfo->folder->folder->klass->type; G_LOCK(popup); #ifdef HAVE_LIBNOTIFY /* Check out which type to notify about */ switch(ftype) { case F_MH: case F_MBOX: case F_MAILDIR: case F_IMAP: nftype = F_TYPE_MAIL; break; case F_NEWS: nftype = F_TYPE_NEWS; break; case F_UNKNOWN: if((uistr = msginfo->folder->folder->klass->uistr) == NULL) { G_UNLOCK(popup); return; } else if(!strcmp(uistr, "vCalendar")) nftype = F_TYPE_CALENDAR; else if(!strcmp(uistr, "RSSyl")) nftype = F_TYPE_RSS; else { debug_print("Notification Plugin: Unknown folder type %d\n",ftype); G_UNLOCK(popup); return; } break; default: debug_print("Notification Plugin: Unknown folder type %d\n",ftype); G_UNLOCK(popup); return; } notification_libnotify_add_msg(msginfo, nftype); #else /* !HAVE_LIBNOTIFY */ ppopup = &popup; retval = notification_popup_add_msg(msginfo); /* Renew timeout only when the above call was successful */ if(retval) { if(ppopup->timeout_id) g_source_remove(ppopup->timeout_id); ppopup->timeout_id = g_timeout_add(notify_config.popup_timeout, popup_timeout_fun, GINT_TO_POINTER(nftype)); } #endif /* !HAVE_LIBNOTIFY */ G_UNLOCK(popup); #ifndef HAVE_LIBNOTIFY /* GUI update */ while(gtk_events_pending()) gtk_main_iteration(); #endif /* !HAVE_LIBNOTIFY */ }