From e7f9852d5f6d6419fb714270f4556a531f0a98bc Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Sun, 12 May 2024 23:09:40 +0300 Subject: [PATCH] plasma: implement option to disable session management I have idea about adding one more option but not sure if I should, the idea is to restart applications even if not registered for session management since klauncher tracks applications anyway. which applications are restarted then becomes limited to what klauncher starts tho Signed-off-by: Ivailo Monev --- kcontrol/workspaceoptions/mainpage.ui | 20 ++++++++ .../workspaceoptions/workspaceoptions.cpp | 6 +++ plasma/shells/plasma-desktop/plasmaapp.cpp | 48 ++++++++++++++----- plasma/shells/plasma-desktop/plasmaapp.h | 4 ++ 4 files changed, 67 insertions(+), 11 deletions(-) diff --git a/kcontrol/workspaceoptions/mainpage.ui b/kcontrol/workspaceoptions/mainpage.ui index 39ff1d36..df7d68df 100644 --- a/kcontrol/workspaceoptions/mainpage.ui +++ b/kcontrol/workspaceoptions/mainpage.ui @@ -95,7 +95,27 @@ + + + + Session Management: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + true + + + + Qt::Vertical diff --git a/kcontrol/workspaceoptions/workspaceoptions.cpp b/kcontrol/workspaceoptions/workspaceoptions.cpp index ff1096ce..da5a2e2a 100644 --- a/kcontrol/workspaceoptions/workspaceoptions.cpp +++ b/kcontrol/workspaceoptions/workspaceoptions.cpp @@ -66,11 +66,13 @@ WorkspaceOptionsModule::WorkspaceOptionsModule(QWidget *parent, const QVariantLi connect(m_ui->cacheTheme, SIGNAL(toggled(bool)), this, SLOT(changed())); connect(m_ui->cacheTheme, SIGNAL(toggled(bool)), this, SLOT(cacheThemeChanged(bool))); connect(m_ui->themeCacheSize, SIGNAL(valueChanged(int)), this, SLOT(changed())); + connect(m_ui->sessionManagement, SIGNAL(toggled(bool)), this, SLOT(changed())); if (!m_plasmaFound) { m_ui->formFactor->setEnabled(false); m_ui->cacheTheme->setEnabled(false); m_ui->themeCacheSize->setEnabled(false); + m_ui->sessionManagement->setEnabled(false); } } @@ -88,6 +90,8 @@ void WorkspaceOptionsModule::save() KConfigGroup cg2(&config, "CachePolicies"); cg2.writeEntry("CacheTheme", m_ui->cacheTheme->isChecked()); cg2.writeEntry("ThemeCacheKb", m_ui->themeCacheSize->value() * 1024); + KConfigGroup cg3(&config, "General"); + cg3.writeEntry("SessionManagement", m_ui->sessionManagement->isChecked()); } const bool isDesktop = (m_ui->formFactor->currentIndex() == 0); @@ -160,6 +164,8 @@ void WorkspaceOptionsModule::load() m_ui->cacheTheme->setChecked(cg2.readEntry("CacheTheme", true)); const int themeCacheKb = cg2.readEntry("ThemeCacheKb", 81920); m_ui->themeCacheSize->setValue(themeCacheKb / 1024); + KConfigGroup cg3(&config, "General"); + m_ui->sessionManagement->setChecked(cg3.readEntry("SessionManagement", true)); } void WorkspaceOptionsModule::defaults() diff --git a/plasma/shells/plasma-desktop/plasmaapp.cpp b/plasma/shells/plasma-desktop/plasmaapp.cpp index f473e22d..bb022856 100644 --- a/plasma/shells/plasma-desktop/plasmaapp.cpp +++ b/plasma/shells/plasma-desktop/plasmaapp.cpp @@ -72,6 +72,7 @@ static const int s_sessiondelay = 500; // ms static const int s_phasetimeout = 10000; // ms +static const bool s_defaultsm = true; static const QString s_defaultwm = QString::fromLatin1("kwin"); static const QStringList s_defaultwmcommands = QStringList() << s_defaultwm; @@ -123,7 +124,9 @@ PlasmaApp::PlasmaApp() m_logoutAfterStartup(false), m_confirm(0), m_sdtype(KWorkSpace::ShutdownTypeNone), - m_sessionManager(false) + m_failSafe(false), + m_sessionManager(false), + m_dirWatch(nullptr) { KGlobal::locale()->insertCatalog("libplasma"); KGlobal::locale()->insertCatalog("plasmagenericshell"); @@ -268,6 +271,13 @@ void PlasmaApp::setupDesktop() void PlasmaApp::setupSession() { + if (!m_failSafe) { + m_dirWatch = new KDirWatch(this); + m_dirWatch->setInterval(5000); + m_dirWatch->addFile(KGlobal::dirs()->saveLocation("config") + QLatin1String("plasmarc")); + connect(m_dirWatch, SIGNAL(dirty(QString)), this, SLOT(configDirty())); + } + m_phaseTimer = new QTimer(this); m_phaseTimer->setInterval(500); connect(m_phaseTimer, SIGNAL(timeout()), this, SLOT(nextPhase())); @@ -287,9 +297,11 @@ void PlasmaApp::setupSession() sessionBus, this ); - const bool failsafe = (qgetenv("KDE_FAILSAFE").toInt() == 1); - if (!failsafe) { - m_sessionManager = true; + m_failSafe = (qgetenv("KDE_FAILSAFE").toInt() == 1); + KConfig cfg("plasmarc", KConfig::NoGlobals); + KConfigGroup config(&cfg, "General"); + if (!m_failSafe) { + m_sessionManager = config.readEntry("SessionManagement", s_defaultsm); connect( sessionBus.interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), this, SLOT(serviceOwnerChanged(QString,QString,QString)) @@ -299,9 +311,7 @@ void PlasmaApp::setupSession() KGlobal::dirs()->addResourceType("windowmanagers", "data", "plasma/windowmanagers"); QStringList wmcommands; - if (!failsafe) { - KConfig cfg("plasmarc", KConfig::NoGlobals); - KConfigGroup config(&cfg, "General"); + if (!m_failSafe) { const QString wmname = config.readEntry("windowManager", s_defaultwm); if (wmname != s_defaultwm) { KDesktopFile wmfile("windowmanagers", wmname + ".desktop"); @@ -330,10 +340,18 @@ void PlasmaApp::setupSession() clientgroup.deleteGroup(); clientgroup.sync(); } - } + } m_wmProc = new QProcess(this); m_wmProc->start(wmprog, wmcommands); + if (!m_failSafe && !m_sessionManager) { + kDebug() << "deleting previous session"; + // make sure when session management is enabled again it is a fresh start even if KDirWatch + // did not had the time to detect the changes done to the config + sessiongroup.deleteGroup(); + sessiongroup.sync(); + } + m_phaseTimer->start(); } @@ -346,14 +364,14 @@ void PlasmaApp::panelHidden(bool hidden) { if (hidden) { ++m_panelHidden; - //kDebug() << "panel hidden" << m_panelHidden; + // kDebug() << "panel hidden" << m_panelHidden; } else { --m_panelHidden; if (m_panelHidden < 0) { kDebug() << "panelHidden(false) called too many times!"; m_panelHidden = 0; } - //kDebug() << "panel unhidden" << m_panelHidden; + // kDebug() << "panel unhidden" << m_panelHidden; } } @@ -488,7 +506,7 @@ bool PlasmaApp::x11EventFilter(XEvent *event) } else if (event->type == EnterNotify) { panel->hintOrUnhide(QPoint(-1, -1)); //kDebug() << "entry"; - //FIXME: this if it was possible to avoid the polling + // FIXME: this if it was possible to avoid the polling /*} else if (event->type == LeaveNotify) { panel->unhintHide(); */ @@ -1128,6 +1146,14 @@ void PlasmaApp::serviceOwnerChanged(const QString &name, const QString &oldOwner } } +void PlasmaApp::configDirty() +{ + KConfig cfg("plasmarc", KConfig::NoGlobals); + KConfigGroup config(&cfg, "General"); + m_sessionManager = config.readEntry("SessionManagement", s_defaultsm); + kDebug() << "plasmarc dirty" << m_sessionManager; +} + void PlasmaApp::suspendStartup(const QString &app) { m_startupSuspend++; diff --git a/plasma/shells/plasma-desktop/plasmaapp.h b/plasma/shells/plasma-desktop/plasmaapp.h index 0153c654..6237c5a1 100644 --- a/plasma/shells/plasma-desktop/plasmaapp.h +++ b/plasma/shells/plasma-desktop/plasmaapp.h @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -150,6 +151,7 @@ private Q_SLOTS: void clientSaved(); void clientSaveCanceled(); void serviceOwnerChanged(const QString &name, const QString &oldOwner, const QString &newOwner); + void configDirty(); private: KActionCollection* m_actionCollection; @@ -180,7 +182,9 @@ private: bool m_logoutAfterStartup; int m_confirm; KWorkSpace::ShutdownType m_sdtype; + bool m_failSafe; bool m_sessionManager; + KDirWatch* m_dirWatch; QList m_clients; QList m_saveQueue; };