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 <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-12 23:09:40 +03:00
parent d30570a6e3
commit e7f9852d5f
4 changed files with 67 additions and 11 deletions

View file

@ -95,7 +95,27 @@
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="sessionManagementLabel">
<property name="text">
<string>Session Management:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="sessionManagement">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>

View file

@ -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()

View file

@ -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++;

View file

@ -30,6 +30,7 @@
#include <KUniqueApplication>
#include <KActionCollection>
#include <KDirWatch>
#include <Plasma/Plasma>
#include <plasma/packagemetadata.h>
@ -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<org::kde::KApplication*> m_clients;
QList<org::kde::KApplication*> m_saveQueue;
};