diff --git a/kcmkwin/kwinscreenedges/CMakeLists.txt b/kcmkwin/kwinscreenedges/CMakeLists.txt
--- a/kcmkwin/kwinscreenedges/CMakeLists.txt
+++ b/kcmkwin/kwinscreenedges/CMakeLists.txt
@@ -10,6 +10,7 @@
set(kcm_kwinscreenedges_PART_SRCS main.cpp ${kcm_screenedges_SRCS})
ki18n_wrap_ui(kcm_kwinscreenedges_PART_SRCS main.ui)
+kconfig_add_kcfg_files(kcm_screenedges_SRCS kwintouchscreensettings.kcfgc kwintouchscreenscriptsettings.kcfgc)
add_library(kcm_kwinscreenedges MODULE ${kcm_kwinscreenedges_PART_SRCS})
set(kcm_screenedges_LIBS
Qt5::DBus
diff --git a/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfg b/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfg
new file mode 100644
--- /dev/null
+++ b/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ ElectricNone
+
+
+
diff --git a/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfgc b/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfgc
new file mode 100644
--- /dev/null
+++ b/kcmkwin/kwinscreenedges/kwintouchscreenscriptsettings.kcfgc
@@ -0,0 +1,7 @@
+File=kwintouchscreenscriptsettings.kcfg
+NameSpace=KWin
+ClassName=KWinTouchScreenScriptSettings
+IncludeFiles=kwinglobals.h
+Mutators=true
+DefaultValueGetters=true
+ParentInConstructor=true
diff --git a/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfg b/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfg
new file mode 100644
--- /dev/null
+++ b/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfg
@@ -0,0 +1,56 @@
+
+
+
+
+
+ None
+
+
+ None
+
+
+ None
+
+
+ None
+
+
+
+
+ ElectricNone
+
+
+ ElectricNone
+
+
+ ElectricNone
+
+
+
+
+ ElectricNone
+
+
+
+
+ ElectricNone
+
+
+ ElectricNone
+
+
+ ElectricNone
+
+
+
+
+ ElectricLeft
+
+
+ ElectricNone
+
+
+
diff --git a/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfgc b/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfgc
new file mode 100644
--- /dev/null
+++ b/kcmkwin/kwinscreenedges/kwintouchscreensettings.kcfgc
@@ -0,0 +1,7 @@
+File=kwintouchscreensettings.kcfg
+NameSpace=KWin
+ClassName=KWinTouchScreenSettings
+IncludeFiles=kwinglobals.h
+Mutators=true
+DefaultValueGetters=true
+ParentInConstructor=true
diff --git a/kcmkwin/kwinscreenedges/touch.h b/kcmkwin/kwinscreenedges/touch.h
--- a/kcmkwin/kwinscreenedges/touch.h
+++ b/kcmkwin/kwinscreenedges/touch.h
@@ -3,6 +3,7 @@
This file is part of the KDE project.
Copyright (C) 2009 Lucas Murray
+Copyright (C) 2020 Cyril Rossi
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -32,6 +33,8 @@
namespace KWin
{
+class KWinTouchScreenSettings;
+class KWinTouchScreenScriptSettings;
enum class BuiltInEffect;
class KWinScreenEdgesConfigForm : public QWidget, public Ui::KWinScreenEdgesConfigForm
@@ -54,12 +57,16 @@
void save() override;
void load() override;
void defaults() override;
+
protected:
void showEvent(QShowEvent* e) override;
+
private:
KWinScreenEdgesConfigForm* m_ui;
KSharedConfigPtr m_config;
QStringList m_scripts; //list of script IDs ordered in the list they are presented in the menu
+ QHash m_scriptSettings;
+ KWinTouchScreenSettings *m_settings;
enum EffectActions {
PresentWindowsAll = ELECTRIC_ACTION_COUNT, // Start at the end of built in actions
@@ -79,15 +86,17 @@
void monitorAddItem(const QString& item);
void monitorItemSetEnabled(int index, bool enabled);
void monitorInit();
- void monitorLoadAction(ElectricBorder edge, const QString& configName);
- void monitorLoad();
- void monitorSaveAction(int edge, const QString& configName);
- void monitorSave();
- void monitorDefaults();
+ void monitorLoadSettings();
+ void monitorSaveSettings();
void monitorShowEvent();
void monitorChangeEdge(ElectricBorder border, int index);
void monitorHideEdge(ElectricBorder border, bool hidden);
QList monitorCheckEffectHasEdge(int index) const;
+
+ void updateUnmanagedState();
+
+ static ElectricBorderAction electricBorderActionFromString(const QString &s);
+ static QString electricBorderActionToString(int a);
};
} // namespace
diff --git a/kcmkwin/kwinscreenedges/touch.cpp b/kcmkwin/kwinscreenedges/touch.cpp
--- a/kcmkwin/kwinscreenedges/touch.cpp
+++ b/kcmkwin/kwinscreenedges/touch.cpp
@@ -4,6 +4,7 @@
Copyright (C) 2008 Martin Gräßlin
Copyright (C) 2009 Lucas Murray
+Copyright (C) 2020 Cyril Rossi
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -31,6 +32,9 @@
#include
#include
+#include "kwintouchscreensettings.h"
+#include "kwintouchscreenscriptsettings.h"
+
K_PLUGIN_FACTORY(KWinScreenEdgesConfigFactory, registerPlugin();)
namespace KWin
@@ -45,16 +49,18 @@
KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList& args)
: KCModule(parent, args)
, m_config(KSharedConfig::openConfig("kwinrc"))
+ , m_settings(new KWinTouchScreenSettings(this))
{
m_ui = new KWinScreenEdgesConfigForm(this);
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(m_ui);
monitorInit();
- connect(m_ui->monitor, SIGNAL(changed()), this, SLOT(changed()));
-
- load();
+ connect(m_ui->monitor, &Monitor::changed, this, [this]() {
+ monitorSaveSettings();
+ updateUnmanagedState();
+ });
}
KWinScreenEdgesConfig::~KWinScreenEdgesConfig()
@@ -64,17 +70,22 @@
void KWinScreenEdgesConfig::load()
{
KCModule::load();
+ m_settings->load();
+ for (auto setting : m_scriptSettings) {
+ setting->load();
+ }
- monitorLoad();
-
- emit changed(false);
+ monitorLoadSettings();
+ updateUnmanagedState();
}
void KWinScreenEdgesConfig::save()
{
- KCModule::save();
-
- monitorSave();
+ monitorSaveSettings();
+ m_settings->save();
+ for (auto setting : m_scriptSettings) {
+ setting->save();
+ }
// Reload KWin.
QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig");
@@ -87,14 +98,18 @@
interface.reconfigureEffect(BuiltInEffects::nameForEffect(BuiltInEffect::DesktopGrid));
interface.reconfigureEffect(BuiltInEffects::nameForEffect(BuiltInEffect::Cube));
- emit changed(false);
+ KCModule::save();
}
void KWinScreenEdgesConfig::defaults()
{
- monitorDefaults();
-
- emit changed(true);
+ m_settings->setDefaults();
+ for (auto setting : m_scriptSettings) {
+ setting->setDefaults();
+ }
+ monitorLoadSettings();
+ KCModule::defaults();
+ updateUnmanagedState();
}
void KWinScreenEdgesConfig::showEvent(QShowEvent* e)
@@ -104,6 +119,23 @@
monitorShowEvent();
}
+void KWinScreenEdgesConfig::updateUnmanagedState()
+{
+ bool isScriptSaveNeeded = std::any_of(m_scriptSettings.cbegin(),
+ m_scriptSettings.cend(),
+ [](const KWinTouchScreenScriptSettings *setting) {
+ return setting->isSaveNeeded();
+ });
+ unmanagedWidgetChangeState(m_settings->isSaveNeeded() || isScriptSaveNeeded);
+
+ bool isScriptNotDefault = std::any_of(m_scriptSettings.cbegin(),
+ m_scriptSettings.cend(),
+ [](const KWinTouchScreenScriptSettings *setting) {
+ return !setting->isDefaults();
+ });
+ unmanagedWidgetDefaultState(m_settings->isDefaults() && !isScriptNotDefault );
+}
+
// Copied from kcmkwin/kwincompositing/main.cpp
bool KWinScreenEdgesConfig::effectEnabled(const BuiltInEffect& effect, const KConfigGroup& cfg) const
{
@@ -162,6 +194,7 @@
}
m_scripts << script.pluginId();
monitorAddItem(script.name());
+ m_scriptSettings[script.pluginId()] = new KWinTouchScreenScriptSettings(script.pluginId(), this);
}
monitorHideEdge(ElectricTopLeft, true);
@@ -172,184 +205,109 @@
monitorShowEvent();
}
-void KWinScreenEdgesConfig::monitorLoadAction(ElectricBorder edge, const QString& configName)
-{
- KConfigGroup config(m_config, "TouchEdges");
- QString lowerName = config.readEntry(configName, "None").toLower();
- if (lowerName == "showdesktop") monitorChangeEdge(edge, int(ElectricActionShowDesktop));
- else if (lowerName == "lockscreen") monitorChangeEdge(edge, int(ElectricActionLockScreen));
- else if (lowerName == "krunner") monitorChangeEdge(edge, int(ElectricActionKRunner));
- else if (lowerName == "activitymanager") monitorChangeEdge(edge, int(ElectricActionActivityManager));
- else if (lowerName == "applicationlauncher") monitorChangeEdge(edge, int(ElectricActionApplicationLauncher));
-}
-
-void KWinScreenEdgesConfig::monitorLoad()
+void KWinScreenEdgesConfig::monitorLoadSettings()
{
// Load ElectricBorderActions
- monitorLoadAction(ElectricTop, "Top");
- monitorLoadAction(ElectricRight, "Right");
- monitorLoadAction(ElectricBottom, "Bottom");
- monitorLoadAction(ElectricLeft, "Left");
+ monitorChangeEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->top()));
+ monitorChangeEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->right()));
+ monitorChangeEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->bottom()));
+ monitorChangeEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->left()));
// Load effect-specific actions:
- // Present Windows
- KConfigGroup presentWindowsConfig(m_config, "Effect-PresentWindows");
- QList list = QList();
- // PresentWindows BorderActivateAll
- list.append(int(ElectricTopLeft));
- list = presentWindowsConfig.readEntry("TouchBorderActivateAll", list);
+ // Present Windows BorderActivateAll
+ QList list = m_settings->touchBorderActivateAll();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(PresentWindowsAll));
}
// PresentWindows BorderActivate
- list.clear();
- list.append(int(ElectricNone));
- list = presentWindowsConfig.readEntry("TouchBorderActivate", list);
+ list = m_settings->touchBorderActivatePresentWindows();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(PresentWindowsCurrent));
}
// PresentWindows BorderActivateClass
- list.clear();
- list.append(int(ElectricNone));
- list = presentWindowsConfig.readEntry("TouchBorderActivateClass", list);
+ list = m_settings->touchBorderActivateClass();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(PresentWindowsClass));
}
- // Desktop Grid
- KConfigGroup gridConfig(m_config, "Effect-DesktopGrid");
- list.clear();
- list.append(int(ElectricNone));
- list = gridConfig.readEntry("TouchBorderActivate", list);
+ // Desktop Grid BorderActivate
+ list = m_settings->touchBorderActivateDesktopGrid();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(DesktopGrid));
}
- // Desktop Cube
- KConfigGroup cubeConfig(m_config, "Effect-Cube");
- list.clear();
- list.append(int(ElectricNone));
- list = cubeConfig.readEntry("TouchBorderActivate", list);
+ // Desktop Cube BorderActivate
+ list = m_settings->touchBorderActivateCube();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(Cube));
}
- list.clear();
- list.append(int(ElectricNone));
- list = cubeConfig.readEntry("TouchBorderActivateCylinder", list);
+ // Desktop Cube BorderActivateCylinder
+ list = m_settings->touchBorderActivateCylinder();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(Cylinder));
}
- list.clear();
- list.append(int(ElectricNone));
- list = cubeConfig.readEntry("TouchBorderActivateSphere", list);
+ // Desktop Cube BorderActivateSphere
+ list = m_settings->touchBorderActivateSphere();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(Sphere));
}
- // TabBox
- KConfigGroup tabBoxConfig(m_config, "TabBox");
- list.clear();
- // TabBox
- list.append(int(ElectricLeft));
- list = tabBoxConfig.readEntry("TouchBorderActivate", list);
+ // TabBox BorderActivate
+ list = m_settings->touchBorderActivateTabBox();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(TabBox));
}
// Alternative TabBox
- list.clear();
- list.append(int(ElectricNone));
- list = tabBoxConfig.readEntry("TouchBorderAlternativeActivate", list);
+ list = m_settings->touchBorderAlternativeActivate();
foreach (int i, list) {
monitorChangeEdge(ElectricBorder(i), int(TabBoxAlternative));
}
+ // Scripts
for (int i=0; i < m_scripts.size(); i++) {
int index = EffectCount + i;
- KConfigGroup scriptConfig(m_config, "Script-"+m_scripts[i]);
- list.append(int(ElectricNone));
- list = scriptConfig.readEntry("TouchBorderActivate", list);
+ list = m_scriptSettings[m_scripts[i]]->touchBorderActivate();
for (int i: list) {
monitorChangeEdge(ElectricBorder(i), index);
}
}
}
-void KWinScreenEdgesConfig::monitorSaveAction(int edge, const QString& configName)
-{
- KConfigGroup config(m_config, "TouchEdges");
- int item = m_ui->monitor->selectedEdgeItem(edge);
- if (item == 1)
- config.writeEntry(configName, "ShowDesktop");
- else if (item == 2)
- config.writeEntry(configName, "LockScreen");
- else if (item == 3)
- config.writeEntry(configName, "KRunner");
- else if (item == 4)
- config.writeEntry(configName, "ActivityManager");
- else if (item == 5)
- config.writeEntry(configName, "ApplicationLauncher");
- else // Anything else
- config.writeEntry(configName, "None");
-}
-
-void KWinScreenEdgesConfig::monitorSave()
+void KWinScreenEdgesConfig::monitorSaveSettings()
{
// Save ElectricBorderActions
- monitorSaveAction(int(Monitor::Top), "Top");
- monitorSaveAction(int(Monitor::Right), "Right");
- monitorSaveAction(int(Monitor::Bottom), "Bottom");
- monitorSaveAction(int(Monitor::Left), "Left");
+ m_settings->setTop(KWinScreenEdgesConfig::electricBorderActionToString(m_ui->monitor->selectedEdgeItem(static_cast(Monitor::Top))));
+ m_settings->setRight(KWinScreenEdgesConfig::electricBorderActionToString(m_ui->monitor->selectedEdgeItem(static_cast(Monitor::Right))));
+ m_settings->setBottom(KWinScreenEdgesConfig::electricBorderActionToString(m_ui->monitor->selectedEdgeItem(static_cast(Monitor::Bottom))));
+ m_settings->setLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_ui->monitor->selectedEdgeItem(static_cast(Monitor::Left))));
// Save effect-specific actions:
// Present Windows
- KConfigGroup presentWindowsConfig(m_config, "Effect-PresentWindows");
- presentWindowsConfig.writeEntry("TouchBorderActivate",
- monitorCheckEffectHasEdge(int(PresentWindowsAll)));
- presentWindowsConfig.writeEntry("TouchBorderActivateAll",
- monitorCheckEffectHasEdge(int(PresentWindowsCurrent)));
- presentWindowsConfig.writeEntry("TouchBorderActivateClass",
- monitorCheckEffectHasEdge(int(PresentWindowsClass)));
+ m_settings->setTouchBorderActivatePresentWindows(monitorCheckEffectHasEdge(static_cast(PresentWindowsAll)));
+ m_settings->setTouchBorderActivateAll(monitorCheckEffectHasEdge(static_cast(PresentWindowsCurrent)));
+ m_settings->setTouchBorderActivateClass(monitorCheckEffectHasEdge(static_cast(PresentWindowsClass)));
// Desktop Grid
- KConfigGroup gridConfig(m_config, "Effect-DesktopGrid");
- gridConfig.writeEntry("TouchBorderActivate",
- monitorCheckEffectHasEdge(int(DesktopGrid)));
+ m_settings->setTouchBorderActivateDesktopGrid(monitorCheckEffectHasEdge(static_cast(DesktopGrid)));
// Desktop Cube
- KConfigGroup cubeConfig(m_config, "Effect-Cube");
- cubeConfig.writeEntry("TouchBorderActivate",
- monitorCheckEffectHasEdge(int(Cube)));
- cubeConfig.writeEntry("TouchBorderActivateCylinder",
- monitorCheckEffectHasEdge(int(Cylinder)));
- cubeConfig.writeEntry("TouchBorderActivateSphere",
- monitorCheckEffectHasEdge(int(Sphere)));
+ m_settings->setTouchBorderActivateCube(monitorCheckEffectHasEdge(static_cast(Cube)));
+ m_settings->setTouchBorderActivateCylinder(monitorCheckEffectHasEdge(static_cast(Cylinder)));
+ m_settings->setTouchBorderActivateSphere(monitorCheckEffectHasEdge(static_cast(Sphere)));
// TabBox
- KConfigGroup tabBoxConfig(m_config, "TabBox");
- tabBoxConfig.writeEntry("TouchBorderActivate",
- monitorCheckEffectHasEdge(int(TabBox)));
- tabBoxConfig.writeEntry("TouchBorderAlternativeActivate",
- monitorCheckEffectHasEdge(int(TabBoxAlternative)));
+ m_settings->setTouchBorderActivateTabBox(monitorCheckEffectHasEdge(static_cast(TabBox)));
+ m_settings->setTouchBorderAlternativeActivate(monitorCheckEffectHasEdge(static_cast(TabBoxAlternative)));
- for (int i=0; i < m_scripts.size(); i++) {
+ // Scripts
+ for (int i = 0; i < m_scripts.size(); i++) {
int index = EffectCount + i;
- KConfigGroup scriptConfig(m_config, "Script-"+m_scripts[i]);
- scriptConfig.writeEntry("TouchBorderActivate",
- monitorCheckEffectHasEdge(index));
+ m_scriptSettings[m_scripts[i]]->setTouchBorderActivate(monitorCheckEffectHasEdge(index));
}
}
-void KWinScreenEdgesConfig::monitorDefaults()
-{
- // Clear all edges
- for (int i = 0; i < 8; i++)
- m_ui->monitor->selectEdgeItem(i, 0);
- // select TabBox
- m_ui->monitor->selectEdgeItem(int(Monitor::Left), int(TabBox));
-}
-
void KWinScreenEdgesConfig::monitorShowEvent()
{
// Check if they are enabled
@@ -466,6 +424,45 @@
return list;
}
+ElectricBorderAction KWinScreenEdgesConfig::electricBorderActionFromString(const QString &s)
+{
+ QString lowerName = s.toLower();
+ if (lowerName == QStringLiteral("showdesktop")) {
+ return ElectricActionShowDesktop;
+ }
+ if (lowerName == QStringLiteral("lockscreen")) {
+ return ElectricActionLockScreen;
+ }
+ if (lowerName == QStringLiteral("krunner")) {
+ return ElectricActionKRunner;
+ }
+ if (lowerName == QStringLiteral("activitymanager")) {
+ return ElectricActionActivityManager;
+ }
+ if (lowerName == QStringLiteral("applicationlauncher")) {
+ return ElectricActionApplicationLauncher;
+ }
+ return ElectricActionNone;
+}
+
+QString KWinScreenEdgesConfig::electricBorderActionToString(int a)
+{
+ switch (a) {
+ case 1:
+ return QStringLiteral("ShowDesktop");
+ case 2:
+ return QStringLiteral("LockScreen");
+ case 3:
+ return QStringLiteral("KRunner");
+ case 4:
+ return QStringLiteral("ActivityManager");
+ case 5:
+ return QStringLiteral("ApplicationLauncher");
+ default:
+ return QStringLiteral("None");
+ }
+}
+
} // namespace
#include "touch.moc"