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"