9#include <config-kwin.h>
12#include "compositor.h"
15#include "virtualdesktops.h"
18#include <KConfigGroup>
19#include <KDecoration2/DecorationSettings>
21#include <QFontDatabase>
29 , DecorationSettingsPrivate(parent)
35 parent, &KDecoration2::DecorationSettings::alphaChannelSupportedChanged);
37 if (previous != 1 && current != 1) {
40 Q_EMIT parent->onAllDesktopsAvailableChanged(current > 1);
59 return VirtualDesktopManager::self()->count() > 1;
64 return m_closeDoubleClickMenu;
67static QHash<KDecoration2::DecorationButtonType, QChar> s_buttonNames;
68static void initButtons()
70 if (!s_buttonNames.isEmpty()) {
73 s_buttonNames[KDecoration2::DecorationButtonType::Menu] = QChar(
'M');
74 s_buttonNames[KDecoration2::DecorationButtonType::ApplicationMenu] = QChar(
'N');
75 s_buttonNames[KDecoration2::DecorationButtonType::OnAllDesktops] = QChar(
'S');
76 s_buttonNames[KDecoration2::DecorationButtonType::ContextHelp] = QChar(
'H');
77 s_buttonNames[KDecoration2::DecorationButtonType::Minimize] = QChar(
'I');
78 s_buttonNames[KDecoration2::DecorationButtonType::Maximize] = QChar(
'A');
79 s_buttonNames[KDecoration2::DecorationButtonType::Close] = QChar(
'X');
80 s_buttonNames[KDecoration2::DecorationButtonType::KeepAbove] = QChar(
'F');
81 s_buttonNames[KDecoration2::DecorationButtonType::KeepBelow] = QChar(
'B');
82 s_buttonNames[KDecoration2::DecorationButtonType::Shade] = QChar(
'L');
83 s_buttonNames[KDecoration2::DecorationButtonType::Spacer] = QChar(
'_');
86static QString buttonsToString(
const QList<KDecoration2::DecorationButtonType> &buttons)
88 auto buttonToString = [](KDecoration2::DecorationButtonType button) -> QChar {
89 const auto it = s_buttonNames.constFind(button);
90 if (it != s_buttonNames.constEnd()) {
96 for (
auto button : buttons) {
97 ret.append(buttonToString(button));
102QList<KDecoration2::DecorationButtonType> SettingsImpl::readDecorationButtons(
const KConfigGroup &config,
104 const QList<KDecoration2::DecorationButtonType> &defaultValue)
const
107 auto buttonsFromString = [](
const QString &buttons) -> QList<KDecoration2::DecorationButtonType> {
108 QList<KDecoration2::DecorationButtonType> ret;
109 for (
auto it = buttons.begin(); it != buttons.end(); ++it) {
110 for (
auto it2 = s_buttonNames.constBegin(); it2 != s_buttonNames.constEnd(); ++it2) {
111 if (it2.value() == (*it)) {
121static KDecoration2::BorderSize stringToSize(
const QString &name)
123 static const QMap<QString, KDecoration2::BorderSize> s_sizes = QMap<QString, KDecoration2::BorderSize>({{QStringLiteral(
"None"), KDecoration2::BorderSize::None},
124 {QStringLiteral(
"NoSides"), KDecoration2::BorderSize::NoSides},
125 {QStringLiteral(
"Tiny"), KDecoration2::BorderSize::Tiny},
126 {QStringLiteral(
"Normal"), KDecoration2::BorderSize::Normal},
127 {QStringLiteral(
"Large"), KDecoration2::BorderSize::Large},
128 {QStringLiteral(
"VeryLarge"), KDecoration2::BorderSize::VeryLarge},
129 {QStringLiteral(
"Huge"), KDecoration2::BorderSize::Huge},
130 {QStringLiteral(
"VeryHuge"), KDecoration2::BorderSize::VeryHuge},
131 {QStringLiteral(
"Oversized"), KDecoration2::BorderSize::Oversized}});
132 auto it = s_sizes.constFind(name);
133 if (it == s_sizes.constEnd()) {
135 return KDecoration2::BorderSize::Normal;
140void SettingsImpl::readSettings()
142 KConfigGroup config = kwinApp()->config()->group(QStringLiteral(
"org.kde.kdecoration2"));
143 const auto &left = readDecorationButtons(config,
"ButtonsOnLeft", QList<KDecoration2::DecorationButtonType>({KDecoration2::DecorationButtonType::Menu, KDecoration2::DecorationButtonType::OnAllDesktops}));
144 if (left != m_leftButtons) {
145 m_leftButtons = left;
146 Q_EMIT decorationSettings()->decorationButtonsLeftChanged(m_leftButtons);
148 const auto &right = readDecorationButtons(config,
"ButtonsOnRight", QList<KDecoration2::DecorationButtonType>({KDecoration2::DecorationButtonType::ContextHelp, KDecoration2::DecorationButtonType::Minimize, KDecoration2::DecorationButtonType::Maximize, KDecoration2::DecorationButtonType::Close}));
149 if (right != m_rightButtons) {
150 m_rightButtons = right;
151 Q_EMIT decorationSettings()->decorationButtonsRightChanged(m_rightButtons);
154 const bool close = config.readEntry(
"CloseOnDoubleClickOnMenu",
false);
155 if (close != m_closeDoubleClickMenu) {
156 m_closeDoubleClickMenu = close;
157 Q_EMIT decorationSettings()->closeOnDoubleClickOnMenuChanged(m_closeDoubleClickMenu);
159 m_autoBorderSize = config.readEntry(
"BorderSizeAuto",
true);
161 auto size = stringToSize(config.readEntry(
"BorderSize", QStringLiteral(
"Normal")));
162 if (m_autoBorderSize) {
164 size = stringToSize(
Workspace::self()->decorationBridge()->recommendedBorderSize());
166 if (size != m_borderSize) {
168 Q_EMIT decorationSettings()->borderSizeChanged(m_borderSize);
170 const QFont
font = QFontDatabase::systemFont(QFontDatabase::TitleFont);
171 if (
font != m_font) {
173 Q_EMIT decorationSettings()->fontChanged(m_font);
176 Q_EMIT decorationSettings()->reconfigured();
182#include "moc_settings.cpp"
void compositingToggled(bool active)
static bool compositing()
Static check to test whether the Compositor is available and active.
static Compositor * self()
bool isCloseOnDoubleClickOnMenu() const override
SettingsImpl(KDecoration2::DecorationSettings *parent)
bool isOnAllDesktopsAvailable() const override
bool isAlphaChannelSupported() const override
QFont font() const override
void countChanged(uint previousCount, uint newCount)
ApplicationMenu * applicationMenu() const
static Workspace * self()
DecorationButtonsList buttonsFromString(const QString &buttons)