commit:     fabb3f9f1de7d866981f7be223b254f4040f7015
Author:     Andreas Sturmlechner <andreas.sturmlechner <AT> gmail <DOT> com>
AuthorDate: Sun Jun 26 20:09:20 2016 +0000
Commit:     Michael Palimaka <kensington <AT> gentoo <DOT> org>
CommitDate: Sun Jun 26 20:36:30 2016 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=fabb3f9f

kde-plasma/kwin: Add back saving/loading/client matching by WM_COMMAND

Upstream dropped it in 5.6 but later found out it was still in use by
Mozilla applications et al., thus reverted in Plasma/5.6 branch but
only after 5.6.5 release.

Package-Manager: portage-2.2.28

 .../files/kwin-5.6.5-legacy-session-mgmt.patch     | 140 +++++++++++++++++++++
 kde-plasma/kwin/kwin-5.6.5-r1.ebuild               |  99 +++++++++++++++
 2 files changed, 239 insertions(+)

diff --git a/kde-plasma/kwin/files/kwin-5.6.5-legacy-session-mgmt.patch 
b/kde-plasma/kwin/files/kwin-5.6.5-legacy-session-mgmt.patch
new file mode 100644
index 0000000..067124a
--- /dev/null
+++ b/kde-plasma/kwin/files/kwin-5.6.5-legacy-session-mgmt.patch
@@ -0,0 +1,140 @@
+commit 59740e7416bb2b3a9852212fa4b213e5ba76deb7
+Author: Andreas Hartmetz <[email protected]>
+Date:   Thu Jun 23 19:40:40 2016 +0200
+
+    Revert "Remove saving and loading (and client matching by) WM_COMMAND."
+    
+    This reverts commit 2eac7634cc524bf5e425cf081a639a6b6407e380.
+    
+    CCBUG: 362671
+
+diff --git a/activities.cpp b/activities.cpp
+index 25eb1c1..42c5db8 100644
+--- a/activities.cpp
++++ b/activities.cpp
+@@ -169,7 +169,7 @@ void Activities::reallyStop(const QString &id)
+         const Client* c = (*it);
+         const QByteArray sessionId = c->sessionId();
+         if (sessionId.isEmpty()) {
+-            continue;
++            continue; //TODO support old wm_command apps too?
+         }
+ 
+         //qDebug() << sessionId;
+diff --git a/sm.cpp b/sm.cpp
+index 08810a4..ca1edea 100644
+--- a/sm.cpp
++++ b/sm.cpp
+@@ -109,8 +109,12 @@ void Workspace::storeSession(KConfig* config, SMSavePhase 
phase)
+     for (ClientList::Iterator it = clients.begin(); it != clients.end(); 
++it) {
+         Client* c = (*it);
+         QByteArray sessionId = c->sessionId();
++        QByteArray wmCommand = c->wmCommand();
+         if (sessionId.isEmpty())
+-            continue;
++            // remember also applications that are not XSMP capable
++            // and use the obsolete WM_COMMAND / WM_SAVE_YOURSELF
++            if (wmCommand.isEmpty())
++                continue;
+         count++;
+         if (c->isActive())
+             active_client = count;
+@@ -140,6 +144,7 @@ void Workspace::storeClient(KConfigGroup &cg, int num, 
Client *c)
+     QString n = QString::number(num);
+     cg.writeEntry(QLatin1String("sessionId") + n, c->sessionId().constData());
+     cg.writeEntry(QLatin1String("windowRole") + n, 
c->windowRole().constData());
++    cg.writeEntry(QLatin1String("wmCommand") + n, c->wmCommand().constData());
+     cg.writeEntry(QLatin1String("resourceName") + n, 
c->resourceName().constData());
+     cg.writeEntry(QLatin1String("resourceClass") + n, 
c->resourceClass().constData());
+     cg.writeEntry(QLatin1String("geometry") + n, 
QRect(c->calculateGravitation(true), c->clientSize()));   // FRAME
+@@ -180,8 +185,12 @@ void Workspace::storeSubSession(const QString &name, 
QSet<QByteArray> sessionIds
+     for (ClientList::Iterator it = clients.begin(); it != clients.end(); 
++it) {
+         Client* c = (*it);
+         QByteArray sessionId = c->sessionId();
++        QByteArray wmCommand = c->wmCommand();
+         if (sessionId.isEmpty())
+-            continue;
++            // remember also applications that are not XSMP capable
++            // and use the obsolete WM_COMMAND / WM_SAVE_YOURSELF
++            if (wmCommand.isEmpty())
++                continue;
+         if (!sessionIds.contains(sessionId))
+             continue;
+ 
+@@ -221,6 +230,7 @@ void Workspace::addSessionInfo(KConfigGroup &cg)
+         session.append(info);
+         info->sessionId = cg.readEntry(QLatin1String("sessionId") + n, 
QString()).toLatin1();
+         info->windowRole = cg.readEntry(QLatin1String("windowRole") + n, 
QString()).toLatin1();
++        info->wmCommand = cg.readEntry(QLatin1String("wmCommand") + n, 
QString()).toLatin1();
+         info->resourceName = cg.readEntry(QLatin1String("resourceName") + n, 
QString()).toLatin1();
+         info->resourceClass = cg.readEntry(QLatin1String("resourceClass") + 
n, QString()).toLower().toLatin1();
+         info->geometry = cg.readEntry(QLatin1String("geometry") + n, QRect());
+@@ -269,6 +279,7 @@ SessionInfo* Workspace::takeSessionInfo(Client* c)
+     SessionInfo *realInfo = 0;
+     QByteArray sessionId = c->sessionId();
+     QByteArray windowRole = c->windowRole();
++    QByteArray wmCommand = c->wmCommand();
+     QByteArray resourceName = c->resourceName();
+     QByteArray resourceClass = c->resourceClass();
+ 
+@@ -302,8 +313,10 @@ SessionInfo* Workspace::takeSessionInfo(Client* c)
+             if (info->resourceName == resourceName
+                     && info->resourceClass == resourceClass
+                     && sessionInfoWindowTypeMatch(c, info)) {
+-                realInfo = info;
+-                session.removeAll(info);
++                if (wmCommand.isEmpty() || info->wmCommand == wmCommand) {
++                    realInfo = info;
++                    session.removeAll(info);
++                }
+             }
+         }
+     }
+diff --git a/sm.h b/sm.h
+index 4c5fda6..529187d 100644
+--- a/sm.h
++++ b/sm.h
+@@ -41,6 +41,7 @@ class Client;
+ struct SessionInfo {
+     QByteArray sessionId;
+     QByteArray windowRole;
++    QByteArray wmCommand;
+     QByteArray wmClientMachine;
+     QByteArray resourceName;
+     QByteArray resourceClass;
+diff --git a/toplevel.cpp b/toplevel.cpp
+index af368b5..4a7ec6d 100644
+--- a/toplevel.cpp
++++ b/toplevel.cpp
+@@ -177,6 +177,19 @@ QByteArray Toplevel::sessionId() const
+     return result;
+ }
+ 
++/*!
++  Returns command property for this client,
++  taken either from its window or from the leader window.
++ */
++QByteArray Toplevel::wmCommand()
++{
++    QByteArray result = Xcb::StringProperty(window(), XCB_ATOM_WM_COMMAND);
++    if (result.isEmpty() && wmClientLeaderWin && wmClientLeaderWin != 
window())
++        result = Xcb::StringProperty(wmClientLeaderWin, XCB_ATOM_WM_COMMAND);
++    result.replace(0, ' ');
++    return result;
++}
++
+ void Toplevel::getWmClientMachine()
+ {
+     m_clientMachine->resolve(window(), wmClientLeader());
+diff --git a/toplevel.h b/toplevel.h
+index 3133851..91eee5f 100644
+--- a/toplevel.h
++++ b/toplevel.h
+@@ -274,6 +274,7 @@ public:
+     QByteArray sessionId() const;
+     QByteArray resourceName() const;
+     QByteArray resourceClass() const;
++    QByteArray wmCommand();
+     QByteArray wmClientMachine(bool use_localhost) const;
+     const ClientMachine *clientMachine() const;
+     Window wmClientLeader() const;

diff --git a/kde-plasma/kwin/kwin-5.6.5-r1.ebuild 
b/kde-plasma/kwin/kwin-5.6.5-r1.ebuild
new file mode 100644
index 0000000..2f12148
--- /dev/null
+++ b/kde-plasma/kwin/kwin-5.6.5-r1.ebuild
@@ -0,0 +1,99 @@
+# Copyright 1999-2016 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Id$
+
+EAPI=6
+
+KDE_HANDBOOK="optional"
+KDE_TEST="optional"
+VIRTUALX_REQUIRED="test"
+inherit kde5
+
+DESCRIPTION="KDE window manager"
+LICENSE="GPL-2+"
+KEYWORDS="~amd64 ~arm ~x86"
+IUSE="gles2 multimedia"
+
+# drop qtcore subslot operator when QT_MINIMAL >= 5.7.0
+COMMON_DEPEND="
+       $(add_frameworks_dep kactivities)
+       $(add_frameworks_dep kauth)
+       $(add_frameworks_dep kcmutils)
+       $(add_frameworks_dep kcompletion)
+       $(add_frameworks_dep kconfig)
+       $(add_frameworks_dep kconfigwidgets)
+       $(add_frameworks_dep kcoreaddons)
+       $(add_frameworks_dep kcrash)
+       $(add_frameworks_dep kdeclarative)
+       $(add_frameworks_dep kglobalaccel)
+       $(add_frameworks_dep ki18n)
+       $(add_frameworks_dep kiconthemes)
+       $(add_frameworks_dep kidletime)
+       $(add_frameworks_dep kinit)
+       $(add_frameworks_dep kio)
+       $(add_frameworks_dep knewstuff)
+       $(add_frameworks_dep knotifications)
+       $(add_frameworks_dep kpackage)
+       $(add_frameworks_dep kservice)
+       $(add_frameworks_dep kwayland)
+       $(add_frameworks_dep kwidgetsaddons)
+       $(add_frameworks_dep kwindowsystem X)
+       $(add_frameworks_dep kxmlgui)
+       $(add_frameworks_dep plasma)
+       $(add_plasma_dep kdecoration)
+       $(add_plasma_dep kscreenlocker)
+       $(add_qt_dep qtcore '' '' '5=')
+       $(add_qt_dep qtdbus)
+       $(add_qt_dep qtdeclarative)
+       $(add_qt_dep qtgui 'gles2=,opengl(+)')
+       $(add_qt_dep qtscript)
+       $(add_qt_dep qtwidgets)
+       $(add_qt_dep qtx11extras)
+       >=dev-libs/libinput-0.10
+       >=dev-libs/wayland-1.2
+       media-libs/fontconfig
+       media-libs/freetype
+       media-libs/libepoxy
+       media-libs/mesa[egl,gbm,gles2?,wayland]
+       virtual/libudev:=
+       x11-libs/libICE
+       x11-libs/libSM
+       x11-libs/libX11
+       x11-libs/libXi
+       x11-libs/libdrm
+       >=x11-libs/libxcb-1.10
+       >=x11-libs/libxkbcommon-0.4.1
+       x11-libs/xcb-util-cursor
+       x11-libs/xcb-util-image
+       x11-libs/xcb-util-keysyms
+"
+RDEPEND="${COMMON_DEPEND}
+       $(add_plasma_dep kde-cli-tools)
+       multimedia? (
+               || (
+                       $(add_qt_dep qtmultimedia 'gstreamer,qml')
+                       $(add_qt_dep qtmultimedia 'gstreamer010,qml')
+               )
+       )
+       !<kde-apps/kdeartwork-meta-15.08.3-r1:4
+       !kde-base/kwin:4
+       !kde-base/systemsettings:4
+"
+DEPEND="${COMMON_DEPEND}
+       $(add_qt_dep designer)
+       $(add_qt_dep qtconcurrent)
+       x11-proto/xproto
+       test? ( x11-libs/xcb-util-wm )
+"
+
+RESTRICT="test"
+
+PATCHES=(
+       "${FILESDIR}/${PN}-5.6.3-glibc-sysmacros.patch"
+       "${FILESDIR}/${PN}-5.6.5-legacy-session-mgmt.patch" # backport in 5.6 
after release
+)
+
+src_prepare() {
+       kde5_src_prepare
+       use multimedia || eapply "${FILESDIR}/${PN}-gstreamer-optional.patch"
+}

Reply via email to