From 2eac7634cc524bf5e425cf081a639a6b6407e380 Mon Sep 17 00:00:00 2001 From: Andreas Hartmetz Date: Sat, 9 Jan 2016 03:33:55 +0100 Subject: [PATCH] Remove saving and loading (and client matching by) WM_COMMAND. This legacy session management scheme using the WM_COMMAND property seems to be called XSM. It is very, very legacy because it was superseded by XSMP in 1993(!). By inspecting ~/.config/session/kwin_[...] I could see that Firefox still sets WM_COMMAND, but nothing else in a regular session with some applications. As one of the last applications to switch to XSMP session management, I guess Firefox keeps doing that because it still needs to work on, say, Solaris, anyway, so why not set WM_COMMAND on Linux as well. The WM_COMMAND set by Firefox looks like "wmCommand8=firefox\s" in the kwin session file. It doesn't actually contain a session identifier. But then, Firefox only has one session per user anyway. This goes together with commit 5f0ca1305db4a925 in plasma-workspace / ksmserver to remove legacy session management support. I've talked about my plan to do this on IRC with Martin so hopefully it's okay to just do this now. --- activities.cpp | 2 +- sm.cpp | 21 ++++----------------- sm.h | 1 - toplevel.cpp | 13 ------------- toplevel.h | 1 - 5 files changed, 5 insertions(+), 33 deletions(-) diff --git a/activities.cpp b/activities.cpp index 42c5db8019..25eb1c1460 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; //TODO support old wm_command apps too? + continue; } //qDebug() << sessionId; diff --git a/sm.cpp b/sm.cpp index 6852390eba..37b405cf88 100644 --- a/sm.cpp +++ b/sm.cpp @@ -109,12 +109,8 @@ 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()) - // remember also applications that are not XSMP capable - // and use the obsolete WM_COMMAND / WM_SAVE_YOURSELF - if (wmCommand.isEmpty()) - continue; + continue; count++; if (c->isActive()) active_client = count; @@ -144,7 +140,6 @@ 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 @@ -185,12 +180,8 @@ void Workspace::storeSubSession(const QString &name, QSet 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()) - // remember also applications that are not XSMP capable - // and use the obsolete WM_COMMAND / WM_SAVE_YOURSELF - if (wmCommand.isEmpty()) - continue; + continue; if (!sessionIds.contains(sessionId)) continue; @@ -230,7 +221,6 @@ 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()); @@ -279,7 +269,6 @@ 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(); @@ -313,10 +302,8 @@ SessionInfo* Workspace::takeSessionInfo(Client* c) if (info->resourceName == resourceName && info->resourceClass == resourceClass && sessionInfoWindowTypeMatch(c, info)) { - if (wmCommand.isEmpty() || info->wmCommand == wmCommand) { - realInfo = info; - session.removeAll(info); - } + realInfo = info; + session.removeAll(info); } } } diff --git a/sm.h b/sm.h index 529187d84b..4c5fda6e0a 100644 --- a/sm.h +++ b/sm.h @@ -41,7 +41,6 @@ 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 92471e8312..e519c8bc6b 100644 --- a/toplevel.cpp +++ b/toplevel.cpp @@ -177,19 +177,6 @@ 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 91eee5f26f..313385130a 100644 --- a/toplevel.h +++ b/toplevel.h @@ -274,7 +274,6 @@ 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;