From 8ee0ef2cde1882085f03ef86f28bbb7ceab1da38 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Sun, 13 Oct 2013 23:20:50 -0400 Subject: [PATCH] messageTray: Don't always open the source when clicking on the notification Some consumers may not always want to open the app, so make clients that want to do this explicitly connect to the 'clicked' signal. https://bugzilla.gnome.org/show_bug.cgi?id=710137 --- js/ui/components/telepathyClient.js | 26 +++++++++++++------------- js/ui/messageTray.js | 2 -- js/ui/notificationDaemon.js | 17 ++++++++++++++--- js/ui/windowAttentionHandler.js | 5 ++++- 4 files changed, 31 insertions(+), 19 deletions(-) diff --git a/js/ui/components/telepathyClient.js b/js/ui/components/telepathyClient.js index 739bb9064..c4565ecff 100644 --- a/js/ui/components/telepathyClient.js +++ b/js/ui/components/telepathyClient.js @@ -446,6 +446,7 @@ const ChatSource = new Lang.Class({ this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed)); this._notification = new ChatNotification(this); + this._notification.connect('clicked', Lang.bind(this, this.open)); this._notification.setUrgency(MessageTray.Urgency.HIGH); this._notifyTimeoutId = 0; @@ -544,20 +545,19 @@ const ChatSource = new Lang.Class({ this._notification.update(this._notification.title, null, { customContent: true }); }, - open: function(notification) { - if (this._client.is_handling_channel(this._channel)) { - // We are handling the channel, try to pass it to Empathy - this._client.delegate_channels_async([this._channel], - global.get_current_time(), - 'org.freedesktop.Telepathy.Client.Empathy.Chat', null); - } - else { - // We are not the handler, just ask to present the channel - let dbus = Tp.DBusDaemon.dup(); - let cd = Tp.ChannelDispatcher.new(dbus); + open: function() { + if (this._client.is_handling_channel(this._channel)) { + // We are handling the channel, try to pass it to Empathy + this._client.delegate_channels_async([this._channel], + global.get_current_time(), + 'org.freedesktop.Telepathy.Client.Empathy.Chat', null); + } else { + // We are not the handler, just ask to present the channel + let dbus = Tp.DBusDaemon.dup(); + let cd = Tp.ChannelDispatcher.new(dbus); - cd.present_channel_async(this._channel, global.get_current_time(), null); - } + cd.present_channel_async(this._channel, global.get_current_time(), null); + } }, _getLogMessages: function() { diff --git a/js/ui/messageTray.js b/js/ui/messageTray.js index e7e722e72..75c3027f2 100644 --- a/js/ui/messageTray.js +++ b/js/ui/messageTray.js @@ -1385,9 +1385,7 @@ const Source = new Lang.Class({ if (this.notifications.indexOf(notification) >= 0) return; - notification.connect('clicked', Lang.bind(this, this.open)); notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy)); - this.notifications.push(notification); this.emit('notification-added', notification); diff --git a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js index c714ff138..3e47dc75d 100644 --- a/js/ui/notificationDaemon.js +++ b/js/ui/notificationDaemon.js @@ -422,15 +422,15 @@ const NotificationDaemon = new Lang.Class({ soundName: hints['sound-name'] }); notification.setImage(image); + let hasDefaultAction = false; + if (actions.length) { let useActionIcons = (hints['action-icons'] == true); for (let i = 0; i < actions.length - 1; i += 2) { let [actionId, label] = [actions[i], actions[i+1]]; if (actionId == 'default') { - notification.connect('clicked', Lang.bind(this, function() { - this._emitActionInvoked(ndata.id, "default"); - })); + hasDefaultAction = true; } else { notification.addButton(this._makeButton(id, label, useActionIcons), Lang.bind(this, function() { this._emitActionInvoked(ndata.id, actionId); @@ -438,6 +438,17 @@ const NotificationDaemon = new Lang.Class({ } } } + + if (hasDefaultAction) { + notification.connect('clicked', Lang.bind(this, function() { + this._emitActionInvoked(ndata.id, 'default'); + })); + } else { + notification.connect('clicked', Lang.bind(this, function() { + source.open(); + })); + } + switch (hints.urgency) { case Urgency.LOW: notification.setUrgency(MessageTray.Urgency.LOW); diff --git a/js/ui/windowAttentionHandler.js b/js/ui/windowAttentionHandler.js index 78e20611e..599eee9a6 100644 --- a/js/ui/windowAttentionHandler.js +++ b/js/ui/windowAttentionHandler.js @@ -39,6 +39,9 @@ const WindowAttentionHandler = new Lang.Class({ let [title, banner] = this._getTitleAndBanner(app, window); let notification = new MessageTray.Notification(source, title, banner); + notification.connect('clicked', function() { + source.open(); + }); notification.setForFeedback(true); source.notify(notification); @@ -79,7 +82,7 @@ const Source = new Lang.Class({ return this._app.create_icon_texture(size); }, - open : function(notification) { + open: function() { Main.activateWindow(this._window); this.destroy(); }