From 24a4a87bacb207cc7f2a6002210eca4d25b6df95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Tue, 22 Jul 2014 16:02:22 +0200 Subject: [PATCH] Load settings for KDecoration2 based plugins * library to load * decoration buttons (based on old KDecoration1 implementation) --- decorations/decorationbridge.cpp | 4 +- decorations/settings.cpp | 72 ++++++++++++++++++++++++++++---- decorations/settings.h | 18 +++++++- 3 files changed, 82 insertions(+), 12 deletions(-) diff --git a/decorations/decorationbridge.cpp b/decorations/decorationbridge.cpp index 6f6ea97789..f4468340c4 100644 --- a/decorations/decorationbridge.cpp +++ b/decorations/decorationbridge.cpp @@ -63,12 +63,12 @@ DecorationBridge *DecorationBridge::self() void DecorationBridge::init() { + KConfigGroup config = KSharedConfig::openConfig(KWIN_CONFIG)->group(s_pluginName); KDecoration2::DecorationSettings::self(this); - // TODO: configurable plugin const auto offers = KPluginTrader::self()->query(s_pluginName, s_pluginName, - QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(QStringLiteral("org.kde.breeze"))); + QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(config.readEntry("library", "org.kde.breeze"))); if (offers.isEmpty()) { qWarning() << "Could not locate decoration plugin"; return; diff --git a/decorations/settings.cpp b/decorations/settings.cpp index 520e9a0ba4..b016cdec0d 100644 --- a/decorations/settings.cpp +++ b/decorations/settings.cpp @@ -22,8 +22,12 @@ along with this program. If not, see . #include "composite.h" #include "virtualdesktops.h" +#include + #include +#include + namespace KWin { namespace Decoration @@ -32,6 +36,8 @@ SettingsImpl::SettingsImpl(KDecoration2::DecorationSettings *parent) : QObject() , DecorationSettingsPrivate(parent) { + readSettings(); + connect(Compositor::self(), &Compositor::compositingToggled, parent, &KDecoration2::DecorationSettings::alphaChannelSupportedChanged); connect(VirtualDesktopManager::self(), &VirtualDesktopManager::countChanged, this, @@ -56,21 +62,71 @@ bool SettingsImpl::isOnAllDesktopsAvailable() const return VirtualDesktopManager::self()->count() > 1; } -QList< KDecoration2::DecorationButtonType > SettingsImpl::decorationButtonsLeft() const +static QHash s_buttonNames; +static void initButtons() { - return QList({ - KDecoration2::DecorationButtonType::Menu, - KDecoration2::DecorationButtonType::OnAllDesktops - }); + if (!s_buttonNames.isEmpty()) { + return; + } + s_buttonNames[KDecoration2::DecorationButtonType::Menu] = QChar('M'); + s_buttonNames[KDecoration2::DecorationButtonType::ApplicationMenu] = QChar('N'); + s_buttonNames[KDecoration2::DecorationButtonType::OnAllDesktops] = QChar('S'); + s_buttonNames[KDecoration2::DecorationButtonType::QuickHelp] = QChar('H'); + s_buttonNames[KDecoration2::DecorationButtonType::Minimize] = QChar('I'); + s_buttonNames[KDecoration2::DecorationButtonType::Maximize] = QChar('A'); + s_buttonNames[KDecoration2::DecorationButtonType::Close] = QChar('X'); + s_buttonNames[KDecoration2::DecorationButtonType::KeepAbove] = QChar('F'); + s_buttonNames[KDecoration2::DecorationButtonType::KeepBelow] = QChar('B'); + s_buttonNames[KDecoration2::DecorationButtonType::Shade] = QChar('L'); } -QList< KDecoration2::DecorationButtonType > SettingsImpl::decorationButtonsRight() const +static QString buttonsToString(const QList &buttons) { - return QList({ + auto buttonToString = [](KDecoration2::DecorationButtonType button) -> QChar { + const auto it = s_buttonNames.constFind(button); + if (it != s_buttonNames.constEnd()) { + return it.value(); + } + return QChar(); + }; + QString ret; + for (auto button : buttons) { + ret.append(buttonToString(button)); + } + return ret; +} + +QList< KDecoration2::DecorationButtonType > SettingsImpl::readDecorationButtons(const KConfigGroup &config, + const char *key, + const QList< KDecoration2::DecorationButtonType > &defaultValue) const +{ + initButtons(); + auto buttonsFromString = [](const QString &buttons) -> QList { + QList ret; + for (auto it = buttons.begin(); it != buttons.end(); ++it) { + for (auto it2 = s_buttonNames.constBegin(); it2 != s_buttonNames.constEnd(); ++it2) { + if (it2.value() == (*it)) { + ret << it2.key(); + } + } + } + return ret; + }; + return buttonsFromString(config.readEntry(key, buttonsToString(defaultValue))); +} + +void SettingsImpl::readSettings() +{ + KConfigGroup config = KSharedConfig::openConfig(KWIN_CONFIG)->group(QStringLiteral("org.kde.kdecoration2")); + m_leftButtons = readDecorationButtons(config, "ButtonsOnLeft", QList({ + KDecoration2::DecorationButtonType::Menu, + KDecoration2::DecorationButtonType::OnAllDesktops + })); + m_rightButtons = readDecorationButtons(config, "ButtonsOnRight", QList({ KDecoration2::DecorationButtonType::Minimize, KDecoration2::DecorationButtonType::Maximize, KDecoration2::DecorationButtonType::Close - }); + })); } } diff --git a/decorations/settings.h b/decorations/settings.h index 51c0604f82..fbde46bf81 100644 --- a/decorations/settings.h +++ b/decorations/settings.h @@ -24,6 +24,8 @@ along with this program. If not, see . #include +class KConfigGroup; + namespace KWin { namespace Decoration @@ -37,8 +39,20 @@ public: virtual ~SettingsImpl(); bool isAlphaChannelSupported() const override; bool isOnAllDesktopsAvailable() const override; - QList< KDecoration2::DecorationButtonType > decorationButtonsLeft() const override; - QList< KDecoration2::DecorationButtonType > decorationButtonsRight() const override; + QList< KDecoration2::DecorationButtonType > decorationButtonsLeft() const override { + return m_leftButtons; + } + QList< KDecoration2::DecorationButtonType > decorationButtonsRight() const override { + return m_rightButtons; + } + +private: + void readSettings(); + QList< KDecoration2::DecorationButtonType > readDecorationButtons(const KConfigGroup &config, + const char *key, + const QList< KDecoration2::DecorationButtonType > &defaultValue) const; + QList< KDecoration2::DecorationButtonType > m_leftButtons; + QList< KDecoration2::DecorationButtonType > m_rightButtons; }; } // Decoration } // KWin