From 437668c7f0207b6ea6f9c1467e15411a0903c8ca Mon Sep 17 00:00:00 2001 From: Holger Berndt Date: Thu, 29 Sep 2016 22:21:02 +0200 Subject: [PATCH] Notification plugin: Port from libindicate to unity/messaging menu This is a slightly modified version of the patch from Sebastien Noel, fixes bug #2665 --- configure.ac | 28 ++-- src/plugins/notification/Makefile.am | 4 +- .../notification/notification_indicator.c | 138 ++++++++---------- .../notification/notification_indicator.h | 1 + .../notification/notification_plugin.c | 3 + src/plugins/notification/notification_prefs.c | 90 +----------- 6 files changed, 86 insertions(+), 178 deletions(-) diff --git a/configure.ac b/configure.ac index 9333edcec..9ba8bbe21 100644 --- a/configure.ac +++ b/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" diff --git a/src/plugins/notification/Makefile.am b/src/plugins/notification/Makefile.am index 39fa2c04c..1ce0e2cc5 100644 --- a/src/plugins/notification/Makefile.am +++ b/src/plugins/notification/Makefile.am @@ -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: diff --git a/src/plugins/notification/notification_indicator.c b/src/plugins/notification/notification_indicator.c index 381eabc34..083ff5402 100644 --- a/src/plugins/notification/notification_indicator.c +++ b/src/plugins/notification/notification_indicator.c @@ -29,24 +29,41 @@ #include "folder.h" #include "common/utils.h" -#include -#include -#include +#include +#include -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); + + total_message_count += count.unread_msgs; - 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)); + 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 */ diff --git a/src/plugins/notification/notification_indicator.h b/src/plugins/notification/notification_indicator.h index ab6db461a..bc1be5e12 100644 --- a/src/plugins/notification/notification_indicator.h +++ b/src/plugins/notification/notification_indicator.h @@ -28,6 +28,7 @@ #include void notification_update_indicator(void); +void notification_indicator_setup(void); void notification_indicator_destroy(void); #endif /* NOTIFICATION_INDICATOR */ diff --git a/src/plugins/notification/notification_plugin.c b/src/plugins/notification/notification_plugin.c index 4b5be7335..0da3c1f82 100644 --- a/src/plugins/notification/notification_plugin.c +++ b/src/plugins/notification/notification_plugin.c @@ -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 diff --git a/src/plugins/notification/notification_prefs.c b/src/plugins/notification/notification_prefs.c index 9e2e22990..8d5561ef7 100644 --- a/src/plugins/notification/notification_prefs.c +++ b/src/plugins/notification/notification_prefs.c @@ -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(); - } - else { - if(indicator_register_file_exists()) - indicator_register_file_remove(); + if(notify_config.indicator_enabled) { + notification_indicator_setup(); + notification_update_indicator(); } - - notification_indicator_destroy(); - notification_update_indicator(); } static void notify_indicator_enable_set_sensitivity(GtkToggleButton *button, -- 2.25.1