9#include <config-kwin.h>
20#include <KConfigGroup>
22#include <QDBusConnection>
24#include <linux/input.h>
28static const QString s_socketName = QStringLiteral(
"wayland_test_kwin_modifier_only_shortcut-0");
29static const QString s_serviceName = QStringLiteral(
"org.kde.KWin.Test.ModifierOnlyShortcut");
30static const QString
s_path = QStringLiteral(
"/Test");
40 void testTrigger_data();
43 void testGlobalShortcutsDisabled_data();
44 void testGlobalShortcutsDisabled();
50 Q_CLASSINFO(
"D-Bus Interface",
"org.kde.KWin.Test.ModifierOnlyShortcut")
66 QDBusConnection::sessionBus().registerService(s_serviceName);
67 QDBusConnection::sessionBus().registerObject(
s_path, s_serviceName,
this, QDBusConnection::ExportScriptableSlots);
72 QDBusConnection::sessionBus().unregisterObject(
s_path);
73 QDBusConnection::sessionBus().unregisterService(s_serviceName);
81void ModifierOnlyShortcutTest::initTestCase()
86 QRect(0, 0, 1280, 1024),
87 QRect(1280, 0, 1280, 1024),
90 kwinApp()->setConfig(KSharedConfig::openConfig(QString(), KConfig::SimpleConfig));
91 qputenv(
"KWIN_XKB_DEFAULT_KEYMAP",
"1");
92 qputenv(
"XKB_DEFAULT_RULES",
"evdev");
95 QVERIFY(applicationStartedSpy.wait());
98void ModifierOnlyShortcutTest::init()
104void ModifierOnlyShortcutTest::cleanup()
108void ModifierOnlyShortcutTest::testTrigger_data()
110 QTest::addColumn<QStringList>(
"metaConfig");
111 QTest::addColumn<QStringList>(
"altConfig");
112 QTest::addColumn<QStringList>(
"controlConfig");
113 QTest::addColumn<QStringList>(
"shiftConfig");
114 QTest::addColumn<int>(
"modifier");
115 QTest::addColumn<QList<int>>(
"nonTriggeringMods");
117 const QStringList trigger = QStringList{s_serviceName,
s_path, s_serviceName, QStringLiteral(
"shortcut")};
118 const QStringList e = QStringList();
120 QTest::newRow(
"leftMeta") << trigger << e << e << e << KEY_LEFTMETA << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
121 QTest::newRow(
"rightMeta") << trigger << e << e << e << KEY_RIGHTMETA << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
122 QTest::newRow(
"leftAlt") << e << trigger << e << e << KEY_LEFTALT << QList<int>{KEY_LEFTMETA, KEY_RIGHTMETA, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
123 QTest::newRow(
"rightAlt") << e << trigger << e << e << KEY_RIGHTALT << QList<int>{KEY_LEFTMETA, KEY_RIGHTMETA, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
124 QTest::newRow(
"leftControl") << e << e << trigger << e << KEY_LEFTCTRL << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTMETA, KEY_RIGHTMETA, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
125 QTest::newRow(
"rightControl") << e << e << trigger << e << KEY_RIGHTCTRL << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTMETA, KEY_RIGHTMETA, KEY_LEFTSHIFT, KEY_RIGHTSHIFT};
126 QTest::newRow(
"leftShift") << e << e << e << trigger << KEY_LEFTSHIFT << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTMETA, KEY_RIGHTMETA};
127 QTest::newRow(
"rightShift") << e << e << e << trigger << KEY_RIGHTSHIFT << QList<int>{KEY_LEFTALT, KEY_RIGHTALT, KEY_LEFTCTRL, KEY_RIGHTCTRL, KEY_LEFTMETA, KEY_RIGHTMETA};
130void ModifierOnlyShortcutTest::testTrigger()
136 KConfigGroup group = kwinApp()->config()->group(QStringLiteral(
"ModifierOnlyShortcuts"));
137 QFETCH(QStringList, metaConfig);
138 QFETCH(QStringList, altConfig);
139 QFETCH(QStringList, shiftConfig);
140 QFETCH(QStringList, controlConfig);
141 group.writeEntry(
"Meta", metaConfig);
142 group.writeEntry(
"Alt", altConfig);
143 group.writeEntry(
"Shift", shiftConfig);
144 group.writeEntry(
"Control", controlConfig);
149 quint32 timestamp = 1;
150 QFETCH(
int, modifier);
153 QCOMPARE(triggeredSpy.count(), 1);
156 QFETCH(QList<int>, nonTriggeringMods);
157 for (
auto it = nonTriggeringMods.constBegin(), end = nonTriggeringMods.constEnd(); it != end; it++) {
160 QCOMPARE(triggeredSpy.count(), 1);
166 QCOMPARE(triggeredSpy.count(), 2);
173 QCOMPARE(triggeredSpy.count(), 2);
180 QCOMPARE(triggeredSpy.count(), 2);
187 QCOMPARE(triggeredSpy.count(), 2);
191 QCOMPARE(
input()->qtButtonStates(), Qt::LeftButton);
195 QCOMPARE(
input()->qtButtonStates(), Qt::NoButton);
196 QCOMPARE(triggeredSpy.count(), 2);
200 QCOMPARE(
input()->qtButtonStates(), Qt::LeftButton);
204 QCOMPARE(
input()->qtButtonStates(), Qt::NoButton);
205 QCOMPARE(triggeredSpy.count(), 2);
210 QCOMPARE(
input()->qtButtonStates(), Qt::LeftButton);
213 QCOMPARE(
input()->qtButtonStates(), Qt::NoButton);
214 QCOMPARE(triggeredSpy.count(), 2);
220 QCOMPARE(triggeredSpy.count(), 2);
226 QCOMPARE(triggeredSpy.count(), 2);
228#if KWIN_BUILD_SCREENLOCKER
233 QCOMPARE(triggeredSpy.count(), 2);
238 QCOMPARE(triggeredSpy.count(), 2);
244void ModifierOnlyShortcutTest::testCapsLock()
251 KConfigGroup group = kwinApp()->config()->group(QStringLiteral(
"ModifierOnlyShortcuts"));
252 group.writeEntry(
"Meta", QStringList());
253 group.writeEntry(
"Alt", QStringList());
254 group.writeEntry(
"Shift", QStringList{s_serviceName,
s_path, s_serviceName, QStringLiteral(
"shortcut")});
255 group.writeEntry(
"Control", QStringList());
260 quint32 timestamp = 1;
261 const int modifier = KEY_LEFTSHIFT;
264 QCOMPARE(triggeredSpy.count(), 1);
269 QCOMPARE(
input()->keyboardModifiers(), Qt::NoModifier);
270 QCOMPARE(triggeredSpy.count(), 1);
276 QCOMPARE(
input()->keyboardModifiers(), Qt::NoModifier);
277 QCOMPARE(triggeredSpy.count(), 2);
280 group.writeEntry(
"Meta", QStringList{s_serviceName,
s_path, s_serviceName, QStringLiteral(
"shortcut")});
281 group.writeEntry(
"Alt", QStringList());
282 group.writeEntry(
"Shift", QStringList{});
283 group.writeEntry(
"Control", QStringList());
287 QCOMPARE(
input()->keyboardModifiers(), Qt::MetaModifier);
288 QCOMPARE(
input()->keyboard()->xkb()->modifiersRelevantForGlobalShortcuts(), Qt::MetaModifier);
290 QCOMPARE(triggeredSpy.count(), 3);
293 group.writeEntry(
"Meta", QStringList());
294 group.writeEntry(
"Alt", QStringList());
295 group.writeEntry(
"Shift", QStringList{s_serviceName,
s_path, s_serviceName, QStringLiteral(
"shortcut")});
296 group.writeEntry(
"Control", QStringList());
303 QCOMPARE(
input()->keyboardModifiers(), Qt::NoModifier);
304 QCOMPARE(triggeredSpy.count(), 3);
307void ModifierOnlyShortcutTest::testGlobalShortcutsDisabled_data()
309 QTest::addColumn<QStringList>(
"metaConfig");
310 QTest::addColumn<QStringList>(
"altConfig");
311 QTest::addColumn<QStringList>(
"controlConfig");
312 QTest::addColumn<QStringList>(
"shiftConfig");
313 QTest::addColumn<int>(
"modifier");
315 const QStringList trigger = QStringList{s_serviceName,
s_path, s_serviceName, QStringLiteral(
"shortcut")};
316 const QStringList e = QStringList();
318 QTest::newRow(
"leftMeta") << trigger << e << e << e << KEY_LEFTMETA;
319 QTest::newRow(
"rightMeta") << trigger << e << e << e << KEY_RIGHTMETA;
320 QTest::newRow(
"leftAlt") << e << trigger << e << e << KEY_LEFTALT;
321 QTest::newRow(
"rightAlt") << e << trigger << e << e << KEY_RIGHTALT;
322 QTest::newRow(
"leftControl") << e << e << trigger << e << KEY_LEFTCTRL;
323 QTest::newRow(
"rightControl") << e << e << trigger << e << KEY_RIGHTCTRL;
324 QTest::newRow(
"leftShift") << e << e << e << trigger << KEY_LEFTSHIFT;
325 QTest::newRow(
"rightShift") << e << e << e << trigger << KEY_RIGHTSHIFT;
328void ModifierOnlyShortcutTest::testGlobalShortcutsDisabled()
336 KConfigGroup group = kwinApp()->config()->group(QStringLiteral(
"ModifierOnlyShortcuts"));
337 QFETCH(QStringList, metaConfig);
338 QFETCH(QStringList, altConfig);
339 QFETCH(QStringList, shiftConfig);
340 QFETCH(QStringList, controlConfig);
341 group.writeEntry(
"Meta", metaConfig);
342 group.writeEntry(
"Alt", altConfig);
343 group.writeEntry(
"Shift", shiftConfig);
344 group.writeEntry(
"Control", controlConfig);
349 quint32 timestamp = 1;
350 QFETCH(
int, modifier);
351 QVERIFY(!
workspace()->globalShortcutsDisabled());
354 QCOMPARE(triggeredSpy.count(), 1);
355 triggeredSpy.clear();
359 QVERIFY(
workspace()->globalShortcutsDisabled());
363 QCOMPARE(triggeredSpy.count(), 0);
364 triggeredSpy.clear();
368 QVERIFY(!
workspace()->globalShortcutsDisabled());
372 QCOMPARE(triggeredSpy.count(), 1);
376#include "modifier_only_shortcut_test.moc"
void setActiveOutput(Output *output)
void disableGlobalShortcutsForClient(bool disable)
Q_SCRIPTABLE void shortcut()
#define WAYLANDTEST_MAIN(TestObject)
void keyboardKeyReleased(quint32 key, quint32 time)
void setOutputConfig(const QList< QRect > &geometries)
void pointerAxisVertical(qreal delta, quint32 time, qint32 discreteDelta=0, InputRedirection::PointerAxisSource source=InputRedirection::PointerAxisSourceUnknown)
void keyboardKeyPressed(quint32 key, quint32 time)
void pointerAxisHorizontal(qreal delta, quint32 time, qint32 discreteDelta=0, InputRedirection::PointerAxisSource source=InputRedirection::PointerAxisSourceUnknown)
void pointerButtonPressed(quint32 button, quint32 time)
void pointerButtonReleased(quint32 button, quint32 time)
WaylandServer * waylandServer()
InputRedirection * input()