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
This commit is contained in:
Jasper St. Pierre 2013-10-13 23:20:50 -04:00
parent 43f4682ec4
commit 8ee0ef2cde
4 changed files with 31 additions and 19 deletions

View File

@ -446,6 +446,7 @@ const ChatSource = new Lang.Class({
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed)); this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
this._notification = new ChatNotification(this); this._notification = new ChatNotification(this);
this._notification.connect('clicked', Lang.bind(this, this.open));
this._notification.setUrgency(MessageTray.Urgency.HIGH); this._notification.setUrgency(MessageTray.Urgency.HIGH);
this._notifyTimeoutId = 0; this._notifyTimeoutId = 0;
@ -544,20 +545,19 @@ const ChatSource = new Lang.Class({
this._notification.update(this._notification.title, null, { customContent: true }); this._notification.update(this._notification.title, null, { customContent: true });
}, },
open: function(notification) { open: function() {
if (this._client.is_handling_channel(this._channel)) { if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy // We are handling the channel, try to pass it to Empathy
this._client.delegate_channels_async([this._channel], this._client.delegate_channels_async([this._channel],
global.get_current_time(), global.get_current_time(),
'org.freedesktop.Telepathy.Client.Empathy.Chat', null); 'org.freedesktop.Telepathy.Client.Empathy.Chat', null);
} } else {
else { // We are not the handler, just ask to present the channel
// We are not the handler, just ask to present the channel let dbus = Tp.DBusDaemon.dup();
let dbus = Tp.DBusDaemon.dup(); let cd = Tp.ChannelDispatcher.new(dbus);
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() { _getLogMessages: function() {

View File

@ -1385,9 +1385,7 @@ const Source = new Lang.Class({
if (this.notifications.indexOf(notification) >= 0) if (this.notifications.indexOf(notification) >= 0)
return; return;
notification.connect('clicked', Lang.bind(this, this.open));
notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy)); notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy));
this.notifications.push(notification); this.notifications.push(notification);
this.emit('notification-added', notification); this.emit('notification-added', notification);

View File

@ -422,15 +422,15 @@ const NotificationDaemon = new Lang.Class({
soundName: hints['sound-name'] }); soundName: hints['sound-name'] });
notification.setImage(image); notification.setImage(image);
let hasDefaultAction = false;
if (actions.length) { if (actions.length) {
let useActionIcons = (hints['action-icons'] == true); let useActionIcons = (hints['action-icons'] == true);
for (let i = 0; i < actions.length - 1; i += 2) { for (let i = 0; i < actions.length - 1; i += 2) {
let [actionId, label] = [actions[i], actions[i+1]]; let [actionId, label] = [actions[i], actions[i+1]];
if (actionId == 'default') { if (actionId == 'default') {
notification.connect('clicked', Lang.bind(this, function() { hasDefaultAction = true;
this._emitActionInvoked(ndata.id, "default");
}));
} else { } else {
notification.addButton(this._makeButton(id, label, useActionIcons), Lang.bind(this, function() { notification.addButton(this._makeButton(id, label, useActionIcons), Lang.bind(this, function() {
this._emitActionInvoked(ndata.id, actionId); 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) { switch (hints.urgency) {
case Urgency.LOW: case Urgency.LOW:
notification.setUrgency(MessageTray.Urgency.LOW); notification.setUrgency(MessageTray.Urgency.LOW);

View File

@ -39,6 +39,9 @@ const WindowAttentionHandler = new Lang.Class({
let [title, banner] = this._getTitleAndBanner(app, window); let [title, banner] = this._getTitleAndBanner(app, window);
let notification = new MessageTray.Notification(source, title, banner); let notification = new MessageTray.Notification(source, title, banner);
notification.connect('clicked', function() {
source.open();
});
notification.setForFeedback(true); notification.setForFeedback(true);
source.notify(notification); source.notify(notification);
@ -79,7 +82,7 @@ const Source = new Lang.Class({
return this._app.create_icon_texture(size); return this._app.create_icon_texture(size);
}, },
open : function(notification) { open: function() {
Main.activateWindow(this._window); Main.activateWindow(this._window);
this.destroy(); this.destroy();
} }