Notification plugin: Port from libindicate to unity/messaging menu
This is a slightly modified version of the patch from Sebastien Noel, fixes bug #2665
This commit is contained in:
parent
8dc0092094
commit
437668c7f0
28
configure.ac
28
configure.ac
|
@ -1083,7 +1083,8 @@ dnl Archive: libarchive
|
|||
dnl Fancy: Webkit, curl, optionally libsoup-gnome
|
||||
dnl Gdata: libgdata
|
||||
dnl Libravatar: libcurl
|
||||
dnl Notification: optionally libnotify libindicate libcanberra_gtk hotkey
|
||||
dnl Notification: optionally libnotify unity/messaging-menu
|
||||
dnl libcanberra_gtk hotkey
|
||||
dnl Pdf-Viewer: libpoppler
|
||||
dnl Perl: sed perl
|
||||
dnl PGP/Core: libgpgme
|
||||
|
@ -1288,20 +1289,13 @@ fi
|
|||
AC_SUBST(libcanberra_gtk_CFLAGS)
|
||||
AC_SUBST(libcanberra_gtk_LIBS)
|
||||
|
||||
dnl libindicate ****************************************************************
|
||||
dnl We support either 0.3+ or 0.5+ or 0.6+ or 0.7+
|
||||
LIBINDICATE_MODULE=indicate
|
||||
LIBINDICATE_REQUIRED=0.3.0
|
||||
|
||||
PKG_CHECK_EXISTS(indicate-0.5 >= 0.5.0, LIBINDICATE_MODULE=indicate-0.5)
|
||||
PKG_CHECK_EXISTS(indicate-0.6 >= 0.6.0, LIBINDICATE_MODULE=indicate-0.6)
|
||||
PKG_CHECK_EXISTS(indicate-0.7 >= 0.7.0, LIBINDICATE_MODULE=indicate-0.7)
|
||||
PKG_CHECK_MODULES(libindicate, $LIBINDICATE_MODULE >= $LIBINDICATE_REQUIRED, HAVE_LIBINDICATE=yes, HAVE_LIBINDICATE=no)
|
||||
if test x"$HAVE_LIBINDICATE" = xyes; then
|
||||
AC_DEFINE(NOTIFICATION_INDICATOR, 1, [Activate support for indicators])
|
||||
dnl unity/messaging-menu *******************************************************
|
||||
PKG_CHECK_MODULES(unity, unity messaging-menu, HAVE_UNITY=yes, HAVE_UNITY=no)
|
||||
if test x"$HAVE_UNITY" = xyes; then
|
||||
AC_DEFINE(NOTIFICATION_INDICATOR, 1, [Activate support for unity and messaging-menu])
|
||||
fi
|
||||
AC_SUBST(libindicate_CFLAGS)
|
||||
AC_SUBST(libindicate_LIBS)
|
||||
AC_SUBST(unity_CFLAGS)
|
||||
AC_SUBST(unity_LIBS)
|
||||
|
||||
dnl hotkeys ********************************************************************
|
||||
PKG_CHECK_MODULES(CM_NP_HOTKEY, [gio-2.0 >= 2.15.6 gio-unix-2.0 >= 2.15.6], HAVE_HOTKEYS=yes, HAVE_HOTKEYS=no)
|
||||
|
@ -1547,10 +1541,10 @@ if test x"$enable_notification_plugin" != xno; then
|
|||
notification_missing_dependencies="$notification_missing_dependencies hotkeys"
|
||||
fi
|
||||
notification_features="$notification_features lcdproc"
|
||||
if test x"$HAVE_LIBINDICATE" = xyes; then
|
||||
notification_features="$notification_features libindicate"
|
||||
if test x"$HAVE_UNITY" = xyes; then
|
||||
notification_features="$notification_features unity/messaging-menu"
|
||||
else
|
||||
notification_missing_dependencies="$notification_missing_dependencies libindicate"
|
||||
notification_missing_dependencies="$notification_missing_dependencies unity/messaging-menu"
|
||||
fi
|
||||
if test x"$HAVE_LIBNOTIFY" = xyes; then
|
||||
notification_features="$notification_features libnotify"
|
||||
|
|
|
@ -93,7 +93,7 @@ notification_la_DEPENDENCIES = $(plugin_deps) \
|
|||
notification_la_LIBADD = $(plugin_ldadd) $(cygwin_export_lib) \
|
||||
$(GTK_LIBS) \
|
||||
$(libnotify_LIBS) \
|
||||
$(libindicate_LIBS) \
|
||||
$(unity_LIBS) \
|
||||
$(libcanberra_gtk_LIBS) \
|
||||
$(hotkey_lib_path)
|
||||
|
||||
|
@ -103,7 +103,7 @@ notification_la_CPPFLAGS = \
|
|||
$(GLIB_CFLAGS) \
|
||||
$(GTK_CFLAGS) \
|
||||
$(libnotify_CFLAGS) \
|
||||
$(libindicate_CFLAGS) \
|
||||
$(unity_CFLAGS) \
|
||||
$(libcanberra_gtk_CFLAGS)
|
||||
|
||||
clean-local:
|
||||
|
|
|
@ -29,24 +29,41 @@
|
|||
#include "folder.h"
|
||||
#include "common/utils.h"
|
||||
|
||||
#include <libindicate/server.h>
|
||||
#include <libindicate/indicator.h>
|
||||
#include <libindicate/indicator-messages.h>
|
||||
#include <messaging-menu.h>
|
||||
#include <unity.h>
|
||||
|
||||
static IndicateServer *server = NULL;
|
||||
static GHashTable *indicators = NULL;
|
||||
#define CLAWS_DESKTOP_FILE "claws-mail.desktop"
|
||||
|
||||
static MessagingMenuApp *mmapp = NULL;
|
||||
static gboolean mmapp_registered = FALSE;
|
||||
static UnityLauncherEntry *launcher = NULL;
|
||||
static gulong mainwin_state_changed_signal_id = 0;
|
||||
|
||||
static void show_claws_mail(MessagingMenuApp *mmapp, const gchar *id, gpointer data);
|
||||
|
||||
void notification_indicator_setup(void)
|
||||
{
|
||||
if(!mmapp) {
|
||||
mmapp = messaging_menu_app_new(CLAWS_DESKTOP_FILE);
|
||||
}
|
||||
if(notify_config.indicator_enabled && !mmapp_registered) {
|
||||
messaging_menu_app_register(MESSAGING_MENU_APP(mmapp));
|
||||
g_signal_connect(mmapp, "activate-source", G_CALLBACK(show_claws_mail), NULL);
|
||||
mmapp_registered = TRUE;
|
||||
}
|
||||
if(!launcher) {
|
||||
launcher = unity_launcher_entry_get_for_desktop_id(CLAWS_DESKTOP_FILE);
|
||||
}
|
||||
}
|
||||
|
||||
void notification_indicator_destroy(void)
|
||||
{
|
||||
if(indicators) {
|
||||
g_hash_table_destroy(indicators);
|
||||
indicators = NULL;
|
||||
if(!launcher) {
|
||||
unity_launcher_entry_set_count_visible(launcher, FALSE);
|
||||
}
|
||||
if(server) {
|
||||
indicate_server_hide(server);
|
||||
g_object_unref(server);
|
||||
server = NULL;
|
||||
if(mmapp_registered) {
|
||||
messaging_menu_app_unregister(mmapp);
|
||||
mmapp_registered = FALSE;
|
||||
}
|
||||
if(mainwin_state_changed_signal_id != 0) {
|
||||
MainWindow *mainwin;
|
||||
|
@ -54,10 +71,9 @@ void notification_indicator_destroy(void)
|
|||
g_signal_handler_disconnect(mainwin->window, mainwin_state_changed_signal_id);
|
||||
mainwin_state_changed_signal_id = 0;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void show_claws_mail(IndicateIndicator *indicator, guint dummy, gpointer data)
|
||||
static void show_claws_mail(MessagingMenuApp *mmapp, const gchar *id, gpointer data)
|
||||
{
|
||||
MainWindow *mainwin;
|
||||
|
||||
|
@ -75,43 +91,6 @@ static void show_claws_mail(IndicateIndicator *indicator, guint dummy, gpointer
|
|||
}
|
||||
}
|
||||
|
||||
static void set_indicator_unread_count(IndicateIndicator *indicator, gint new, gint unread)
|
||||
{
|
||||
gchar *count_str;
|
||||
|
||||
count_str = g_strdup_printf("%d / %d", new, unread);
|
||||
indicate_indicator_set_property(indicator, INDICATE_INDICATOR_MESSAGES_PROP_COUNT, count_str);
|
||||
g_free(count_str);
|
||||
}
|
||||
|
||||
static void create_indicators(void)
|
||||
{
|
||||
IndicateIndicator *indicator;
|
||||
GList *cur_mb;
|
||||
|
||||
indicators = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_object_unref);
|
||||
|
||||
for(cur_mb = folder_get_list(); cur_mb; cur_mb = cur_mb->next) {
|
||||
gchar *name;
|
||||
Folder *folder = cur_mb->data;
|
||||
|
||||
if(!folder->name) {
|
||||
debug_print("Notification plugin: Warning: Ignoring unnamed mailbox in indicator applet\n");
|
||||
continue;
|
||||
}
|
||||
name = g_strdup(folder->name);
|
||||
|
||||
indicator = indicate_indicator_new();
|
||||
indicate_indicator_set_property(indicator, INDICATE_INDICATOR_MESSAGES_PROP_NAME, name);
|
||||
set_indicator_unread_count(indicator, 0, 0);
|
||||
g_object_set_data(G_OBJECT(indicator), "new_msgs", GINT_TO_POINTER(0));
|
||||
g_object_set_data(G_OBJECT(indicator), "unread_msgs", GINT_TO_POINTER(0));
|
||||
g_signal_connect(indicator, "user-display", G_CALLBACK (show_claws_mail), folder);
|
||||
indicate_indicator_show(indicator);
|
||||
g_hash_table_insert(indicators, name, indicator);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean mainwin_state_event(GtkWidget *widget, GdkEventWindowState *event, gpointer user_data)
|
||||
{
|
||||
if(notify_config.indicator_hide_minimized) {
|
||||
|
@ -132,8 +111,8 @@ static gboolean mainwin_state_event(GtkWidget *widget, GdkEventWindowState *even
|
|||
|
||||
void notification_update_indicator(void)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key, value;
|
||||
GList *cur_mb;
|
||||
gint total_message_count;
|
||||
|
||||
if(!mainwin_state_changed_signal_id) {
|
||||
MainWindow *mainwin;
|
||||
|
@ -142,36 +121,45 @@ void notification_update_indicator(void)
|
|||
mainwin_state_changed_signal_id = g_signal_connect(G_OBJECT(mainwin->window), "window-state-event", G_CALLBACK(mainwin_state_event), NULL);
|
||||
}
|
||||
|
||||
|
||||
if(!notify_config.indicator_enabled)
|
||||
return;
|
||||
|
||||
if(!server) {
|
||||
server = indicate_server_ref_default();
|
||||
indicate_server_set_type (server, "message.mail");
|
||||
indicate_server_set_desktop_file(server, get_desktop_file());
|
||||
g_signal_connect(server, "server-display", G_CALLBACK(show_claws_mail), NULL);
|
||||
indicate_server_show(server);
|
||||
}
|
||||
|
||||
if(!indicators)
|
||||
create_indicators();
|
||||
|
||||
total_message_count = 0;
|
||||
/* check accounts for new/unread counts */
|
||||
g_hash_table_iter_init(&iter, indicators);
|
||||
while(g_hash_table_iter_next(&iter, &key, &value)) {
|
||||
for(cur_mb = folder_get_list(); cur_mb; cur_mb = cur_mb->next) {
|
||||
Folder *folder = cur_mb->data;
|
||||
NotificationMsgCount count;
|
||||
gchar *foldername = key;
|
||||
IndicateIndicator *indicator = value;
|
||||
|
||||
notification_core_get_msg_count_of_foldername(foldername, &count);
|
||||
if(!folder->name) {
|
||||
debug_print("Notification plugin: Warning: Ignoring unnamed mailbox in indicator applet\n");
|
||||
continue;
|
||||
}
|
||||
gchar *id = folder->name;
|
||||
notification_core_get_msg_count_of_foldername(folder->name, &count);
|
||||
|
||||
set_indicator_unread_count(indicator, count.new_msgs, count.unread_msgs);
|
||||
indicate_indicator_set_property(indicator, INDICATE_INDICATOR_MESSAGES_PROP_ATTENTION,
|
||||
(count.new_msgs > 0) ? "true" : "false");
|
||||
g_object_set_data(G_OBJECT(indicator), "new_msgs", GINT_TO_POINTER(count.new_msgs));
|
||||
g_object_set_data(G_OBJECT(indicator), "unread_msgs", GINT_TO_POINTER(count.unread_msgs));
|
||||
total_message_count += count.unread_msgs;
|
||||
|
||||
if(count.new_msgs > 0) {
|
||||
gchar *strcount = g_strdup_printf("%d / %d", count.new_msgs, count.unread_msgs);
|
||||
|
||||
if(messaging_menu_app_has_source(MESSAGING_MENU_APP(mmapp), id))
|
||||
messaging_menu_app_set_source_string(MESSAGING_MENU_APP(mmapp), id, strcount);
|
||||
else
|
||||
messaging_menu_app_append_source_with_string(MESSAGING_MENU_APP(mmapp), id, NULL, id, strcount);
|
||||
|
||||
g_free(strcount);
|
||||
messaging_menu_app_draw_attention(MESSAGING_MENU_APP(mmapp), id);
|
||||
}
|
||||
else {
|
||||
if(messaging_menu_app_has_source(MESSAGING_MENU_APP(mmapp), id)) {
|
||||
messaging_menu_app_remove_attention(MESSAGING_MENU_APP(mmapp), id);
|
||||
messaging_menu_app_remove_source(MESSAGING_MENU_APP(mmapp), id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unity_launcher_entry_set_count(launcher, total_message_count);
|
||||
unity_launcher_entry_set_count_visible(launcher, total_message_count > 0);
|
||||
}
|
||||
|
||||
#endif /* NOTIFICATION_INDICATOR */
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
#include <glib.h>
|
||||
|
||||
void notification_update_indicator(void);
|
||||
void notification_indicator_setup(void);
|
||||
void notification_indicator_destroy(void);
|
||||
|
||||
#endif /* NOTIFICATION_INDICATOR */
|
||||
|
|
|
@ -328,6 +328,9 @@ gint plugin_init(gchar **error)
|
|||
|
||||
notify_gtk_init();
|
||||
|
||||
#ifdef NOTIFICATION_INDICATOR
|
||||
notification_indicator_setup();
|
||||
#endif
|
||||
#ifdef NOTIFICATION_BANNER
|
||||
notification_update_banner();
|
||||
#endif
|
||||
|
|
|
@ -165,7 +165,6 @@ typedef struct {
|
|||
PrefsPage page;
|
||||
GtkWidget *indicator_enabled;
|
||||
GtkWidget *indicator_cont_enable;
|
||||
GtkWidget *indicator_register;
|
||||
GtkWidget *indicator_hide_minimized;
|
||||
}NotifyIndicatorPage;
|
||||
NotifyIndicatorPage indicator_page;
|
||||
|
@ -306,8 +305,8 @@ PrefParam
|
|||
#ifdef NOTIFICATION_INDICATOR
|
||||
{ "indicator_enabled", "FALSE", ¬ify_config.indicator_enabled, P_BOOL,
|
||||
NULL, NULL, NULL},
|
||||
{ "indicator_hide_minimized", "FALSE", ¬ify_config.indicator_hide_minimized, P_BOOL,
|
||||
NULL, NULL, NULL},
|
||||
{ "indicator_hide_minimized", "FALSE", ¬ify_config.indicator_hide_minimized, P_BOOL,
|
||||
NULL, NULL, NULL},
|
||||
#endif /* NOTIFICATION_INDICATOR */
|
||||
#ifdef NOTIFICATION_HOTKEYS
|
||||
{ "hotkeys_enabled", "FALSE", ¬ify_config.hotkeys_enabled, P_BOOL,
|
||||
|
@ -1787,69 +1786,6 @@ static void notify_trayicon_popup_enable_set_sensitivity(GtkToggleButton *bu,
|
|||
|
||||
#ifdef NOTIFICATION_INDICATOR
|
||||
|
||||
#define NOTIFICATION_INDICATOR_REGISTER_PATH ".config/indicators/messages/applications"
|
||||
|
||||
static gboolean indicator_register_file_exists(void)
|
||||
{
|
||||
gboolean retval;
|
||||
gchar *filepath;
|
||||
filepath = g_strconcat(get_home_dir(), "/" NOTIFICATION_INDICATOR_REGISTER_PATH "/claws-mail", NULL);
|
||||
retval = is_file_exist(filepath);
|
||||
g_free(filepath);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static gboolean indicator_register_file_create(void)
|
||||
{
|
||||
FILE *fp;
|
||||
gchar *path, *filepath;
|
||||
gboolean success;
|
||||
|
||||
/* make sure directory path exists */
|
||||
path = g_strconcat(get_home_dir(), "/" NOTIFICATION_INDICATOR_REGISTER_PATH, NULL);
|
||||
if(!is_dir_exist(path)) {
|
||||
if(make_dir_hier(path) != -1)
|
||||
debug_print("Notification plugin: Created directory '%s'\n", path);
|
||||
else {
|
||||
debug_print("Notification plugin: Error creating directory '%s'\n", path);
|
||||
g_free(path);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* create register file */
|
||||
filepath = g_strconcat(path, "/claws-mail", NULL);
|
||||
g_free(path);
|
||||
fp = fopen(filepath, "w");
|
||||
success = (fp != NULL);
|
||||
if(fp) {
|
||||
fprintf(fp, "%s\n", get_desktop_file());
|
||||
fclose(fp);
|
||||
debug_print("Notification plugin: Created desktop indicator file '%s'\n", filepath);
|
||||
}
|
||||
else
|
||||
debug_print("Notification plugin: Could not create desktop indicator file '%s'\n", filepath);
|
||||
g_free(filepath);
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
static gboolean indicator_register_file_remove(void)
|
||||
{
|
||||
gchar *filepath;
|
||||
int retval;
|
||||
|
||||
filepath = g_strconcat(get_home_dir(), "/" NOTIFICATION_INDICATOR_REGISTER_PATH "/claws-mail", NULL);
|
||||
retval = claws_unlink(filepath);
|
||||
if(retval != -1)
|
||||
debug_print("Notification plugin: Deleted file '%s'\n", filepath);
|
||||
else
|
||||
debug_print("Notification plugin: Error deleting file '%s'\n", filepath);
|
||||
g_free(filepath);
|
||||
|
||||
return (retval != -1);
|
||||
}
|
||||
|
||||
static void notify_create_indicator_page(PrefsPage *page, GtkWindow *window,
|
||||
gpointer data)
|
||||
{
|
||||
|
@ -1881,12 +1817,6 @@ static void notify_create_indicator_page(PrefsPage *page, GtkWindow *window,
|
|||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), notify_config.indicator_hide_minimized);
|
||||
indicator_page.indicator_hide_minimized = checkbox;
|
||||
|
||||
/* register */
|
||||
ind_reg = gtk_check_button_new_with_label(_("Register Claws Mail"));
|
||||
gtk_box_pack_start(GTK_BOX(indicator_page.indicator_cont_enable), ind_reg, FALSE, FALSE, 0);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(ind_reg), indicator_register_file_exists());
|
||||
indicator_page.indicator_register = ind_reg;
|
||||
|
||||
notify_indicator_enable_set_sensitivity(GTK_TOGGLE_BUTTON(indicator_page.indicator_enabled), NULL);
|
||||
gtk_widget_show_all(pvbox);
|
||||
indicator_page.page.widget = pvbox;
|
||||
|
@ -1898,24 +1828,16 @@ static void notify_destroy_indicator_page(PrefsPage *page)
|
|||
|
||||
static void notify_save_indicator(PrefsPage *page)
|
||||
{
|
||||
gboolean ind_reg;
|
||||
notification_indicator_destroy();
|
||||
|
||||
notify_config.indicator_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(indicator_page.indicator_enabled));
|
||||
|
||||
notify_config.indicator_hide_minimized = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(indicator_page.indicator_hide_minimized));
|
||||
|
||||
ind_reg = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(indicator_page.indicator_register));
|
||||
if(ind_reg) {
|
||||
if(!indicator_register_file_exists())
|
||||
indicator_register_file_create();
|
||||
if(notify_config.indicator_enabled) {
|
||||
notification_indicator_setup();
|
||||
notification_update_indicator();
|
||||
}
|
||||
else {
|
||||
if(indicator_register_file_exists())
|
||||
indicator_register_file_remove();
|
||||
}
|
||||
|
||||
notification_indicator_destroy();
|
||||
notification_update_indicator();
|
||||
}
|
||||
|
||||
static void notify_indicator_enable_set_sensitivity(GtkToggleButton *button,
|
||||
|
|
Loading…
Reference in a new issue