From d530d52df61731f1e36071a89e4d2a8719a3cfbf Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Tue, 12 May 2020 10:12:26 -0400 Subject: [PATCH] notify-send: Give failing exit code if showing notification fails Right now notify-send will quietly return a successful exit status even if showing the notification fails. This commit changes the behavior to instead fail on failure. https://gitlab.gnome.org/GNOME/libnotify/-/merge_requests/13 --- tools/notify-send.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tools/notify-send.c b/tools/notify-send.c index c0b9eeb..f8d59de 100644 --- a/tools/notify-send.c +++ b/tools/notify-send.c @@ -104,61 +104,61 @@ notify_notification_set_hint_variant (NotifyNotification *notification, N_("Invalid hint type \"%s\". Valid types " "are int, double, string and byte."), type); return FALSE; } if (conv_error) { *error = g_error_new (G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE, N_("Value \"%s\" of hint \"%s\" could not be " "parsed as type \"%s\"."), value, key, type); return FALSE; } return TRUE; } int main (int argc, char *argv[]) { static const char *summary = NULL; char *body; static const char *type = NULL; static char *app_name = NULL; static char *icon_str = NULL; static char *icons = NULL; static char **n_text = NULL; static char **hints = NULL; static gboolean do_version = FALSE; - static gboolean hint_error = FALSE; + static gboolean hint_error = FALSE, show_error = FALSE; static glong expire_timeout = NOTIFY_EXPIRES_DEFAULT; GOptionContext *opt_ctx; NotifyNotification *notify; GError *error = NULL; gboolean retval; static const GOptionEntry entries[] = { {"urgency", 'u', 0, G_OPTION_ARG_CALLBACK, g_option_arg_urgency_cb, N_("Specifies the urgency level (low, normal, critical)."), N_("LEVEL")}, {"expire-time", 't', 0, G_OPTION_ARG_INT, &expire_timeout, N_ ("Specifies the timeout in milliseconds at which to expire the " "notification."), N_("TIME")}, {"app-name", 'a', 0, G_OPTION_ARG_STRING, &app_name, N_("Specifies the app name for the icon"), N_("APP_NAME")}, {"icon", 'i', 0, G_OPTION_ARG_FILENAME, &icons, N_("Specifies an icon filename or stock icon to display."), N_("ICON[,ICON...]")}, {"category", 'c', 0, G_OPTION_ARG_FILENAME, &type, N_("Specifies the notification category."), N_("TYPE[,TYPE...]")}, {"hint", 'h', 0, G_OPTION_ARG_FILENAME_ARRAY, &hints, N_ ("Specifies basic extra data to pass. Valid types are int, double, string and byte."), N_("TYPE:NAME:VALUE")}, {"version", 'v', 0, G_OPTION_ARG_NONE, &do_version, N_("Version of the package."), NULL}, @@ -242,39 +242,49 @@ main (int argc, char *argv[]) while ((hint = hints[i++])) { tokens = g_strsplit (hint, ":", -1); l = g_strv_length (tokens); if (l != 3) { fprintf (stderr, "%s\n", N_("Invalid hint syntax specified. " "Use TYPE:NAME:VALUE.")); hint_error = TRUE; } else { retval = notify_notification_set_hint_variant (notify, tokens[0], tokens[1], tokens[2], &error); if (!retval) { fprintf (stderr, "%s\n", error->message); g_error_free (error); hint_error = TRUE; } } g_strfreev (tokens); if (hint_error) break; } } - if (!hint_error) - notify_notification_show (notify, NULL); + if (!hint_error) { + retval = notify_notification_show (notify, &error); + + if (!retval) { + fprintf (stderr, "%s\n", error->message); + g_error_free (error); + show_error = TRUE; + } + } g_object_unref (G_OBJECT (notify)); notify_uninit (); - exit (hint_error); + if (hint_error || show_error) + exit (1); + + return 0; } -- 2.32.0