diff --git a/decorations/decorationbridge.h b/decorations/decorationbridge.h --- a/decorations/decorationbridge.h +++ b/decorations/decorationbridge.h @@ -58,6 +58,9 @@ bool needsBlur() const { return m_blur; } + QString recommendedBorderSize() const { + return m_recommendedBorderSize; + } void reconfigure(); @@ -67,13 +70,17 @@ QString supportInformation() const; +Q_SIGNALS: + void metaDataLoaded(); + private: void loadMetaData(const QJsonObject &object); void findTheme(const QVariantMap &map); void initPlugin(); QString readTheme() const; KPluginFactory *m_factory; bool m_blur; + QString m_recommendedBorderSize; QString m_plugin; QString m_defaultTheme; QString m_theme; diff --git a/decorations/decorationbridge.cpp b/decorations/decorationbridge.cpp --- a/decorations/decorationbridge.cpp +++ b/decorations/decorationbridge.cpp @@ -191,6 +191,7 @@ { // reset all settings m_blur = false; + m_recommendedBorderSize = QString(); m_theme = QString(); m_defaultTheme = QString(); @@ -205,7 +206,13 @@ if (blurIt != decoSettingsMap.end()) { m_blur = blurIt.value().toBool(); } + auto recBorderSizeIt = decoSettingsMap.find(QStringLiteral("recommendedBorderSize")); + if (recBorderSizeIt != decoSettingsMap.end()) { + m_recommendedBorderSize = recBorderSizeIt.value().toString(); + } findTheme(decoSettingsMap); + + Q_EMIT metaDataLoaded(); } void DecorationBridge::findTheme(const QVariantMap &map) @@ -285,6 +292,7 @@ QString b; b.append(QStringLiteral("Plugin: %1\n").arg(m_plugin)); b.append(QStringLiteral("Theme: %1\n").arg(m_theme)); + b.append(QStringLiteral("Plugin recommends border size: %1\n").arg(m_recommendedBorderSize > 0 ? QString(m_recommendedBorderSize) : "No")); b.append(QStringLiteral("Blur: %1\n").arg(m_blur)); const QMetaObject *metaOptions = m_settings->metaObject(); for (int i=0; ipropertyCount(); ++i) { diff --git a/decorations/settings.h b/decorations/settings.h --- a/decorations/settings.h +++ b/decorations/settings.h @@ -58,6 +58,7 @@ QVector< KDecoration2::DecorationButtonType > m_leftButtons; QVector< KDecoration2::DecorationButtonType > m_rightButtons; KDecoration2::BorderSize m_borderSize; + bool m_autoBorderSize = true; bool m_closeDoubleClickMenu = false; }; } // Decoration diff --git a/decorations/settings.cpp b/decorations/settings.cpp --- a/decorations/settings.cpp +++ b/decorations/settings.cpp @@ -19,6 +19,7 @@ *********************************************************************/ #include "settings.h" // KWin +#include "decorationbridge.h" #include "composite.h" #include "virtualdesktops.h" #include "workspace.h" @@ -58,6 +59,7 @@ } ); connect(Workspace::self(), &Workspace::configChanged, this, &SettingsImpl::readSettings); + connect(DecorationBridge::self(), &DecorationBridge::metaDataLoaded, this, &SettingsImpl::readSettings); } SettingsImpl::~SettingsImpl() = default; @@ -178,7 +180,13 @@ m_closeDoubleClickMenu = close; emit decorationSettings()->closeOnDoubleClickOnMenuChanged(m_closeDoubleClickMenu); } - const auto size = stringToSize(config.readEntry("BorderSize", QStringLiteral("Normal"))); + m_autoBorderSize = config.readEntry("BorderSizeAuto", true); + + auto size = stringToSize(config.readEntry("BorderSize", QStringLiteral("Normal"))); + if (m_autoBorderSize) { + /* Falls back to Normal border size, if the plugin does not provide a valid recommendation. */ + size = stringToSize(DecorationBridge::self()->recommendedBorderSize()); + } if (size != m_borderSize) { m_borderSize = size; emit decorationSettings()->borderSizeChanged(m_borderSize); diff --git a/kcmkwin/kwindecoration/kcm.cpp b/kcmkwin/kwindecoration/kcm.cpp --- a/kcmkwin/kwindecoration/kcm.cpp +++ b/kcmkwin/kwindecoration/kcm.cpp @@ -139,6 +139,10 @@ m_ui->doubleClickMessage->setVisible(false); m_ui->doubleClickMessage->setText(i18n("Close by double clicking:\n To open the menu, keep the button pressed until it appears.")); m_ui->doubleClickMessage->setCloseButtonVisible(true); + + m_ui->pluginBorderSize->setChecked(true); + m_ui->borderSizesCombo->setEnabled(false); + m_ui->borderSizesLabel->setEnabled(false); m_ui->borderSizesCombo->setItemData(0, QVariant::fromValue(BorderSize::None)); m_ui->borderSizesCombo->setItemData(1, QVariant::fromValue(BorderSize::NoSides)); m_ui->borderSizesCombo->setItemData(2, QVariant::fromValue(BorderSize::Tiny)); @@ -163,6 +167,12 @@ m_ui->doubleClickMessage->animatedHide(); } ); + connect(m_ui->pluginBorderSize, &QCheckBox::stateChanged, this, [this]() { + bool isAutoBorders = m_ui->pluginBorderSize->isChecked(); + m_ui->borderSizesCombo->setEnabled(!isAutoBorders); + m_ui->borderSizesLabel->setEnabled(!isAutoBorders); + changed(); + }); connect(m_ui->borderSizesCombo, static_cast(&QComboBox::currentIndexChanged), this, [this] (int index) { auto listView = m_quickView->rootObject()->findChild("listView"); @@ -308,6 +318,7 @@ const QString plugin = config.readEntry("library", s_defaultPlugin); const QString theme = config.readEntry("theme", s_defaultTheme); m_ui->closeWindowsDoubleClick->setChecked(config.readEntry("CloseOnDoubleClickOnMenu", false)); + m_ui->pluginBorderSize->setChecked(config.readEntry("BorderSizeAuto", true)); const QVariant border = QVariant::fromValue(stringToSize(config.readEntry("BorderSize", s_borderSizeNormal))); m_ui->borderSizesCombo->setCurrentIndex(m_ui->borderSizesCombo->findData(border)); @@ -346,6 +357,7 @@ { KConfigGroup config = KSharedConfig::openConfig("kwinrc")->group(s_pluginName); config.writeEntry("CloseOnDoubleClickOnMenu", m_ui->closeWindowsDoubleClick->isChecked()); + config.writeEntry("BorderSizeAuto", m_ui->pluginBorderSize->isChecked()); config.writeEntry("BorderSize", sizeToString(m_ui->borderSizesCombo->currentData().value())); if (auto listView = m_quickView->rootObject()->findChild("listView")) { const int currentIndex = listView->property("currentIndex").toInt(); diff --git a/kcmkwin/kwindecoration/kcm.ui b/kcmkwin/kwindecoration/kcm.ui --- a/kcmkwin/kwindecoration/kcm.ui +++ b/kcmkwin/kwindecoration/kcm.ui @@ -77,6 +77,16 @@ + + + + + + &Auto border size + + + + Qt::Horizontal @@ -92,7 +102,7 @@ - Border si&ze: + &Manual border size: Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter