diff --git a/kcmkwin/kwinscreenedges/CMakeLists.txt b/kcmkwin/kwinscreenedges/CMakeLists.txt --- a/kcmkwin/kwinscreenedges/CMakeLists.txt +++ b/kcmkwin/kwinscreenedges/CMakeLists.txt @@ -6,11 +6,13 @@ monitor.cpp screenpreviewwidget.cpp kwinscreenedge.cpp + kwinscreenedgeconfigform.cpp ) qt5_add_dbus_interface(kcm_screenedges_SRCS ${KWin_SOURCE_DIR}/org.kde.kwin.Effects.xml kwin_effects_interface) set(kcm_kwinscreenedges_PART_SRCS main.cpp ${kcm_screenedges_SRCS}) ki18n_wrap_ui(kcm_kwinscreenedges_PART_SRCS main.ui) +kconfig_add_kcfg_files(kcm_kwinscreenedges_PART_SRCS kwinscreenedgesettings.kcfgc kwinscreenedgescriptsettings.kcfgc) add_library(kcm_kwinscreenedges MODULE ${kcm_kwinscreenedges_PART_SRCS}) set(kcm_screenedges_LIBS Qt5::DBus diff --git a/kcmkwin/kwinscreenedges/kwinscreenedge.h b/kcmkwin/kwinscreenedges/kwinscreenedge.h --- a/kcmkwin/kwinscreenedges/kwinscreenedge.h +++ b/kcmkwin/kwinscreenedges/kwinscreenedge.h @@ -54,9 +54,9 @@ void monitorChangeDefaultEdge(const QList &borderList, int index); // revert to reference settings and assess for saveNeeded and default changed - void reload(); + virtual void reload(); // reset to default settings and assess for saveNeeded and default changed - void setDefaults(); + virtual void setDefaults(); private Q_SLOTS: void onChanged(); @@ -68,6 +68,8 @@ private: virtual Monitor *monitor() const = 0; + virtual bool isSaveNeeded() const; + virtual bool isDefault() const; // internal use, assert if border equals ELECTRIC_COUNT or ElectricNone static int electricBorderToMonitorEdge(ElectricBorder border); diff --git a/kcmkwin/kwinscreenedges/kwinscreenedge.cpp b/kcmkwin/kwinscreenedges/kwinscreenedge.cpp --- a/kcmkwin/kwinscreenedges/kwinscreenedge.cpp +++ b/kcmkwin/kwinscreenedges/kwinscreenedge.cpp @@ -193,17 +193,17 @@ void KWinScreenEdge::onChanged() { - bool needSave = false; + bool needSave = isSaveNeeded(); for (auto it = m_reference.begin(); it != m_reference.cend(); ++it) { needSave |= it.value() != monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key())); } emit saveNeededChanged(needSave); - bool isDefault = true; + bool defaults = isDefault(); for (auto it = m_default.begin(); it != m_default.cend(); ++it) { - isDefault &= it.value() == monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key())); + defaults &= it.value() == monitor()->selectedEdgeItem(KWinScreenEdge::electricBorderToMonitorEdge(it.key())); } - emit defaultChanged(isDefault); + emit defaultChanged(defaults); } void KWinScreenEdge::createConnection() @@ -214,4 +214,14 @@ &KWinScreenEdge::onChanged); } +bool KWinScreenEdge::isSaveNeeded() const +{ + return false; +} + +bool KWinScreenEdge::isDefault() const +{ + return true; +} + } // namespace diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.h b/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.h new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.h @@ -0,0 +1,72 @@ +/******************************************************************** + KWin - the KDE window manager + 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 +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#ifndef __KWINSCREENEDGECONFIGFORM_H__ +#define __KWINSCREENEDGECONFIGFORM_H__ + +#include "kwinscreenedge.h" + +namespace Ui +{ +class KWinScreenEdgesConfigUI; +} + +namespace KWin +{ + +class KWinScreenEdgesConfigForm : public KWinScreenEdge +{ + Q_OBJECT + +public: + KWinScreenEdgesConfigForm(QWidget *parent = nullptr); + ~KWinScreenEdgesConfigForm() override; + + // value is between 0. and 1. + void setElectricBorderCornerRatio(double value); + void setDefaultElectricBorderCornerRatio(double value); + + // return value between 0. and 1. + double electricBorderCornerRatio() const; + + void reload() override; + void setDefaults() override; + +protected: + Monitor *monitor() const override; + bool isSaveNeeded() const override; + bool isDefault() const override; + +private Q_SLOTS: + void sanitizeCooldown(); + void groupChanged(); + +private: + // electricBorderCornerRatio value between 0. and 1. + double m_referenceCornerRatio = 0.; + double m_defaultCornerRatio = 0.; + + Ui::KWinScreenEdgesConfigUI *ui; +}; + +} // namespace + +#endif diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.cpp b/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.cpp new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgeconfigform.cpp @@ -0,0 +1,110 @@ +/******************************************************************** + KWin - the KDE window manager + 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 +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ + +#include "kwinscreenedgeconfigform.h" +#include "ui_main.h" + +namespace KWin +{ + +KWinScreenEdgesConfigForm::KWinScreenEdgesConfigForm(QWidget *parent) + : KWinScreenEdge(parent) + , ui(new Ui::KWinScreenEdgesConfigUI) +{ + ui->setupUi(this); + + connect(ui->kcfg_ElectricBorderDelay, SIGNAL(valueChanged(int)), this, SLOT(sanitizeCooldown())); + + // Visual feedback of action group conflicts + connect(ui->kcfg_ElectricBorders, SIGNAL(currentIndexChanged(int)), this, SLOT(groupChanged())); + connect(ui->kcfg_ElectricBorderMaximize, SIGNAL(stateChanged(int)), this, SLOT(groupChanged())); + connect(ui->kcfg_ElectricBorderTiling, SIGNAL(stateChanged(int)), this, SLOT(groupChanged())); + + connect(ui->electricBorderCornerRatioSpin, SIGNAL(valueChanged(int)), this, SLOT(onChanged())); +} + +KWinScreenEdgesConfigForm::~KWinScreenEdgesConfigForm() +{ + delete ui; +} + +void KWinScreenEdgesConfigForm::setElectricBorderCornerRatio(double value) +{ + m_referenceCornerRatio = value; + ui->electricBorderCornerRatioSpin->setValue(m_referenceCornerRatio * 100.); +} + +void KWinScreenEdgesConfigForm::setDefaultElectricBorderCornerRatio(double value) +{ + m_defaultCornerRatio = value; +} + +double KWinScreenEdgesConfigForm::electricBorderCornerRatio() const +{ + return ui->electricBorderCornerRatioSpin->value() / 100.; +} + +void KWinScreenEdgesConfigForm::reload() +{ + ui->electricBorderCornerRatioSpin->setValue(m_referenceCornerRatio * 100.); + KWinScreenEdge::reload(); +} + +void KWinScreenEdgesConfigForm::setDefaults() +{ + ui->electricBorderCornerRatioSpin->setValue(m_defaultCornerRatio * 100.); + KWinScreenEdge::setDefaults(); +} + +Monitor *KWinScreenEdgesConfigForm::monitor() const +{ + return ui->monitor; +} + +bool KWinScreenEdgesConfigForm::isSaveNeeded() const +{ + return m_referenceCornerRatio != electricBorderCornerRatio(); +} + +bool KWinScreenEdgesConfigForm::isDefault() const +{ + return m_defaultCornerRatio == electricBorderCornerRatio(); +} + +void KWinScreenEdgesConfigForm::sanitizeCooldown() +{ + ui->kcfg_ElectricBorderCooldown->setMinimum(ui->kcfg_ElectricBorderDelay->value() + 50); +} + +void KWinScreenEdgesConfigForm::groupChanged() +{ + // Monitor conflicts + bool hide = false; + if (ui->kcfg_ElectricBorders->currentIndex() == 2) { + hide = true; + } + monitorHideEdge(ElectricTop, hide); + monitorHideEdge(ElectricRight, hide); + monitorHideEdge(ElectricBottom, hide); + monitorHideEdge(ElectricLeft, hide); +} + +} // namespace diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfg b/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfg new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfg @@ -0,0 +1,14 @@ + + + + + + + + ElectricNone + + + diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfgc b/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfgc new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgescriptsettings.kcfgc @@ -0,0 +1,7 @@ +File=kwinscreenedgescriptsettings.kcfg +NameSpace=KWin +ClassName=KWinScreenEdgeScriptSettings +IncludeFiles=kwinglobals.h +Mutators=true +DefaultValueGetters=true +ParentInConstructor=true diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfg b/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfg new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfg @@ -0,0 +1,88 @@ + + + + + + 0 + + + 150 + + + 350 + + + true + + + true + + + 0.25 + + + + + None + + + None + + + None + + + None + + + None + + + None + + + None + + + PresentWindowsAll + + + + + ElectricTopLeft + + + ElectricNone + + + ElectricNone + + + + + ElectricNone + + + + + ElectricNone + + + ElectricNone + + + ElectricNone + + + + + ElectricLeft + + + ElectricNone + + + diff --git a/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfgc b/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfgc new file mode 100644 --- /dev/null +++ b/kcmkwin/kwinscreenedges/kwinscreenedgesettings.kcfgc @@ -0,0 +1,7 @@ +File=kwinscreenedgesettings.kcfg +NameSpace=KWin +ClassName=KWinScreenEdgeSettings +IncludeFiles=kwinglobals.h +Mutators=true +DefaultValueGetters=true +ParentInConstructor=true diff --git a/kcmkwin/kwinscreenedges/main.h b/kcmkwin/kwinscreenedges/main.h --- a/kcmkwin/kwinscreenedges/main.h +++ b/kcmkwin/kwinscreenedges/main.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 @@ -26,43 +27,37 @@ #include "kwinglobals.h" -#include "ui_main.h" - class QShowEvent; namespace KWin { +class KWinScreenEdgesConfigForm; +class KWinScreenEdgeSettings; +class KWinScreenEdgeScriptSettings; enum class BuiltInEffect; -class KWinScreenEdgesConfigForm : public QWidget, public Ui::KWinScreenEdgesConfigForm -{ - Q_OBJECT - -public: - explicit KWinScreenEdgesConfigForm(QWidget* parent); -}; - class KWinScreenEdgesConfig : public KCModule { Q_OBJECT public: - explicit KWinScreenEdgesConfig(QWidget* parent, const QVariantList& args); + explicit KWinScreenEdgesConfig(QWidget *parent, const QVariantList &args); ~KWinScreenEdgesConfig() override; public Q_SLOTS: - virtual void groupChanged(); void save() override; void load() override; void defaults() override; + protected: - void showEvent(QShowEvent* e) override; -private Q_SLOTS: - void sanitizeCooldown(); + void showEvent(QShowEvent *e) override; + private: - KWinScreenEdgesConfigForm* m_ui; + KWinScreenEdgesConfigForm *m_form; KSharedConfigPtr m_config; QStringList m_scripts; //list of script IDs ordered in the list they are presented in the menu + QHash m_scriptSettings; + KWinScreenEdgeSettings *m_settings; enum EffectActions { PresentWindowsAll = ELECTRIC_ACTION_COUNT, // Start at the end of built in actions @@ -77,20 +72,16 @@ EffectCount }; - bool effectEnabled(const BuiltInEffect& effect, const KConfigGroup& cfg) const; + bool effectEnabled(const BuiltInEffect &effect, const KConfigGroup &cfg) const; - 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 monitorLoadDefaultSettings(); + void monitorSaveSettings(); void monitorShowEvent(); - void monitorChangeEdge(ElectricBorder border, int index); - void monitorHideEdge(ElectricBorder border, bool hidden); - QList monitorCheckEffectHasEdge(int index) const; + + static ElectricBorderAction electricBorderActionFromString(const QString &string); + static QString electricBorderActionToString(int action); }; } // namespace diff --git a/kcmkwin/kwinscreenedges/main.cpp b/kcmkwin/kwinscreenedges/main.cpp --- a/kcmkwin/kwinscreenedges/main.cpp +++ b/kcmkwin/kwinscreenedges/main.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 @@ -30,98 +31,66 @@ #include #include #include +#include + +#include "kwinscreenedgeconfigform.h" +#include "kwinscreenedgesettings.h" +#include "kwinscreenedgescriptsettings.h" K_PLUGIN_FACTORY(KWinScreenEdgesConfigFactory, registerPlugin();) namespace KWin { -KWinScreenEdgesConfigForm::KWinScreenEdgesConfigForm(QWidget* parent) - : QWidget(parent) -{ - setupUi(this); -} - -KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget* parent, const QVariantList& args) +KWinScreenEdgesConfig::KWinScreenEdgesConfig(QWidget *parent, const QVariantList &args) : KCModule(parent, args) + , m_form(new KWinScreenEdgesConfigForm(this)) , m_config(KSharedConfig::openConfig("kwinrc")) + , m_settings(new KWinScreenEdgeSettings(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())); - - connect(m_ui->desktopSwitchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(changed())); - connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(sanitizeCooldown())); - connect(m_ui->activationDelaySpin, SIGNAL(valueChanged(int)), this, SLOT(changed())); - connect(m_ui->triggerCooldownSpin, SIGNAL(valueChanged(int)), this, SLOT(changed())); - connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(changed())); - connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(changed())); - connect(m_ui->electricBorderCornerRatioSpin, SIGNAL(valueChanged(int)), this, SLOT(changed())); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(m_form); - // Visual feedback of action group conflicts - connect(m_ui->desktopSwitchCombo, SIGNAL(currentIndexChanged(int)), this, SLOT(groupChanged())); - connect(m_ui->quickMaximizeBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged())); - connect(m_ui->quickTileBox, SIGNAL(stateChanged(int)), this, SLOT(groupChanged())); + addConfig(m_settings, m_form); - load(); + monitorInit(); - sanitizeCooldown(); + connect(m_form, &KWinScreenEdgesConfigForm::saveNeededChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetChangeState); + connect(m_form, &KWinScreenEdgesConfigForm::defaultChanged, this, &KWinScreenEdgesConfig::unmanagedWidgetDefaultState); } KWinScreenEdgesConfig::~KWinScreenEdgesConfig() { } -void KWinScreenEdgesConfig::groupChanged() -{ - // Monitor conflicts - bool hide = false; - if (m_ui->desktopSwitchCombo->currentIndex() == 2) - hide = true; - monitorHideEdge(ElectricTop, hide); - monitorHideEdge(ElectricRight, hide); - monitorHideEdge(ElectricBottom, hide); - monitorHideEdge(ElectricLeft, hide); -} - void KWinScreenEdgesConfig::load() { KCModule::load(); + m_settings->load(); + for (KWinScreenEdgeScriptSettings *setting : qAsConst(m_scriptSettings)) { + setting->load(); + } - monitorLoad(); - - KConfigGroup config(m_config, "Windows"); - - m_ui->desktopSwitchCombo->setCurrentIndex(config.readEntry("ElectricBorders", 0)); - m_ui->activationDelaySpin->setValue(config.readEntry("ElectricBorderDelay", 150)); - m_ui->triggerCooldownSpin->setValue(config.readEntry("ElectricBorderCooldown", 350)); - m_ui->quickMaximizeBox->setChecked(config.readEntry("ElectricBorderMaximize", true)); - m_ui->quickTileBox->setChecked(config.readEntry("ElectricBorderTiling", true)); - m_ui->electricBorderCornerRatioSpin->setValue(qRound(config.readEntry("ElectricBorderCornerRatio", 0.25)*100)); - - emit changed(false); + monitorLoadSettings(); + monitorLoadDefaultSettings(); + m_form->setElectricBorderCornerRatio(m_settings->electricBorderCornerRatio()); + m_form->setDefaultElectricBorderCornerRatio(m_settings->defaultElectricBorderCornerRatioValue()); + m_form->reload(); } void KWinScreenEdgesConfig::save() { - KCModule::save(); - - monitorSave(); - - KConfigGroup config(m_config, "Windows"); - - config.writeEntry("ElectricBorders", m_ui->desktopSwitchCombo->currentIndex()); - config.writeEntry("ElectricBorderDelay", m_ui->activationDelaySpin->value()); - config.writeEntry("ElectricBorderCooldown", m_ui->triggerCooldownSpin->value()); - config.writeEntry("ElectricBorderMaximize", m_ui->quickMaximizeBox->isChecked()); - config.writeEntry("ElectricBorderTiling", m_ui->quickTileBox->isChecked()); - config.writeEntry("ElectricBorderCornerRatio", m_ui->electricBorderCornerRatioSpin->value()/100.0); + monitorSaveSettings(); + m_settings->setElectricBorderCornerRatio(m_form->electricBorderCornerRatio()); + m_settings->save(); + for (KWinScreenEdgeScriptSettings *setting : qAsConst(m_scriptSettings)) { + setting->save(); + } - config.sync(); + // Reload saved settings to ScreenEdge UI + monitorLoadSettings(); + m_form->setElectricBorderCornerRatio(m_settings->electricBorderCornerRatio()); + m_form->reload(); // Reload KWin. QDBusMessage message = QDBusMessage::createSignal("/KWin", "org.kde.KWin", "reloadConfig"); @@ -134,78 +103,54 @@ interface.reconfigureEffect(BuiltInEffects::nameForEffect(BuiltInEffect::DesktopGrid)); interface.reconfigureEffect(BuiltInEffects::nameForEffect(BuiltInEffect::Cube)); - emit changed(false); + KCModule::save(); } void KWinScreenEdgesConfig::defaults() { - monitorDefaults(); + m_form->setDefaults(); - m_ui->desktopSwitchCombo->setCurrentIndex(0); - m_ui->activationDelaySpin->setValue(150); - m_ui->triggerCooldownSpin->setValue(350); - m_ui->quickMaximizeBox->setChecked(true); - m_ui->quickTileBox->setChecked(true); - m_ui->electricBorderCornerRatioSpin->setValue(25); - - emit changed(true); + KCModule::defaults(); } -void KWinScreenEdgesConfig::showEvent(QShowEvent* e) +void KWinScreenEdgesConfig::showEvent(QShowEvent *e) { KCModule::showEvent(e); monitorShowEvent(); } -void KWinScreenEdgesConfig::sanitizeCooldown() -{ - m_ui->triggerCooldownSpin->setMinimum(m_ui->activationDelaySpin->value() + 50); -} - // Copied from kcmkwin/kwincompositing/main.cpp -bool KWinScreenEdgesConfig::effectEnabled(const BuiltInEffect& effect, const KConfigGroup& cfg) const +bool KWinScreenEdgesConfig::effectEnabled(const BuiltInEffect &effect, const KConfigGroup &cfg) const { return cfg.readEntry(BuiltInEffects::nameForEffect(effect) + "Enabled", BuiltInEffects::enabledByDefault(effect)); } //----------------------------------------------------------------------------- // Monitor -void KWinScreenEdgesConfig::monitorAddItem(const QString& item) -{ - for (int i = 0; i < 8; i++) - m_ui->monitor->addEdgeItem(i, item); -} - -void KWinScreenEdgesConfig::monitorItemSetEnabled(int index, bool enabled) -{ - for (int i = 0; i < 8; i++) - m_ui->monitor->setEdgeItemEnabled(i, index, enabled); -} - void KWinScreenEdgesConfig::monitorInit() { - monitorAddItem(i18n("No Action")); - monitorAddItem(i18n("Show Desktop")); - monitorAddItem(i18n("Lock Screen")); - monitorAddItem(i18n("Show KRunner")); - monitorAddItem(i18n("Activity Manager")); - monitorAddItem(i18n("Application Launcher")); + m_form->monitorAddItem(i18n("No Action")); + m_form->monitorAddItem(i18n("Show Desktop")); + m_form->monitorAddItem(i18n("Lock Screen")); + m_form->monitorAddItem(i18n("Show KRunner")); + m_form->monitorAddItem(i18n("Activity Manager")); + m_form->monitorAddItem(i18n("Application Launcher")); // Add the effects const QString presentWindowsName = BuiltInEffects::effectData(BuiltInEffect::PresentWindows).displayName; - monitorAddItem(i18n("%1 - All Desktops", presentWindowsName)); - monitorAddItem(i18n("%1 - Current Desktop", presentWindowsName)); - monitorAddItem(i18n("%1 - Current Application", presentWindowsName)); - monitorAddItem(BuiltInEffects::effectData(BuiltInEffect::DesktopGrid).displayName); + m_form->monitorAddItem(i18n("%1 - All Desktops", presentWindowsName)); + m_form->monitorAddItem(i18n("%1 - Current Desktop", presentWindowsName)); + m_form->monitorAddItem(i18n("%1 - Current Application", presentWindowsName)); + m_form->monitorAddItem(BuiltInEffects::effectData(BuiltInEffect::DesktopGrid).displayName); const QString cubeName = BuiltInEffects::effectData(BuiltInEffect::Cube).displayName; - monitorAddItem(i18n("%1 - Cube", cubeName)); - monitorAddItem(i18n("%1 - Cylinder", cubeName)); - monitorAddItem(i18n("%1 - Sphere", cubeName)); + m_form->monitorAddItem(i18n("%1 - Cube", cubeName)); + m_form->monitorAddItem(i18n("%1 - Cylinder", cubeName)); + m_form->monitorAddItem(i18n("%1 - Sphere", cubeName)); - monitorAddItem(i18n("Toggle window switching")); - monitorAddItem(i18n("Toggle alternative window switching")); + m_form->monitorAddItem(i18n("Toggle window switching")); + m_form->monitorAddItem(i18n("Toggle alternative window switching")); const QString scriptFolder = QStringLiteral("kwin/scripts/"); const auto scripts = KPackage::PackageLoader::self()->listPackages(QStringLiteral("KWin/Script"), scriptFolder); @@ -220,313 +165,195 @@ continue; } m_scripts << script.pluginId(); - monitorAddItem(script.name()); + m_form->monitorAddItem(script.name()); + m_scriptSettings[script.pluginId()] = new KWinScreenEdgeScriptSettings(script.pluginId(), this); } monitorShowEvent(); } -void KWinScreenEdgesConfig::monitorLoadAction(ElectricBorder edge, const QString& configName) -{ - KConfigGroup config(m_config, "ElectricBorders"); - 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(ElectricTopRight, "TopRight"); - monitorLoadAction(ElectricRight, "Right"); - monitorLoadAction(ElectricBottomRight, "BottomRight"); - monitorLoadAction(ElectricBottom, "Bottom"); - monitorLoadAction(ElectricBottomLeft, "BottomLeft"); - monitorLoadAction(ElectricLeft, "Left"); - monitorLoadAction(ElectricTopLeft, "TopLeft"); + m_form->monitorChangeEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->top())); + m_form->monitorChangeEdge(ElectricTopRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->topRight())); + m_form->monitorChangeEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->right())); + m_form->monitorChangeEdge(ElectricBottomRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->bottomRight())); + m_form->monitorChangeEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->bottom())); + m_form->monitorChangeEdge(ElectricBottomLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->bottomLeft())); + m_form->monitorChangeEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->left())); + m_form->monitorChangeEdge(ElectricTopLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->topLeft())); // Load effect-specific actions: - // Present Windows - KConfigGroup presentWindowsConfig(m_config, "Effect-PresentWindows"); - QList list = QList(); // PresentWindows BorderActivateAll - list.append(int(ElectricTopLeft)); - list = presentWindowsConfig.readEntry("BorderActivateAll", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(PresentWindowsAll)); - } + m_form->monitorChangeEdge(m_settings->borderActivateAll(), PresentWindowsAll); + // PresentWindows BorderActivate - list.clear(); - list.append(int(ElectricNone)); - list = presentWindowsConfig.readEntry("BorderActivate", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(PresentWindowsCurrent)); - } + m_form->monitorChangeEdge(m_settings->borderActivatePresentWindows(), PresentWindowsCurrent); + // PresentWindows BorderActivateClass - list.clear(); - list.append(int(ElectricNone)); - list = presentWindowsConfig.readEntry("BorderActivateClass", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(PresentWindowsClass)); - } + m_form->monitorChangeEdge(m_settings->borderActivateClass(), PresentWindowsClass); // Desktop Grid - KConfigGroup gridConfig(m_config, "Effect-DesktopGrid"); - list.clear(); - list.append(int(ElectricNone)); - list = gridConfig.readEntry("BorderActivate", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(DesktopGrid)); - } + m_form->monitorChangeEdge(m_settings->borderActivateDesktopGrid(), DesktopGrid); // Desktop Cube - KConfigGroup cubeConfig(m_config, "Effect-Cube"); - list.clear(); - list.append(int(ElectricNone)); - list = cubeConfig.readEntry("BorderActivate", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(Cube)); - } - list.clear(); - list.append(int(ElectricNone)); - list = cubeConfig.readEntry("BorderActivateCylinder", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(Cylinder)); - } - list.clear(); - list.append(int(ElectricNone)); - list = cubeConfig.readEntry("BorderActivateSphere", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(Sphere)); - } + m_form->monitorChangeEdge(m_settings->borderActivateCube(), Cube); + m_form->monitorChangeEdge(m_settings->borderActivateCylinder(), Cylinder); + m_form->monitorChangeEdge(m_settings->borderActivateSphere(), Sphere); // TabBox - KConfigGroup tabBoxConfig(m_config, "TabBox"); - list.clear(); - // TabBox - list.append(int(ElectricNone)); - list = tabBoxConfig.readEntry("BorderActivate", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(TabBox)); - } + m_form->monitorChangeEdge(m_settings->borderActivateTabBox(), TabBox); // Alternative TabBox - list.clear(); - list.append(int(ElectricNone)); - list = tabBoxConfig.readEntry("BorderAlternativeActivate", list); - foreach (int i, list) { - monitorChangeEdge(ElectricBorder(i), int(TabBoxAlternative)); - } + m_form->monitorChangeEdge(m_settings->borderAlternativeActivate(), 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]); - list.append(int(ElectricNone)); - list = scriptConfig.readEntry("BorderActivate", list); - for (int i: list) { - monitorChangeEdge(ElectricBorder(i), index); - } + m_form->monitorChangeEdge(m_scriptSettings[m_scripts[i]]->borderActivate(), index); } } -void KWinScreenEdgesConfig::monitorSaveAction(int edge, const QString& configName) +void KWinScreenEdgesConfig::monitorLoadDefaultSettings() { - KConfigGroup config(m_config, "ElectricBorders"); - 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"); + // Load ElectricBorderActions + m_form->monitorChangeDefaultEdge(ElectricTop, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultTopValue())); + m_form->monitorChangeDefaultEdge(ElectricTopRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultTopRightValue())); + m_form->monitorChangeDefaultEdge(ElectricRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultRightValue())); + m_form->monitorChangeDefaultEdge(ElectricBottomRight, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultBottomRightValue())); + m_form->monitorChangeDefaultEdge(ElectricBottom, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultBottomValue())); + m_form->monitorChangeDefaultEdge(ElectricBottomLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultBottomLeftValue())); + m_form->monitorChangeDefaultEdge(ElectricLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultLeftValue())); + m_form->monitorChangeDefaultEdge(ElectricTopLeft, KWinScreenEdgesConfig::electricBorderActionFromString(m_settings->defaultTopLeftValue())); + + // Load effect-specific actions: + + // PresentWindows BorderActivateAll + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateAllValue(), PresentWindowsAll); + + // PresentWindows BorderActivate + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivatePresentWindowsValue(), PresentWindowsCurrent); + + // PresentWindows BorderActivateClass + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateClassValue(), PresentWindowsClass); + + // Desktop Grid + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateDesktopGridValue(), DesktopGrid); + + // Desktop Cube + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateCubeValue(), Cube); + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateCylinderValue(), Cylinder); + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateSphereValue(), Sphere); + + // TabBox + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderActivateTabBoxValue(), TabBox); + // Alternative TabBox + m_form->monitorChangeDefaultEdge(m_settings->defaultBorderAlternativeActivateValue(), TabBoxAlternative); } -void KWinScreenEdgesConfig::monitorSave() +void KWinScreenEdgesConfig::monitorSaveSettings() { // Save ElectricBorderActions - monitorSaveAction(int(Monitor::Top), "Top"); - monitorSaveAction(int(Monitor::TopRight), "TopRight"); - monitorSaveAction(int(Monitor::Right), "Right"); - monitorSaveAction(int(Monitor::BottomRight), "BottomRight"); - monitorSaveAction(int(Monitor::Bottom), "Bottom"); - monitorSaveAction(int(Monitor::BottomLeft), "BottomLeft"); - monitorSaveAction(int(Monitor::Left), "Left"); - monitorSaveAction(int(Monitor::TopLeft), "TopLeft"); + m_settings->setTop(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTop))); + m_settings->setTopRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTopRight))); + m_settings->setRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricRight))); + m_settings->setBottomRight(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottomRight))); + m_settings->setBottom(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottom))); + m_settings->setBottomLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricBottomLeft))); + m_settings->setLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricLeft))); + m_settings->setTopLeft(KWinScreenEdgesConfig::electricBorderActionToString(m_form->selectedEdgeItem(ElectricTopLeft))); // Save effect-specific actions: // Present Windows - KConfigGroup presentWindowsConfig(m_config, "Effect-PresentWindows"); - presentWindowsConfig.writeEntry("BorderActivateAll", - monitorCheckEffectHasEdge(int(PresentWindowsAll))); - presentWindowsConfig.writeEntry("BorderActivate", - monitorCheckEffectHasEdge(int(PresentWindowsCurrent))); - presentWindowsConfig.writeEntry("BorderActivateClass", - monitorCheckEffectHasEdge(int(PresentWindowsClass))); + m_settings->setBorderActivateAll(m_form->monitorCheckEffectHasEdge(PresentWindowsAll)); + m_settings->setBorderActivatePresentWindows(m_form->monitorCheckEffectHasEdge(PresentWindowsCurrent)); + m_settings->setBorderActivateClass(m_form->monitorCheckEffectHasEdge(PresentWindowsClass)); // Desktop Grid - KConfigGroup gridConfig(m_config, "Effect-DesktopGrid"); - gridConfig.writeEntry("BorderActivate", - monitorCheckEffectHasEdge(int(DesktopGrid))); + m_settings->setBorderActivateDesktopGrid(m_form->monitorCheckEffectHasEdge(DesktopGrid)); // Desktop Cube - KConfigGroup cubeConfig(m_config, "Effect-Cube"); - cubeConfig.writeEntry("BorderActivate", - monitorCheckEffectHasEdge(int(Cube))); - cubeConfig.writeEntry("BorderActivateCylinder", - monitorCheckEffectHasEdge(int(Cylinder))); - cubeConfig.writeEntry("BorderActivateSphere", - monitorCheckEffectHasEdge(int(Sphere))); + m_settings->setBorderActivateCube(m_form->monitorCheckEffectHasEdge(Cube)); + m_settings->setBorderActivateCylinder(m_form->monitorCheckEffectHasEdge(Cylinder)); + m_settings->setBorderActivateSphere(m_form->monitorCheckEffectHasEdge(Sphere)); // TabBox - KConfigGroup tabBoxConfig(m_config, "TabBox"); - tabBoxConfig.writeEntry("BorderActivate", - monitorCheckEffectHasEdge(int(TabBox))); - tabBoxConfig.writeEntry("BorderAlternativeActivate", - monitorCheckEffectHasEdge(int(TabBoxAlternative))); + m_settings->setBorderActivateTabBox(m_form->monitorCheckEffectHasEdge(TabBox)); + m_settings->setBorderAlternativeActivate(m_form->monitorCheckEffectHasEdge(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("BorderActivate", - monitorCheckEffectHasEdge(index)); + m_scriptSettings[m_scripts[i]]->setBorderActivate(m_form->monitorCheckEffectHasEdge(index)); } } -void KWinScreenEdgesConfig::monitorDefaults() -{ - // Clear all edges - for (int i = 0; i < 8; i++) - m_ui->monitor->selectEdgeItem(i, 0); - - // Present windows = Top-left - m_ui->monitor->selectEdgeItem(int(Monitor::TopLeft), int(PresentWindowsAll)); -} - void KWinScreenEdgesConfig::monitorShowEvent() { // Check if they are enabled KConfigGroup config(m_config, "Plugins"); // Present Windows bool enabled = effectEnabled(BuiltInEffect::PresentWindows, config); - monitorItemSetEnabled(int(PresentWindowsCurrent), enabled); - monitorItemSetEnabled(int(PresentWindowsAll), enabled); + m_form->monitorItemSetEnabled(PresentWindowsCurrent, enabled); + m_form->monitorItemSetEnabled(PresentWindowsAll, enabled); // Desktop Grid enabled = effectEnabled(BuiltInEffect::DesktopGrid, config); - monitorItemSetEnabled(int(DesktopGrid), enabled); + m_form->monitorItemSetEnabled(DesktopGrid, enabled); // Desktop Cube enabled = effectEnabled(BuiltInEffect::Cube, config); - monitorItemSetEnabled(int(Cube), enabled); - monitorItemSetEnabled(int(Cylinder), enabled); - monitorItemSetEnabled(int(Sphere), enabled); + m_form->monitorItemSetEnabled(Cube, enabled); + m_form->monitorItemSetEnabled(Cylinder, enabled); + m_form->monitorItemSetEnabled(Sphere, enabled); // tabbox, depends on reasonable focus policy. KConfigGroup config2(m_config, "Windows"); QString focusPolicy = config2.readEntry("FocusPolicy", QString()); bool reasonable = focusPolicy != "FocusStrictlyUnderMouse" && focusPolicy != "FocusUnderMouse"; - monitorItemSetEnabled(int(TabBox), reasonable); - monitorItemSetEnabled(int(TabBoxAlternative), reasonable); + m_form->monitorItemSetEnabled(TabBox, reasonable); + m_form->monitorItemSetEnabled(TabBoxAlternative, reasonable); } -void KWinScreenEdgesConfig::monitorChangeEdge(ElectricBorder border, int index) +ElectricBorderAction KWinScreenEdgesConfig::electricBorderActionFromString(const QString &string) { - switch(border) { - case ElectricTop: - m_ui->monitor->selectEdgeItem(int(Monitor::Top), index); - break; - case ElectricTopRight: - m_ui->monitor->selectEdgeItem(int(Monitor::TopRight), index); - break; - case ElectricRight: - m_ui->monitor->selectEdgeItem(int(Monitor::Right), index); - break; - case ElectricBottomRight: - m_ui->monitor->selectEdgeItem(int(Monitor::BottomRight), index); - break; - case ElectricBottom: - m_ui->monitor->selectEdgeItem(int(Monitor::Bottom), index); - break; - case ElectricBottomLeft: - m_ui->monitor->selectEdgeItem(int(Monitor::BottomLeft), index); - break; - case ElectricLeft: - m_ui->monitor->selectEdgeItem(int(Monitor::Left), index); - break; - case ElectricTopLeft: - m_ui->monitor->selectEdgeItem(int(Monitor::TopLeft), index); - break; - default: // Nothing - break; + QString lowerName = string.toLower(); + if (lowerName == QStringLiteral("showdesktop")) { + return ElectricActionShowDesktop; } -} - -void KWinScreenEdgesConfig::monitorHideEdge(ElectricBorder border, bool hidden) -{ - switch(border) { - case ElectricTop: - m_ui->monitor->setEdgeHidden(int(Monitor::Top), hidden); - break; - case ElectricTopRight: - m_ui->monitor->setEdgeHidden(int(Monitor::TopRight), hidden); - break; - case ElectricRight: - m_ui->monitor->setEdgeHidden(int(Monitor::Right), hidden); - break; - case ElectricBottomRight: - m_ui->monitor->setEdgeHidden(int(Monitor::BottomRight), hidden); - break; - case ElectricBottom: - m_ui->monitor->setEdgeHidden(int(Monitor::Bottom), hidden); - break; - case ElectricBottomLeft: - m_ui->monitor->setEdgeHidden(int(Monitor::BottomLeft), hidden); - break; - case ElectricLeft: - m_ui->monitor->setEdgeHidden(int(Monitor::Left), hidden); - break; - case ElectricTopLeft: - m_ui->monitor->setEdgeHidden(int(Monitor::TopLeft), hidden); - break; - default: // Nothing - break; + 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; } -QList KWinScreenEdgesConfig::monitorCheckEffectHasEdge(int index) const +QString KWinScreenEdgesConfig::electricBorderActionToString(int action) { - QList list = QList(); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::Top)) == index) - list.append(int(ElectricTop)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::TopRight)) == index) - list.append(int(ElectricTopRight)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::Right)) == index) - list.append(int(ElectricRight)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::BottomRight)) == index) - list.append(int(ElectricBottomRight)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::Bottom)) == index) - list.append(int(ElectricBottom)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::BottomLeft)) == index) - list.append(int(ElectricBottomLeft)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::Left)) == index) - list.append(int(ElectricLeft)); - if (m_ui->monitor->selectedEdgeItem(int(Monitor::TopLeft)) == index) - list.append(int(ElectricTopLeft)); - - if (list.isEmpty()) - list.append(int(ElectricNone)); - return list; + switch (action) { + 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 diff --git a/kcmkwin/kwinscreenedges/main.ui b/kcmkwin/kwinscreenedges/main.ui --- a/kcmkwin/kwinscreenedges/main.ui +++ b/kcmkwin/kwinscreenedges/main.ui @@ -1,7 +1,7 @@ - KWinScreenEdgesConfigForm - + KWinScreenEdgesConfigUI + 0 @@ -67,12 +67,12 @@ &Maximize: - quickMaximizeBox + kcfg_ElectricBorderMaximize - + Windows dragged to top edge @@ -89,7 +89,7 @@ - + Windows dragged to left or right edge @@ -147,12 +147,12 @@ &Switch desktop on edge: - desktopSwitchCombo + kcfg_ElectricBorders - + Disabled @@ -179,12 +179,12 @@ Activation &delay: - activationDelaySpin + kcfg_ElectricBorderDelay - + ms @@ -211,12 +211,12 @@ &Reactivation delay: - triggerCooldownSpin + kcfg_ElectricBorderCooldown - + true @@ -280,7 +280,7 @@ - quickTileBox + kcfg_ElectricBorderTiling toggled(bool) label_1 setEnabled(bool) @@ -296,7 +296,7 @@ - quickTileBox + kcfg_ElectricBorderTiling toggled(bool) electricBorderCornerRatioSpin setEnabled(bool) @@ -312,7 +312,7 @@ - quickTileBox + kcfg_ElectricBorderTiling toggled(bool) electricBorderCornerRatioLabel setEnabled(bool)