[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kwin] /: Revert "Remove saving and loading (and client matching by) WM_COMMAND."
From:       Andreas Hartmetz <ahartmetz () gmail ! com>
Date:       2016-06-23 19:09:40
Message-ID: E1bGA0S-0006V4-3R () code ! kde ! org
[Download RAW message or body]

Git commit 03f0dc51d72ba0ad55fe077a519e1041c937ac6d by Andreas Hartmetz.
Committed on 23/06/2016 at 19:07.
Pushed by ahartmetz into branch 'master'.

Revert "Remove saving and loading (and client matching by) WM_COMMAND."

This reverts commit 2eac7634cc524bf5e425cf081a639a6b6407e380.

Cherry-picked from 5.6.

CCBUG: 362671

M  +1    -1    activities.cpp
M  +17   -4    sm.cpp
M  +1    -0    sm.h
M  +13   -0    toplevel.cpp
M  +1    -0    toplevel.h

http://commits.kde.org/kwin/03f0dc51d72ba0ad55fe077a519e1041c937ac6d

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 999dac4..2a0e8bc 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 f2a15ab..57b3083 100644
--- a/toplevel.h
+++ b/toplevel.h
@@ -278,6 +278,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;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic