[arch-commits] Commit in gnome-shell/trunk (2 files)

Ionut Biru ibiru at archlinux.org
Thu Jan 19 10:10:06 UTC 2012


    Date: Thursday, January 19, 2012 @ 05:10:05
  Author: ibiru
Revision: 146930

revert commit that breaks tray icons for apps like skype, pidgin, dropbox. FS#27987

Added:
  gnome-shell/trunk/revert-notificationdaemon-group-based-on-pid-and-titles.patch
Modified:
  gnome-shell/trunk/PKGBUILD

---------------------------------------------------------------+
 PKGBUILD                                                      |   10 
 revert-notificationdaemon-group-based-on-pid-and-titles.patch |  224 ++++++++++
 2 files changed, 231 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2012-01-19 10:08:04 UTC (rev 146929)
+++ PKGBUILD	2012-01-19 10:10:05 UTC (rev 146930)
@@ -4,7 +4,7 @@
 
 pkgname=gnome-shell
 pkgver=3.2.2
-pkgrel=1
+pkgrel=2
 pkgdesc="The next generation GNOME Shell"
 arch=('i686' 'x86_64')
 url="http://live.gnome.org/GnomeShell"
@@ -15,12 +15,16 @@
 options=('!libtool' '!emptydirs')
 install=gnome-shell.install
 groups=(gnome)
-source=(http://ftp.gnome.org/pub/GNOME/sources/$pkgname/${pkgver%.*}/$pkgname-$pkgver.tar.xz)
-sha256sums=('68967b9d58ad0551d7d3d28a276526a15faf1fc1d27f4624eb405663910e2eb8')
+source=(http://ftp.gnome.org/pub/GNOME/sources/$pkgname/${pkgver%.*}/$pkgname-$pkgver.tar.xz
+        revert-notificationdaemon-group-based-on-pid-and-titles.patch)
+sha256sums=('68967b9d58ad0551d7d3d28a276526a15faf1fc1d27f4624eb405663910e2eb8'
+            '9e0337cd25d29d7215561d6fa30612d69c89fe7c27aa563a0c0b8a5b6f6cf12a')
 
 build() {
   cd "$srcdir/$pkgname-$pkgver"
 
+  patch -Np1 -R -i "$srcdir/revert-notificationdaemon-group-based-on-pid-and-titles.patch"
+
   PYTHON=/usr/bin/python2 ./configure --prefix=/usr --sysconfdir=/etc \
       --libexecdir=/usr/lib/gnome-shell \
       --localstatedir=/var --disable-static \

Added: revert-notificationdaemon-group-based-on-pid-and-titles.patch
===================================================================
--- revert-notificationdaemon-group-based-on-pid-and-titles.patch	                        (rev 0)
+++ revert-notificationdaemon-group-based-on-pid-and-titles.patch	2012-01-19 10:10:05 UTC (rev 146930)
@@ -0,0 +1,224 @@
+From 7e654ab3ca6e8ac75ba5e45c2a411eb1c2904b26 Mon Sep 17 00:00:00 2001
+From: Marina Zhurakhinskaya <marinaz at 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 a/js/ui/notificationDaemon.js b/js/ui/notificationDaemon.js
+index f40205d..c691efe 100644
+--- a/js/ui/notificationDaemon.js
++++ b/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




More information about the arch-commits mailing list