KWin
Loading...
Searching...
No Matches
shortcutsettings.cpp
Go to the documentation of this file.
1/*
2 KWin - the KDE window manager
3 This file is part of the KDE project.
4
5 SPDX-FileCopyrightText: 2023 Ismael Asensio <isma.af@gmail.com>
6
7 SPDX-License-Identifier: GPL-2.0-or-later
8*/
9
10#include "shortcutsettings.h"
11
12#include <QAction>
13
14#include <KActionCollection>
15#include <KGlobalAccel>
16#include <KLocalizedString>
17
18// Implementation of a KConfigSkeletonItem that uses KGlobalAccel to retrieve and store
19// shortcut settings instead of storing them in a config file
20class ShortcutItem : public KConfigSkeletonItem
21{
22public:
23 ShortcutItem(QAction *action, KActionCollection *actionCollection);
24
25 void readConfig(KConfig *config) override;
26 void writeConfig(KConfig *config) override;
27
28 void readDefault(KConfig *config) override;
29 void setDefault() override;
30 void swapDefault() override;
31
32 bool isEqual(const QVariant &p) const override;
33 QVariant property() const override;
34 void setProperty(const QVariant &p) override;
35
36private:
37 KActionCollection *m_actionCollection = nullptr;
38 QAction *m_action = nullptr;
39 QKeySequence m_savedShortcut;
40};
41
42ShortcutItem::ShortcutItem(QAction *action, KActionCollection *actionCollection)
43 : KConfigSkeletonItem(actionCollection->componentName(), action->text())
44 , m_actionCollection(actionCollection)
45 , m_action(action)
46{
47 setGetDefaultImpl([this] {
48 return m_actionCollection->defaultShortcut(m_action);
49 });
50
51 setIsDefaultImpl([this] {
52 return m_action->shortcut() == m_actionCollection->defaultShortcut(m_action);
53 });
54
55 setIsSaveNeededImpl([this] {
56 return (m_action->shortcut() != m_savedShortcut);
57 });
58}
59
60void ShortcutItem::readConfig(KConfig *config)
61{
62 const auto shortcuts = KGlobalAccel::self()->globalShortcut(m_actionCollection->componentName(), m_action->objectName());
63 m_savedShortcut = shortcuts.isEmpty() ? QKeySequence() : shortcuts.first();
64 m_action->setShortcut(m_savedShortcut);
65}
66
67void ShortcutItem::writeConfig(KConfig *config)
68{
69 m_savedShortcut = m_action->shortcut();
70 KGlobalAccel::self()->setShortcut(m_action, {m_action->shortcut()}, KGlobalAccel::NoAutoloading);
71}
72
73void ShortcutItem::readDefault(KConfig *config)
74{
75}
76
78{
79 m_action->setShortcut(m_actionCollection->defaultShortcut(m_action));
80}
81
83{
84 QKeySequence previousShortcut = m_action->shortcut();
85 m_action->setShortcut(m_actionCollection->defaultShortcut(m_action));
86 m_actionCollection->setDefaultShortcut(m_action, previousShortcut);
87}
88
89bool ShortcutItem::isEqual(const QVariant &p) const
90{
91 if (!p.canConvert<QKeySequence>()) {
92 return false;
93 }
94 return m_action->shortcut() == p.value<QKeySequence>();
95}
96
97QVariant ShortcutItem::property() const
98{
99 return QVariant::fromValue<QKeySequence>(m_action->shortcut());
100}
101
102void ShortcutItem::setProperty(const QVariant &p)
103{
104 m_action->setShortcut(p.value<QKeySequence>());
105}
106
107namespace KWin
108{
109namespace TabBox
110{
111
113 : KConfigSkeleton(nullptr, parent)
114 , m_actionCollection(new KActionCollection(this, QStringLiteral("kwin")))
115{
116 m_actionCollection->setConfigGroup("Navigation");
117 m_actionCollection->setConfigGlobal(true);
118
119 auto addShortcut = [this](const KLocalizedString &name, const QKeySequence &sequence = QKeySequence()) {
120 const QString untranslatedName = QString::fromUtf8(name.untranslatedText());
121 QAction *action = m_actionCollection->addAction(untranslatedName);
122 action->setObjectName(untranslatedName);
123 action->setProperty("isConfigurationAction", true);
124 action->setText(name.toString());
125
126 m_actionCollection->setDefaultShortcut(action, sequence);
127
128 addItem(new ShortcutItem(action, m_actionCollection));
129 };
130
131 // TabboxType::Main
132 addShortcut(ki18nd("kwin", "Walk Through Windows"), Qt::ALT | Qt::Key_Tab);
133 addShortcut(ki18nd("kwin", "Walk Through Windows (Reverse)"), Qt::ALT | Qt::SHIFT | Qt::Key_Tab);
134 addShortcut(ki18nd("kwin", "Walk Through Windows of Current Application"), Qt::ALT | Qt::Key_QuoteLeft);
135 addShortcut(ki18nd("kwin", "Walk Through Windows of Current Application (Reverse)"), Qt::ALT | Qt::Key_AsciiTilde);
136 // TabboxType::Alternative
137 addShortcut(ki18nd("kwin", "Walk Through Windows Alternative"));
138 addShortcut(ki18nd("kwin", "Walk Through Windows Alternative (Reverse)"));
139 addShortcut(ki18nd("kwin", "Walk Through Windows of Current Application Alternative"));
140 addShortcut(ki18nd("kwin", "Walk Through Windows of Current Application Alternative (Reverse)"));
141}
142
143KActionCollection *ShortcutSettings::actionCollection() const
144{
145 return m_actionCollection;
146}
147
148QKeySequence ShortcutSettings::shortcut(const QString &name) const
149{
150 QAction *action = m_actionCollection->action(name);
151 Q_ASSERT(action);
152 return action->shortcut();
153}
154
155void ShortcutSettings::setShortcut(const QString &name, const QKeySequence &seq)
156{
157 QAction *action = m_actionCollection->action(name);
158 Q_ASSERT(action);
159 action->setShortcut(seq);
160}
161
162bool ShortcutSettings::isDefault(const QString &name) const
163{
164 QAction *action = m_actionCollection->action(name);
165 Q_ASSERT(action);
166 return action->shortcut() == m_actionCollection->defaultShortcut(action);
167}
168
169} // namespace TabBox
170} // namespace KWin
QKeySequence shortcut(const QString &name) const
void setShortcut(const QString &name, const QKeySequence &seq)
bool isDefault(const QString &name) const
KActionCollection * actionCollection() const
QVariant property() const override
bool isEqual(const QVariant &p) const override
void writeConfig(KConfig *config) override
void setProperty(const QVariant &p) override
void setDefault() override
void readDefault(KConfig *config) override
void readConfig(KConfig *config) override
ShortcutItem(QAction *action, KActionCollection *actionCollection)
void swapDefault() override