From ffe2182883c2848b93578c9f3907bf839fe11af7 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Wed, 18 Sep 2019 22:35:20 -0700 Subject: [PATCH] feat: set urgency on linux notifications (#20152) --- BUILD.gn | 1 + docs/api/notification.md | 7 +++++++ shell/browser/api/atom_api_notification.cc | 12 ++++++++++++ shell/browser/api/atom_api_notification.h | 3 +++ .../notifications/linux/libnotify_notification.cc | 10 ++++++++++ shell/browser/notifications/notification.h | 1 + spec-main/api-notification-dbus-spec.ts | 3 ++- 7 files changed, 36 insertions(+), 1 deletion(-) diff --git a/BUILD.gn b/BUILD.gn index c791fafd3..94aad7e53 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -280,6 +280,7 @@ if (is_linux) { "notify_notification_add_action", "notify_notification_set_image_from_pixbuf", "notify_notification_set_timeout", + "notify_notification_set_urgency", "notify_notification_set_hint_string", "notify_notification_show", "notify_notification_close", diff --git a/docs/api/notification.md b/docs/api/notification.md index 61a0c3aab..27f5bc34b 100644 --- a/docs/api/notification.md +++ b/docs/api/notification.md @@ -37,6 +37,7 @@ Returns `Boolean` - Whether or not desktop notifications are supported on the cu * `hasReply` Boolean (optional) _macOS_ - Whether or not to add an inline reply option to the notification. * `replyPlaceholder` String (optional) _macOS_ - The placeholder to write in the inline reply input field. * `sound` String (optional) _macOS_ - The name of the sound file to play when the notification is shown. + * `urgency` String (optional) _Linux_ - The urgency level of the notification. Can be 'normal', 'critical', or 'low'. * `actions` [NotificationAction[]](structures/notification-action.md) (optional) _macOS_ - Actions to add to the notification. Please read the available actions and limitations in the `NotificationAction` documentation. * `closeButtonText` String (optional) _macOS_ - A custom title for the close button of an alert. An empty string will cause the default localized text to be used. @@ -144,6 +145,12 @@ A `Boolean` property representing whether the notification is silent. A `Boolean` property representing whether the notification has a reply action. +#### `notification.urgency` _Linux_ + +A `String` property representing the urgency level of the notification. Can be 'normal', 'critical', or 'low'. + +Default is 'low' - see [NotifyUrgency](https://developer.gnome.org/notification-spec/#urgency-levels) for more information. + #### `notification.actions` A [`NotificationAction[]`](structures/notification-action.md) property representing the actions of the notification. diff --git a/shell/browser/api/atom_api_notification.cc b/shell/browser/api/atom_api_notification.cc index b9eefc9be..e1e48f104 100644 --- a/shell/browser/api/atom_api_notification.cc +++ b/shell/browser/api/atom_api_notification.cc @@ -68,6 +68,7 @@ Notification::Notification(v8::Isolate* isolate, } opts.Get("silent", &silent_); opts.Get("replyPlaceholder", &reply_placeholder_); + opts.Get("urgency", &urgency_); opts.Get("hasReply", &has_reply_); opts.Get("actions", &actions_); opts.Get("sound", &sound_); @@ -118,6 +119,10 @@ base::string16 Notification::GetSound() const { return sound_; } +base::string16 Notification::GetUrgency() const { + return urgency_; +} + std::vector Notification::GetActions() const { return actions_; } @@ -155,6 +160,10 @@ void Notification::SetSound(const base::string16& new_sound) { sound_ = new_sound; } +void Notification::SetUrgency(const base::string16& new_urgency) { + urgency_ = new_urgency; +} + void Notification::SetActions( const std::vector& actions) { actions_ = actions; @@ -211,6 +220,7 @@ void Notification::Show() { options.actions = actions_; options.sound = sound_; options.close_button_text = close_button_text_; + options.urgency = urgency_; notification_->Show(options); } } @@ -238,6 +248,8 @@ void Notification::BuildPrototype(v8::Isolate* isolate, &Notification::SetHasReply) .SetProperty("replyPlaceholder", &Notification::GetReplyPlaceholder, &Notification::SetReplyPlaceholder) + .SetProperty("urgency", &Notification::GetUrgency, + &Notification::SetUrgency) .SetProperty("sound", &Notification::GetSound, &Notification::SetSound) .SetProperty("actions", &Notification::GetActions, &Notification::SetActions) diff --git a/shell/browser/api/atom_api_notification.h b/shell/browser/api/atom_api_notification.h index eea76adc6..ec43fb432 100644 --- a/shell/browser/api/atom_api_notification.h +++ b/shell/browser/api/atom_api_notification.h @@ -54,6 +54,7 @@ class Notification : public mate::TrackableObject, bool GetSilent() const; bool GetHasReply() const; base::string16 GetReplyPlaceholder() const; + base::string16 GetUrgency() const; base::string16 GetSound() const; std::vector GetActions() const; base::string16 GetCloseButtonText() const; @@ -64,6 +65,7 @@ class Notification : public mate::TrackableObject, void SetBody(const base::string16& new_body); void SetSilent(bool new_silent); void SetHasReply(bool new_has_reply); + void SetUrgency(const base::string16& new_urgency); void SetReplyPlaceholder(const base::string16& new_reply_placeholder); void SetSound(const base::string16& sound); void SetActions(const std::vector& actions); @@ -80,6 +82,7 @@ class Notification : public mate::TrackableObject, bool has_reply_ = false; base::string16 reply_placeholder_; base::string16 sound_; + base::string16 urgency_; std::vector actions_; base::string16 close_button_text_; diff --git a/shell/browser/notifications/linux/libnotify_notification.cc b/shell/browser/notifications/linux/libnotify_notification.cc index 394918816..d286d559f 100644 --- a/shell/browser/notifications/linux/libnotify_notification.cc +++ b/shell/browser/notifications/linux/libnotify_notification.cc @@ -100,6 +100,16 @@ void LibnotifyNotification::Show(const NotificationOptions& options) { nullptr); } + NotifyUrgency urgency = NOTIFY_URGENCY_NORMAL; + if (options.urgency == base::ASCIIToUTF16("critical")) { + urgency = NOTIFY_URGENCY_CRITICAL; + } else if (options.urgency == base::ASCIIToUTF16("low")) { + urgency = NOTIFY_URGENCY_LOW; + } + + // Set the urgency level of the notification. + libnotify_loader_.notify_notification_set_urgency(notification_, urgency); + if (!options.icon.drawsNothing()) { GdkPixbuf* pixbuf = libgtkui::GdkPixbufFromSkBitmap(options.icon); libnotify_loader_.notify_notification_set_image_from_pixbuf(notification_, diff --git a/shell/browser/notifications/notification.h b/shell/browser/notifications/notification.h index 6de8d5e9c..74dd8f964 100644 --- a/shell/browser/notifications/notification.h +++ b/shell/browser/notifications/notification.h @@ -34,6 +34,7 @@ struct NotificationOptions { bool has_reply; base::string16 reply_placeholder; base::string16 sound; + base::string16 urgency; // Linux std::vector actions; base::string16 close_button_text; diff --git a/spec-main/api-notification-dbus-spec.ts b/spec-main/api-notification-dbus-spec.ts index cd442da20..6154bfcd1 100644 --- a/spec-main/api-notification-dbus-spec.ts +++ b/spec-main/api-notification-dbus-spec.ts @@ -116,7 +116,8 @@ ifdescribe(!skip)('Notification module (dbus)', () => { actions: [], hints: { 'append': 'true', - 'desktop-entry': appName + 'desktop-entry': appName, + 'urgency': 1 } }) })