mirror of
https://github.com/void-linux/void-packages.git
synced 2025-07-30 09:22:57 +02:00
gnome-shell: add patch from arch to revert/fix notification area bug.
This commit is contained in:
parent
4906c06558
commit
506394d7b1
2 changed files with 226 additions and 0 deletions
|
@ -0,0 +1,224 @@
|
||||||
|
From 7e654ab3ca6e8ac75ba5e45c2a411eb1c2904b26 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Marina Zhurakhinskaya <marinaz@redhat.com>
|
||||||
|
Date: Tue, 20 Dec 2011 05:51:35 +0000
|
||||||
|
Subject: notificationDaemon: group sources based on a combination of pid and title
|
||||||
|
|
||||||
|
That way different system notifications, such as the ones about battery power
|
||||||
|
and the ones about software updates, are shown with separate message tray
|
||||||
|
sources.
|
||||||
|
|
||||||
|
https://bugzilla.gnome.org/show_bug.cgi?id=664138
|
||||||
|
---
|
||||||
|
diff --git js/ui/notificationDaemon.js js/ui/notificationDaemon.js
|
||||||
|
index f40205d..c691efe 100644
|
||||||
|
--- js/ui/notificationDaemon.js
|
||||||
|
+++ js/ui/notificationDaemon.js
|
||||||
|
@@ -92,7 +92,7 @@ NotificationDaemon.prototype = {
|
||||||
|
_init: function() {
|
||||||
|
DBus.session.exportObject('/org/freedesktop/Notifications', this);
|
||||||
|
|
||||||
|
- this._sources = {};
|
||||||
|
+ this._sources = [];
|
||||||
|
this._senderToPid = {};
|
||||||
|
this._notifications = {};
|
||||||
|
this._busProxy = new Bus();
|
||||||
|
@@ -150,14 +150,30 @@ NotificationDaemon.prototype = {
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
+ _lookupSource: function(title, pid, trayIcon) {
|
||||||
|
+ for (let i = 0; i < this._sources.length; i++) {
|
||||||
|
+ let source = this._sources[i];
|
||||||
|
+ if (source.pid == pid &&
|
||||||
|
+ (source.initialTitle == title || source.trayIcon || trayIcon))
|
||||||
|
+ return source;
|
||||||
|
+ }
|
||||||
|
+ return null;
|
||||||
|
+ },
|
||||||
|
+
|
||||||
|
// Returns the source associated with ndata.notification if it is set.
|
||||||
|
- // Otherwise, returns the source associated with the pid if one is
|
||||||
|
- // stored in this._sources and the notification is not transient.
|
||||||
|
- // Otherwise, creates a new source as long as pid is provided.
|
||||||
|
+ // Otherwise, returns the source associated with the title and pid if
|
||||||
|
+ // such source is stored in this._sources and the notification is not
|
||||||
|
+ // transient. If the existing or requested source is associated with
|
||||||
|
+ // a tray icon and passed in pid matches a pid of an existing source,
|
||||||
|
+ // the title match is ignored to enable representing a tray icon and
|
||||||
|
+ // notifications from the same application with a single source.
|
||||||
|
+ //
|
||||||
|
+ // If no existing source is found, a new source is created as long as
|
||||||
|
+ // pid is provided.
|
||||||
|
//
|
||||||
|
// Either a pid or ndata.notification is needed to retrieve or
|
||||||
|
// create a source.
|
||||||
|
- _getSource: function(title, pid, ndata, sender) {
|
||||||
|
+ _getSource: function(title, pid, ndata, sender, trayIcon) {
|
||||||
|
if (!pid && !(ndata && ndata.notification))
|
||||||
|
return null;
|
||||||
|
|
||||||
|
@@ -174,20 +190,24 @@ NotificationDaemon.prototype = {
|
||||||
|
// with a transient one from the same sender, so we
|
||||||
|
// always create a new source object for new transient notifications
|
||||||
|
// and never add it to this._sources .
|
||||||
|
- if (!isForTransientNotification && this._sources[pid]) {
|
||||||
|
- let source = this._sources[pid];
|
||||||
|
- source.setTitle(title);
|
||||||
|
- return source;
|
||||||
|
+ if (!isForTransientNotification) {
|
||||||
|
+ let source = this._lookupSource(title, pid, trayIcon);
|
||||||
|
+ if (source) {
|
||||||
|
+ source.setTitle(title);
|
||||||
|
+ return source;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
- let source = new Source(title, pid, sender);
|
||||||
|
+ let source = new Source(title, pid, sender, trayIcon);
|
||||||
|
source.setTransient(isForTransientNotification);
|
||||||
|
|
||||||
|
if (!isForTransientNotification) {
|
||||||
|
- this._sources[pid] = source;
|
||||||
|
+ this._sources.push(source);
|
||||||
|
source.connect('destroy', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
- delete this._sources[pid];
|
||||||
|
+ let index = this._sources.indexOf(source);
|
||||||
|
+ if (index >= 0)
|
||||||
|
+ this._sources.splice(index, 1);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -261,7 +281,7 @@ NotificationDaemon.prototype = {
|
||||||
|
let sender = DBus.getCurrentMessageContext().sender;
|
||||||
|
let pid = this._senderToPid[sender];
|
||||||
|
|
||||||
|
- let source = this._getSource(appName, pid, ndata, sender);
|
||||||
|
+ let source = this._getSource(appName, pid, ndata, sender, null);
|
||||||
|
|
||||||
|
if (source) {
|
||||||
|
this._notifyForSource(source, ndata);
|
||||||
|
@@ -282,7 +302,7 @@ NotificationDaemon.prototype = {
|
||||||
|
if (!ndata)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- source = this._getSource(appName, pid, ndata, sender);
|
||||||
|
+ source = this._getSource(appName, pid, ndata, sender, null);
|
||||||
|
|
||||||
|
// We only store sender-pid entries for persistent sources.
|
||||||
|
// Removing the entries once the source is destroyed
|
||||||
|
@@ -432,8 +452,8 @@ NotificationDaemon.prototype = {
|
||||||
|
if (!tracker.focus_app)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- for (let id in this._sources) {
|
||||||
|
- let source = this._sources[id];
|
||||||
|
+ for (let i = 0; i < this._sources.length; i++) {
|
||||||
|
+ let source = this._sources[i];
|
||||||
|
if (source.app == tracker.focus_app) {
|
||||||
|
source.destroyNonResidentNotifications();
|
||||||
|
return;
|
||||||
|
@@ -456,12 +476,11 @@ NotificationDaemon.prototype = {
|
||||||
|
},
|
||||||
|
|
||||||
|
_onTrayIconAdded: function(o, icon) {
|
||||||
|
- let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null, null);
|
||||||
|
- source.setTrayIcon(icon);
|
||||||
|
+ let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null, null, icon);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onTrayIconRemoved: function(o, icon) {
|
||||||
|
- let source = this._sources[icon.pid];
|
||||||
|
+ let source = this._lookupSource(icon.pid, null, true);
|
||||||
|
if (source)
|
||||||
|
source.destroy();
|
||||||
|
}
|
||||||
|
@@ -476,10 +495,12 @@ function Source(title, pid, sender) {
|
||||||
|
Source.prototype = {
|
||||||
|
__proto__: MessageTray.Source.prototype,
|
||||||
|
|
||||||
|
- _init: function(title, pid, sender) {
|
||||||
|
+ _init: function(title, pid, sender, trayIcon) {
|
||||||
|
MessageTray.Source.prototype._init.call(this, title);
|
||||||
|
|
||||||
|
- this._pid = pid;
|
||||||
|
+ this.initialTitle = title;
|
||||||
|
+
|
||||||
|
+ this.pid = pid;
|
||||||
|
if (sender)
|
||||||
|
// TODO: dbus-glib implementation of watch_name() doesn’t return an id to be used for
|
||||||
|
// unwatch_name() or implement unwatch_name(), however when we move to using GDBus implementation,
|
||||||
|
@@ -496,7 +517,12 @@ Source.prototype = {
|
||||||
|
this.title = this.app.get_name();
|
||||||
|
else
|
||||||
|
this.useNotificationIcon = true;
|
||||||
|
- this._trayIcon = null;
|
||||||
|
+
|
||||||
|
+ this.trayIcon = trayIcon;
|
||||||
|
+ if (this.trayIcon) {
|
||||||
|
+ this._setSummaryIcon(this.trayIcon);
|
||||||
|
+ this.useNotificationIcon = false;
|
||||||
|
+ }
|
||||||
|
},
|
||||||
|
|
||||||
|
_onNameVanished: function() {
|
||||||
|
@@ -523,7 +549,7 @@ Source.prototype = {
|
||||||
|
},
|
||||||
|
|
||||||
|
handleSummaryClick: function() {
|
||||||
|
- if (!this._trayIcon)
|
||||||
|
+ if (!this.trayIcon)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let event = Clutter.get_current_event();
|
||||||
|
@@ -544,11 +570,11 @@ Source.prototype = {
|
||||||
|
let id = global.connect('notify::stage-input-mode', Lang.bind(this,
|
||||||
|
function () {
|
||||||
|
global.disconnect(id);
|
||||||
|
- this._trayIcon.click(event);
|
||||||
|
+ this.trayIcon.click(event);
|
||||||
|
}));
|
||||||
|
Main.overview.hide();
|
||||||
|
} else {
|
||||||
|
- this._trayIcon.click(event);
|
||||||
|
+ this.trayIcon.click(event);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
@@ -557,31 +583,25 @@ Source.prototype = {
|
||||||
|
if (this.app)
|
||||||
|
return;
|
||||||
|
|
||||||
|
- this.app = Shell.WindowTracker.get_default().get_app_from_pid(this._pid);
|
||||||
|
+ this.app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
|
||||||
|
if (!this.app)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only override the icon if we were previously using
|
||||||
|
// notification-based icons (ie, not a trayicon) or if it was unset before
|
||||||
|
- if (!this._trayIcon) {
|
||||||
|
+ if (!this.trayIcon) {
|
||||||
|
this.useNotificationIcon = false;
|
||||||
|
this._setSummaryIcon(this.app.create_icon_texture (this.ICON_SIZE));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
- setTrayIcon: function(icon) {
|
||||||
|
- this._setSummaryIcon(icon);
|
||||||
|
- this.useNotificationIcon = false;
|
||||||
|
- this._trayIcon = icon;
|
||||||
|
- },
|
||||||
|
-
|
||||||
|
open: function(notification) {
|
||||||
|
this.destroyNonResidentNotifications();
|
||||||
|
this.openApp();
|
||||||
|
},
|
||||||
|
|
||||||
|
_lastNotificationRemoved: function() {
|
||||||
|
- if (!this._trayIcon)
|
||||||
|
+ if (!this.trayIcon)
|
||||||
|
this.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
|
--
|
||||||
|
cgit v0.9.0.2
|
|
@ -1,10 +1,12 @@
|
||||||
# Template file for 'gnome-shell'
|
# Template file for 'gnome-shell'
|
||||||
pkgname=gnome-shell
|
pkgname=gnome-shell
|
||||||
version=3.2.2
|
version=3.2.2
|
||||||
|
patch_args="-Np0 -R"
|
||||||
distfiles="${GNOME_SITE}/$pkgname/3.2/$pkgname-$version.tar.xz"
|
distfiles="${GNOME_SITE}/$pkgname/3.2/$pkgname-$version.tar.xz"
|
||||||
build_style=gnu-configure
|
build_style=gnu-configure
|
||||||
configure_args="--disable-schemas-install --disable-schemas-compile
|
configure_args="--disable-schemas-install --disable-schemas-compile
|
||||||
--with-gconf-schema-file-dir=/usr/share/gconf/schemas"
|
--with-gconf-schema-file-dir=/usr/share/gconf/schemas"
|
||||||
|
revision=1
|
||||||
short_desc="GNOME core user interface"
|
short_desc="GNOME core user interface"
|
||||||
maintainer="Juan RP <xtraeme@gmail.com>"
|
maintainer="Juan RP <xtraeme@gmail.com>"
|
||||||
homepage="http://live.gnome.org/GnomeShell"
|
homepage="http://live.gnome.org/GnomeShell"
|
||||||
|
|
Loading…
Add table
Reference in a new issue