Deskflow 1.26.0.207
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
Config.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2026 Deskflow Developers
4 * SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
5 * SPDX-FileCopyrightText: (C) 2002 Chris Schoeneman
6 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
7 */
8
9#pragma once
10
11#include "base/BaseException.h"
12#include "base/String.h"
15#include "net/NetworkAddress.h"
16#include "server/InputFilter.h"
17
18#include <iosfwd>
19#include <map>
20#include <set>
21
22namespace deskflow::server {
23class Config;
25} // namespace deskflow::server
26
27class IEventQueue;
28
29namespace std {
30template <> struct iterator_traits<deskflow::server::Config>
31{
32 using value_type = std::string;
33 using difference_type = ptrdiff_t;
34 using iterator_category = bidirectional_iterator_tag;
35 using pointer = std::string *;
36 using reference = std::string &;
37};
38} // namespace std
39
40namespace deskflow::server {
41
43
52class Config
53{
54public:
55 using ScreenOptions = std::map<OptionID, OptionValue>;
56 using Interval = std::pair<float, float>;
57
59 {
60 public:
61 CellEdge(Direction side, float position);
62 CellEdge(Direction side, const Interval &);
63 CellEdge(const std::string &name, Direction side, const Interval &);
64 ~CellEdge() = default;
65
66 Interval getInterval() const;
67 void setName(const std::string_view &newName);
68 std::string getName() const;
69 Direction getSide() const;
70 bool overlaps(const CellEdge &) const;
71 bool isInside(float x) const;
72
73 // transform position to [0,1]
74 float transform(float x) const;
75
76 // transform [0,1] to position
77 float inverseTransform(float x) const;
78
79 // compares side and start of interval
80 bool operator<(const CellEdge &) const;
81
82 // compares side and interval
83 bool operator==(const CellEdge &) const;
84
85 private:
86 void init(const std::string_view &name, Direction side, const Interval &);
87
88 private:
89 std::string m_name;
90 Direction m_side;
91 Interval m_interval;
92 };
93
94private:
95 class Name
96 {
97 public:
98 Name(Config *, const std::string &name);
99
100 bool operator==(const std::string &name) const;
101
102 private:
103 Config *m_config;
104 std::string m_name;
105 };
106
107 class Cell
108 {
109 private:
110 using EdgeLinks = std::map<CellEdge, CellEdge>;
111
112 public:
113 using const_iterator = EdgeLinks::const_iterator;
114
115 bool add(const CellEdge &src, const CellEdge &dst);
116 void remove(Direction side);
117 void remove(Direction side, float position);
118 void remove(const Name &destinationName);
119 void rename(const Name &oldName, const std::string &newName);
120
121 bool hasEdge(const CellEdge &) const;
122 bool overlaps(const CellEdge &) const;
123
124 bool getLink(Direction side, float position, const CellEdge *&src, const CellEdge *&dst) const;
125
126 bool operator==(const Cell &) const;
127
128 const_iterator begin() const;
129 const_iterator end() const;
130
131 private:
132 EdgeLinks m_neighbors;
133
134 public:
135 ScreenOptions m_options;
136 };
137 using CellMap = std::map<std::string, Cell, deskflow::string::CaselessCmp>;
138 using NameMap = std::map<std::string, std::string, deskflow::string::CaselessCmp>;
139
140public:
141 using link_const_iterator = Cell::const_iterator;
142 using internal_const_iterator = CellMap::const_iterator;
143 using all_const_iterator = NameMap::const_iterator;
144 class const_iterator : public std::iterator_traits<Config>
145 {
146 public:
147 explicit const_iterator() = default;
148 explicit const_iterator(const internal_const_iterator &i) : m_i(i)
149 {
150 // do nothing
151 }
152 const_iterator(const const_iterator &src) = default;
153 ~const_iterator() = default;
154
156 {
157 m_i = i.m_i;
158 return *this;
159 }
160 std::string operator*() const
161 {
162 return m_i->first;
163 }
164 const std::string *operator->() const
165 {
166 return &(m_i->first);
167 }
169 {
170 ++m_i;
171 return *this;
172 }
174 {
175 return const_iterator(m_i++);
176 }
178 {
179 --m_i;
180 return *this;
181 }
183 {
184 return const_iterator(m_i--);
185 }
186 bool operator==(const const_iterator &i) const
187 {
188 return (m_i == i.m_i);
189 }
190
191 private:
193 };
194
195 explicit Config(IEventQueue *events);
196 virtual ~Config() = default;
197
199
200
202
206 bool addScreen(const std::string &name);
207
209
213 bool renameScreen(const std::string &oldName, const std::string &newName);
214
216
221 void removeScreen(const std::string &name);
222
224
227 void removeAllScreens();
228
230
236 bool addAlias(const std::string &canonical, const std::string &alias);
237
239
243 bool removeAlias(const std::string &alias);
244
246
250 bool removeAliases(const std::string &canonical);
251
253
256 void removeAllAliases();
257
259
274 bool connect(
275 const std::string &srcName, Direction srcSide, float srcStart, float srcEnd, const std::string &dstName,
276 float dstStart, float dstEnd
277 );
278
280
284 bool disconnect(const std::string &srcName, Direction srcSide);
285
287
292 bool disconnect(const std::string &srcName, Direction srcSide, float position);
293
295
300
302
307 bool addOption(const std::string &name, OptionID option, OptionValue value);
308
310
315 bool removeOption(const std::string &name, OptionID option);
316
318
322 bool removeOptions(const std::string &name);
323
325
329 virtual InputFilter *getInputFilter();
330
332
334
336
339 bool isValidScreenName(const std::string &name) const;
340
342 const_iterator begin() const;
344 const_iterator end() const;
345
350
352
355 virtual bool isScreen(const std::string &name) const;
356
358
361 bool isCanonicalName(const std::string &name) const;
362
364
368 std::string getCanonicalName(const std::string &name) const;
369
371
378 std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const;
379
381
385 bool hasNeighbor(const std::string &, Direction) const;
386
388
392 bool hasNeighbor(const std::string &, Direction, float start, float end) const;
393
395 link_const_iterator beginNeighbor(const std::string &) const;
397 link_const_iterator endNeighbor(const std::string &) const;
398
400 const NetworkAddress &getDeskflowAddress() const;
401
403
408 const ScreenOptions *getOptions(const std::string &name) const;
409
411
415 bool hasLockToScreenAction() const;
416
418 bool operator==(const Config &) const;
419
421
425 void read(ConfigReadContext &context);
426
428
431 friend std::istream &operator>>(std::istream &, Config &);
432
434
437 friend std::ostream &operator<<(std::ostream &, const Config &);
438
440
443 static const char *dirName(Direction);
444
446
449 static std::string formatInterval(const Interval &);
451
452private:
453 void readSection(ConfigReadContext &);
454 void readSectionOptions(ConfigReadContext &);
455 void readSectionScreens(ConfigReadContext &);
456 void readSectionLinks(ConfigReadContext &);
457 void readSectionAliases(ConfigReadContext &);
458
460 parseCondition(const ConfigReadContext &, const std::string &condition, const std::vector<std::string> &args);
461 void parseAction(
462 ConfigReadContext &, const std::string &action, const std::vector<std::string> &args, InputFilter::Rule &,
463 bool activate
464 );
465
466 void parseScreens(const ConfigReadContext &, const std::string_view &, std::set<std::string> &screens) const;
467 static const char *getOptionName(OptionID);
468 static std::string getOptionValue(OptionID, OptionValue);
469
470private:
471 CellMap m_map;
472 NameMap m_nameToCanonicalName;
473 NetworkAddress m_deskflowAddress;
474 ScreenOptions m_globalOptions;
475 InputFilter m_inputFilter;
476 bool m_hasLockToScreenAction = false;
477 IEventQueue *m_events;
478};
479
481
485{
486public:
487 using ArgList = std::vector<std::string>;
488
489 explicit ConfigReadContext(std::istream &, int32_t firstLine = 1);
491
492 bool readLine(std::string &);
493 uint32_t getLineNumber() const;
494
495 bool operator!() const;
496
497 OptionValue parseBoolean(const std::string &) const;
498 OptionValue parseInt(const std::string &) const;
499 OptionValue parseModifierKey(const std::string &) const;
500 OptionValue parseCorner(const std::string &) const;
501 OptionValue parseCorners(const std::string &) const;
502 OptionValue parseProtocol(const std::string &) const;
503 Config::Interval parseInterval(const ArgList &args) const;
505 const std::string &type, const std::string &line, const std::string &delim, std::string::size_type &index,
506 std::string &name, ArgList &args
507 ) const;
508 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke) const;
509 IPlatformScreen::KeyInfo *parseKeystroke(const std::string &keystroke, const std::set<std::string> &screens) const;
510 IPlatformScreen::ButtonInfo parseMouse(const std::string &mouse) const;
511 KeyModifierMask parseModifier(const std::string &modifiers) const;
512 std::istream &getStream() const
513 {
514 return m_stream;
515 };
516
517private:
518 // not implemented
519 ConfigReadContext &operator=(const ConfigReadContext &);
520
521 static std::string concatArgs(const ArgList &args);
522
523private:
524 std::istream &m_stream;
525 int32_t m_line;
526};
527
529
533{
534public:
535 ServerConfigReadException(const ConfigReadContext &context, const std::string &);
536 ServerConfigReadException(const ConfigReadContext &context, const char *errorFmt, const std::string &arg);
537 ~ServerConfigReadException() throw() override = default;
538
539protected:
540 // BaseException overrides
541 QString getWhat() const throw() override;
542
543private:
544 std::string m_error;
545};
546
547} // namespace deskflow::server
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:28
static int type
Definition ArchNetworkWinsock.cpp:45
Direction
Computer edge directions for mouse movement.
Definition DirectionTypes.h:22
uint32_t KeyModifierMask
Modifier key mask.
Definition KeyTypes.h:44
int32_t OptionValue
Option Value.
Definition OptionTypes.h:23
uint32_t OptionID
Option ID.
Definition OptionTypes.h:17
int x
Definition ServerConfig.cpp:23
BaseException()
Use getWhat() as the result of what().
Definition BaseException.cpp:18
Event queue interface.
Definition IEventQueue.h:29
Key event data.
Definition IKeyState.h:31
Button event data.
Definition IPrimaryScreen.h:25
Definition InputFilter.h:36
Definition InputFilter.h:315
Definition InputFilter.h:23
Network address type.
Definition NetworkAddress.h:17
Configuration read context.
Definition Config.h:485
uint32_t getLineNumber() const
Definition Config.cpp:1704
IPlatformScreen::ButtonInfo parseMouse(const std::string &mouse) const
Definition Config.cpp:1998
bool operator!() const
Definition Config.cpp:1709
OptionValue parseProtocol(const std::string &) const
bool readLine(std::string &)
Definition Config.cpp:1666
void parseNameWithArgs(const std::string &type, const std::string &line, const std::string &delim, std::string::size_type &index, std::string &name, ArgList &args) const
Definition Config.cpp:1866
OptionValue parseModifierKey(const std::string &) const
Definition Config.cpp:1742
OptionValue parseCorner(const std::string &) const
Definition Config.cpp:1768
std::istream & getStream() const
Definition Config.h:512
OptionValue parseInt(const std::string &) const
Definition Config.cpp:1725
Config::Interval parseInterval(const ArgList &args) const
Definition Config.cpp:1838
std::vector< std::string > ArgList
Definition Config.h:487
ConfigReadContext(std::istream &, int32_t firstLine=1)
Definition Config.cpp:1661
IPlatformScreen::KeyInfo * parseKeystroke(const std::string &keystroke) const
Definition Config.cpp:1971
KeyModifierMask parseModifier(const std::string &modifiers) const
Definition Config.cpp:2019
OptionValue parseCorners(const std::string &) const
Definition Config.cpp:1794
OptionValue parseBoolean(const std::string &) const
Definition Config.cpp:1714
float inverseTransform(float x) const
Definition Config.cpp:1415
bool isInside(float x) const
Definition Config.cpp:1405
std::string getName() const
Definition Config.cpp:1384
float transform(float x) const
Definition Config.cpp:1410
bool operator<(const CellEdge &) const
Definition Config.cpp:1420
bool overlaps(const CellEdge &) const
Definition Config.cpp:1394
Direction getSide() const
Definition Config.cpp:1389
Interval getInterval() const
Definition Config.cpp:1374
void setName(const std::string_view &newName)
Definition Config.cpp:1379
CellEdge(Direction side, float position)
Definition Config.cpp:1342
bool operator==(const CellEdge &) const
Definition Config.cpp:1431
const_iterator operator++(int)
Definition Config.h:173
std::string operator*() const
Definition Config.h:160
const_iterator operator--(int)
Definition Config.h:182
const std::string * operator->() const
Definition Config.h:164
const_iterator & operator=(const const_iterator &i)
Definition Config.h:155
bool operator==(const const_iterator &i) const
Definition Config.h:186
const_iterator & operator--()
Definition Config.h:177
const_iterator & operator++()
Definition Config.h:168
const_iterator(const const_iterator &src)=default
const_iterator(const internal_const_iterator &i)
Definition Config.h:148
Server configuration.
Definition Config.h:53
friend std::ostream & operator<<(std::ostream &, const Config &)
Write configuration.
Definition Config.cpp:1580
static std::string formatInterval(const Interval &)
Get interval as string.
Definition Config.cpp:564
void removeAllAliases()
Remove all aliases.
Definition Config.cpp:185
bool hasNeighbor(const std::string &, Direction) const
Check for neighbor.
Definition Config.cpp:432
bool removeOptions(const std::string &name)
Remove a screen options.
Definition Config.cpp:294
bool addScreen(const std::string &name)
Add screen.
Definition Config.cpp:37
void read(ConfigReadContext &context)
Read configuration.
Definition Config.cpp:541
void setDeskflowAddress(const NetworkAddress &)
Set server address.
Definition Config.cpp:247
std::pair< float, float > Interval
Definition Config.h:56
virtual bool isScreen(const std::string &name) const
Test for screen name.
Definition Config.cpp:385
bool removeOption(const std::string &name, OptionID option)
Remove a screen option.
Definition Config.cpp:273
const NetworkAddress & getDeskflowAddress() const
Get the server address.
Definition Config.cpp:464
CellMap::const_iterator internal_const_iterator
Definition Config.h:142
bool addOption(const std::string &name, OptionID option, OptionValue value)
Add a screen option.
Definition Config.cpp:252
bool addAlias(const std::string &canonical, const std::string &alias)
Add alias.
Definition Config.cpp:129
const_iterator begin() const
Get beginning (canonical) screen name iterator.
Definition Config.cpp:365
bool removeAliases(const std::string &canonical)
Remove aliases.
Definition Config.cpp:166
bool removeAlias(const std::string &alias)
Remove alias.
Definition Config.cpp:147
bool disconnect(const std::string &srcName, Direction srcSide)
Disconnect screens.
Definition Config.cpp:215
const_iterator end() const
Get ending (canonical) screen name iterator.
Definition Config.cpp:370
bool connect(const std::string &srcName, Direction srcSide, float srcStart, float srcEnd, const std::string &dstName, float dstStart, float dstEnd)
Connect screens.
Definition Config.cpp:196
const ScreenOptions * getOptions(const std::string &name) const
Get the screen options.
Definition Config.cpp:469
all_const_iterator endAll() const
Get ending screen name iterator.
Definition Config.cpp:380
virtual InputFilter * getInputFilter()
Get the hot key input filter.
Definition Config.cpp:559
bool renameScreen(const std::string &oldName, const std::string &newName)
Rename screen.
Definition Config.cpp:53
std::string getNeighbor(const std::string &, Direction, float position, float *positionOut) const
Get neighbor.
Definition Config.cpp:405
void removeScreen(const std::string &name)
Remove screen.
Definition Config.cpp:95
all_const_iterator beginAll() const
Get beginning screen name iterator.
Definition Config.cpp:375
virtual ~Config()=default
Cell::const_iterator link_const_iterator
Definition Config.h:141
Config(IEventQueue *events)
Definition Config.cpp:32
static const char * dirName(Direction)
Get direction name.
Definition Config.cpp:550
bool operator==(const Config &) const
Compare configurations.
Definition Config.cpp:491
link_const_iterator beginNeighbor(const std::string &) const
Get beginning neighbor iterator.
Definition Config.cpp:450
link_const_iterator endNeighbor(const std::string &) const
Get ending neighbor iterator.
Definition Config.cpp:457
NameMap::const_iterator all_const_iterator
Definition Config.h:143
void removeAllScreens()
Remove all screens.
Definition Config.cpp:123
std::map< OptionID, OptionValue > ScreenOptions
Definition Config.h:55
bool hasLockToScreenAction() const
Check for lock to screen action.
Definition Config.cpp:486
std::string getCanonicalName(const std::string &name) const
Get canonical name.
Definition Config.cpp:395
bool isValidScreenName(const std::string &name) const
Test screen name validity.
Definition Config.cpp:315
friend std::istream & operator>>(std::istream &, Config &)
Read configuration.
Definition Config.cpp:1573
bool isCanonicalName(const std::string &name) const
Test for canonical screen name.
Definition Config.cpp:390
QString getWhat() const override
Get a human readable string describing the exception.
Definition Config.cpp:2069
ServerConfigReadException(const ConfigReadContext &context, const std::string &)
Definition Config.cpp:2052
Definition Config.cpp:27
Definition DaemonApp.h:18
Definition Config.h:29
ptrdiff_t difference_type
Definition Config.h:33
std::string * pointer
Definition Config.h:35
std::string & reference
Definition Config.h:36
std::string value_type
Definition Config.h:32
bidirectional_iterator_tag iterator_category
Definition Config.h:34