Deskflow 1.24.0.365
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
InputFilter.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
5 * SPDX-FileCopyrightText: (C) 2005 Chris Schoeneman
6 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
7 */
8
9#pragma once
10
11#include "base/DirectionTypes.h"
13#include "deskflow/KeyTypes.h"
14#include "deskflow/MouseTypes.h"
15
16#include <set>
17
18class PrimaryClient;
19class Event;
20class IEventQueue;
21
23{
24public:
25 // -------------------------------------------------------------------------
26 // Input Filter Condition Classes
27 // -------------------------------------------------------------------------
34
36 {
37 public:
38 Condition() = default;
39 virtual ~Condition() = default;
40
41 virtual Condition *clone() const = 0;
42 virtual std::string format() const = 0;
43
44 virtual FilterStatus match(const Event &) = 0;
45
46 virtual void enablePrimary(PrimaryClient *);
47 virtual void disablePrimary(PrimaryClient *);
48 };
49
50 // KeystrokeCondition
52 {
53 public:
56 ~KeystrokeCondition() override = default;
57
58 KeyID getKey() const;
60
61 // Condition overrides
62 Condition *clone() const override;
63 std::string format() const override;
64 FilterStatus match(const Event &) override;
65 void enablePrimary(PrimaryClient *) override;
66 void disablePrimary(PrimaryClient *) override;
67
68 private:
69 uint32_t m_id = 0;
70 KeyID m_key;
71 KeyModifierMask m_mask;
72 IEventQueue *m_events;
73 };
74
75 // MouseButtonCondition
77 {
78 public:
81 ~MouseButtonCondition() override = default;
82
83 ButtonID getButton() const;
85
86 // Condition overrides
87 Condition *clone() const override;
88 std::string format() const override;
89 FilterStatus match(const Event &) override;
90
91 private:
92 ButtonID m_button;
93 KeyModifierMask m_mask;
94 IEventQueue *m_events;
95 };
96
97 // ScreenConnectedCondition
99 {
100 public:
101 ScreenConnectedCondition(IEventQueue *events, const std::string &screen);
102 ~ScreenConnectedCondition() override = default;
103
104 // Condition overrides
105 Condition *clone() const override;
106 std::string format() const override;
107 FilterStatus match(const Event &) override;
108
109 private:
110 std::string m_screen;
111 IEventQueue *m_events;
112 };
113
114 // -------------------------------------------------------------------------
115 // Input Filter Action Classes
116 // -------------------------------------------------------------------------
117
118 class Action
119 {
120 public:
121 Action() = default;
122 virtual ~Action() = default;
123
124 virtual Action *clone() const = 0;
125 virtual std::string format() const = 0;
126
127 virtual void perform(const Event &) = 0;
128 };
129
130 // LockCursorToScreenAction
132 {
133 public:
134 enum Mode
135 {
139 };
140
142
143 Mode getMode() const;
144
145 // Action overrides
146 Action *clone() const override;
147 std::string format() const override;
148 void perform(const Event &) override;
149
150 private:
151 Mode m_mode;
152 IEventQueue *m_events;
153 };
154
155 class RestartServer : public Action
156 {
157 public:
158 enum Mode
159 {
161 };
162
163 explicit RestartServer(Mode = restart);
164
165 Mode getMode() const;
166
167 // Action overrides
168 Action *clone() const override;
169 std::string format() const override;
170 void perform(const Event &) override;
171
172 private:
173 Mode m_mode;
174 };
175
176 // SwitchToScreenAction
178 {
179 public:
180 SwitchToScreenAction(IEventQueue *events, const std::string &screen);
181
182 std::string getScreen() const;
183
184 // Action overrides
185 Action *clone() const override;
186 std::string format() const override;
187 void perform(const Event &) override;
188
189 private:
190 std::string m_screen;
191 IEventQueue *m_events;
192 };
193
194 // SwitchInDirectionAction
196 {
197 public:
199
200 Direction getDirection() const;
201
202 // Action overrides
203 Action *clone() const override;
204 std::string format() const override;
205 void perform(const Event &) override;
206
207 private:
208 Direction m_direction;
209 IEventQueue *m_events;
210 };
211
212 // SwitchToNextScreenAction
214 {
215 public:
216 explicit SwitchToNextScreenAction(IEventQueue *events);
217
218 // Action overrides
219 Action *clone() const override;
220 std::string format() const override;
221 void perform(const Event &) override;
222
223 private:
224 IEventQueue *m_events;
225 };
226
227 // KeyboardBroadcastAction
229 {
230 public:
231 enum Mode
232 {
236 };
237
238 explicit KeyboardBroadcastAction(IEventQueue *events, Mode = kToggle);
239 explicit KeyboardBroadcastAction(IEventQueue *events, Mode, const std::set<std::string> &screens);
240
241 Mode getMode() const;
242 std::set<std::string> getScreens() const;
243
244 // Action overrides
245 Action *clone() const override;
246 std::string format() const override;
247 void perform(const Event &) override;
248
249 private:
250 Mode m_mode;
251 std::string m_screens;
252 IEventQueue *m_events;
253 };
254
255 // KeystrokeAction
256 class KeystrokeAction : public Action
257 {
258 public:
259 KeystrokeAction(IEventQueue *events, IPlatformScreen::KeyInfo *adoptedInfo, bool press);
262 ~KeystrokeAction() override;
263
266
268 const IPlatformScreen::KeyInfo *getInfo() const;
269 bool isOnPress() const;
270
271 // Action overrides
272 Action *clone() const override;
273 std::string format() const override;
274 void perform(const Event &) override;
275
276 protected:
277 virtual const char *formatName() const;
278
279 private:
280 IPlatformScreen::KeyInfo *m_keyInfo;
281 bool m_press;
282 IEventQueue *m_events;
283 };
284
285 // MouseButtonAction -- modifier combinations not implemented yet
287 {
288 public:
289 MouseButtonAction(IEventQueue *events, const IPlatformScreen::ButtonInfo &adoptedInfo, bool press);
292 ~MouseButtonAction() override = default;
293
296
298 bool isOnPress() const;
299
300 // Action overrides
301 Action *clone() const override;
302 std::string format() const override;
303 void perform(const Event &) override;
304
305 protected:
306 virtual const char *formatName() const;
307
308 private:
309 IPlatformScreen::ButtonInfo m_buttonInfo;
310 bool m_press;
311 IEventQueue *m_events;
312 };
313
314 class Rule
315 {
316 public:
317 Rule() = default;
318 explicit Rule(Condition *adopted);
319 Rule(const Rule &);
320 ~Rule();
321
322 Rule &operator=(const Rule &);
323
324 // replace the condition
325 void setCondition(Condition *adopted);
326
327 // add an action to the rule
328 void adoptAction(Action *, bool onActivation);
329
330 // remove an action from the rule
331 void removeAction(bool onActivation, uint32_t index);
332
333 // replace an action in the rule
334 void replaceAction(Action *adopted, bool onActivation, uint32_t index);
335
336 // enable/disable
337 void enable(PrimaryClient *);
338 void disable(PrimaryClient *);
339
340 // event handling
341 bool handleEvent(const Event &e);
342
343 // convert rule to a string
344 std::string format() const;
345
346 // get the rule's condition
347 const Condition *getCondition() const;
348
349 // get number of actions
350 uint32_t getNumActions(bool onActivation) const;
351
352 // get action by index
353 const Action &getAction(bool onActivation, uint32_t index) const;
354
355 private:
356 void clear();
357 void copy(const Rule &);
358
359 private:
360 using ActionList = std::vector<Action *>;
361
362 Condition *m_condition = nullptr;
363 ActionList m_activateActions;
364 ActionList m_deactivateActions;
365 };
366
367 // -------------------------------------------------------------------------
368 // Input Filter Class
369 // -------------------------------------------------------------------------
370 using RuleList = std::vector<Rule>;
371
372 explicit InputFilter(IEventQueue *events);
373 InputFilter(const InputFilter &);
374 ~InputFilter();
375
377
378 // add rule, adopting the condition and the actions
379 void addFilterRule(const Rule &rule);
380
381 // remove a rule
382 void removeFilterRule(uint32_t index);
383
384 // get rule by index
385 Rule &getRule(uint32_t index);
386
387 // enable event filtering using the given primary client. disable
388 // if client is nullptr.
389 void setPrimaryClient(PrimaryClient *client);
390
391 // convert rules to a string
392 std::string format(const std::string_view &linePrefix) const;
393
394 // get number of rules
395 uint32_t getNumRules() const;
396
398 bool operator==(const InputFilter &) const;
399
400private:
401 // event handling
402 void handleEvent(const Event &);
403
404private:
405 RuleList m_ruleList;
406 PrimaryClient *m_primaryClient = nullptr;
407 IEventQueue *m_events;
408};
Direction
Screen edge directions for mouse movement.
Definition DirectionTypes.h:22
int key
Definition KeySequence.cpp:15
uint32_t KeyID
Key ID.
Definition KeyTypes.h:21
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:44
uint8_t ButtonID
Mouse button ID.
Definition MouseTypes.h:16
Event.
Definition Event.h:29
Event queue interface.
Definition IEventQueue.h:29
Key event data.
Definition IKeyState.h:31
Button event data.
Definition IPrimaryScreen.h:25
Definition InputFilter.h:119
virtual void perform(const Event &)=0
virtual Action * clone() const =0
virtual ~Action()=default
virtual std::string format() const =0
Definition InputFilter.h:36
virtual Condition * clone() const =0
virtual void enablePrimary(PrimaryClient *)
Definition InputFilter.cpp:24
virtual void disablePrimary(PrimaryClient *)
Definition InputFilter.cpp:29
virtual std::string format() const =0
virtual ~Condition()=default
virtual FilterStatus match(const Event &)=0
KeyboardBroadcastAction(IEventQueue *events, Mode=kToggle)
Definition InputFilter.cpp:361
std::set< std::string > getScreens() const
Definition InputFilter.cpp:383
Mode getMode() const
Definition InputFilter.cpp:378
Mode
Definition InputFilter.h:232
@ kOn
Definition InputFilter.h:234
@ kOff
Definition InputFilter.h:233
@ kToggle
Definition InputFilter.h:235
std::string format() const override
Definition InputFilter.cpp:395
void perform(const Event &) override
Definition InputFilter.cpp:410
Action * clone() const override
Definition InputFilter.cpp:390
std::string format() const override
Definition InputFilter.cpp:458
KeystrokeAction & operator=(KeystrokeAction const &)=delete
KeystrokeAction & operator=(KeystrokeAction &&)=delete
virtual const char * formatName() const
Definition InputFilter.cpp:490
KeystrokeAction(KeystrokeAction &&)=delete
KeystrokeAction(KeystrokeAction const &)=delete
Action * clone() const override
Definition InputFilter.cpp:452
void perform(const Event &) override
Definition InputFilter.cpp:478
void adoptInfo(IPlatformScreen::KeyInfo *)
Definition InputFilter.cpp:436
bool isOnPress() const
Definition InputFilter.cpp:447
~KeystrokeAction() override
Definition InputFilter.cpp:431
const IPlatformScreen::KeyInfo * getInfo() const
Definition InputFilter.cpp:442
KeystrokeAction(IEventQueue *events, IPlatformScreen::KeyInfo *adoptedInfo, bool press)
Definition InputFilter.cpp:423
KeyID getKey() const
Definition InputFilter.cpp:50
std::string format() const override
Definition InputFilter.cpp:65
void disablePrimary(PrimaryClient *) override
Definition InputFilter.cpp:97
void enablePrimary(PrimaryClient *) override
Definition InputFilter.cpp:92
KeyModifierMask getMask() const
Definition InputFilter.cpp:55
KeystrokeCondition(IEventQueue *events, IPlatformScreen::KeyInfo *)
Definition InputFilter.cpp:34
Condition * clone() const override
Definition InputFilter.cpp:60
~KeystrokeCondition() override=default
FilterStatus match(const Event &) override
Definition InputFilter.cpp:70
Action * clone() const override
Definition InputFilter.cpp:215
Mode getMode() const
Definition InputFilter.cpp:210
std::string format() const override
Definition InputFilter.cpp:220
void perform(const Event &) override
Definition InputFilter.cpp:227
LockCursorToScreenAction(IEventQueue *events, Mode=kToggle)
Definition InputFilter.cpp:203
Mode
Definition InputFilter.h:135
@ kOn
Definition InputFilter.h:137
@ kToggle
Definition InputFilter.h:138
@ kOff
Definition InputFilter.h:136
MouseButtonAction & operator=(MouseButtonAction &&)=delete
void perform(const Event &) override
Definition InputFilter.cpp:528
MouseButtonAction(MouseButtonAction const &)=delete
~MouseButtonAction() override=default
virtual const char * formatName() const
Definition InputFilter.cpp:547
std::string format() const override
Definition InputFilter.cpp:520
const IPlatformScreen::ButtonInfo & getInfo() const
Definition InputFilter.cpp:505
bool isOnPress() const
Definition InputFilter.cpp:510
Action * clone() const override
Definition InputFilter.cpp:515
MouseButtonAction & operator=(MouseButtonAction const &)=delete
MouseButtonAction(MouseButtonAction &&)=delete
MouseButtonAction(IEventQueue *events, const IPlatformScreen::ButtonInfo &adoptedInfo, bool press)
Definition InputFilter.cpp:495
ButtonID getButton() const
Definition InputFilter.cpp:119
~MouseButtonCondition() override=default
MouseButtonCondition(IEventQueue *events, const IPlatformScreen::ButtonInfo &)
Definition InputFilter.cpp:103
FilterStatus match(const Event &) override
Definition InputFilter.cpp:143
KeyModifierMask getMask() const
Definition InputFilter.cpp:124
Condition * clone() const override
Definition InputFilter.cpp:129
std::string format() const override
Definition InputFilter.cpp:134
std::string format() const override
Definition InputFilter.cpp:255
Mode
Definition InputFilter.h:159
@ restart
Definition InputFilter.h:160
Mode getMode() const
Definition InputFilter.cpp:245
Action * clone() const override
Definition InputFilter.cpp:250
void perform(const Event &) override
Definition InputFilter.cpp:262
RestartServer(Mode=restart)
Definition InputFilter.cpp:240
Definition InputFilter.h:315
void replaceAction(Action *adopted, bool onActivation, uint32_t index)
Definition InputFilter.cpp:636
const Condition * getCondition() const
Definition InputFilter.cpp:732
Rule & operator=(const Rule &)
Definition InputFilter.cpp:571
void removeAction(bool onActivation, uint32_t index)
Definition InputFilter.cpp:625
std::string format() const
Definition InputFilter.cpp:698
void setCondition(Condition *adopted)
Definition InputFilter.cpp:608
uint32_t getNumActions(bool onActivation) const
Definition InputFilter.cpp:737
~Rule()
Definition InputFilter.cpp:566
void disable(PrimaryClient *)
Definition InputFilter.cpp:656
void enable(PrimaryClient *)
Definition InputFilter.cpp:649
const Action & getAction(bool onActivation, uint32_t index) const
Definition InputFilter.cpp:746
bool handleEvent(const Event &e)
Definition InputFilter.cpp:663
void adoptAction(Action *, bool onActivation)
Definition InputFilter.cpp:614
Condition * clone() const override
Definition InputFilter.cpp:177
FilterStatus match(const Event &) override
Definition InputFilter.cpp:187
~ScreenConnectedCondition() override=default
std::string format() const override
Definition InputFilter.cpp:182
ScreenConnectedCondition(IEventQueue *events, const std::string &screen)
Definition InputFilter.cpp:170
void perform(const Event &) override
Definition InputFilter.cpp:331
SwitchInDirectionAction(IEventQueue *events, Direction)
Definition InputFilter.cpp:307
Action * clone() const override
Definition InputFilter.cpp:319
std::string format() const override
Definition InputFilter.cpp:324
Direction getDirection() const
Definition InputFilter.cpp:314
SwitchToNextScreenAction(IEventQueue *events)
Definition InputFilter.cpp:339
void perform(const Event &) override
Definition InputFilter.cpp:354
Action * clone() const override
Definition InputFilter.cpp:344
std::string format() const override
Definition InputFilter.cpp:349
void perform(const Event &) override
Definition InputFilter.cpp:290
SwitchToScreenAction(IEventQueue *events, const std::string &screen)
Definition InputFilter.cpp:268
std::string getScreen() const
Definition InputFilter.cpp:275
Action * clone() const override
Definition InputFilter.cpp:280
std::string format() const override
Definition InputFilter.cpp:285
InputFilter(IEventQueue *events)
Definition InputFilter.cpp:758
bool operator==(const InputFilter &) const
Compare filters.
Definition InputFilter.cpp:873
void removeFilterRule(uint32_t index)
Definition InputFilter.cpp:794
~InputFilter()
Definition InputFilter.cpp:768
InputFilter & operator=(const InputFilter &)
Definition InputFilter.cpp:773
void addFilterRule(const Rule &rule)
Definition InputFilter.cpp:786
FilterStatus
Definition InputFilter.h:29
@ Deactivate
Definition InputFilter.h:32
@ Activate
Definition InputFilter.h:31
@ NoMatch
Definition InputFilter.h:30
Rule & getRule(uint32_t index)
Definition InputFilter.cpp:802
void setPrimaryClient(PrimaryClient *client)
Definition InputFilter.cpp:807
std::vector< Rule > RuleList
Definition InputFilter.h:370
uint32_t getNumRules() const
Definition InputFilter.cpp:868
std::string format(const std::string_view &linePrefix) const
Definition InputFilter.cpp:857
Primary screen as pseudo-client.
Definition PrimaryClient.h:23