notificationDaemon: Remove support for legacy status icons
Tray icons make for a terrible UI on their own, but trying to shoehorn them into the notification system has only made them worse. At least for the time being this removal is temporary and support for tray icons will be back, but no longer as part of the notification system. https://bugzilla.gnome.org/show_bug.cgi?id=744815
This commit is contained in:
parent
a71ab9abb2
commit
5a8923ef95
@ -1313,7 +1313,7 @@ const Source = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
get isClearable() {
|
get isClearable() {
|
||||||
return !this.trayIcon && !this.isChat && !this.resident;
|
return !this.isChat && !this.resident;
|
||||||
},
|
},
|
||||||
|
|
||||||
countUpdated: function() {
|
countUpdated: function() {
|
||||||
|
@ -91,21 +91,6 @@ const rewriteRules = {
|
|||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
|
|
||||||
'bluetooth-applet': 'bluetooth',
|
|
||||||
'gnome-volume-control-applet': 'volume', // renamed to gnome-sound-applet
|
|
||||||
// when moved to control center
|
|
||||||
'gnome-sound-applet': 'volume',
|
|
||||||
'nm-applet': 'network',
|
|
||||||
'gnome-power-manager': 'battery',
|
|
||||||
'keyboard': 'keyboard',
|
|
||||||
'a11y-keyboard': 'a11y',
|
|
||||||
'kbd-scrolllock': 'keyboard',
|
|
||||||
'kbd-numlock': 'keyboard',
|
|
||||||
'kbd-capslock': 'keyboard',
|
|
||||||
'ibus-ui-gtk': 'keyboard'
|
|
||||||
};
|
|
||||||
|
|
||||||
const FdoNotificationDaemon = new Lang.Class({
|
const FdoNotificationDaemon = new Lang.Class({
|
||||||
Name: 'FdoNotificationDaemon',
|
Name: 'FdoNotificationDaemon',
|
||||||
|
|
||||||
@ -120,13 +105,10 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
|
|
||||||
this._nextNotificationId = 1;
|
this._nextNotificationId = 1;
|
||||||
|
|
||||||
Shell.WindowTracker.get_default().connect('notify::focus-app', Lang.bind(this, this._onFocusAppChanged));
|
Shell.WindowTracker.get_default().connect('notify::focus-app',
|
||||||
Main.overview.connect('hidden', Lang.bind(this, this._onFocusAppChanged));
|
Lang.bind(this, this._onFocusAppChanged));
|
||||||
|
Main.overview.connect('hidden',
|
||||||
this._trayManager = new Shell.TrayManager();
|
Lang.bind(this, this._onFocusAppChanged));
|
||||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
|
||||||
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
|
||||||
this._trayManager.manage_screen(global.screen, Main.messageTray.actor);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_imageForNotificationData: function(hints) {
|
_imageForNotificationData: function(hints) {
|
||||||
@ -167,11 +149,10 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
return null;
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_lookupSource: function(title, pid, trayIcon) {
|
_lookupSource: function(title, pid) {
|
||||||
for (let i = 0; i < this._sources.length; i++) {
|
for (let i = 0; i < this._sources.length; i++) {
|
||||||
let source = this._sources[i];
|
let source = this._sources[i];
|
||||||
if (source.pid == pid &&
|
if (source.pid == pid && source.initialTitle == title)
|
||||||
(source.initialTitle == title || source.trayIcon || trayIcon))
|
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -188,7 +169,7 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
//
|
//
|
||||||
// Either a pid or ndata.notification is needed to retrieve or
|
// Either a pid or ndata.notification is needed to retrieve or
|
||||||
// create a source.
|
// create a source.
|
||||||
_getSource: function(title, pid, ndata, sender, trayIcon) {
|
_getSource: function(title, pid, ndata, sender) {
|
||||||
if (!pid && !(ndata && ndata.notification))
|
if (!pid && !(ndata && ndata.notification))
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
@ -199,13 +180,13 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
if (ndata && ndata.notification)
|
if (ndata && ndata.notification)
|
||||||
return ndata.notification.source;
|
return ndata.notification.source;
|
||||||
|
|
||||||
let source = this._lookupSource(title, pid, trayIcon);
|
let source = this._lookupSource(title, pid);
|
||||||
if (source) {
|
if (source) {
|
||||||
source.setTitle(title);
|
source.setTitle(title);
|
||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
let source = new FdoNotificationDaemonSource(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null);
|
let source = new FdoNotificationDaemonSource(title, pid, sender, ndata ? ndata.hints['desktop-entry'] : null);
|
||||||
|
|
||||||
this._sources.push(source);
|
this._sources.push(source);
|
||||||
source.connect('destroy', Lang.bind(this, function() {
|
source.connect('destroy', Lang.bind(this, function() {
|
||||||
@ -503,20 +484,6 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
_emitActionInvoked: function(id, action) {
|
_emitActionInvoked: function(id, action) {
|
||||||
this._dbusImpl.emit_signal('ActionInvoked',
|
this._dbusImpl.emit_signal('ActionInvoked',
|
||||||
GLib.Variant.new('(us)', [id, action]));
|
GLib.Variant.new('(us)', [id, action]));
|
||||||
},
|
|
||||||
|
|
||||||
_onTrayIconAdded: function(o, icon) {
|
|
||||||
let wmClass = icon.wm_class ? icon.wm_class.toLowerCase() : '';
|
|
||||||
if (STANDARD_TRAY_ICON_IMPLEMENTATIONS[wmClass] !== undefined)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let source = this._getSource(icon.title || icon.wm_class || C_("program", "Unknown"), icon.pid, null, null, icon);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onTrayIconRemoved: function(o, icon) {
|
|
||||||
let source = this._lookupSource(null, icon.pid, true);
|
|
||||||
if (source)
|
|
||||||
source.destroy();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -524,10 +491,9 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
Name: 'FdoNotificationDaemonSource',
|
Name: 'FdoNotificationDaemonSource',
|
||||||
Extends: MessageTray.Source,
|
Extends: MessageTray.Source,
|
||||||
|
|
||||||
_init: function(title, pid, sender, trayIcon, appId) {
|
_init: function(title, pid, sender, appId) {
|
||||||
// Need to set the app before chaining up, so
|
// Need to set the app before chaining up, so
|
||||||
// methods called from the parent constructor can find it
|
// methods called from the parent constructor can find it
|
||||||
this.trayIcon = trayIcon;
|
|
||||||
this.pid = pid;
|
this.pid = pid;
|
||||||
this.app = this._getApp(appId);
|
this.app = this._getApp(appId);
|
||||||
|
|
||||||
@ -547,12 +513,6 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
Lang.bind(this, this._onNameVanished));
|
Lang.bind(this, this._onNameVanished));
|
||||||
else
|
else
|
||||||
this._nameWatcherId = 0;
|
this._nameWatcherId = 0;
|
||||||
|
|
||||||
if (this.trayIcon) {
|
|
||||||
// Try again finding the app, using the WM_CLASS from the tray icon
|
|
||||||
this._setSummaryIcon(this.trayIcon);
|
|
||||||
this.useNotificationIcon = false;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_createPolicy: function() {
|
_createPolicy: function() {
|
||||||
@ -570,15 +530,14 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
// of which аre removed from DBus immediately.
|
// of which аre removed from DBus immediately.
|
||||||
// Sender being removed from DBus would normally result in a tray icon being removed,
|
// Sender being removed from DBus would normally result in a tray icon being removed,
|
||||||
// so allow the code path that handles the tray icon being removed to handle that case.
|
// so allow the code path that handles the tray icon being removed to handle that case.
|
||||||
if (!this.trayIcon && this.app)
|
if (this.app)
|
||||||
this.destroy();
|
this.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
processNotification: function(notification, gicon) {
|
processNotification: function(notification, gicon) {
|
||||||
if (gicon)
|
if (gicon)
|
||||||
this._gicon = gicon;
|
this._gicon = gicon;
|
||||||
if (!this.trayIcon)
|
this.iconUpdated();
|
||||||
this.iconUpdated();
|
|
||||||
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
if (notification.resident && this.app && tracker.focus_app == this.app)
|
if (notification.resident && this.app && tracker.focus_app == this.app)
|
||||||
@ -587,29 +546,6 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
this.notify(notification);
|
this.notify(notification);
|
||||||
},
|
},
|
||||||
|
|
||||||
handleSummaryClick: function(button) {
|
|
||||||
if (!this.trayIcon)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let event = Clutter.get_current_event();
|
|
||||||
|
|
||||||
// Left clicks are passed through only where there aren't unacknowledged
|
|
||||||
// notifications, so it possible to open them in summary mode; right
|
|
||||||
// clicks are always forwarded, as the right click menu is not useful for
|
|
||||||
// tray icons
|
|
||||||
if (button == 1 &&
|
|
||||||
this.notifications.length > 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
let id = global.stage.connect('deactivate', Lang.bind(this, function () {
|
|
||||||
global.stage.disconnect(id);
|
|
||||||
this.trayIcon.click(event);
|
|
||||||
}));
|
|
||||||
|
|
||||||
Main.overview.hide();
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_getApp: function(appId) {
|
_getApp: function(appId) {
|
||||||
let app;
|
let app;
|
||||||
|
|
||||||
@ -617,16 +553,6 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
if (app != null)
|
if (app != null)
|
||||||
return app;
|
return app;
|
||||||
|
|
||||||
if (this.trayIcon) {
|
|
||||||
app = Shell.AppSystem.get_default().lookup_startup_wmclass(this.trayIcon.wm_class);
|
|
||||||
if (app != null)
|
|
||||||
return app;
|
|
||||||
|
|
||||||
app = Shell.AppSystem.get_default().lookup_desktop_wmclass(this.trayIcon.wm_class);
|
|
||||||
if (app != null)
|
|
||||||
return app;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (appId) {
|
if (appId) {
|
||||||
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
|
||||||
if (app != null)
|
if (app != null)
|
||||||
@ -652,8 +578,7 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_lastNotificationRemoved: function() {
|
_lastNotificationRemoved: function() {
|
||||||
if (!this.trayIcon)
|
this.destroy();
|
||||||
this.destroy();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
openApp: function() {
|
openApp: function() {
|
||||||
@ -674,11 +599,7 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
createIcon: function(size) {
|
createIcon: function(size) {
|
||||||
if (this.trayIcon) {
|
if (this.app) {
|
||||||
return new Clutter.Clone({ width: size,
|
|
||||||
height: size,
|
|
||||||
source: this.trayIcon });
|
|
||||||
} else if (this.app) {
|
|
||||||
return this.app.create_icon_texture(size);
|
return this.app.create_icon_texture(size);
|
||||||
} else if (this._gicon) {
|
} else if (this._gicon) {
|
||||||
return new St.Icon({ gicon: this._gicon,
|
return new St.Icon({ gicon: this._gicon,
|
||||||
|
@ -457,9 +457,6 @@ const MessagesIndicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onSourceAdded: function(tray, source) {
|
_onSourceAdded: function(tray, source) {
|
||||||
if (source.trayIcon)
|
|
||||||
return;
|
|
||||||
|
|
||||||
source.connect('count-updated', Lang.bind(this, this._updateCount));
|
source.connect('count-updated', Lang.bind(this, this._updateCount));
|
||||||
this._sources.push(source);
|
this._sources.push(source);
|
||||||
this._updateCount();
|
this._updateCount();
|
||||||
|
Loading…
Reference in New Issue
Block a user