Phosphor
Qt6 / Wayland library suite for window-management tools
 
Loading...
Searching...
No Matches
TriggerParser.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2026 fuddlesworth
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#pragma once
5
6#include <phosphorcompositor_export.h>
7
8#include <QDBusArgument>
9#include <QVariant>
10#include <QVariantList>
11#include <QVariantMap>
12#include <QVector>
13#include <Qt>
14
15namespace PhosphorCompositor {
16
24{
25 int modifier = 0;
26 int mouseButton = 0;
27
30 bool operator==(const ParsedTrigger& other) const = default;
31};
32
39namespace TriggerParser {
40
50inline bool checkModifier(int modifierSetting, Qt::KeyboardModifiers mods)
51{
52 const bool shiftHeld = mods.testFlag(Qt::ShiftModifier);
53 const bool ctrlHeld = mods.testFlag(Qt::ControlModifier);
54 const bool altHeld = mods.testFlag(Qt::AltModifier);
55 const bool metaHeld = mods.testFlag(Qt::MetaModifier);
56
57 switch (modifierSetting) {
58 case 0:
59 return false; // Disabled
60 case 1:
61 return shiftHeld; // Shift
62 case 2:
63 return ctrlHeld; // Ctrl
64 case 3:
65 return altHeld; // Alt
66 case 4:
67 return metaHeld; // Meta
68 case 5:
69 return ctrlHeld && altHeld; // CtrlAlt
70 case 6:
71 return ctrlHeld && shiftHeld; // CtrlShift
72 case 7:
73 return altHeld && shiftHeld; // AltShift
74 case 8:
75 return true; // AlwaysActive
76 case 9:
77 return altHeld && metaHeld; // AltMeta
78 case 10:
79 return ctrlHeld && altHeld && metaHeld; // CtrlAltMeta
80 case 11:
81 return metaHeld && shiftHeld; // MetaShift
82 case 12:
83 return ctrlHeld && metaHeld; // CtrlMeta
84 default:
85 return false;
86 }
87}
88
97inline Qt::KeyboardModifiers modifierMaskFor(int modifierSetting)
98{
99 switch (modifierSetting) {
100 case 1:
101 return Qt::ShiftModifier;
102 case 2:
103 return Qt::ControlModifier;
104 case 3:
105 return Qt::AltModifier;
106 case 4:
107 return Qt::MetaModifier;
108 case 5:
109 return Qt::ControlModifier | Qt::AltModifier;
110 case 6:
111 return Qt::ControlModifier | Qt::ShiftModifier;
112 case 7:
113 return Qt::AltModifier | Qt::ShiftModifier;
114 case 9:
115 return Qt::AltModifier | Qt::MetaModifier;
116 case 10:
117 return Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
118 case 11:
119 return Qt::MetaModifier | Qt::ShiftModifier;
120 case 12:
121 return Qt::ControlModifier | Qt::MetaModifier;
122 default:
123 return Qt::NoModifier;
124 }
125}
126
142inline bool exactModifierMatch(int modifierSetting, Qt::KeyboardModifiers mods)
143{
144 constexpr Qt::KeyboardModifiers chordMask =
145 Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
146 return (mods & chordMask) == modifierMaskFor(modifierSetting);
147}
148
175inline bool anyTriggerHeldExact(const QVector<ParsedTrigger>& triggers, Qt::KeyboardModifiers mods,
176 Qt::MouseButtons mouseButtons)
177{
178 for (const auto& t : triggers) {
179 if (t.modifier == 0 && t.mouseButton == 0) {
180 continue;
181 }
182 const bool btnMatch = (t.mouseButton == 0) || (static_cast<int>(mouseButtons) & t.mouseButton) != 0;
183 if (exactModifierMatch(t.modifier, mods) && btnMatch) {
184 return true;
185 }
186 }
187 return false;
188}
189
198inline bool anyTriggerHeld(const QVector<ParsedTrigger>& triggers, Qt::KeyboardModifiers mods,
199 Qt::MouseButtons mouseButtons)
200{
201 for (const auto& t : triggers) {
202 const bool modMatch = (t.modifier == 0) || checkModifier(t.modifier, mods);
203 const bool btnMatch = (t.mouseButton == 0) || (static_cast<int>(mouseButtons) & t.mouseButton) != 0;
204 if (modMatch && btnMatch && (t.modifier != 0 || t.mouseButton != 0))
205 return true;
206 }
207 return false;
208}
209
221PHOSPHORCOMPOSITOR_EXPORT QVector<ParsedTrigger>
222parseTriggers(const QVariant& triggerVariant, const QString& modifierFieldName, const QString& mouseButtonFieldName);
223
224} // namespace TriggerParser
225} // namespace PhosphorCompositor
bool checkModifier(int modifierSetting, Qt::KeyboardModifiers mods)
Map DragModifier enum value to Qt modifier flags.
Definition TriggerParser.h:50
PHOSPHORCOMPOSITOR_EXPORT QVector< ParsedTrigger > parseTriggers(const QVariant &triggerVariant, const QString &modifierFieldName, const QString &mouseButtonFieldName)
Parse trigger list from D-Bus QVariantList (handles QDBusArgument wrapping)
Qt::KeyboardModifiers modifierMaskFor(int modifierSetting)
The Qt modifier mask a DragModifier enumerator stands for.
Definition TriggerParser.h:97
bool anyTriggerHeldExact(const QVector< ParsedTrigger > &triggers, Qt::KeyboardModifiers mods, Qt::MouseButtons mouseButtons)
Whether any trigger matches the current state exactly on MODIFIERS.
Definition TriggerParser.h:175
bool exactModifierMatch(int modifierSetting, Qt::KeyboardModifiers mods)
Whether mods is EXACTLY the combination modifierSetting names.
Definition TriggerParser.h:142
bool anyTriggerHeld(const QVector< ParsedTrigger > &triggers, Qt::KeyboardModifiers mods, Qt::MouseButtons mouseButtons)
Check if any parsed trigger is currently held.
Definition TriggerParser.h:198
Definition DaemonClient.h:22
Pre-parsed activation trigger (avoids QVariant unboxing in hot path)
Definition TriggerParser.h:24
int mouseButton
Definition TriggerParser.h:26
int modifier
Definition TriggerParser.h:25
bool operator==(const ParsedTrigger &other) const =default
Value equality, so a consumer caching a parsed list can tell a real settings change from a re-publish...