static gboolean my_folder_item_update_hook(gpointer source, gpointer data) { FolderItemUpdateData *update_data = source; FolderType ftype; gchar *uistr; g_return_val_if_fail(source != NULL, FALSE); #if defined(NOTIFICATION_LCDPROC) || defined(NOTIFICATION_TRAYICON) || defined(NOTIFICATION_INDICATOR) notification_update_msg_counts(NULL); #else if(notify_config.urgency_hint_new || notify_config.urgency_hint_unread) notification_update_msg_counts(NULL); #endif /* Check if the folder types is to be notified about */ ftype = update_data->item->folder->klass->type; uistr = update_data->item->folder->klass->uistr; if(!notify_include_folder_type(ftype, uistr)) return FALSE; if(update_data->update_flags & F_ITEM_UPDATE_MSGCNT) { #ifdef NOTIFICATION_BANNER notification_update_banner(); #endif #if defined(NOTIFICATION_POPUP) || defined(NOTIFICATION_COMMAND) notification_new_unnotified_msgs(update_data); #endif } return FALSE; }
static gboolean my_offline_switch_hook(gpointer source, gpointer data) { #ifdef NOTIFICATION_TRAYICON notification_update_msg_counts(NULL); #endif return FALSE; }
static gboolean notification_trayicon_on_size_changed(GtkStatusIcon *icon, gint size, gpointer user_data) { notification_update_msg_counts(NULL); return FALSE; }
static gboolean my_folder_update_hook(gpointer source, gpointer data) { FolderUpdateData *hookdata; g_return_val_if_fail(source != NULL, FALSE); hookdata = source; #if defined(NOTIFICATION_LCDPROC) || defined(NOTIFICATION_TRAYICON) if(hookdata->update_flags & FOLDER_REMOVE_FOLDERITEM) notification_update_msg_counts(hookdata->item); else notification_update_msg_counts(NULL); #endif return FALSE; }
static gboolean my_main_window_close_hook(gpointer source, gpointer data) { gboolean retVal = FALSE; #ifdef NOTIFICATION_TRAYICON notification_update_msg_counts(NULL); retVal = notification_trayicon_main_window_close(source, data); #endif return retVal; }
static gboolean my_account_list_changed_hook(gpointer source, gpointer data) { gboolean retVal = FALSE; #ifdef NOTIFICATION_TRAYICON notification_update_msg_counts(NULL); retVal = notification_trayicon_account_list_changed(source, data); #endif return retVal; }
gint plugin_init(gchar **error) { gchar *rcpath; /* Version check */ /* No be able to test against new-contacts */ if(!check_plugin_version(MAKE_NUMERIC_VERSION(3,8,1,46), VERSION_NUMERIC, _("Notification"), error)) return -1; /* Check if threading is enabled */ if(!g_thread_supported()) { *error = g_strdup(_("The Notification plugin needs threading support.")); return -1; } hook_f_item = hooks_register_hook(FOLDER_ITEM_UPDATE_HOOKLIST, my_folder_item_update_hook, NULL); if(hook_f_item == (guint) -1) { *error = g_strdup(_("Failed to register folder item update hook in the " "Notification plugin")); return -1; } hook_f = hooks_register_hook(FOLDER_UPDATE_HOOKLIST, my_folder_update_hook, NULL); if(hook_f == (guint) -1) { *error = g_strdup(_("Failed to register folder update hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); return -1; } hook_m_info = hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, my_msginfo_update_hook, NULL); if(hook_m_info == (guint) -1) { *error = g_strdup(_("Failed to register msginfo update hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); return -1; } hook_offline = hooks_register_hook(OFFLINE_SWITCH_HOOKLIST, my_offline_switch_hook, NULL); if(hook_offline == (guint) -1) { *error = g_strdup(_("Failed to register offline switch hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, hook_m_info); return -1; } hook_mw_close = hooks_register_hook(MAIN_WINDOW_CLOSE, my_main_window_close_hook, NULL); if(hook_mw_close == (guint) -1) { *error = g_strdup(_("Failed to register main window close hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, hook_m_info); hooks_unregister_hook(OFFLINE_SWITCH_HOOKLIST, hook_offline); return -1; } hook_got_iconified = hooks_register_hook(MAIN_WINDOW_GOT_ICONIFIED, my_main_window_got_iconified_hook, NULL); if(hook_got_iconified == (guint) -1) { *error = g_strdup(_("Failed to register got iconified hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, hook_m_info); hooks_unregister_hook(OFFLINE_SWITCH_HOOKLIST, hook_offline); hooks_unregister_hook(MAIN_WINDOW_CLOSE, hook_mw_close); return -1; } hook_account = hooks_register_hook(ACCOUNT_LIST_CHANGED_HOOKLIST, my_account_list_changed_hook, NULL); if (hook_account == (guint) -1) { *error = g_strdup(_("Failed to register account list changed hook in the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, hook_m_info); hooks_unregister_hook(OFFLINE_SWITCH_HOOKLIST, hook_offline); hooks_unregister_hook(MAIN_WINDOW_CLOSE, hook_mw_close); hooks_unregister_hook(MAIN_WINDOW_GOT_ICONIFIED, hook_got_iconified); return -1; } hook_theme_changed = hooks_register_hook(THEME_CHANGED_HOOKLIST, my_update_theme_hook, NULL); if(hook_theme_changed == (guint)-1) { *error = g_strdup(_("Failed to register theme change hook int the " "Notification plugin")); hooks_unregister_hook(FOLDER_ITEM_UPDATE_HOOKLIST, hook_f_item); hooks_unregister_hook(FOLDER_UPDATE_HOOKLIST, hook_f); hooks_unregister_hook(MSGINFO_UPDATE_HOOKLIST, hook_m_info); hooks_unregister_hook(OFFLINE_SWITCH_HOOKLIST, hook_offline); hooks_unregister_hook(MAIN_WINDOW_CLOSE, hook_mw_close); hooks_unregister_hook(MAIN_WINDOW_GOT_ICONIFIED, hook_got_iconified); hooks_unregister_hook(ACCOUNT_LIST_CHANGED_HOOKLIST, hook_account); return -1; } /* Configuration */ prefs_set_default(notify_param); rcpath = g_strconcat(get_rc_dir(), G_DIR_SEPARATOR_S, COMMON_RC, NULL); prefs_read_config(notify_param, "NotificationPlugin", rcpath, NULL); g_free(rcpath); /* Folder specific stuff */ notification_foldercheck_read_array(); notification_notified_hash_startup_init(); notify_gtk_init(); #ifdef NOTIFICATION_BANNER notification_update_banner(); #endif #ifdef NOTIFICATION_LCDPROC notification_lcdproc_connect(); #endif #ifdef NOTIFICATION_TRAYICON if(notify_config.trayicon_enabled && notify_config.trayicon_hide_at_startup && claws_is_starting()) { MainWindow *mainwin = mainwindow_get_mainwindow(); g_idle_add(trayicon_startup_idle,NULL); if(mainwin && gtk_widget_get_visible(GTK_WIDGET(mainwin->window))) main_window_hide(mainwin); main_set_show_at_startup(FALSE); } #endif my_account_list_changed_hook(NULL,NULL); if(notify_config.urgency_hint_new || notify_config.urgency_hint_unread) notification_update_msg_counts(NULL); #ifdef NOTIFICATION_HOTKEYS notification_hotkeys_update_bindings(); #endif debug_print("Notification plugin loaded\n"); return 0; }
void notification_lcdproc_connect(void) { gint len, count; gchar buf[NOTIFICATION_LCDPROC_BUFFER_SIZE]; if(!notify_config.lcdproc_enabled) return; if(sock) notification_lcdproc_disconnect(); sock = sock_connect(notify_config.lcdproc_hostname, notify_config.lcdproc_port); /* * Quietly return when a connection fails; next attempt * will be made when some folder info has been changed. */ if(sock == NULL || sock->state == CONN_FAILED) { debug_print("Could not connect to LCDd\n"); if(sock && sock->state == CONN_FAILED) { sock_close(sock, TRUE); sock = NULL; } return; } else debug_print("Connected to LCDd\n"); sock_set_nonblocking_mode(sock, TRUE); /* Friendly people say "hello" first */ notification_sock_puts(sock, "hello"); /* FIXME: Ouch. Is this really the way to go? */ count = 50; len = 0; while((len <= 0) && (count-- >= 0)) { g_usleep(125000); len = sock_read(sock, buf, NOTIFICATION_LCDPROC_BUFFER_SIZE); } /* * This might not be a LCDProc server. * FIXME: check LCD size, LCDd version etc */ if (len <= 0) { debug_print("Notification plugin: Can't communicate with " "LCDd server! Are you sure that " "there is a LCDd server running on %s:%d?\n", notify_config.lcdproc_hostname, notify_config.lcdproc_port); notification_lcdproc_disconnect(); return; } notification_lcdproc_send("client_set -name \"{Claws-Mail}\""); notification_lcdproc_send("screen_add msg_counts"); notification_lcdproc_send("screen_set msg_counts -name {Claws-Mail Message Count}"); notification_lcdproc_send("widget_add msg_counts title title"); notification_lcdproc_send("widget_set msg_counts title {Claws-Mail}"); notification_lcdproc_send("widget_add msg_counts line1 string"); notification_lcdproc_send("widget_add msg_counts line2 string"); notification_lcdproc_send("widget_add msg_counts line3 string"); notification_update_msg_counts(NULL); }