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:
Holger Berndt 2016-09-29 22:21:02 +02:00
parent 8dc0092094
commit 437668c7f0
6 changed files with 86 additions and 178 deletions

View file

@ -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"

View file

@ -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:

View file

@ -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 */

View file

@ -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 */

View file

@ -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

View file

@ -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", &notify_config.indicator_enabled, P_BOOL,
NULL, NULL, NULL},
{ "indicator_hide_minimized", "FALSE", &notify_config.indicator_hide_minimized, P_BOOL,
NULL, NULL, NULL},
{ "indicator_hide_minimized", "FALSE", &notify_config.indicator_hide_minimized, P_BOOL,
NULL, NULL, NULL},
#endif /* NOTIFICATION_INDICATOR */
#ifdef NOTIFICATION_HOTKEYS
{ "hotkeys_enabled", "FALSE", &notify_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,