diff options
-rw-r--r-- | configure.in | 18 | ||||
-rw-r--r-- | src/notification.c | 198 |
2 files changed, 67 insertions, 149 deletions
diff --git a/configure.in b/configure.in index e4dd7015..eb611592 100644 --- a/configure.in +++ b/configure.in @@ -62,23 +62,9 @@ AC_PATH_PROG([PERL],[perl],) # libnotify check # ******************************* -LIBNOTIFY_REQUIRED=0.4.1 +LIBNOTIFY_REQUIRED=0.6.1 -AC_ARG_ENABLE([libnotify], - AC_HELP_STRING([--enable-libnotify],[enable libnotify support]),, - [enable_libnotify=yes]) - -if test x$enable_libnotify = xyes ; then - PKG_CHECK_MODULES([LIBNOTIFY],[libnotify >= $LIBNOTIFY_REQUIRED], - [HAVE_LIBNOTIFY="yes"],[HAVE_LIBNOTIFY="no"]) - - AC_SUBST([LIBNOTIFY_CFLAGS]) - AC_SUBST([LIBNOTIFY_LIBS]) - - if test "x$HAVE_LIBNOTIFY" = "xyes"; then - AC_DEFINE([HAVE_LIBNOTIFY],[1],[libnotify is available on this machine]) - fi -fi +PKG_CHECK_MODULES([LIBNOTIFY],[libnotify >= $LIBNOTIFY_REQUIRED]) # ******************************* # Debug diff --git a/src/notification.c b/src/notification.c index 99a2e36a..531aed22 100644 --- a/src/notification.c +++ b/src/notification.c @@ -24,75 +24,31 @@ #include <config.h> +#include <unistd.h> +#include <stdlib.h> #include <gtk/gtk.h> #include <time.h> #include <string.h> - -#ifdef HAVE_LIBNOTIFY #include <libnotify/notify.h> -#endif #include "zenity.h" #include "util.h" -static GtkStatusIcon *status_icon; -static gchar *icon_file; -static const gchar *icon_stock; -static gint icon_size; +static char *icon_file; static void -zenity_notification_icon_update (void) +on_notification_default_action (NotifyNotification *n, + const char *action, + void *user_data) { - GdkPixbuf *pixbuf; - GError *error = NULL; - - pixbuf = gdk_pixbuf_new_from_file_at_scale (icon_file, icon_size, icon_size, TRUE, &error); - - if (error) { - g_warning ("Could not load notification icon '%s': %s", - icon_file, error->message); - g_clear_error (&error); - } - if (!pixbuf) { - pixbuf = gdk_pixbuf_new_from_file_at_scale (ZENITY_IMAGE_FULLPATH ("zenity-notification.png"), - icon_size, icon_size, TRUE, NULL); - } - - gtk_status_icon_set_from_pixbuf (status_icon, pixbuf); - - if (pixbuf) { - g_object_unref (pixbuf); - } -} - -static gboolean -zenity_notification_icon_size_changed_cb (GtkStatusIcon *icon, - gint size, - gpointer user_data) -{ - icon_size = size; - - /* If we're displaying not a stock icon but a custom pixbuf, - * we need to update the icon for the new size. - */ - if (!icon_stock) { - zenity_notification_icon_update (); - - return TRUE; - } + ZenityData *zen_data; - return FALSE; -} + zen_data = (ZenityData *)user_data; + notify_notification_close (n, NULL); -static gboolean -zenity_notification_icon_activate_cb (GtkWidget *widget, - ZenityData *data) -{ - data->exit_code = zenity_util_return_exit_code (ZENITY_OK); + zen_data->exit_code = zenity_util_return_exit_code (ZENITY_OK); gtk_main_quit (); - - return TRUE; } static gboolean @@ -145,26 +101,14 @@ zenity_notification_handle_stdin (GIOChannel *channel, while (*value && g_ascii_isspace (*value)) value++; if (!g_ascii_strcasecmp (command, "icon")) { - icon_stock = zenity_util_stock_from_filename (value); - g_free (icon_file); icon_file = g_strdup (value); - - if (icon_stock) { - gtk_status_icon_set_from_stock (status_icon, icon_stock); - } else if (gtk_status_icon_get_visible (status_icon) && - gtk_status_icon_is_embedded (status_icon)) { - zenity_notification_icon_update (); - } } else if (!g_ascii_strcasecmp (command, "message")) { -#ifdef HAVE_LIBNOTIFY /* display a notification bubble */ if (!g_utf8_validate (value, -1, NULL)) { g_warning ("Invalid UTF-8 in input!"); - } else if (notify_is_initted ()) { + } else { NotifyNotification *notif; - const gchar *icon = NULL; - gchar *freeme = NULL; gchar **message; error = NULL; @@ -178,46 +122,37 @@ zenity_notification_handle_stdin (GIOChannel *channel, continue; } - if (icon_stock) { - icon = icon_stock; - } else if (icon_file) { - icon = freeme = g_filename_to_uri (icon_file, NULL, NULL); - } - - notif = notify_notification_new_with_status_icon ( - message[0] /* title */, - message[1] /* summary */, - icon, status_icon); + notif = notify_notification_new (message[0] /* title */, + message[1] /* summary */, + icon_file); g_strfreev (message); - g_free (freeme); - notify_notification_show (notif, &error); - - if (error) { - g_warning ("Error showing notification: %s", error->message); - g_error_free (error); - } + notify_notification_show (notif, &error); + if (error) { + g_warning ("Error showing notification: %s", error->message); + g_error_free (error); + } g_object_unref (notif); - } else { -#else - { /* this brace is for balance */ -#endif - g_warning ("Notification framework not available"); - } + } } else if (!g_ascii_strcasecmp (command, "tooltip")) { - if (g_utf8_validate (value, -1, NULL)) { - gtk_status_icon_set_tooltip_text (status_icon, value); - } else { + if (!g_utf8_validate (value, -1, NULL)) { g_warning ("Invalid UTF-8 in input!"); + } else { + NotifyNotification *notif; + + notif = notify_notification_new (value, + NULL, + icon_file); + notify_notification_show (notif, &error); + if (error) { + g_warning ("Error showing notification: %s", error->message); + g_error_free (error); + } } } else if (!g_ascii_strcasecmp (command, "visible")) { - if (!g_ascii_strcasecmp (value, "false")) { - gtk_status_icon_set_visible (status_icon, FALSE); - } else { - gtk_status_icon_set_visible (status_icon, TRUE); - } + } else { g_warning ("Unknown command '%s'", command); } @@ -249,55 +184,52 @@ zenity_notification_listen_on_stdin (ZenityData *data) zenity_notification_handle_stdin, data); } -void +void zenity_notification (ZenityData *data, ZenityNotificationData *notification_data) { - status_icon = gtk_status_icon_new (); - g_signal_connect (status_icon, "size-changed", - G_CALLBACK (zenity_notification_icon_size_changed_cb), data); + GError *error; + NotifyNotification *notification; - if (notification_data->notification_text) { - gtk_status_icon_set_tooltip_text (status_icon, notification_data->notification_text); - } else { - gtk_status_icon_set_tooltip_text (status_icon, _("Zenity notification")); - } - - icon_file = g_strdup (data->window_icon); - icon_stock = zenity_util_stock_from_filename (data->window_icon); - - /* Only set the stock icon here; if we're going to display a - * custom pixbuf we wait for the size-changed signal to load - * it at the right size. - */ - if (icon_stock) { - gtk_status_icon_set_from_stock (status_icon, icon_stock); - } - -#ifdef HAVE_LIBNOTIFY /* create the notification widget */ if (!notify_is_initted ()) { notify_init (_("Zenity notification")); } -#endif - + if (notification_data->listen) { zenity_notification_listen_on_stdin (data); } else { - /* if we aren't listening for changes, then close on activate (left-click) */ - g_signal_connect (status_icon, "activate", - G_CALLBACK (zenity_notification_icon_activate_cb), data); - } + if (notification_data->notification_text == NULL) { + exit (1); + } + + notification = notify_notification_new (notification_data->notification_text, NULL, data->window_icon); + if (notification == NULL) { + exit (1); + } + + /* if we aren't listening for changes, then close on default action */ + notify_notification_add_action (notification, + "default", + "Do Default Action", + (NotifyActionCallback) on_notification_default_action, + data, + NULL); + + /* Show icon and wait */ + error = NULL; + if (!notify_notification_show (notification, &error)) { + if (error != NULL) { + g_warning ("Error showing notification: %s", error->message); + g_error_free (error); + } + exit (1); + } - /* Show icon and wait */ - gtk_status_icon_set_visible (status_icon, TRUE); + } - if(data->timeout_delay > 0) { + if (data->timeout_delay > 0) { g_timeout_add_seconds (data->timeout_delay, (GSourceFunc) zenity_util_timeout_handle, NULL); } gtk_main (); - - /* Cleanup */ - g_object_unref (status_icon); - g_free (icon_file); } |