Deskflow 1.22.0.197
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
12#include "deskflow/KeyTypes.h"
13#include "deskflow/MouseTypes.h"
15
16#include <map>
17#include <set>
18
19class PrimaryClient;
20class Event;
21class IEventQueue;
22
24{
25public:
26 // -------------------------------------------------------------------------
27 // Input Filter Condition Classes
28 // -------------------------------------------------------------------------
35
37 {
38 public:
39 Condition() = default;
40 virtual ~Condition() = default;
41
42 virtual Condition *clone() const = 0;
43 virtual std::string format() const = 0;
44
45 virtual FilterStatus match(const Event &) = 0;
46
47 virtual void enablePrimary(PrimaryClient *);
48 virtual void disablePrimary(PrimaryClient *);
49 };
50
51 // KeystrokeCondition
53 {
54 public:
57 ~KeystrokeCondition() override = default;
58
59 KeyID getKey() const;
61
62 // Condition overrides
63 Condition *clone() const override;
64 std::string format() const override;
65 FilterStatus match(const Event &) override;
66 void enablePrimary(PrimaryClient *) override;
67 void disablePrimary(PrimaryClient *) override;
68
69 private:
70 uint32_t m_id = 0;
71 KeyID m_key;
72 KeyModifierMask m_mask;
73 IEventQueue *m_events;
74 };
75
76 // MouseButtonCondition
78 {
79 public:
82 ~MouseButtonCondition() override = default;
83
84 ButtonID getButton() const;
86
87 // Condition overrides
88 Condition *clone() const override;
89 std::string format() const override;
90 FilterStatus match(const Event &) override;
91
92 private:
93 ButtonID m_button;
94 KeyModifierMask m_mask;
95 IEventQueue *m_events;
96 };
97
98 // ScreenConnectedCondition
100 {
101 public:
102 ScreenConnectedCondition(IEventQueue *events, const std::string &screen);
103 ~ScreenConnectedCondition() override = default;
104
105 // Condition overrides
106 Condition *clone() const override;
107 std::string format() const override;
108 FilterStatus match(const Event &) override;
109
110 private:
111 std::string m_screen;
112 IEventQueue *m_events;
113 };
114
115 // -------------------------------------------------------------------------
116 // Input Filter Action Classes
117 // -------------------------------------------------------------------------
118
119 class Action
120 {
121 public:
122 Action() = default;
123 virtual ~Action() = default;
124
125 virtual Action *clone() const = 0;
126 virtual std::string format() const = 0;
127
128 virtual void perform(const Event &) = 0;
129 };
130
131 // LockCursorToScreenAction
133 {
134 public:
135 enum Mode
136 {
140 };
141
143
144 Mode getMode() const;
145
146 // Action overrides
147 Action *clone() const override;
148 std::string format() const override;
149 void perform(const Event &) override;
150
151 private:
152 Mode m_mode;
153 IEventQueue *m_events;
154 };
155
156 class RestartServer : public Action
157 {
158 public:
159 enum Mode
160 {
162 };
163
165
166 Mode getMode() const;
167
168 // Action overrides
169 Action *clone() const override;
170 std::string format() const override;
171 void perform(const Event &) override;
172
173 private:
174 Mode m_mode;
175 IEventQueue *m_events;
176 };
177
178 // SwitchToScreenAction
180 {
181 public:
182 SwitchToScreenAction(IEventQueue *events, const std::string &screen);
183
184 std::string getScreen() const;
185
186 // Action overrides
187 Action *clone() const override;
188 std::string format() const override;
189 void perform(const Event &) override;
190
191 private:
192 std::string m_screen;
193 IEventQueue *m_events;
194 };
195
196 // SwitchInDirectionAction
198 {
199 public:
201
202 Direction getDirection() const;
203
204 // Action overrides
205 Action *clone() const override;
206 std::string format() const override;
207 void perform(const Event &) override;
208
209 private:
210 Direction m_direction;
211 IEventQueue *m_events;
212 };
213
214 // KeyboardBroadcastAction
216 {
217 public:
218 enum Mode
219 {
223 };
224
226 KeyboardBroadcastAction(IEventQueue *events, Mode, const std::set<std::string> &screens);
227
228 Mode getMode() const;
229 std::set<std::string> getScreens() const;
230
231 // Action overrides
232 Action *clone() const override;
233 std::string format() const override;
234 void perform(const Event &) override;
235
236 private:
237 Mode m_mode;
238 std::string m_screens;
239 IEventQueue *m_events;
240 };
241
242 // KeystrokeAction
243 class KeystrokeAction : public Action
244 {
245 public:
246 KeystrokeAction(IEventQueue *events, IPlatformScreen::KeyInfo *adoptedInfo, bool press);
249 ~KeystrokeAction() override;
250
253
255 const IPlatformScreen::KeyInfo *getInfo() const;
256 bool isOnPress() const;
257
258 // Action overrides
259 Action *clone() const override;
260 std::string format() const override;
261 void perform(const Event &) override;
262
263 protected:
264 virtual const char *formatName() const;
265
266 private:
267 IPlatformScreen::KeyInfo *m_keyInfo;
268 bool m_press;
269 IEventQueue *m_events;
270 };
271
272 // MouseButtonAction -- modifier combinations not implemented yet
274 {
275 public:
276 MouseButtonAction(IEventQueue *events, IPlatformScreen::ButtonInfo *adoptedInfo, bool press);
279 ~MouseButtonAction() override;
280
283
285 bool isOnPress() const;
286
287 // Action overrides
288 Action *clone() const override;
289 std::string format() const override;
290 void perform(const Event &) override;
291
292 protected:
293 virtual const char *formatName() const;
294
295 private:
296 IPlatformScreen::ButtonInfo *m_buttonInfo;
297 bool m_press;
298 IEventQueue *m_events;
299 };
300
301 class Rule
302 {
303 public:
304 Rule() = default;
305 explicit Rule(Condition *adopted);
306 Rule(const Rule &);
307 ~Rule();
308
309 Rule &operator=(const Rule &);
310
311 // replace the condition
312 void setCondition(Condition *adopted);
313
314 // add an action to the rule
315 void adoptAction(Action *, bool onActivation);
316
317 // remove an action from the rule
318 void removeAction(bool onActivation, uint32_t index);
319
320 // replace an action in the rule
321 void replaceAction(Action *adopted, bool onActivation, uint32_t index);
322
323 // enable/disable
324 void enable(PrimaryClient *);
325 void disable(PrimaryClient *);
326
327 // event handling
328 bool handleEvent(const Event &e);
329
330 // convert rule to a string
331 std::string format() const;
332
333 // get the rule's condition
334 const Condition *getCondition() const;
335
336 // get number of actions
337 uint32_t getNumActions(bool onActivation) const;
338
339 // get action by index
340 const Action &getAction(bool onActivation, uint32_t index) const;
341
342 private:
343 void clear();
344 void copy(const Rule &);
345
346 private:
347 using ActionList = std::vector<Action *>;
348
349 Condition *m_condition = nullptr;
350 ActionList m_activateActions;
351 ActionList m_deactivateActions;
352 };
353
354 // -------------------------------------------------------------------------
355 // Input Filter Class
356 // -------------------------------------------------------------------------
357 using RuleList = std::vector<Rule>;
358
359 explicit InputFilter(IEventQueue *events);
360 InputFilter(const InputFilter &);
361 ~InputFilter();
362
364
365 // add rule, adopting the condition and the actions
366 void addFilterRule(const Rule &rule);
367
368 // remove a rule
369 void removeFilterRule(uint32_t index);
370
371 // get rule by index
372 Rule &getRule(uint32_t index);
373
374 // enable event filtering using the given primary client. disable
375 // if client is nullptr.
376 void setPrimaryClient(PrimaryClient *client);
377
378 // convert rules to a string
379 std::string format(const std::string_view &linePrefix) const;
380
381 // get number of rules
382 uint32_t getNumRules() const;
383
385 bool operator==(const InputFilter &) const;
387 bool operator!=(const InputFilter &) const;
388
389private:
390 // event handling
391 void handleEvent(const Event &);
392
393private:
394 RuleList m_ruleList;
395 PrimaryClient *m_primaryClient = nullptr;
396 IEventQueue *m_events;
397};
Direction
Screen edge directions for mouse movement.
Definition DirectionTypes.h:21
int key
Definition KeySequence.cpp:15
uint32_t KeyID
Key ID.
Definition KeyTypes.h:22
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:45
uint8_t ButtonID
Mouse button ID.
Definition MouseTypes.h:16
Deskflow Network Protocol Specification and Implementation.
Event.
Definition Event.h:27
Event queue interface.
Definition IEventQueue.h:32
Key event data.
Definition IKeyState.h:31
Button event data.
Definition IPrimaryScreen.h:26
Definition InputFilter.h:120
virtual void perform(const Event &)=0
virtual Action * clone() const =0
virtual ~Action()=default
virtual std::string format() const =0
Definition InputFilter.h:37
virtual Condition * clone() const =0
virtual void enablePrimary(PrimaryClient *)
Definition InputFilter.cpp:23
virtual void disablePrimary(PrimaryClient *)
Definition InputFilter.cpp:28
virtual std::string format() const =0
virtual ~Condition()=default
virtual FilterStatus match(const Event &)=0
KeyboardBroadcastAction(IEventQueue *events, Mode=kToggle)
Definition InputFilter.cpp:338
std::set< std::string > getScreens() const
Definition InputFilter.cpp:360
Mode getMode() const
Definition InputFilter.cpp:355
Mode
Definition InputFilter.h:219
@ kOn
Definition InputFilter.h:221
@ kOff
Definition InputFilter.h:220
@ kToggle
Definition InputFilter.h:222
std::string format() const override
Definition InputFilter.cpp:372
void perform(const Event &) override
Definition InputFilter.cpp:387
Action * clone() const override
Definition InputFilter.cpp:367
std::string format() const override
Definition InputFilter.cpp:435
KeystrokeAction & operator=(KeystrokeAction const &)=delete
KeystrokeAction & operator=(KeystrokeAction &&)=delete
virtual const char * formatName() const
Definition InputFilter.cpp:467
KeystrokeAction(KeystrokeAction &&)=delete
KeystrokeAction(KeystrokeAction const &)=delete
Action * clone() const override
Definition InputFilter.cpp:429
void perform(const Event &) override
Definition InputFilter.cpp:455
void adoptInfo(IPlatformScreen::KeyInfo *)
Definition InputFilter.cpp:413
bool isOnPress() const
Definition InputFilter.cpp:424
~KeystrokeAction() override
Definition InputFilter.cpp:408
const IPlatformScreen::KeyInfo * getInfo() const
Definition InputFilter.cpp:419
KeystrokeAction(IEventQueue *events, IPlatformScreen::KeyInfo *adoptedInfo, bool press)
Definition InputFilter.cpp:400
KeyID getKey() const
Definition InputFilter.cpp:49
std::string format() const override
Definition InputFilter.cpp:64
void disablePrimary(PrimaryClient *) override
Definition InputFilter.cpp:96
void enablePrimary(PrimaryClient *) override
Definition InputFilter.cpp:91
KeyModifierMask getMask() const
Definition InputFilter.cpp:54
KeystrokeCondition(IEventQueue *events, IPlatformScreen::KeyInfo *)
Definition InputFilter.cpp:33
Condition * clone() const override
Definition InputFilter.cpp:59
~KeystrokeCondition() override=default
FilterStatus match(const Event &) override
Definition InputFilter.cpp:69
Action * clone() const override
Definition InputFilter.cpp:214
Mode getMode() const
Definition InputFilter.cpp:209
std::string format() const override
Definition InputFilter.cpp:219
void perform(const Event &) override
Definition InputFilter.cpp:226
LockCursorToScreenAction(IEventQueue *events, Mode=kToggle)
Definition InputFilter.cpp:202
Mode
Definition InputFilter.h:136
@ kOn
Definition InputFilter.h:138
@ kToggle
Definition InputFilter.h:139
@ kOff
Definition InputFilter.h:137
MouseButtonAction & operator=(MouseButtonAction &&)=delete
const IPlatformScreen::ButtonInfo * getInfo() const
Definition InputFilter.cpp:485
void perform(const Event &) override
Definition InputFilter.cpp:509
MouseButtonAction(MouseButtonAction const &)=delete
virtual const char * formatName() const
Definition InputFilter.cpp:528
~MouseButtonAction() override
Definition InputFilter.cpp:480
MouseButtonAction(IEventQueue *events, IPlatformScreen::ButtonInfo *adoptedInfo, bool press)
Definition InputFilter.cpp:472
std::string format() const override
Definition InputFilter.cpp:501
bool isOnPress() const
Definition InputFilter.cpp:490
Action * clone() const override
Definition InputFilter.cpp:495
MouseButtonAction & operator=(MouseButtonAction const &)=delete
MouseButtonAction(MouseButtonAction &&)=delete
ButtonID getButton() const
Definition InputFilter.cpp:118
MouseButtonCondition(IEventQueue *events, IPlatformScreen::ButtonInfo *)
Definition InputFilter.cpp:102
~MouseButtonCondition() override=default
FilterStatus match(const Event &) override
Definition InputFilter.cpp:142
KeyModifierMask getMask() const
Definition InputFilter.cpp:123
Condition * clone() const override
Definition InputFilter.cpp:128
std::string format() const override
Definition InputFilter.cpp:133
std::string format() const override
Definition InputFilter.cpp:254
Mode
Definition InputFilter.h:160
@ restart
Definition InputFilter.h:161
Mode getMode() const
Definition InputFilter.cpp:244
Action * clone() const override
Definition InputFilter.cpp:249
RestartServer(IEventQueue *events, Mode=restart)
Definition InputFilter.cpp:239
void perform(const Event &) override
Definition InputFilter.cpp:261
Definition InputFilter.h:302
void replaceAction(Action *adopted, bool onActivation, uint32_t index)
Definition InputFilter.cpp:617
const Condition * getCondition() const
Definition InputFilter.cpp:713
Rule & operator=(const Rule &)
Definition InputFilter.cpp:552
void removeAction(bool onActivation, uint32_t index)
Definition InputFilter.cpp:606
std::string format() const
Definition InputFilter.cpp:679
void setCondition(Condition *adopted)
Definition InputFilter.cpp:589
uint32_t getNumActions(bool onActivation) const
Definition InputFilter.cpp:718
~Rule()
Definition InputFilter.cpp:547
void disable(PrimaryClient *)
Definition InputFilter.cpp:637
void enable(PrimaryClient *)
Definition InputFilter.cpp:630
const Action & getAction(bool onActivation, uint32_t index) const
Definition InputFilter.cpp:727
bool handleEvent(const Event &e)
Definition InputFilter.cpp:644
void adoptAction(Action *, bool onActivation)
Definition InputFilter.cpp:595
Condition * clone() const override
Definition InputFilter.cpp:176
FilterStatus match(const Event &) override
Definition InputFilter.cpp:186
~ScreenConnectedCondition() override=default
std::string format() const override
Definition InputFilter.cpp:181
ScreenConnectedCondition(IEventQueue *events, const std::string &screen)
Definition InputFilter.cpp:169
void perform(const Event &) override
Definition InputFilter.cpp:330
SwitchInDirectionAction(IEventQueue *events, Direction)
Definition InputFilter.cpp:306
Action * clone() const override
Definition InputFilter.cpp:318
std::string format() const override
Definition InputFilter.cpp:323
Direction getDirection() const
Definition InputFilter.cpp:313
void perform(const Event &) override
Definition InputFilter.cpp:289
SwitchToScreenAction(IEventQueue *events, const std::string &screen)
Definition InputFilter.cpp:267
std::string getScreen() const
Definition InputFilter.cpp:274
Action * clone() const override
Definition InputFilter.cpp:279
std::string format() const override
Definition InputFilter.cpp:284
InputFilter(IEventQueue *events)
Definition InputFilter.cpp:739
bool operator==(const InputFilter &) const
Compare filters.
Definition InputFilter.cpp:854
void removeFilterRule(uint32_t index)
Definition InputFilter.cpp:775
~InputFilter()
Definition InputFilter.cpp:749
InputFilter & operator=(const InputFilter &)
Definition InputFilter.cpp:754
void addFilterRule(const Rule &rule)
Definition InputFilter.cpp:767
FilterStatus
Definition InputFilter.h:30
@ Deactivate
Definition InputFilter.h:33
@ Activate
Definition InputFilter.h:32
@ NoMatch
Definition InputFilter.h:31
Rule & getRule(uint32_t index)
Definition InputFilter.cpp:783
void setPrimaryClient(PrimaryClient *client)
Definition InputFilter.cpp:788
std::vector< Rule > RuleList
Definition InputFilter.h:357
uint32_t getNumRules() const
Definition InputFilter.cpp:849
bool operator!=(const InputFilter &) const
Compare filters.
Definition InputFilter.cpp:876
std::string format(const std::string_view &linePrefix) const
Definition InputFilter.cpp:838
Primary screen as pseudo-client.
Definition PrimaryClient.h:24