Deskflow 1.27.0.7
Keyboard and mouse sharing utility
Loading...
Searching...
No Matches
Settings.h
Go to the documentation of this file.
1/*
2 * Deskflow -- mouse and keyboard sharing utility
3 * SPDX-FileCopyrightText: (C) 2025 - 2026 Chris Rizzitello <sithlord48@gmail.com>
4 * SPDX-FileCopyrightText: (C) 2016 - 2025 Synergy App Ltd
5 * SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
6 */
7
8#pragma once
9
10#include <QSettings>
11
12#include <QDir>
13
14#include "common/Constants.h"
17
18class QFileSystemWatcher;
19class Settings : public QObject
20{
21 Q_OBJECT
22public:
23#if defined(Q_OS_WIN)
24 inline const static auto UserDir = QStringLiteral("%1/AppData/Roaming/%2").arg(QDir::homePath(), kAppName);
25 inline const static auto SystemDir = QStringLiteral("%1ProgramData/%2").arg(QDir::rootPath(), kAppName);
26#elif defined(Q_OS_MACOS)
27 inline const static auto UserDir = QStringLiteral("%1/Library/%2").arg(QDir::homePath(), kAppName);
28 inline const static auto SystemDir = QStringLiteral("/Library/%1").arg(kAppName);
29#else
30 inline const static auto UserDir = QStringLiteral("%1/.config/%2").arg(QDir::homePath(), kAppName);
31 inline const static auto SystemDir = QStringLiteral("/etc/%1").arg(kAppName);
32#endif
33
34 inline const static auto UserSettingFile = QStringLiteral("%1/%2.conf").arg(UserDir, kAppName);
35 inline const static auto SystemSettingFile = QStringLiteral("%1/%2.conf").arg(SystemDir, kAppName);
36
37 struct Client
38 {
39 inline static const auto DynamicConnectionRetry = QStringLiteral("client/dynamicConnectionInterval");
40 inline static const auto InvertYScroll = QStringLiteral("client/invertYScroll");
41 inline static const auto InvertXScroll = QStringLiteral("client/invertXScroll");
42 inline static const auto YScrollScale = QStringLiteral("client/yScrollScale");
43 inline static const auto XScrollScale = QStringLiteral("client/xScrollScale");
44 inline static const auto LanguageSync = QStringLiteral("client/languageSync");
45 inline static const auto RemoteHost = QStringLiteral("client/remoteHost");
46 inline static const auto XdpClipboardRetried = QStringLiteral("client/xdpClipboardRetried");
47 inline static const auto XdpRestoreToken = QStringLiteral("client/xdpRestoreToken");
48 };
49 struct Core
50 {
51 inline static const auto CoreMode = QStringLiteral("core/coreMode");
52 inline static const auto Interface = QStringLiteral("core/interface");
53 inline static const auto LastVersion = QStringLiteral("core/lastVersion");
54 inline static const auto Port = QStringLiteral("core/port");
55 inline static const auto PreventSleep = QStringLiteral("core/preventSleep");
56 inline static const auto ProcessMode = QStringLiteral("core/processMode");
57 inline static const auto ComputerName = QStringLiteral("core/computerName");
58 inline static const auto Display = QStringLiteral("core/display");
59 inline static const auto UseHooks = QStringLiteral("core/useHooks");
60 inline static const auto Language = QStringLiteral("core/language");
61 inline static const auto EnableEnterCommand = QStringLiteral("core/enableEnterCommand");
62 inline static const auto ComputerEnterCommand = QStringLiteral("core/enterCommand");
63 inline static const auto EnableExitCommand = QStringLiteral("core/enableExitCommand");
64 inline static const auto ComputerExitCommand = QStringLiteral("core/exitCommand");
65 };
66 struct Daemon
67 {
68 inline static const auto ConfigFile = QStringLiteral("daemon/configFile");
69 inline static const auto Elevate = QStringLiteral("daemon/elevate");
70 inline static const auto LogFile = QStringLiteral("daemon/logFile");
71 inline static const auto LogLevel = QStringLiteral("daemon/logLevel");
72 };
73 struct Gui
74 {
75 inline static const auto Autohide = QStringLiteral("gui/autoHide");
76 inline static const auto AutoStartCore = QStringLiteral("gui/startCoreWithGui");
77 inline static const auto AutoUpdateCheck = QStringLiteral("gui/enableUpdateCheck");
78 inline static const auto UpdateCheckUrl = QStringLiteral("gui/updateCheckUrl");
79 inline static const auto CloseReminder = QStringLiteral("gui/closeReminder");
80 inline static const auto CloseToTray = QStringLiteral("gui/closeToTray");
81 inline static const auto LogExpanded = QStringLiteral("gui/logExpanded");
82 inline static const auto SymbolicTrayIcon = QStringLiteral("gui/symbolicTrayIcon");
83 inline static const auto WindowGeometry = QStringLiteral("gui/windowGeometry");
84 inline static const auto ShownFirstConnectedMessage = QStringLiteral("gui/shownFirstConnectedMessage");
85 inline static const auto ShownServerFirstStartMessage = QStringLiteral("gui/shownServerFirstStartMessage");
86 inline static const auto ShowVersionInTitle = QStringLiteral("gui/showVersionInTitle");
87 inline static const auto IgnoreMissingKeyboardLayouts = QStringLiteral("gui/ignoreMissingKeyboardLayouts");
88 };
89 struct Log
90 {
91 inline static const auto File = QStringLiteral("log/file");
92 inline static const auto Level = QStringLiteral("log/level");
93 inline static const auto ToFile = QStringLiteral("log/toFile");
94 inline static const auto GuiDebug = QStringLiteral("log/guiDebug");
95 };
96 struct Security
97 {
98 inline static const auto CheckPeers = QStringLiteral("security/checkPeerFingerprints");
99 inline static const auto Certificate = QStringLiteral("security/certificate");
100 inline static const auto KeySize = QStringLiteral("security/keySize");
101 inline static const auto TlsEnabled = QStringLiteral("security/tlsEnabled");
102 };
103 struct Server
104 {
105 inline static const auto ClipboardSize = QStringLiteral("server/clipboardSize");
106 inline static const auto DefaultLockToComputerState = QStringLiteral("server/defaultLockToComputerState");
107 inline static const auto DisableLockToComputer = QStringLiteral("server/disableLockToComputer");
108 inline static const auto EnableClipboard = QStringLiteral("server/enableClipboard");
109 inline static const auto EnableHeartbeat = QStringLiteral("server/enableHeartbeat");
110 inline static const auto EnableSwitchDelay = QStringLiteral("server/enableSwitchDelay");
111 inline static const auto EnableSwitchDoubleTap = QStringLiteral("server/enableSwitchDoubleTap");
112 inline static const auto ExternalConfig = QStringLiteral("server/externalConfig");
113 inline static const auto ExternalConfigFile = QStringLiteral("server/externalConfigFile");
114 inline static const auto GridHeight = QStringLiteral("server/gridHeight");
115 inline static const auto GridWidth = QStringLiteral("server/gridWidth");
116 inline static const auto Heartbeat = QStringLiteral("server/heartbeat");
117 inline static const auto Protocol = QStringLiteral("server/protocol");
118 inline static const auto RelativeMouseMoves = QStringLiteral("server/relativeMouseMoves");
119 inline static const auto SwitchDelay = QStringLiteral("server/switchDelay");
120 inline static const auto SwitchDoubleTap = QStringLiteral("server/switchDoubleTap");
121 inline static const auto Win32KeepForeground = QStringLiteral("server/win32KeepForeground");
122 inline static const auto XdpClipboardRetried = QStringLiteral("server/xdpClipboardRetried");
123 inline static const auto XdpRestoreToken = QStringLiteral("server/xdpRestoreToken");
124 };
125
126 struct Computer
127 {
128 inline static const auto Aliases = QStringLiteral("computer_%1/aliases");
129 inline static const auto Name = QStringLiteral("computer_%1/name");
130 inline static const auto HalfDuplexCapsLock = QStringLiteral("computer_%1/halfDuplexCapsLock");
131 inline static const auto HalfDuplexNumLock = QStringLiteral("computer_%1/halfDuplexNumLock");
132 inline static const auto HalfDuplexScrollLock = QStringLiteral("computer_%1/halfDuplexScrollLock");
133 inline static const auto ModifierAlt = QStringLiteral("computer_%1/modifierAlt");
134 inline static const auto ModifierAltGr = QStringLiteral("computer_%1/modifierAltGr");
135 inline static const auto ModifierCtrl = QStringLiteral("computer_%1/modifierCtrl");
136 inline static const auto ModifierMeta = QStringLiteral("computer_%1/modifierMeta");
137 inline static const auto ModifierShift = QStringLiteral("computer_%1/modifierShift");
138 inline static const auto ModifierSuper = QStringLiteral("computer_%1/modifierSuper");
139 inline static const auto SwitchCornerSize = QStringLiteral("computer_%1/switchCornerSize");
140 inline static const auto SwitchCornerTopLeft = QStringLiteral("computer_%1/switchCornerTopLeft");
141 inline static const auto SwitchCornerTopRight = QStringLiteral("computer_%1/switchCornerTopRight");
142 inline static const auto SwitchCornerBottomLeft = QStringLiteral("computer_%1/switchCornerBottomLeft");
143 inline static const auto SwitchCornerBottomRight = QStringLiteral("computer_%1/switchCornerBottomRight");
144 inline static const auto WeakX11Focus = QStringLiteral("computer_%1/weakX11Focus");
145 inline static const auto XtestIsXineramaUnaware = QStringLiteral("computer_%1/xtestIsXineramaUnaware");
146 };
147
148 // Track Removed keys to make upgrading config easier
149 // REMOVE FOR 2.0
151 {
152 inline static const auto NumRows = QStringLiteral("internalConfig/numRows");
153 inline static const auto NumColumns = QStringLiteral("internalConfig/numColumns");
154 inline static const auto ClipboardSharing = QStringLiteral("internalConfig/clipboardSharing");
155 inline static const auto Heartbeat = QStringLiteral("internalConfig/heartbeat");
156 inline static const auto SwitchDelay = QStringLiteral("internalConfig/switchDelay");
157 inline static const auto HasHeartbeat = QStringLiteral("internalConfig/hasHeartbeat");
158 inline static const auto HasSwitchDelay = QStringLiteral("internalConfig/hasSwitchDelay");
159 inline static const auto HasSwitchDoubleTap = QStringLiteral("internalConfig/hasSwitchDoubleTap");
160 inline static const auto DefaultLockToScreenState = QStringLiteral("internalConfig/defaultLockToScreenState");
161 inline static const auto DisableLockToScreen = QStringLiteral("internalConfig/disableLockToScreen");
162 inline static const auto SwitchDoubleTapDelay = QStringLiteral("internalConfig/switchDoubleTap");
163 inline static const auto Win32KeepForeground = QStringLiteral("internalConfig/win32KeepForeground");
164 inline static const auto RelativeMouseMoves = QStringLiteral("internalConfig/relativeMouseMoves");
165 inline static const auto Protocol = QStringLiteral("internalConfig/protocol");
166 inline static const auto ClipboardSharingSize = QStringLiteral("internalConfig/clipboardSharingSize");
167 };
168
169 // Enums types used in settings
170 // The use of enum classes is not use for these
171 // enum classes are more specific when used with QVariant
172 // This leads longer function calls in code
173 // and longer more cryptic output in the settings file
174 // The using of standard enum will just write ints
175 // and we can read / write them as if they were ints
181 Q_ENUM(ProcessMode)
182
189 Q_ENUM(CoreMode)
190
191 static Settings *instance();
192 static void setSettingsFile(const QString &settingsFile = QString());
193 static void setStateFile(const QString &stateFile = QString());
194 static void clearState();
195 static void setValue(const QString &key = QString(), const QVariant &value = QVariant());
196 static QVariant value(const QString &key = QString());
197 static void restoreDefaultSettings();
198 static QVariant defaultValue(const QString &key);
199 static bool isServerConfigFileReadable();
200 static bool isWritable();
201 static bool isPortableMode();
202 static QString settingsFile();
203 static QString settingsPath();
204 static QString serverConfigFile();
205 static QString tlsDir();
206 static QString tlsTrustedServersDb();
207 static QString tlsTrustedClientsDb();
208 static QString logLevelText();
209 static QSettingsProxy &proxy();
211 static void save(bool emitSaving = true);
212 static QStringList validKeys();
213 static QStringList validGroups();
214 static QString portableSettingsFile();
215 static void removeUnknownComputers(const QStringList &knownComputers);
216 static QVariant computerDefaults(const QString &key);
217 static QStringList knownComputers();
218
219Q_SIGNALS:
220 void settingsChanged(const QString key);
221 void settingsWritableChanged(bool writable);
223
224private:
225 explicit Settings(QObject *parent = nullptr);
226 Settings *operator=(Settings &other) = delete;
227 Settings(const Settings &other) = delete;
228 ~Settings() override = default;
229
235 void upgradeSettings();
236 void cleanSettings();
237 void cleanStateSettings();
238
242 void setupComputerName();
243
249 static QString cleanComputerName(const QString &name);
250
255 void checkIfSettingsWritableChange();
256
257 QSettings *m_settings = nullptr;
258 QSettings *m_stateSettings = nullptr;
259 bool m_settingsWritable;
260 QFileSystemWatcher *m_settingsWatcher = nullptr;
261 std::shared_ptr<QSettingsProxy> m_settingsProxy;
262
263 // clang-format off
264 inline static const QStringList m_validGroup = {
265 QStringLiteral("client")
266 , QStringLiteral("core")
267 , QStringLiteral("daemon")
268 , QStringLiteral("gui")
269 , QStringLiteral("log")
270 , QStringLiteral("security")
271 , QStringLiteral("server")
272 , QStringLiteral("internalConfig")
273 };
274
275 inline static const QStringList m_validKeys = {
286 , Core::Port
301 , Log::File
302 , Log::Level
338 };
339
340 // When checking the default values this list contains the ones that default to false.
341 inline static const QStringList m_defaultFalseValues = {
366 };
367
368 // When checking the default values this list contains the ones that default to true.
369 inline static const QStringList m_defaultTrueValues = {
379 };
380
381 // Settings saved in our State file
382 inline static const QStringList m_stateKeys = {
388 };
389
390 // Contains settings keys to be upgraded.
391 inline static const QMap<QString, QString> m_upgradedMap = {
392 /* OLD KEY NEW KEY */
393 {QStringLiteral("core/screenName"), Core::ComputerName}
409 };
410
411// Contains settings removed from server-configuration file
412 inline static const QStringList m_oldServerConfigKeys = {
428 , QStringLiteral("internalConfig/switchCorner")
429 };
430 // clang-format on
431};
static const struct sockaddr FAR * name
Definition ArchNetworkWinsock.cpp:29
NetworkProtocol
Definition NetworkProtocol.h:15
Definition QSettingsProxy.h:14
Definition Settings.h:20
static bool isPortableMode()
Definition Settings.cpp:423
static const auto SystemSettingFile
Definition Settings.h:35
static NetworkProtocol networkProtocol()
Definition Settings.cpp:386
static void removeUnknownComputers(const QStringList &knownComputers)
Definition Settings.cpp:506
static QStringList validGroups()
static const auto UserDir
Definition Settings.h:30
static const auto UserSettingFile
Definition Settings.h:34
static void setValue(const QString &key=QString(), const QVariant &value=QVariant())
Definition Settings.cpp:464
static void setSettingsFile(const QString &settingsFile=QString())
Definition Settings.cpp:27
static QVariant computerDefaults(const QString &key)
Definition Settings.cpp:516
static QVariant value(const QString &key=QString())
Definition Settings.cpp:485
static QVariant defaultValue(const QString &key)
Definition Settings.cpp:309
static QString tlsTrustedClientsDb()
Definition Settings.cpp:454
static QString tlsDir()
Definition Settings.cpp:444
static bool isServerConfigFileReadable()
Definition Settings.cpp:412
static QString portableSettingsFile()
Definition Settings.cpp:499
void settingsWritableChanged(bool writable)
static void setStateFile(const QString &stateFile=QString())
Definition Settings.cpp:50
static QSettingsProxy & proxy()
Definition Settings.cpp:381
static QString tlsTrustedServersDb()
Definition Settings.cpp:449
static QStringList validKeys()
Definition Settings.cpp:401
static QString settingsFile()
Definition Settings.cpp:429
CoreMode
Definition Settings.h:184
@ None
Definition Settings.h:185
static void restoreDefaultSettings()
Definition Settings.cpp:492
ProcessMode
Definition Settings.h:177
@ Service
Definition Settings.h:178
@ Desktop
Definition Settings.h:179
void serverSettingsChanged()
static bool isWritable()
Definition Settings.cpp:418
static QString serverConfigFile()
Definition Settings.cpp:406
static void clearState()
Definition Settings.cpp:64
static const auto SystemDir
Definition Settings.h:31
static QStringList knownComputers()
Definition Settings.cpp:538
static Settings * instance()
Definition Settings.cpp:21
static void save(bool emitSaving=true)
Definition Settings.cpp:391
static QString settingsPath()
Definition Settings.cpp:434
static QString logLevelText()
Definition Settings.cpp:459
void settingsChanged(const QString key)
Definition Settings.h:38
static const auto InvertXScroll
Definition Settings.h:41
static const auto XScrollScale
Definition Settings.h:43
static const auto LanguageSync
Definition Settings.h:44
static const auto DynamicConnectionRetry
Definition Settings.h:39
static const auto XdpClipboardRetried
Definition Settings.h:46
static const auto YScrollScale
Definition Settings.h:42
static const auto RemoteHost
Definition Settings.h:45
static const auto XdpRestoreToken
Definition Settings.h:47
static const auto InvertYScroll
Definition Settings.h:40
Definition Settings.h:127
static const auto Name
Definition Settings.h:129
static const auto HalfDuplexNumLock
Definition Settings.h:131
static const auto Aliases
Definition Settings.h:128
static const auto WeakX11Focus
Definition Settings.h:144
static const auto HalfDuplexCapsLock
Definition Settings.h:130
static const auto ModifierAltGr
Definition Settings.h:134
static const auto HalfDuplexScrollLock
Definition Settings.h:132
static const auto ModifierCtrl
Definition Settings.h:135
static const auto XtestIsXineramaUnaware
Definition Settings.h:145
static const auto SwitchCornerBottomLeft
Definition Settings.h:142
static const auto SwitchCornerTopRight
Definition Settings.h:141
static const auto SwitchCornerSize
Definition Settings.h:139
static const auto ModifierMeta
Definition Settings.h:136
static const auto ModifierSuper
Definition Settings.h:138
static const auto SwitchCornerTopLeft
Definition Settings.h:140
static const auto ModifierShift
Definition Settings.h:137
static const auto ModifierAlt
Definition Settings.h:133
static const auto SwitchCornerBottomRight
Definition Settings.h:143
Definition Settings.h:50
static const auto ComputerName
Definition Settings.h:57
static const auto LastVersion
Definition Settings.h:53
static const auto Display
Definition Settings.h:58
static const auto Interface
Definition Settings.h:52
static const auto PreventSleep
Definition Settings.h:55
static const auto UseHooks
Definition Settings.h:59
static const auto Language
Definition Settings.h:60
static const auto EnableExitCommand
Definition Settings.h:63
static const auto CoreMode
Definition Settings.h:51
static const auto Port
Definition Settings.h:54
static const auto EnableEnterCommand
Definition Settings.h:61
static const auto ComputerEnterCommand
Definition Settings.h:62
static const auto ProcessMode
Definition Settings.h:56
static const auto ComputerExitCommand
Definition Settings.h:64
Definition Settings.h:67
static const auto Elevate
Definition Settings.h:69
static const auto ConfigFile
Definition Settings.h:68
static const auto LogFile
Definition Settings.h:70
static const auto LogLevel
Definition Settings.h:71
Definition Settings.h:74
static const auto Autohide
Definition Settings.h:75
static const auto IgnoreMissingKeyboardLayouts
Definition Settings.h:87
static const auto SymbolicTrayIcon
Definition Settings.h:82
static const auto WindowGeometry
Definition Settings.h:83
static const auto AutoUpdateCheck
Definition Settings.h:77
static const auto CloseReminder
Definition Settings.h:79
static const auto ShownFirstConnectedMessage
Definition Settings.h:84
static const auto AutoStartCore
Definition Settings.h:76
static const auto UpdateCheckUrl
Definition Settings.h:78
static const auto ShowVersionInTitle
Definition Settings.h:86
static const auto CloseToTray
Definition Settings.h:80
static const auto ShownServerFirstStartMessage
Definition Settings.h:85
static const auto LogExpanded
Definition Settings.h:81
Definition Settings.h:151
static const auto DefaultLockToScreenState
Definition Settings.h:160
static const auto HasSwitchDoubleTap
Definition Settings.h:159
static const auto NumRows
Definition Settings.h:152
static const auto ClipboardSharingSize
Definition Settings.h:166
static const auto SwitchDelay
Definition Settings.h:156
static const auto HasHeartbeat
Definition Settings.h:157
static const auto NumColumns
Definition Settings.h:153
static const auto RelativeMouseMoves
Definition Settings.h:164
static const auto Heartbeat
Definition Settings.h:155
static const auto HasSwitchDelay
Definition Settings.h:158
static const auto Protocol
Definition Settings.h:165
static const auto Win32KeepForeground
Definition Settings.h:163
static const auto DisableLockToScreen
Definition Settings.h:161
static const auto SwitchDoubleTapDelay
Definition Settings.h:162
static const auto ClipboardSharing
Definition Settings.h:154
Definition Settings.h:90
static const auto ToFile
Definition Settings.h:93
static const auto GuiDebug
Definition Settings.h:94
static const auto File
Definition Settings.h:91
static const auto Level
Definition Settings.h:92
Definition Settings.h:97
static const auto CheckPeers
Definition Settings.h:98
static const auto Certificate
Definition Settings.h:99
static const auto KeySize
Definition Settings.h:100
static const auto TlsEnabled
Definition Settings.h:101
Definition Settings.h:104
static const auto RelativeMouseMoves
Definition Settings.h:118
static const auto XdpClipboardRetried
Definition Settings.h:122
static const auto ExternalConfigFile
Definition Settings.h:113
static const auto SwitchDoubleTap
Definition Settings.h:120
static const auto EnableHeartbeat
Definition Settings.h:109
static const auto GridWidth
Definition Settings.h:115
static const auto SwitchDelay
Definition Settings.h:119
static const auto DefaultLockToComputerState
Definition Settings.h:106
static const auto EnableSwitchDelay
Definition Settings.h:110
static const auto Protocol
Definition Settings.h:117
static const auto Win32KeepForeground
Definition Settings.h:121
static const auto ClipboardSize
Definition Settings.h:105
static const auto XdpRestoreToken
Definition Settings.h:123
static const auto ExternalConfig
Definition Settings.h:112
static const auto DisableLockToComputer
Definition Settings.h:107
static const auto EnableClipboard
Definition Settings.h:108
static const auto EnableSwitchDoubleTap
Definition Settings.h:111
static const auto Heartbeat
Definition Settings.h:116
static const auto GridHeight
Definition Settings.h:114