799 Commits

Author SHA1 Message Date
5355e84b63 Release 1.21.1
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-aarch64 (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-03-31 07:53:29 -07:00
8fbcf907b2 build: windows Installer runs Deskflow as a user not admin post install, after Finish 2025-03-31 06:12:46 -07:00
d2bf5e63e4 refactor: allow settings to use XDG_CONFIG_DIR if defined
fixes: #8421
2025-03-31 06:12:46 -07:00
3ed0915b57 refactor: settings for windows use Appdata/local, always save daemon log to app install path 2025-03-31 06:12:46 -07:00
01878b0522 refactor: settings, prefix portableSettingsFile with app dir at runtime 2025-03-31 06:12:46 -07:00
af6b42fe9e newMethod Settings::validKeys to return the known Settings keys 2025-03-31 06:12:46 -07:00
a0051ea0bc chore: lib/common/settings remove unused signal writableChanged 2025-03-31 06:12:46 -07:00
40c915f6bd chore: lib/common/settings remove unused signal scopeChanged 2025-03-31 06:12:46 -07:00
1cee520e2b chore: lib/common/settings remove unused private isPortableSettings 2025-03-31 06:12:46 -07:00
1dd5654af6 fix: Settings update checkbox was initilzed to autohide value
fixes #8418
2025-03-31 06:12:46 -07:00
2708fc96fe chore: use Type for templates 2025-03-30 21:14:57 +01:00
5cfaa4a4e0 refactor: move ALL gui parts to lib 2025-03-29 18:18:12 +00:00
a6453a6819 fix: local-fingerprint generation 2025-03-28 11:49:08 +00:00
f781ac9855 Release 1.21.0
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-aarch64 (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-03-27 13:47:16 +00:00
d6087cc5bd fix: Handle empty layout names and language codes in layout parser 2025-03-27 13:30:26 +00:00
6e9694b5d8 build: rm pkgconf from list of packges windows needs 2025-03-27 13:07:59 +00:00
201df59cb7 remove Use of libnotify and wintoast 2025-03-27 13:07:59 +00:00
bcfc77fde6 ci: flatpak remove pythong attars 2025-03-27 12:46:28 +00:00
245a522188 build: remove used gio library 2025-03-27 12:46:28 +00:00
fdf1df1a30 refactor: use QtXml in place of pugixml 2025-03-27 12:33:39 +00:00
84b433853a chore: remove unused define HAVE_GMTTIME_R 2025-03-26 09:23:16 +00:00
e225a357fd chore: remove unused define HAVE_GETPWUID_R 2025-03-26 09:23:16 +00:00
54fac87ed2 chore: remove unused define HAVE_WCHAR_H 2025-03-26 09:23:16 +00:00
56a665cd18 chore: remove unused define HAVE_SYS_UTSNAME_H 2025-03-26 09:23:16 +00:00
cb8c6fe9d9 chore: remove unused define HAVE_LOCALE_H 2025-03-26 09:23:16 +00:00
239a265e18 chore: remove unused HAVE_SSTREAM define 2025-03-26 09:23:16 +00:00
ee53d28af7 chore: remove unused HAVE_OSTREAM define 2025-03-26 09:23:16 +00:00
91fd139a49 chore: remove unused HAVE_ISTREAM define 2025-03-26 09:23:16 +00:00
7f1a234d06 refactor: remove unneed library gtkpixbuf 2025-03-26 09:13:13 +00:00
db20c4b0c7 chore: lib/base/PriorityQueue remove unused headers 2025-03-25 14:11:23 +00:00
7bd3fc1eb5 chore: lib/base/LogOutputters remove unused headers 2025-03-25 14:11:23 +00:00
8fde0d764e chore: lib/base/Log remove unused headers 2025-03-25 14:11:23 +00:00
e1eb4ebf98 chore: lib/base/FinalAction remove unused headers 2025-03-25 14:11:23 +00:00
4b06160f84 chore: lib/base/EventTypes remove unused headers 2025-03-25 14:11:23 +00:00
2160f7826f chore: lib/base/EventQueue remove unused headers 2025-03-25 14:11:23 +00:00
7f6a68bb2f chore: lib/base/Event remove unused headers 2025-03-25 14:11:23 +00:00
95521c53d6 chore: cleanup lib/base/Unicode includes 2025-03-25 14:11:23 +00:00
446847f4fb chore: remove unneeded includes in lib/base/XBase 2025-03-25 14:11:23 +00:00
37bc70896b chore: remove unneeded includes in lib/base/String 2025-03-25 14:11:23 +00:00
f9c8d08ff7 chore: remove unused string::splitString 2025-03-25 13:52:49 +00:00
55c611f754 chore: remove unused string::findReplaceAll 2025-03-25 13:52:49 +00:00
541e30f406 chore: remove unused string::removeFileExt 2025-03-25 13:52:49 +00:00
4b24b5b38d chore: remove unused string::removeChar 2025-03-25 13:52:49 +00:00
df8500178b chore: remove unused CaselessCmp::cmpEqual 2025-03-25 13:52:49 +00:00
378fdae140 feat: Handle empty response from update server 2025-03-25 11:13:48 +00:00
31e95ad2dc refactor: remove unused lib/arch/mulitbyte.h 2025-03-25 08:39:05 +00:00
8b5a61f07f refactor: remove ArchFile, move only use of getInstallDir to MSWindowsWatchdog 2025-03-25 08:39:05 +00:00
516f803eb4 refactor: remove ArchFile::getbasePath for QFileInfo::fileName 2025-03-25 08:39:05 +00:00
c1a7b836ce refactor: remove unused ArchMiscWindows::processDialog 2025-03-24 12:16:39 +00:00
9530b9c6ba refactor: remove unused ArchMiscWindows::s_dialog, ArchMiscWindows::cleanup 2025-03-24 12:16:39 +00:00
9df2a2c28d refactor: remove unused ArchMiscWindows::removeDialog 2025-03-24 12:16:39 +00:00
133545d03f refactor: remove unused ArchMiscWindows::addDialog 2025-03-24 12:16:39 +00:00
75e852d95f refactor: remove unused ArchMiscWindows::readValueBinary 2025-03-24 12:16:39 +00:00
9c44653fff refactor: remove unused ArchMiscWindows::setValueBinary 2025-03-24 12:16:39 +00:00
2adee7c460 refactor: remove unused ArchMiscWindows::deleteKeyTree 2025-03-24 12:16:39 +00:00
6f6e9cddb7 refactor: remove unused ArchMiscWindows::deleteValue 2025-03-24 12:16:39 +00:00
fdd9b1bb6d refactor: remove unused ArchMiscWindows::getIcons 2025-03-24 12:16:39 +00:00
b2ff6aa938 refactor: remove unused ArchMiscWindows::setIcons 2025-03-24 12:16:39 +00:00
5e4188b2fe refactor: remove unused ArchMiscWindows::hasValue 2025-03-24 12:16:39 +00:00
a3875bf71c fix: small leak on closing of mainwindow by not parenting the menus, found via valgrind 2025-03-24 12:06:29 +00:00
f3930d9520 chore: MainWindow: use Size instead of seperate Width/Height calls in update size 2025-03-24 12:06:29 +00:00
f66a50dab7 chore: MainWindow remove unused empty layout 2025-03-24 12:06:29 +00:00
68ebc88293 ci: Sync local flatpak depends to those on flathub 2025-03-24 11:57:37 +00:00
83c8d295d4 refactor: MainWindow remove test menu 2025-03-21 12:47:46 +00:00
07219ed431 refactor: use QVariant().toBool() in place of StringUtils::StrToBool, remove StringUtils 2025-03-21 12:47:46 +00:00
da5f3c0be1 refactor: remove StringUtils::trimEnd and just use QString::trimmed 2025-03-21 12:47:46 +00:00
a23e35c522 refactor: move lib/gui/Diagnostic => apps/deskflow-gui/Diagnostic 2025-03-21 12:47:46 +00:00
eb74d8ca99 refactor: replace EnvVars.h with a new item in settings Settings::Core::UpdateUrl 2025-03-21 12:47:46 +00:00
65b6fe7ca3 refactor: move lib/gui/Constants.h => lib/common/UrlConstants.h 2025-03-21 12:47:46 +00:00
9b6615328b refactor: move lib/gui/StyleUtils.h => apps/deskflow-gui/StyleUtils.h 2025-03-21 12:47:46 +00:00
7fb87b32f5 refactor: move lib/gui/validators => apps/deskflow-gui/validators 2025-03-21 12:47:46 +00:00
8508805f5d chore: remove unused apps/deskflow-gui/ProcessorArch.h 2025-03-21 11:42:32 +00:00
385a610da2 chore: remove unused apps/deskflow-gui/QUtility 2025-03-21 11:42:32 +00:00
e00058a332 chore: remove unused MacOSXPrecomp.h 2025-03-21 11:42:32 +00:00
45b6ff19e7 chore: remove StdExcept and include stdexcept directly where needed
remove _NOEXCEPT define and just use throw()
2025-03-21 11:42:32 +00:00
1798d7e4e6 chore: remove StdOStream and include ostream directly where needed 2025-03-21 11:42:32 +00:00
854787e6b3 chore: remove StdIStream and include istream directly where needed 2025-03-21 11:42:32 +00:00
498ffe85c3 chore: remove StdSet and include set directly where needed 2025-03-21 11:42:32 +00:00
cd3f9b2e7d chore: remove StdMap and include map directly where needed 2025-03-21 11:42:32 +00:00
42b16efdb9 chore: remove StdList and include list directly where needed 2025-03-21 11:42:32 +00:00
003f87db9e chore: remove StdVector and include vector directly where needed 2025-03-21 11:42:32 +00:00
86dca27e4c chore: remove StdDeque and include deque directly where needed 2025-03-21 11:42:32 +00:00
26fa6860e4 chore: Move used code from Win32Hook to MSWindowsHook and remove Win32Hook 2025-03-21 11:42:32 +00:00
d9798a9b2b chore: remove StdPost / StdPre 2025-03-21 11:42:32 +00:00
70a2554370 refactor: VersionChecker use its own QNetworkManager not a Proxy
remove lib/gui/proxy/QNetworkManagerProxy
2025-03-21 10:16:22 +00:00
13c325eb3f chore: rename lib/common/stdvector.h => lib/common/StdVector.h 2025-03-20 13:06:45 +00:00
a3ad66dfb0 chore: rename lib/common/stdset.h => lib/common/StdSet.h 2025-03-20 13:06:45 +00:00
c9d1a50bb0 chore: rename lib/common/stdpre.h => lib/common/StdPre.h 2025-03-20 13:06:45 +00:00
cb3e516206 chore: rename lib/common/stdpost.h => lib/common/StdPost.h 2025-03-20 13:06:45 +00:00
de2e3fb9ce chore: rename lib/common/stdostream.h => lib/common/StdOStream.h 2025-03-20 13:06:45 +00:00
3bad718bb7 chore: rename lib/common/stdmap.h => lib/common/StdMap.h 2025-03-20 13:06:45 +00:00
40c10766f3 chore: rename lib/common/stdlist.h => lib/common/StdList.h 2025-03-20 13:06:45 +00:00
bf09df835d chore: rename lib/common/stdistream.h => lib/common/StdIStream.h 2025-03-20 13:06:45 +00:00
4a16804d27 chore: rename lib/common/stdexcept.h => lib/common/StdExcept.h 2025-03-20 13:06:45 +00:00
5e1aa9eb5d chore: rename lib/common/stddeque.h => lib/common/StdDeque.h 2025-03-20 13:06:45 +00:00
3c86d9dc83 chore: rename lib/common/constants.h.in => lib/common/Constants.h.in 2025-03-20 13:06:45 +00:00
099262d8ce chore: rename lib/common/common.h => lib/common/Common.h 2025-03-20 13:06:45 +00:00
d9e6ec4b70 chore: rename lib/config.h.in => lib/Config.h.in 2025-03-20 13:06:45 +00:00
d7b20fad5c chore: rename lib/platform/wayland.h => lib/platform/Wayland.h 2025-03-20 13:06:45 +00:00
6e6a88af87 chore: rename lib/platform/dfwhook.h => lib/platform/Win32Hook.h 2025-03-20 13:06:45 +00:00
ce17167248 chore: rename lib/io/filesystem => lib/io/Filesystem 2025-03-20 13:06:45 +00:00
656ad6402b chore: rename lib/gui/styles.h => lib/gui/Styles.h 2025-03-20 13:06:45 +00:00
329742a411 chore: rename lib/gui/style_utils.h => lib/gui/StyleUtils.h 2025-03-20 13:06:45 +00:00
4df982dd6f chore: rename lib/gui/string_utils.h => lib/gui/StringUtils.h 2025-03-20 13:06:45 +00:00
b1010751ba chore: rename lib/gui/messages => lib/gui/Messages 2025-03-20 13:06:45 +00:00
4238441018 chore: rename lib/gui/env_vars.h => lib/gui/EnvVars.h 2025-03-20 13:06:45 +00:00
a13bd3d0bd chore: rename lib/gui/dot_env => lib/gui/DotEnv 2025-03-20 13:06:45 +00:00
516e612282 chore: rename lib/gui/diagnostic => lib/gui/Diagnostic 2025-03-20 13:06:45 +00:00
bfd4bbd8f4 chore: rename lib/gui/constants.h => lib/gui/Constants.h 2025-03-20 13:06:45 +00:00
1c4ec6ec41 chore: remove unused lib/gui/byte_utils 2025-03-20 13:06:45 +00:00
2ef23b8206 chore: rename lib/deskflow/protocol_types => lib/deskflow/ProtocolTypes 2025-03-20 13:06:45 +00:00
ecf70f09f3 chore: rename lib/deskflow/option_types => lib/deskflow/OptionTypes 2025-03-20 13:06:45 +00:00
397c652e1c chore: rename lib/deskflow/mouse_types => lib/deskflow/MouseTypes 2025-03-20 13:06:45 +00:00
1666a30b94 chore: rename lib/deskflow/clipboard_types => lib/deskflow/ClipboardTypes 2025-03-20 13:06:45 +00:00
827d020d16 chore: rename lib/deskflow/key_types => lib/deskflow/KeyTypes 2025-03-20 13:06:45 +00:00
0138372871 chore: rename lib/base/log_outputters => lib/base/LogOutputters 2025-03-20 13:06:45 +00:00
9e78cb55aa chore: rename lib/base/finally.h => lib/base/FinalAction.h 2025-03-20 13:06:45 +00:00
38cc678ad2 chore: Settings Dialog remove unused and not implimented updateTlsRegenerateButton method from header 2025-03-19 20:29:40 +00:00
e624e6f174 fix: SetttingsDialog KeySize Combobox does not set key length
fixes #8380
2025-03-19 20:29:40 +00:00
96b50b7d1c chore: remove unused action in MainWindow 2025-03-19 20:29:40 +00:00
ffbe2cf885 refactor: use Settings for secure connect certificate path 2025-03-19 20:01:01 +00:00
b1b8720781 refactor: remove unused ARCH::concatPath 2025-03-19 20:01:01 +00:00
8609cbc20a refactor: remove unused ARCH::getUserDirectory 2025-03-19 20:01:01 +00:00
7fe862b715 refactor: remove unused ARCH::getSystemDirectory 2025-03-19 20:01:01 +00:00
377272e917 refactor: remove unused arch profileDir 2025-03-19 20:01:01 +00:00
b051c5ae60 refactor: new Setting::tlsTrustedClientssDb() method to return trusted client fingerprint db 2025-03-19 20:01:01 +00:00
38f00da704 refactor: new Setting::tlsTrustedServersDb() method to return trusted server fingerprint db 2025-03-19 20:01:01 +00:00
dcd2c62880 refactor: new Setting::tlsLocalDb() method to return local fingerprint db 2025-03-19 20:01:01 +00:00
b7f29d76c3 refactor: use new Setting::tlsDir() method to return current tlsdir where needed 2025-03-19 20:01:01 +00:00
55601debe0 refactor: use Settings in SecureListenSocket for certificate path 2025-03-19 20:01:01 +00:00
6c8eca6c41 refactor: ServerApp begin to use Settings 2025-03-19 20:01:01 +00:00
6444e2c208 chore: remove unused ARCH::getLogDirectory 2025-03-19 20:01:01 +00:00
b3ce7c41d3 chore: remove unused ARCH::setPluginDirectory Arch::getPluginDirectory 2025-03-19 20:01:01 +00:00
6963c28219 fix: typo in settings checkPeerFingerprints 2025-03-17 13:01:51 -04:00
99ed548495 fix: typo in settings invertScrollDirection key 2025-03-17 13:01:51 -04:00
d37bda6edb fix: Use correct casing for RemoteHost value in Settings.h 2025-03-17 13:01:51 -04:00
73de5e964e chore: remove unused archsystem classes 2025-03-17 16:59:43 +00:00
27451d3425 refactor: move Screensaver inhibate call for xwindows from arch to platform 2025-03-17 16:59:43 +00:00
613f3651ea refactor: move daemon settings to Settings
fixes #8353
2025-03-17 16:59:43 +00:00
0e3cee6287 feat: handle scope automaticaly
fixes #8358
2025-03-17 13:58:28 +00:00
6056e5850b chore: remove unused ConfigScopes 2025-03-17 13:58:28 +00:00
1b01a010ed refactor: remove use of configScopes from mainwindow 2025-03-17 13:58:28 +00:00
7faf76c7df refactor: remove need for configScope in diagnostic 2025-03-17 13:58:28 +00:00
55f513941b chore: remove lib/gui/config/AppConfig class 2025-03-17 13:58:28 +00:00
9e74100960 chore: remove unused appconfig from mainwindow 2025-03-17 13:58:28 +00:00
531b988dd1 refacator: remove use of app config in server settings 2025-03-17 13:58:28 +00:00
5647121dd8 refacator: allow settings to expose a proxy and emit saving 2025-03-17 13:58:28 +00:00
c1af4c3b71 fix: windows looking in deskflow/deskflow for items
fixes #8371
2025-03-17 13:47:28 +00:00
dd895ed99f Fix typos Recieve in methods
...Recieve... =>
...Receive...

Signed-off-by: Kentaro Hayashi <kenhys@xdump.org>
2025-03-17 09:38:18 -04:00
7771dcd04c Fix typos
avilable =>
available

recieve =>
receive

Signed-off-by: Kentaro Hayashi <kenhys@xdump.org>
2025-03-17 09:38:18 -04:00
d537a23fda refactor: add configure icon for Configure server button 2025-03-17 11:18:27 +00:00
f7b98465fa refactor: mainwindow move save config to a button shown only in server mode 2025-03-17 11:18:27 +00:00
ed1bf01306 fix: log Resize update the timer to 15ms 2025-03-17 11:00:02 +00:00
80f814a2da refactor: unify Coredir to SettingsPath 2025-03-17 10:44:37 +00:00
5355c9080b fix: Parse only the patch number from version check result 2025-03-14 15:30:19 +00:00
16517ca541 refactor(daemon): More helpful and less noisy logging 2025-03-14 14:19:46 +00:00
e8ea9f53ee refactor(daemon): Separate arg parsing from program control flow 2025-03-14 14:19:46 +00:00
7da8c54924 refactor(daemon): Use functional type for daemonize func 2025-03-14 14:19:46 +00:00
3683db0db9 feat(daemon): Print warning when not elevated 2025-03-14 14:19:46 +00:00
cd0aa6496a refactor(daemon): Move file log init code to init functions 2025-03-14 14:19:46 +00:00
c583252b03 refactor(daemon): Move watchdog init to init function
This also improves some logging and adds discreet try-catch blocks for each function call which improves diagnostics
2025-03-14 14:19:46 +00:00
2c433eddd7 chore(daemon): Make function const and better string compare
- Make `clearSettings` const in daemon app
- Improve readability of empty command check
2025-03-14 14:19:46 +00:00
5ee39c9b00 refactor: Settings allow override file of settings/Deskflow.conf 2025-03-14 14:10:19 +00:00
c1642b8d9d refactor: Remove unused CoreTool 2025-03-14 14:10:19 +00:00
f2c16c4432 refactor: remove paths::coreProfileDir and its single use for Settings::settingsPath() 2025-03-14 14:10:19 +00:00
37b4e4b57f refactor: coretool remove getProfileDir 2025-03-14 14:10:19 +00:00
b502a6b848 refactor: remove coretool from coreProcess 2025-03-14 14:10:19 +00:00
fe0ddf85e4 refactor: remove coretool from path.h 2025-03-14 14:10:19 +00:00
6990477504 refactor: remove coretool use from tlsCertificate 2025-03-14 14:10:19 +00:00
e05b35dda4 refactor: remove coretool from mainwindow 2025-03-14 14:10:19 +00:00
f50e4e850b refactor: QSettingsProxy use Settings paths for user and system paths 2025-03-13 13:58:25 +00:00
3cd3d7b1ff refactor: mv lib/gui/proxy/QSettingsProxy => lib/common 2025-03-13 13:58:25 +00:00
5a7284fd6a refactor: appconfig is no longer a iAppConfig subclass 2025-03-13 13:58:25 +00:00
362b2e1477 chore: slim down appconfig to only have expose the settings proxies 2025-03-13 13:58:25 +00:00
7bf716b232 chore: appconfig remove unused m_logdir 2025-03-13 13:58:25 +00:00
554178b658 chore: appconfig remove unused useinternalconfig option 2025-03-13 13:58:25 +00:00
af17b14224 refactor: move serverconfigdialog visible to Settings 2025-03-13 13:58:25 +00:00
1e9f92c93f feat: serverConfigDialog, remove need for appConfig 2025-03-13 13:58:25 +00:00
8bb325a2d2 feat: settingsdialog remove need for appconfig 2025-03-13 13:58:25 +00:00
8606dc8618 refactor: move Coremode control to Settings
newKey core/coreMode <= General/serverGroupEnabled , Genaral/clientGroupEnabled
remove core mode items from appconfig
2025-03-13 13:58:25 +00:00
6362948e15 feat: CoreProcess no longer needs AppConfig 2025-03-13 13:58:25 +00:00
085a70d5a5 refactor: move elevateMode to Settings
newKey: core/elevateMode <= General/elevateMode + General/elevateModeEnum
Remove elevate mode from appConfig
2025-03-13 13:58:25 +00:00
93abf4217b refactor: move enableServer to Settings
General/enableServer is removed, service type stored in core/processMode set it now true when server mode
remove enableServer from appConfig
2025-03-13 13:58:25 +00:00
88b0a7d2e1 refactor: move serviceenabled to deskflow settings 2025-03-13 13:58:25 +00:00
5fa70d0d0a refactor: move ProcessMode to Settings
newKey core/processMode
remove processmode from app config
2025-03-13 13:58:25 +00:00
d01c07cab8 refactor: move screenName to Settings
newkey: core/screenName <= General/screenName
remove screenName from AppConfig
2025-03-13 13:58:25 +00:00
6834862413 refactor: move logFile to Settings
newKey log/file <= General/logFilename
remove logfilename from appConfig
2025-03-13 13:58:25 +00:00
4273fe2318 refactor: move logLevel and loglevelText to Settings
newKey: log/level <= General/logLevel2
remove logLevel from AppConfig
2025-03-13 13:58:25 +00:00
266a4a5edf refactor: move logToFile to Settings
newkey: log/logToFile <= General/logToFile
remove logToFile from AppConfig
2025-03-13 13:58:25 +00:00
5e6381c88a refactor: move port to Settigns
newkey: core/port <= General/port
remove port from AppConfig
2025-03-13 13:58:25 +00:00
9aa1d6b79d refactor: move networkinterface to Settings
newkey: core/interface <= General/interface
remove networkinterface from appconfig
2025-03-13 13:58:25 +00:00
d45d6baacb refactor: move langageSync to Settings
newkey: client/languageSync <= General/languageSync
removed languageSync from appconfig
2025-03-13 13:58:25 +00:00
a887ac066c refactor: move invertscrolling to Settings
newkey: client/invertscrolldirection <= General/invertScrollDirection
remove invertScrollDirection from AppConfig
2025-03-13 13:58:25 +00:00
787a48424e feat: remove need for AppConfig from serverConnection 2025-03-13 13:58:25 +00:00
b20d6361d6 refactor: move external configfile to Settings
newkey: server/externalConfigFile <= General/configFile
remove configFile from AppConfig
2025-03-13 13:58:25 +00:00
b833ca7a45 refactor: move appconfig useExternal config to Settings
newkey: server/externalConfig <= General/useExternalConfig
remove useExternalConfig from appConfig
2025-03-13 13:58:25 +00:00
43eab1f04c feat: remove need for AppConfig in Client Connection 2025-03-13 13:58:25 +00:00
dc9e104f8c refactor: move serverHostname to Settings
newKey: client/remoteHost <= General/serverHostName
remove serverHostname from AppConfig
2025-03-13 13:58:25 +00:00
f456aab196 refactor: move serverBinary to Settings
newkey: server/binary <= General/coreServerBinary
remove coreServer from AppConfig
2025-03-13 13:58:25 +00:00
de3b9d8e2e refactor: move clientBinary to Settings
newkey: client/binary <= General/coreClientBinary
remove coreBinary from AppConfig
2025-03-13 13:58:25 +00:00
b7960eecb4 refactor: move preventSleep to Settings
newkey: core/preventSleep <= General/preventSleep
remove prevent sleep from app config
2025-03-13 13:58:25 +00:00
03f142977f refactor: move lastVersion to Settings
newkey: core/lastVersion <= General/lastVersion
Remove from app config
2025-03-13 13:58:25 +00:00
5360fb3c89 refactor: move requirepeerchecking to Settings
newkey: security/checkpeerfingerprints <= General/requireClientCerts
remove requireClientCerts from appconfig
2025-03-13 13:58:25 +00:00
4eb7ea3491 feat: tlsUtility no longer needs AppConfig, tlsUtility takes a parent object 2025-03-13 13:58:25 +00:00
5642879a21 chore: connect up Settings changed signal to mainwindow 2025-03-13 13:58:25 +00:00
737328d7b0 refactor: move TlsCertPath to Settings
newkey: security/certPath <= General/tlsCertPath
remove tlsCertPath from appConfig
2025-03-13 13:58:25 +00:00
bee0f84556 refactor: move tlsKeyLength to Settings
newkey: security/keySize <= General/tlsKeyLength
removed tlsKeyLength from appconfig
2025-03-13 13:58:25 +00:00
2721de220a refactor: move tlsEnabled to Settings
newkey: security/tlsEnabled <= General/cryptoEnabled
remove tlsEnabled from appconfig
2025-03-13 13:58:25 +00:00
4c6195cc5d refactor: move windowgeometry to Settings
newkey: gui/windowGeometry <= General/mainWindowSize and General/mainWindowPosition
mainWindowSize and Position remove from `AppConfig`
2025-03-13 13:58:25 +00:00
1e46bd2727 refactor: move CloseReminder setting to Settings
newkeyL gui/closeReminder <= General/showCloseReminder
remove closeReminder from `AppConfig`
2025-03-13 13:58:25 +00:00
54ecdad101 refactor: move startedBefore settings to Settings
newkey core/startedBefore <= General/startedBefore
startedBefore has been removed from `AppConfig`
2025-03-13 13:58:25 +00:00
51a749b109 refactor: move closeToTray setting to Settings
newkey: gui/closeToTray <= General/closeToTray
remove closeToTray from `AppConfig`
2025-03-13 13:58:25 +00:00
788f6c3eb2 refactor: Move update check setting to Settings
newkey: gui/enableUpdateCheck <= General/enableUpdateCheck
remove update check from `AppConfig`
2025-03-13 13:58:25 +00:00
e01c595071 refactor move Tray icon setting to Settings
newKey: gui/symbolicTrayIcon <= General/colorfulIcon
the colorfulIcon settings has been removed from `AppConfig`
2025-03-13 13:58:25 +00:00
bcd90434a2 refactor: move autohide setting to Settings
newkey: gui/autoHide <= General/autoHide
auto hide has been removed from `AppConfig`
2025-03-13 13:58:25 +00:00
698fd3f83c refactor: move logExpanded to Settings
newkey: gui/logExpanded <= General/logExpanded
remove logExpanded AppConfig
2025-03-13 13:58:25 +00:00
2a53d4f187 refactor: unittest use Settings 2025-03-13 13:58:25 +00:00
53487e757b feat: New Settings class 2025-03-13 13:58:25 +00:00
ef315183f3 chore: rm unused ARCH:getPlatform 2025-03-13 12:25:25 +00:00
8b1e8dfd9f chore: rm unused CoreTool::getArch 2025-03-13 12:25:25 +00:00
b73aceee7d chore: remove unused Arch::isWOW64 method 2025-03-13 12:25:25 +00:00
3b811a1bd0 chore: remove unused Arch::getOsName 2025-03-13 12:25:25 +00:00
a099276e4e refactor: Move Windows SendSAS call to new thread
Moving the SAS event wait and SendSAS call prevents blocking the main thread allowing for more responsive watchdog (e.g. faster restart Core client/server on session switch).
2025-03-12 12:18:32 -04:00
38f8159e9d refactor: Update global event names to use project proper name 2025-03-12 12:18:32 -04:00
87fb06781c refactor: Change shutdownExistingProcesses to static in MSWindowsWatchdog 2025-03-12 12:18:32 -04:00
b9017de881 refactor: Use simpler lock_guard for Windows daemon set process config 2025-03-12 12:18:32 -04:00
24d1d4e620 refactor: Simplify lock_guard usage by removing explicit mutex type 2025-03-12 12:18:32 -04:00
3bcc1e11ed chore: Move Windows event constants to constants file 2025-03-12 12:18:32 -04:00
d26c75a784 refactor: Move Windows specific constants to #ifdef 2025-03-12 12:18:32 -04:00
5b091dee56 refactor: Rename SAS IPC event name to be more specific 2025-03-12 12:18:32 -04:00
3344644d2e chore: Remove old ctrl+alt+del PostMessage call (for Windows XP and below) 2025-03-12 12:18:32 -04:00
39e7f60c5a build: Get minor MSVC version from host registry 2025-03-12 08:04:16 -04:00
57d1e42eca feat: Check MSVC redist version in WiX installer 2025-03-12 08:04:16 -04:00
cd45164e40 chore: Clean up unused definitions and includes in ArchMiscWindows 2025-03-11 16:38:12 +00:00
0ed583a7fe refactor: Bootstrap logging for Windows runtime check 2025-03-11 16:38:12 +00:00
751c869435 feat: Use EnumProcessModules to search loaded modules) 2025-03-11 16:38:12 +00:00
4cfeadf0be fix: Remove redundant check in runtime DLL condition
For some reason `&& hModule` was added to the end of the condition, which totally breaks the logic for when the DLL is not found.
2025-03-11 16:38:12 +00:00
402baf3bde docs: Add doc comments for ArchMiscWindows 2025-03-11 16:38:12 +00:00
d199130b43 chore: Replace local include with standard library include for set 2025-03-11 16:38:12 +00:00
758c1044b5 ci: pin lint action to use clang-format 20.1.0 2025-03-11 10:57:51 -04:00
6e8952c8a0 chore: update formating for clang-format 20.1.0 2025-03-11 10:57:51 -04:00
bb38ad0766 chore: Rename TLS constants for consistency 2025-03-10 18:57:29 +00:00
bc96ddebdd Release v1.20.1
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-aarch64 (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-03-07 17:00:10 +00:00
80606ef040 fix: Add check for Visual C++ Redistributable installation in WiX patch 2025-03-07 16:14:49 +00:00
836d9b9a2b chore: Disable action on 3rd Windows daemon failure
Indefinitely restarting the daemon is annoying as it makes problems harder to diagnose.
2025-03-07 16:14:49 +00:00
f2063f9e05 fix: Allow compiling on VS2019 for contributors with old IDEs 2025-03-07 09:26:43 -05:00
a74d792b5b fix: mac os icon mask
fixes #8310
2025-03-07 13:30:18 +00:00
256ba2411b refactor: move qt automoc, uic and rcc to a single place in Librarires.cmake 2025-03-07 13:16:09 +00:00
0a23e62093 refactor: replace version.h with kDisplayVersion const 2025-03-07 13:16:09 +00:00
e38a8e6b15 build: build lib/common as static library 2025-03-07 13:16:09 +00:00
6f022ff700 chore: Format XML for better readability in wix-patch.xml 2025-03-07 07:39:36 -05:00
265c2c2a2c chore: Fixed Windows service description in wix-patch.xml 2025-03-07 07:39:36 -05:00
1594b8e760 docs: Make Windows MSVC redist requirement stand out 2025-03-07 07:16:46 -05:00
029cb8fc0b build: do not ship vc msm file, link the redist in the readme 2025-03-06 19:17:53 +00:00
8e236e7e5c build: win32 do not bind vc++ when building 2025-03-06 19:17:53 +00:00
38b2798bb7 chore: remove unused common/stdfstream 2025-03-06 19:17:53 +00:00
d580dfba57 chore: remove unused common/stdsstream 2025-03-06 19:17:53 +00:00
da4237f349 chore: rm unused common/stdbitset.h 2025-03-06 19:17:53 +00:00
a78d1acc71 chore: remove unset variable in arch lib linking 2025-03-06 19:17:53 +00:00
24d5b26da2 build: remove extra private link to openssl::applink 2025-03-06 19:17:53 +00:00
9c81f1c045 build: moving find_package for openssl to net/CMakeLists.txt 2025-03-06 19:17:53 +00:00
899a49d09a build: win32 Remove unneeded python dependency 2025-03-06 19:17:53 +00:00
3a4bf35e22 refactor: Remove unneeed find_packate calls for Qt Components. Qt is found by Libaraies.cmake and accesable to all items in the src folder 2025-03-06 19:17:53 +00:00
495331108b fix: Guard MSVC runtime version depending on compiler version 2025-03-06 10:45:57 -05:00
a7ce936d68 fix: Remove duplicate includes in deskflow-daemon.cpp 2025-03-05 13:59:26 -05:00
f6ccd2a25b feat: Show Git SHA in Windows daemon version number 2025-03-05 13:59:26 -05:00
5d310be807 chore: remove obsolete runWizard setting 2025-03-05 18:48:07 +00:00
bd674f546b fix: Show console on Windows for daemon -h and -f args 2025-03-05 18:04:07 +00:00
cc821f750d fix: Remove unnecessary private access modifier from DaemonApp.h 2025-03-05 18:04:07 +00:00
2485e993a4 chore: Improve bin RC and service description for Windows daemon 2025-03-04 13:36:47 +00:00
b5d12b8aa5 fix: Move version print line after file outputter is created 2025-03-04 13:36:47 +00:00
3ef5793beb Release 1.20.0
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-aarch64 (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-03-03 16:37:24 -05:00
b64942e3a3 fix: Delete HKEY_LOCAL_MACHINE\SOFTWARE\Deskflow when clearing settings 2025-03-03 15:05:09 -05:00
9de268d293 chore: Reduce noisy log lines related to fingerprints not required by GUI 2025-03-03 13:31:18 -05:00
1f08cafffe fix: Use string data instead of path data for fingerprint logging 2025-03-03 13:31:18 -05:00
9eeda33293 fix: do not reset screenCorners on startup
fixes #8276
2025-03-03 17:26:48 +00:00
17bedb1072 fix: Correct parsing of screen corners
fixes #8231
2025-03-03 17:26:48 +00:00
8cca8440b7 fixes #7695 adjust the serverconfig clipboard max size label 2025-03-03 17:16:24 +00:00
b2dadba6fa refactor: serverdialog, use maximum for spinbox horizontal sizepolicy 2025-03-03 17:16:24 +00:00
4f057d706f refactor: serverconfigdialog, use suffix for spinboxes 2025-03-03 17:16:24 +00:00
5e69657176 chore: update windows rc descriptions fixes #8270 2025-03-03 16:32:08 +00:00
2638cce0c0 fix: Do stop the client on fingerprint dialog
fixes #8267
2025-03-03 16:16:57 +00:00
5eac984757 chore: Add mutex for process state management in MSWindowsWatchdog 2025-03-03 14:33:46 +00:00
1bd3f5060e refactor: Add Doxygen comments for MSWindowsWatchdog member functions 2025-03-03 14:33:46 +00:00
55b4cffd3f chore: Remove unused setStartupInfo member function from MSWindowsWatchdog 2025-03-03 14:33:46 +00:00
51ec36f23d chore: Set default values for m_foreground and m_activeDesktop MSWindowsWatchdog 2025-03-03 14:33:46 +00:00
58cb2b76de chore: Remove unused include in MSWindowsWatchdog.h 2025-03-03 14:33:46 +00:00
8d4a715b1c chore: Make MSWindowsWatchdog constructor explicit 2025-03-03 14:33:46 +00:00
997d4a9473 chore: Move free functions to top of Windows watchdog source 2025-03-03 14:33:46 +00:00
0f11b61576 chore: Reduce complexity of outputLoop in Windows watchdog 2025-03-03 14:33:46 +00:00
98aba612c0 chore: Improve loop stop log line in Windows watchdog 2025-03-03 14:33:46 +00:00
b0547f6713 chore: Use ref to const for openProcessForKill arg in Windows watchdog 2025-03-03 14:33:46 +00:00
40fefb9369 chore: Use string_view for MSWindowsWatchdog::setProcessConfig 2025-03-03 14:33:46 +00:00
48e1c43a01 chore: Add cspell words for Windows watchdog 2025-03-03 14:33:46 +00:00
d8d022e9fe chore: Scope constants in Windows watchdog 2025-03-03 14:33:46 +00:00
84194cf5ef chore: Use default init instead of ctor init Windows watchdog 2025-03-03 14:33:46 +00:00
cd5ba1382d chore: Clean up shutdownExistingProcesses (unused var and use if-init) in Windows watchdog 2025-03-03 14:33:46 +00:00
c84b4e3f00 refactor: Reduce complexity of mainLoop in Windows watchdog 2025-03-03 14:33:46 +00:00
be8029deb6 chore: Remove unused g_activeDesktop from Windows watchdog 2025-03-03 14:33:46 +00:00
dbb9b3bf5a chore: Remove unused trimDesktopName from Windows watchdog 2025-03-03 14:33:46 +00:00
32bf9aa02a chore: Use const auto instead of enum for kOutputBufferSize in Windows watchdog 2025-03-03 14:33:46 +00:00
0891afdd63 chore: Use nullptr instead of NULL in Windows watchdog 2025-03-03 14:33:46 +00:00
f7ab6aba58 chore: Remove unused includes from Windows watchdog 2025-03-03 14:33:46 +00:00
74e8a63dcd chore: Remove unused getCommand from Windows watchdog 2025-03-03 14:33:46 +00:00
475172597a chore: Remove unused m_ready from Windows watchdog 2025-03-03 14:33:46 +00:00
8c30ed7a59 chore: Remove unused m_autoDetectCommand and ctor arg from Windows watchdog 2025-03-03 14:33:46 +00:00
44f72a29e9 refactor: Use state machine for Windows daemon watchdog 2025-03-03 14:33:46 +00:00
4db77ba2f7 chore: Improve function name for setting daemon process config 2025-03-03 14:33:46 +00:00
5e29fa93ac chore: Quieten noisy daemon IPC server read log messages 2025-03-03 14:33:46 +00:00
ce8c262a9c build: mac os rpath for client, server and core 2025-02-28 23:04:33 +00:00
3b30065ec3 chore: Prevent static analysis from complaining about new (idiomatic Qt) 2025-02-28 17:58:16 +00:00
54483f26ba refactor: Use member instead of passing param in daemon main loop 2025-02-28 17:58:16 +00:00
13ed447a93 chore: Move daemon constants to constants file 2025-02-28 17:58:16 +00:00
74812fbf75 chore: Remove dead code, function isServerCommandLine from daemon 2025-02-28 17:58:16 +00:00
bdf5a0f352 chore: Clearer naming for static daemon loop functions 2025-02-28 17:58:16 +00:00
b425b43801 fix: Use desktop process mode for core process tests rather than random value 2025-02-28 17:58:16 +00:00
f0c60f5ca9 chore: Improve logging for pipe readers in Windows watchdog 2025-02-28 17:58:16 +00:00
b2ca9bc17b chore: Remove dead code from --debug-service-wait arg 2025-02-28 17:58:16 +00:00
f46474c9f2 refactor: Use WaitForSingleObject instead of sleep for Windows process shutdown 2025-02-28 17:58:16 +00:00
a99d408be1 chore: Improve logging related to Windows daemon start/stop/install/uninstall 2025-02-28 17:58:16 +00:00
19c41e2ac5 fix: Improve Windows daemon stop speed by using non-blocking pipes and shorter sleep times 2025-02-28 17:58:16 +00:00
890fd61e6e refactor: Move ownership of Windows daemon file log outputter to Log 2025-02-28 17:58:16 +00:00
1c42552b3b refactor: Begin logging to file as soon as Windows daemon starts 2025-02-28 17:58:16 +00:00
a6956b9516 refactor: Improve Daemon uninstall exception flow 2025-02-28 17:58:16 +00:00
5a7f6bd1c0 refactor: Remove old Windows TCP IPC implementation (replaced by Qt equivalent) 2025-02-28 17:58:16 +00:00
a3b0ec28fc refactor: Improve logging message for process backoff and reset failure count when no command is set 2025-02-28 17:58:16 +00:00
fa1ab27ee9 refactor: Clear watchdog command setting to prevent persistence on daemon restart 2025-02-28 17:58:16 +00:00
e07a2efbcc refactor: Implement Windows event loop in AppUtilWindows for graceful shutdown handling 2025-02-28 17:58:16 +00:00
e967944c1e fix: Strip line endings for Windows daemon file logging
Windows file logger and `OutputDebugString` already add new lines, so remove the ones added by the Core.
2025-02-28 17:58:16 +00:00
389028ccf9 refactor: Connect socket events in ctor for daemon IPC client 2025-02-28 17:58:16 +00:00
dc6383d593 refactor: Properly disconnect and clean up previous daemon file tail on connection 2025-02-28 17:58:16 +00:00
1c7adf5add refactor: Allocate daemon app and it's thread on stack to reduce memory leak risk 2025-02-28 17:58:16 +00:00
5743db3040 feat: Apply log level on IPC connection 2025-02-28 17:58:16 +00:00
5733541b2a feat: Tail daemon log file instead of using IPC log outputter 2025-02-28 17:58:16 +00:00
5980fb741b refactor: Move daemon process stop command to new Qt IPC 2025-02-28 17:58:16 +00:00
7c672b06d8 refactor: Update IPC server to handle log level and elevate mode changes 2025-02-28 17:58:16 +00:00
53038760de refactor: Use core mode for daemon install on Windows 2025-02-28 17:58:16 +00:00
d6228416a1 refactor: Send log level to daemon over IPC instead of when sending command 2025-02-28 17:58:16 +00:00
80cc323f5a refactor: Improve logging and error handling for SendSAS function in Windows watchdog 2025-02-28 17:58:16 +00:00
90e63e2e9e refactor: Exclude current process when killing existing process from Windows daemon 2025-02-28 17:58:16 +00:00
24c57e46e2 refactor: Run legacy daemon loop in thread 2025-02-28 17:58:16 +00:00
e72faf1446 feat: Connect to daemon IPC on start request 2025-02-28 17:58:16 +00:00
c1d7474700 feat: Restart process from daemon through new Qt IPC impl 2025-02-28 17:58:16 +00:00
0d2d9f385d feat: Implement basic IPC connection between Daemon and GUI 2025-02-28 17:58:16 +00:00
c0094554b1 feat: Convert daemon to Qt app and introduce Qt local server 2025-02-28 17:58:16 +00:00
95603c82ec refactor: Improve logging and args for Windows daemon install/uninstall 2025-02-28 17:58:16 +00:00
8debc1ea7f chore: SettingsDialog remove set defaults from ui file 2025-02-28 16:51:33 +00:00
b4f703562d chore: Settings Dialog do not open with the checkbox for peer certificates having active focus 2025-02-28 16:51:33 +00:00
34b61cc8cd fix: #8259 track a client and server list
fixes 8259
2025-02-28 13:17:26 +00:00
551e0211ac ci: don't send temp screenshots to flathub, fix lint failure for not doing so 2025-02-28 13:06:32 +00:00
0fc5368253 fix: Prevent access violation by moving events, arch, and log objects to top of stack in Windows daemon
This is how we do it in the server/client apps, so it makes sense to mirror the same pattern.
2025-02-28 12:57:15 +00:00
383b39636e chore: Remove dead code; unused outputter param on runInner functions 2025-02-28 12:57:15 +00:00
f56a3ba305 refactor: Rename param for Log::insert to make adoption clearer 2025-02-28 12:57:15 +00:00
0bca094fce chore: Explain use of new for all log outputters 2025-02-28 12:57:15 +00:00
220711c2d7 fix: Only use MS debug outputter when the process is daemonized 2025-02-28 12:57:15 +00:00
66acf9038b fix: Solve double-free by letting Log adopt FileLogOutputter in Windows daemon 2025-02-28 12:57:15 +00:00
aa5a704131 chore: settings dialog remove unused includes 2025-02-27 15:17:13 +00:00
bae494476b refactor: Settings Dialog, update security layout 2025-02-27 15:17:13 +00:00
3ae2de52f4 refactor: SettingsDialog set icons in ui where possible 2025-02-27 15:17:13 +00:00
088d69fec8 refactor: SettingsDialog, use standard object names 2025-02-27 15:17:13 +00:00
63744ddbd6 refactor: settingsdialog, remove autoconnect slots 2025-02-27 15:17:13 +00:00
2d04e0be4d refactor: SettingDialog do not connect from inside the ui file 2025-02-27 15:17:13 +00:00
4f2ef7174a refactor: do not stop sever on new client fingerprint, track the last print we checked and if we are chekcing it do not show a new box 2025-02-27 15:07:50 +00:00
1003de21b5 refactor: do not show error if the fingerprint database is not created yet 2025-02-27 15:07:50 +00:00
b3866b69b2 chore: Fix order of MainWindow ctor init list to match header 2025-02-27 15:07:50 +00:00
9bd7fce45c refactor: MainWindow: Update name change 2025-02-27 13:41:55 +00:00
f0d33ce9de chore: aboutDialog remove unused static strings 2025-02-27 13:32:24 +00:00
07bf6de093 chore: add icon credit to about box 2025-02-27 13:32:24 +00:00
9c463a557a docs: Expand version field on bug_report.yml 2025-02-27 05:12:43 -08:00
566d716feb chore: Remove unused config lines from sonar-project.properties 2025-02-27 04:55:13 -08:00
e7e518d76e refactor: don't quote debug line 2025-02-26 11:52:03 +00:00
08be9fa33f chore: use a style for the flat buttons 2025-02-26 11:52:03 +00:00
72d27c70e0 refactor: gui::styles use QStringLiteral 2025-02-26 11:52:03 +00:00
6de1920d88 chore: remove bufferedLogView 2025-02-25 06:53:57 -08:00
2d3f64f662 chore: cleanup additional item missed in when removing the legacy tray icon 2025-02-25 06:53:57 -08:00
193c28af53 fix: settings dialog can have tls options enabled when they should not be leading to a case where tls gen fails as it not enabled fixes 7883 2025-02-25 06:34:47 -08:00
5b54849fd6 refactor: mainwindow simplify the mode selection UI 2025-02-25 14:18:32 +00:00
b7eb5c467b feat: Remove Inverse Connections Option 2025-02-25 14:18:32 +00:00
f9b6bcc950 refactor: mv net/InverseSockets/SslLogger => net/SslLogger 2025-02-25 14:18:32 +00:00
5d5e32a676 refactor: remove setupwizard 2025-02-25 13:21:39 +00:00
d52939a3fc fix: raise mainwindow on update check dialog
fixes #8234
2025-02-25 13:11:35 +00:00
173e521004 ci: Set timeout for windows job to 30 minutes 2025-02-25 04:07:10 -08:00
038c8af949 ci: use pkg list for vcpkg on ci builds 2025-02-25 04:07:10 -08:00
9f68514577 ci: use Qt install action for windows 2025-02-25 04:07:10 -08:00
d5624ba65e ci: use Qt 6.8.2 for Qt action installs
update vcpkg manifest to newest vcpkg release
2025-02-25 04:07:10 -08:00
d5ee57f349 build: vcpkg rm nolonger used openssl tools 2025-02-25 04:07:10 -08:00
6a08305338 fix: log expanded on start up and windows no resizeable 2025-02-20 22:26:21 +00:00
05ed47be2e fix: server resets to listing state with no clients connected 2025-02-20 21:16:48 +00:00
29d04ea8e0 chore: update lib/gui/constants to use QStringLiterals 2025-02-20 21:16:48 +00:00
ab118a3aa3 chore: remove unused style items 2025-02-20 21:16:48 +00:00
10e5a305bb refactor: remove redundant client / server staus labels, the status label provides this info already 2025-02-20 21:16:48 +00:00
e9c8965066 refactor: mainwindow move tls version to securty tooltip 2025-02-20 21:16:48 +00:00
53d2b3bd2e refactor: MainWindow move update info to status tray 2025-02-20 21:16:48 +00:00
d4cc66a9f9 refactor: move Tls Label to status bar 2025-02-20 21:16:48 +00:00
18cc8565f9 refactor: mainwindow use status bar for status items 2025-02-20 21:16:48 +00:00
caee2b149a chore: move version check log to debug, fixes #8224 2025-02-20 11:15:58 +00:00
e808eed413 refactor: Improve Windows daemon failure backoff for faster client restarts on first fail 2025-02-19 18:23:10 +00:00
16c57d7960 refactor: Improve log message related to desk switch on Windows 2025-02-19 18:23:10 +00:00
200d32db80 chore: Improve log message for leave screen warning on Windows 2025-02-19 18:23:10 +00:00
2322f312a9 refactor: Improve logging for errors when setting/getting cursor pos on Windows 2025-02-19 18:23:10 +00:00
09c157f9e1 fix: Remove --exit-pause to stop "press any key to exit..." showing when Windows daemon kills server/client 2025-02-19 18:23:10 +00:00
c9a360a144 fix: Restore active desktop name check in Windows daemon
- Use `PIPE_NOWAIT` to skip empty stderr output on process output reading from Windows daemon watchdog
- Use `CreateProcess` result to determine when to call `CloseHandle` in Windows daemon watchdog
- Trim output from active desktop process in Windows daemon watchdog
- Improve error logging in Windows daemon watchdog
2025-02-19 18:23:10 +00:00
3de2c1bcf0 fix: missing reuse info for SECURITY.md file 2025-02-18 08:04:26 -05:00
73292f05c8 docs: Create GitHub recommended security policy file 2025-02-18 07:57:08 -05:00
48407d7f8f refactor: simplify MainWindow::checkFingerprints 2025-02-18 12:12:41 +00:00
83c190c385 refactor: use better name to describe for the tlsEnabled var in messages , and correct the name in virtual method 2025-02-18 12:12:41 +00:00
ad79ba907d refactor: Mainwindow localFingerPrintDb => localFingerprintDb 2025-02-18 12:12:41 +00:00
9294f2a026 refactor: use a function to get the trustedFingerprintDb 2025-02-18 12:12:41 +00:00
bfb64f0653 fix: Generate TLS certificate before generating TLS fingerprint 2025-02-17 11:55:28 -05:00
6f66fe767f fix: inabliity to resize when first opening if log open on startup 2025-02-17 11:55:28 -05:00
63846292ff refactor: update tooltips for security icon
add check when appTls State Changes
2025-02-17 11:55:28 -05:00
2f8b78e2a6 refactor: new private MainWindow method localhostFingerprintDb 2025-02-17 11:55:28 -05:00
8d0491f1ad refactor: narrow use of stdString in mainwindow 2025-02-17 11:55:28 -05:00
79dc858446 chore: modify client trying to connect dialog to inform user the new client needs to be put in the layout when both tls is enabled and peer key checking is enabled , otherwise show the old dialog asking to allow the client to connect 2025-02-17 16:26:29 +00:00
0667f5de73 refactor: allow the fingerprint dialog to show local keys and remote if needed 2025-02-17 16:26:29 +00:00
e51956e2c7 feat: Client ID verification
based on barrier: 229abab
  Fixes: CVE-2021-42072, CVE-2021-42073
2025-02-17 16:26:29 +00:00
60c7e512f2 refactor: use enum for secure sockets
based on barrier: 57769cf
2025-02-17 16:26:29 +00:00
e996471e37 refactor: use enum for connections security level
based on barrier: 5c7d719
2025-02-17 16:26:29 +00:00
638349b48a feat: add config for client cert required
based on barrier: 8bc280e0
2025-02-17 16:26:29 +00:00
3e7b14cbd4 fix: Attempt to load SSL certs when connecting
based on barrier: c0ce8937, 4d73ed9f
2025-02-17 16:26:29 +00:00
3abf38aff9 ci: Improve flatpak builder to include arm flatpaks, linting and validation check 2025-02-17 15:38:19 +00:00
12a56f4df0 chore: add updated screenshots from deskflow.org 2025-02-17 15:38:19 +00:00
9bd5fe9afb chore: Replace deprecated developer_name tag with developer block 2025-02-17 15:38:19 +00:00
6ff5d2d5d3 fix: Update local fingerprint label after fingerprint regeneration 2025-02-14 09:42:47 -05:00
c04610c561 chore: use fancy-checkout v1 tag 2025-02-14 13:46:44 +00:00
67e2f56724 chore: update daemon description and icon 2025-02-14 12:44:29 +00:00
5288546231 refactor: use const for tlsDb expected size 2025-02-14 12:44:29 +00:00
d8e311fe59 fix: only regenerate the tls certificate if tls is enabled and we do not already have a certificate 2025-02-14 12:44:29 +00:00
500067a778 fix: generate cert if tls is on and its not found
fixes #8191
  fixes #8192
2025-02-14 12:44:29 +00:00
3c12915fd3 fix: Security icons showing with fresh install
fixes #8170
2025-02-14 12:20:48 +00:00
eb19547b45 refactor: mainwindow force regen of local prints if tls is enabled with a sha256 key 2025-02-12 13:41:45 +00:00
65eed64f04 refactor: new fingerprintdialog 2025-02-12 13:41:45 +00:00
fbaa0a8433 feat: use sha256
based-on: a428b61c7d
 based-on: b7757fbd68
 based-on: a238b27879
2025-02-12 13:41:45 +00:00
743c3feef3 refactor: use FingerprintData for fingerprints
based-on: 7cced74119
2025-02-12 13:41:45 +00:00
d0d5182425 refactor: use new Fingerprint database
based-on: 50534ecb43
   based-on: be8ba0d132
2025-02-12 13:41:45 +00:00
298b1047c4 refactor: add ssl consts into common/constansts 2025-02-12 13:41:45 +00:00
e257501072 chore: add Fingerprint Db Tests 2025-02-12 13:41:45 +00:00
aaa64e986e feat!: Add support for FingerPrintDatabase 2025-02-12 13:41:45 +00:00
7d79a4d729 chore: TlsCertificate, remove unused items 2025-02-12 13:41:45 +00:00
2058519e57 refactor: generate Certs using secureUtils method 2025-02-12 13:41:45 +00:00
5a71d63923 refactor: secureutils add pemFileCertFingerprint 2025-02-12 13:41:45 +00:00
fb32f141cc refactor: secureUtils fingerprint method
Signed-off-by: sithlord48 <sithlord48@gmail.com>
2025-02-12 13:41:45 +00:00
39da277ead refactor: use vector<uint8_t> for keys 2025-02-12 13:41:45 +00:00
a98f2d745e refactor: move SecureSocket::formatFingerprint -> SecureUtils std::string formatSSLFingerprint
based on 0e406d4918
         9d8e1faf59
         b793675ef8
2025-02-12 13:41:45 +00:00
524c3b0e7b refactor: Change log level for active desktop query to debug 2025-02-11 13:06:51 +00:00
e420b9b986 chore: small cmake cleanup
lib/platform: use the REQUIRED_QT_VERSION when looking for Qt Dbus module
  lib/deskflow: rm extra space in cmake file
2025-02-11 13:06:51 +00:00
cb14d158cc refactor: Cleanup core binary help text 2025-02-11 13:06:51 +00:00
ac6809d40f refactor: Rename core process start/stop function names 2025-02-11 13:06:51 +00:00
92603df93d fix: Out of order m_trayIcon in ctor init,
chore: remove unused m_btnCancel
2025-02-11 13:06:51 +00:00
a5f28616f4 chore: df-gui mainwindow directly connect more methods without intermediarty methods 2025-02-11 13:06:51 +00:00
cad1243d75 chore: windows, set icon for deskflow-core 2025-02-11 13:06:51 +00:00
610786ad2e chore: clean up extra empty lines 2025-02-11 13:06:51 +00:00
d093894743 fix: [test]fix #8174, create empty config file under HOME dir
The server always create an empty config file in user's home dir, set tmp config file path for the unittest in order to fix this issue.

Log: Fix unittest create empty config file.
2025-02-11 07:13:31 -05:00
942070950d refactor: MainWindow do not use onNames 2025-02-04 18:11:41 +00:00
ddc24ffb22 refactor: MainWindow don't use lambda where direct connect can happen 2025-02-04 18:11:41 +00:00
b14de6f9e2 refactor: MainWindow conform to naming standards 2025-02-04 18:11:41 +00:00
10c50c9740 docs: Link to the known wayland issues in the readme 2025-02-03 12:45:22 +00:00
60577f00dc chore: add Icons for list-add , list-remove and document-edit 2025-02-03 12:36:18 +00:00
fedd9d33c9 refactor: serverConfig finish renaming, improve logic 2025-02-03 12:36:18 +00:00
ae30237f90 refactor: ServerConfigDialog/tabAdvanced no autoconnections, use naming std 2025-02-03 12:36:18 +00:00
169422a0eb refactor: ServerConfigDialog hotkeyTab, no auto connections use naming std 2025-02-03 12:36:18 +00:00
76fd40a3ec refactor: ServerConfigDialog/tabComputers, no autoconnect slots, use new names 2025-02-03 12:36:18 +00:00
816d66b703 refactor: Don't use autoconnect slots for the button box 2025-02-03 12:36:18 +00:00
774f1fded9 fix: Add client dialog not showing for new clients 2025-02-03 12:36:18 +00:00
9365091c79 Release v1.19.0
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-01-31 07:07:58 -05:00
9dcfb6cc9b fix: Wrong cb_activated signature in input-capture
The options argument was missing so the argument data wasn't the right
one and the method cb_disabled was actually called on a GVariant*
instead on a PortalInputCapture*
2025-01-30 14:50:08 -05:00
e2c3af4e5e fix: readd the newScreenWidget 2025-01-30 15:36:21 +00:00
26367635d9 refactor: QTextStream& screen::writeScreensSection(QTextStream&) -> QString Screen::screenSection()
refactor: QTextStream& screen::writeAliasSection(QTextStream&) -> QString Screen::aliasSection()
2025-01-30 15:36:21 +00:00
0ba35fca7a refactor: clean up data method of model 2025-01-30 15:36:21 +00:00
beb4069845 fix: Screen Missing Icons on server config
Fixes#8155
2025-01-30 15:36:21 +00:00
71b7e819a9 refactor: remove smaller security icons 2025-01-29 21:19:39 +00:00
55772e1133 chore: remove unused ARCH::vsnprintf 2025-01-29 21:07:31 +00:00
43c6bec790 Revert "feat!: Add support for FingerPrintDatabase"
This reverts commit 8f219b735e.
2025-01-28 19:31:03 -05:00
8f219b735e feat!: Add support for FingerPrintDatabase 2025-01-28 20:33:11 +00:00
59ebb6fde4 refactor: force mac os to use the larger security icon in the status area 2025-01-28 16:19:51 +00:00
30a37a8a50 chore: Switched event buffer from Carbon to GCD 2025-01-28 13:11:24 +00:00
415fc3ea63 docs: update openSSL exception link 2025-01-28 12:48:36 +00:00
7f6caec162 chore: reset screen xywh on update_shape
based on https://github.com/input-leap/input-leap/pull/2167
2025-01-28 11:33:55 +00:00
d61bce4534 ci: Add reuse compliance check 2025-01-27 17:05:47 -05:00
1085df54ed refactor: Reuse compliance
build files and documentation: MIT
  images / sources: GPL-2.0-only
  breeze icons: LGPL-2.0-only
  Microsoft MSM file, vc redist license
2025-01-27 17:05:47 -05:00
480776cb38 chore: remove extra gitignore files 2025-01-27 17:05:47 -05:00
2ca1c69335 refactor: move LICENSE_EXCEPTION info into to LICENSES folder 2025-01-27 17:05:47 -05:00
2c2045b6bb docs: Fixed incorrect link on README.md for rewarded bounties 2025-01-27 09:35:25 -05:00
9d3b32c824 Fix a typo in SettingsDialog
compatability =>
compatibility

Signed-off-by: Kentaro Hayashi <kenhys@xdump.org>
2025-01-27 08:29:43 -05:00
c2b3f551d2 chore: String update copyright 2025-01-25 15:43:44 +00:00
f255d77eee chore: add string::fromHex 2025-01-25 15:43:44 +00:00
3125eba014 chore: add string::fromHexChar 2025-01-25 15:43:44 +00:00
9b1489384c chore: String toHex should return a string not do inplace conversion 2025-01-25 15:43:44 +00:00
ac54a97a3f chore: rm use of "Arch" from "String" 2025-01-25 15:43:44 +00:00
0112a5eac8 docs: Update README.md to raise awareness of bounties
Right now we're only seeing bounty interest through Algora's network of developers.

We can increase the number of potential contributors aware of bounties by making this prominent on our README.
2025-01-24 09:22:38 -05:00
a7beed48f8 chore: remove unused placeholder.png file 2025-01-23 22:07:52 +00:00
cc4701a0c2 fix: Fix detect language
It perhaps no variant for a keyboard's layout, set a default value in order to continue detect local language.

Log: Fix detect language.
2025-01-23 16:54:14 -05:00
30263f3c70 ci:use -1.0 as tag for flatpak builder 2025-01-23 21:44:19 +00:00
4c3d6c7080 refactor: move rc_template.rc.in -> windows.rc.in
fixes: #8130
2025-01-23 21:28:57 +00:00
90661c9f13 chore: enable cpack as DEB for deepin|uos
The deepin and uos are debian liked OS, but they do define "ID_LIKE".

Log: enable cpack as DEB for deepin|uos.
2025-01-23 19:26:49 +00:00
2040df435f fix: #8107: Remove legacy tray code 2025-01-23 19:16:29 +00:00
62f53bbb92 fix: check bsdpath for evdev fixes #8112 2025-01-21 17:15:42 -05:00
f49f616ad6 fix: correctly mask symbolic icon on mac os 2025-01-21 17:15:18 -05:00
6eec07b6dc refactor: Use correct log level for failure messages
This change may help us turn up some everyday problems in the field that get missed due to not using debug log level.

This could also make the log a bit noisier, so at a later date we may need to downgrade anything that is not actually a failure/warning.
2025-01-21 16:46:34 -05:00
b65b3678c7 fix: #8119, covering all Unix-like OSes including BSD
Fixes #8119 (using platform variables)
2025-01-21 12:14:42 -05:00
1ec6d02339 refactor: use theme icons for on settings dialog and mac os tray 2025-01-21 11:22:11 -05:00
6b29e1c6ef ci: use qt 6.7.3 for mac os 2025-01-21 11:22:11 -05:00
b13afbbbb9 Properly seek to start of keymap descriptor 2025-01-21 12:07:54 +00:00
f969e0a03b ci: add builder for ubuntu 25.04, fixes https://github.com/deskflow/deskflow/issues/7884 2025-01-21 06:36:37 -05:00
ffe8153c35 build: remove unused TM_IN_SYS_TIME define 2025-01-21 06:27:36 -05:00
afc736e2c8 build: remove unused STDC_HEADERS 2025-01-21 06:27:36 -05:00
ae7e2f70ce build: remove unused PTHREAD_CREATE_JOINABLE 2025-01-21 06:27:36 -05:00
9a1cb5941b build: remove unused define HAVE_X11_XKBLIB_H 2025-01-21 06:27:36 -05:00
fa35d2913d build: remove HAVE_X11_EXTENSIONS_XKBSTR_H define 2025-01-21 06:27:36 -05:00
1115d3287e build: remove HAVE_SYS_STAT define 2025-01-21 06:27:36 -05:00
46cfb281af build: remove HAVE_STRING_H define 2025-01-21 06:27:36 -05:00
365d6f76c2 build: remove HAVE_STRINGS_H define 2025-01-21 06:27:36 -05:00
05275b303f build: remove HAVE_STRFTIME define 2025-01-21 06:27:36 -05:00
535d241f7b build: remove unused STDINT define 2025-01-21 06:27:36 -05:00
3e9289328a build: remove unused INTTYPES define 2025-01-21 06:27:36 -05:00
bac86455d2 build: remove unused HAVE_MEMORY_H 2025-01-21 06:27:36 -05:00
b394f32c01 build: remove unused CXX_STDLIB define 2025-01-21 06:27:36 -05:00
312347bc17 build: remove unused CXX_MUTABLE define 2025-01-21 06:27:36 -05:00
6541ce3f84 build: remove unused CXX_EXTENTION define 2025-01-21 06:27:36 -05:00
b4a5b580bd build: remove unused CXX_CASTS define 2025-01-21 06:27:36 -05:00
d72fd2b3d9 build: remove unused ACCEPT_TYPE_ARG3 2025-01-21 06:27:36 -05:00
5ce9aaea13 build: remove has_BOOL define 2025-01-21 06:27:36 -05:00
cc6bfcc1c2 build: remove unused SIZE defines 2025-01-21 06:27:36 -05:00
efca38babc build: remove size_t define 2025-01-21 06:27:36 -05:00
401326e9d7 build: use CMAKE_PROJECT_NAME and CMAKE_PROJECT_PROPER_NAME to set our kAppName and KAppId 2025-01-21 06:27:36 -05:00
09bd4006d1 refactor: MainWindow, use system-run for the start button and action 2025-01-21 11:16:53 +00:00
c84a8c20c1 refactor: MainWindow, use ProcessStop for the stop action and button 2025-01-21 11:16:53 +00:00
b91681a125 refactor: MainWindow, add help-about icon 2025-01-21 11:16:53 +00:00
f578da16c0 refactor: MainWindow, Icon for the clear settings action 2025-01-21 11:16:53 +00:00
c583ab7d2c refactor: MainWindow, add icons for configure 2025-01-21 11:16:53 +00:00
e6ae6bd0d1 refactor: MainWindow, add document-save-as icon 2025-01-21 11:16:53 +00:00
d51437b6a1 refactor: MainWindow, add view-refreshIcon 2025-01-21 11:16:53 +00:00
6954a4dfa3 refactor: SettingsDialog use security-type icons for key length selector 2025-01-21 11:16:53 +00:00
24b2d9b0c1 refactor: MainWindow add application-exit icon 2025-01-21 11:16:53 +00:00
0adef8d781 refactor: MainWindow, Add tools-report-bug icon 2025-01-21 11:16:53 +00:00
3cce11f9d9 fix: missing setting colorful icon 2025-01-21 11:16:53 +00:00
0f5bcd6d12 fixes 8106, by adjusting the spacing of the about dialog 2025-01-21 11:06:37 +00:00
2ccf0c6639 docs: Indicate S1/S3 compatibility
Synergy 3 uses mDNS which makes it incompatible for now.
2025-01-20 08:34:53 -05:00
6bb84309b7 feat: Build Arm packages using githubs new arm runners 2025-01-20 08:06:20 -05:00
89ec18a8e4 feat: bake in light and dark icon theme 2025-01-20 10:42:29 +00:00
067d6810f3 chore: gui lib, remove unused include dirs 2025-01-19 09:39:54 -05:00
19920801fa build: gui lib use explicit sources 2025-01-19 09:39:54 -05:00
08ad64eb4d chore: remove unused deskflow-gui/AppDelegate 2025-01-19 09:39:54 -05:00
dc5e971043 build: setup bundle plist only on macOS 2025-01-19 09:39:54 -05:00
e0017c1c31 build: deskflow gui explict sources 2025-01-19 09:39:54 -05:00
e58e5c420b refactor: move macOS icon to res folder 2025-01-19 09:39:54 -05:00
ca8c405b5e chore: deskflow-gui, remove unused include_dirs 2025-01-19 09:39:54 -05:00
aff25415ff build: consolidate cmake vars more
move most project defines needed in cmake to the main file
2025-01-19 09:39:54 -05:00
5be1e9f9b9 build: setup a cmake rc template for all apps 2025-01-19 09:39:54 -05:00
3f3116da05 build: simplify the version.rc.in vars
remove the special cmake define for msversion and make it once in the rc
remove duplicate version vars in the rc and use the singe one twice
2025-01-14 21:42:43 +00:00
16396bdbaa build: Unify copyright into one cmake var 2025-01-14 21:42:43 +00:00
660a50d0cf chore: remove unused logo images 2025-01-14 21:22:05 +00:00
93cd71d046 refactor: Adjust the About dialog UI 2025-01-14 21:22:05 +00:00
90c081c889 chore: remove unneeded setVisible override and the unused mac os old tray code within it 2025-01-14 21:00:20 +00:00
a08b0c41e0 fix: always show the hide / show option in the tray menu
Some DE's are like mac os and prevent the user from using click to restore / hide the window
2025-01-14 21:00:20 +00:00
793f40e582 chore: remove basic_types.h 2025-01-14 20:30:45 +00:00
96092df4fc refactor: replace UInt32 with uint32_t 2025-01-14 20:30:45 +00:00
27eb83c981 refactor: replace SInt32 with int32_t 2025-01-14 20:30:45 +00:00
7487eeaa3a refactor: replace UInt16 with uint16_t 2025-01-14 20:30:45 +00:00
1ed49e7487 refactor: replace SInt16 with int16_t 2025-01-14 20:30:45 +00:00
ba11eba91e refactor: replace UInt8 with uint8_t 2025-01-14 20:30:45 +00:00
8ea20cf6da refactor: replace SInt8 with int8_t 2025-01-14 20:30:45 +00:00
ab61fcc007 chore: update readme's linux support. Removes distros list and show the ei / portal needs 2025-01-14 17:01:33 +00:00
f71db61bd3 build: Arch,PKGBUILD: rm arm6h , add all conflicts , correct license 2025-01-14 17:01:33 +00:00
626ff0a5fa chore: remove unused GUI_HOOK 2025-01-14 14:29:39 +00:00
7a72658963 refactor: copy more info with the about dialog info's copy button 2025-01-10 17:05:13 -05:00
b8d12a0895 build: mac os add entitlements 2025-01-10 21:48:55 +00:00
692860f9e9 build: macos bundle plist add hint to tell mac os its not allowed to kill the process
based on https://github.com/input-leap/input-leap/pull/2115"
2025-01-10 21:48:55 +00:00
4b6d0059c5 build: Use custom plist template
Customize the cmake used template so we can generate the plist
using configure file this will allow us to add several additional
keys we would not be able to otherwise add to our plist file
"
2025-01-10 21:48:55 +00:00
1dadc2ddf4 refactor: ActionDialog, Only allow resize when the screen list is visible 2025-01-10 21:39:26 +00:00
328a719d49 refactor: Use Computer in place of Screen for user facing strings 2025-01-10 21:39:26 +00:00
a9f55f8dfc chore: ActionDialog, update UI file to Qt6 format and clean unneed keys 2025-01-10 21:39:26 +00:00
f6dd2881c8 refactor: ActionDialog: disable action saving while settings are invalid 2025-01-10 21:39:26 +00:00
7152119014 refactor: ActionDialog, Only show Action relevent options 2025-01-10 21:39:26 +00:00
29eaa19d95 refactor: ActionDialog, use checkable list for screen selection 2025-01-10 21:39:26 +00:00
4db2b80d4e refactor: ActionDialog, Use Combo for action selection 2025-01-10 21:39:26 +00:00
04f73cfcb7 refactor: ActionDialog, Use Combobox for action trigger 2025-01-10 21:39:26 +00:00
1386ac91dc refactor: ActionDialog, Simplify keySequenceChanged logic 2025-01-10 21:39:26 +00:00
4e913a90eb refactor: ActionDialog, make buttonbox connections in c++ 2025-01-10 21:39:26 +00:00
c36c0f2938 refactor: ActionDialog, Aaccess the keySequenceWidget only thru the ui member 2025-01-10 21:39:26 +00:00
0944d918b7 refactor: KeySequenceWidget, remove protected copy of public method 2025-01-10 21:39:26 +00:00
3572bd28b6 refactor: ActionDialog, Adjust private memberNames 2025-01-10 21:39:26 +00:00
c21595e598 refactor: ActionDialog, remove unneeed forward declare for QRadioButton 2025-01-10 21:39:26 +00:00
096ab3b8ed refactor: ActionDialog, set the current screen combo without the need to track how many items are in the combobox with an additional int variable 2025-01-10 21:39:26 +00:00
1129303254 refactor: ActionDialog, when filling the screen list continue sooner if screen is null 2025-01-10 21:39:26 +00:00
4b456bf835 refactor: ActionDialog, don't keep a copy of the server config 2025-01-10 21:39:26 +00:00
8533348c88 refactor: simplify updateSize 2025-01-10 10:36:19 +00:00
dd0812c201 fix: Mainwindow window size restore \n fixes https://github.com/deskflow/deskflow/issues/8056 2025-01-10 10:36:19 +00:00
9a3a89efab refactor: simplify windows size/pos saving 2025-01-10 10:36:19 +00:00
3875e41154 fix: Enter screen on mac os asap to ensure event hand off
based on https://github.com/input-leap/input-leap/pull/2116
2025-01-09 14:02:01 +00:00
74dcd9bd4e build: run macdeployqt on package 2025-01-08 13:30:52 +00:00
9501b59f81 fix: Save the try icon setting 2025-01-07 20:33:37 -05:00
6c95daf0a1 chore: remove stdstring.h use include <string> instead 2025-01-08 00:11:34 +00:00
3991e0c1a1 refactor: use std::string in place of String
basedon: https://github.com/debauchee/barrier/pull/709
2025-01-08 00:11:34 +00:00
42a17726d9 feat: Allow users to pick mono color (based on isDarkMode) or colorful icon 2025-01-07 23:51:34 +00:00
fc6d39ae6c refactor: Adjust the size of all the tray icons to use the same amount of canvas space" 2025-01-07 23:51:34 +00:00
5d41537505 refactor: remove macOS check for icon theme macOS 11+ uses a mask 2025-01-07 23:51:34 +00:00
f505bfd3e7 refactor: MainWindow setupTrayIcon in method
remove unused MainWindow::createStatusBar and MainWinow::createTrayIcon
2025-01-07 23:51:34 +00:00
d5e651bae9 refactor: MainWindow use QSystemTrayIcon in place of TrayIcon
removes the TrayIcon class
2025-01-07 23:51:34 +00:00
1a35a8bdf7 refactor: Action use QStringLists in place of char * arrays 2025-01-07 23:34:11 +00:00
261d85b423 refactor: Action remove pointless assert 2025-01-07 23:34:11 +00:00
fcc8c3d344 refactor: Action, dont use concatantaion, instead append 2025-01-07 23:34:11 +00:00
112c665480 refactor: Action: add SettingsKeys namespace to hold the settings keys 2025-01-07 23:34:11 +00:00
4c70f4fde5 refactor: Action: use m_foo style member names 2025-01-07 23:34:11 +00:00
665049b723 fix #8059 re add shortcut for quit on windows 2025-01-07 17:17:19 -05:00
13a3c2d281 Chore: rm unused DESKFLOW_GUI_HOOK Items 2025-01-07 17:15:48 -05:00
abdab2d06d feat: resolve #7975, allow only one instance of the gui 2025-01-07 16:54:47 -05:00
fd4ffb6f60 build: Prevent issue where build packages is off with version.rc not being generated 2025-01-07 16:37:04 -05:00
c165413e5b Revert "build: disable package for debug config"
This reverts commit 49622a24b2.
2025-01-07 16:37:04 -05:00
9f1c1da1aa build: unify finding of the qt deploy tool and detect if vcpkg for proper debug build call 2025-01-07 16:37:04 -05:00
a55fafb4fc fix: messages read into vector are cut off by 4 bytes 2025-01-07 21:09:03 +00:00
b0852bfda5 refactor: Hotkey, use internal actionlist in place of function call 2025-01-07 19:45:21 +00:00
9eb0371a92 refactor: Hotkey, use internal keySequence in place of function calls 2025-01-07 19:45:21 +00:00
ef0d929251 refactor: Hotkey outstream logic more Qt 2025-01-07 19:45:21 +00:00
20a5b8eb0b refactor: Hotkey use const for literals 2025-01-07 19:45:21 +00:00
404458aab0 fix: hotkeys w/ multi actions
based on adc49fa066
2025-01-07 19:45:21 +00:00
4702fa56d4 fix: use Fallback version if git found without tag info
fixes https://github.com/deskflow/deskflow/issues/8033
2025-01-07 11:56:32 -05:00
6f744d2278 fix: Version Checker use case insensitive compare in place of toLower() call 2025-01-07 11:54:30 -05:00
49622a24b2 build: disable package for debug config 2025-01-07 11:45:51 -05:00
329afb47be build: windeployqt only on package dir 2025-01-07 11:45:51 -05:00
d4addceb09 build: macos attempt local signing 2025-01-07 11:32:51 -05:00
ca5f41684f fix: MacOS Hide and Show from dock on window close / hide 2025-01-07 09:19:20 -05:00
9c3e08001e fix: mac os CI build by correctly setting INSTALL_RPATH for the gui as a property of its target 2025-01-03 20:02:19 -05:00
6bfde029fe fix: run MacDeployQt at install time on staged app only 2025-01-03 14:10:58 +00:00
351c5123ef fix: Mac Os use Native Hide Event 2025-01-03 13:56:39 +00:00
ba334d5411 refactor: MainWindow remove unneeded onAppAboutToQuit slot 2025-01-03 13:56:39 +00:00
08d4b348e0 fix: use the closeEvent to hide to tray and quit the application 2025-01-03 13:56:39 +00:00
58563d36ca fix: Stop core process when mode changes in gui 2025-01-03 13:32:13 +00:00
ce02bb85b3 chore: update gnome tray fix link to https://extensions.gnome.org/extension/615/appindicator-support/ 2025-01-02 13:44:06 +00:00
df089dab53 fix: Wayland Prompt starts under MainWindow 2025-01-02 13:12:09 +00:00
86ee88d17d feat: Show the TLS Enabled label no matter the selected mode 2025-01-02 13:02:51 +00:00
4f9494245f fix: The Tls Fingerprint label not being shown on start up 2025-01-02 13:02:51 +00:00
2294981525 fix: Unify both Quit actions to use the same function
Mac os tray quit not working
2024-12-30 11:07:34 +00:00
13b58f2f7a fix: 8017, move wayland error to debug context 2024-12-28 20:46:51 +00:00
2455e0e29f refactor: Copy the full version string on the about dialog 2024-12-28 20:36:35 +00:00
23c054661c Release v.18.0, with proper win package
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / lint-check (push) Waiting to run
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2024-12-26 13:16:58 -05:00
098f56daee Release 1.18.0 2024-12-26 12:29:20 -05:00
ee8baeb1ff fix: qDebug doesn't work on Fedora 2024-12-26 16:48:39 +00:00
81d478632a fix: 8012 use 2/3 height on mac os for the log indicator 2024-12-26 16:32:11 +00:00
8e9925d6c8 fix: Mac os missing Quit from tray menu 2024-12-26 16:32:11 +00:00
368ccbbe4c fix: show normal mac os 2024-12-26 16:32:11 +00:00
a401c98bf6 build: fix mac os missing ; 2024-12-26 15:24:02 +00:00
f61fe00c33 ci: update lint action style 2024-12-26 15:24:02 +00:00
97890f86d3 chore: use static QApplication members where possible 2024-12-26 15:01:59 +00:00
638970d65e feat: Visiblity toggle for the log on the main window 2024-12-26 14:45:52 +00:00
98eb89255d refactor: move optional scripts to external repo 2024-12-26 14:29:25 +00:00
ccc60ff900 refactor: mv deskflow[s|c|d] to deskflow-server, deskflow-client and deskflow-deamon 2024-12-26 13:37:29 +00:00
db441eb5cf fix: win32 client taskbar remove duplicate state 2024-12-26 13:37:29 +00:00
21b345e9db fix: Create new Tray Icons for windows 2024-12-26 13:37:29 +00:00
9af37463fd refactor: single copy of app ico files for window now in src/apps/res 2024-12-26 13:37:29 +00:00
225ca23482 refactor: move all apps to one src/apps folder 2024-12-26 13:37:29 +00:00
9811586718 fixes: #7940 Use std::string insert to in place of arg sub for std::string static 2024-12-26 13:06:21 +00:00
858c41c946 fix: #7942, Correctly substitute config name part
fixes https://github.com/deskflow/deskflow/issues/7942
2024-12-26 12:28:19 +00:00
8b25e11f81 ci: combine lint-clang and lint-error into lint-check 2024-12-26 11:48:20 +00:00
d9727e60bc ci: remove unused init-python action 2024-12-26 11:48:20 +00:00
f8ddafe4a2 ci: use clang-format directly in lint-clang action 2024-12-26 11:48:20 +00:00
ab44559df6 fix(CVE-2021-42076): Enforce maximum message length to prevent memory exhaustion
based on barrier: debauchee/barrier@7ab8e01, debauchee/barrier@cc36982,
debauchee/barrier@e33c81b, debauchee/barrier@af90f39, debauchee/barrier@fd5295e
2024-12-26 10:45:21 +00:00
626e8c7364 fix(CVE-2021-42074): Handle SSL race conditions and segmentation fault
based on barrier: debauchee/barrier@8b937a4
2024-12-26 10:24:22 +00:00
041512b050 chore: remove unused scripts 2024-12-22 09:52:50 -05:00
cd0e98a480 build: remove post_config macros 2024-12-22 09:52:50 -05:00
802cfaa279 chore: removed unused scripts/daemon.py 2024-12-22 09:52:50 -05:00
aff3495e74 refactor: MainWindow clearer menu creation, remove private menu items 2024-12-22 12:39:59 +00:00
1ff7d5f4aa refactor: MainWindow remove need created / onCreated methods 2024-12-22 12:39:59 +00:00
784b2b2f6f fix: MainWindow, Use tr for use facing strings 2024-12-22 12:39:59 +00:00
927c8c146e refactor: MainWindow, use qDebug and friends correctly 2024-12-22 12:39:59 +00:00
94006f0bcd refactor: MainWindow, do not use autoconnections for the client / server radio butons 2024-12-22 12:39:59 +00:00
19c227b937 refactor: MainWindow, Do not use autoconnection for tls label 2024-12-22 12:39:59 +00:00
be5025b225 refactor: MainWindow, Do not use auto connection for the computer name label 2024-12-22 12:39:59 +00:00
4ee7d7b20f refactor: MainWindow, Do not auto connect the configure sever button 2024-12-22 12:39:59 +00:00
5032a5d275 refactor: MainWindow, no more auto connection for the host and client ip lines 2024-12-22 12:39:59 +00:00
d0dadf2112 refactor: MainWindow, better handle the toggleCore and ApplySettings buttons 2024-12-22 12:39:59 +00:00
2211caecb8 refactor: MainWindow, m_PButtonToggleStart -> btnToggleCore 2024-12-22 12:39:59 +00:00
5aa4840972 refactor: MainWindow, Create Actions in code 2024-12-22 12:39:59 +00:00
937ac053fe fix(CVE-2021-42075): Close connection on app-level handshake failure
based on barrier: debauchee/barrier@deefecc
2024-12-18 17:23:27 +00:00
cb638f4712 ci: bump mount wait time for macOS 2024-12-18 12:10:53 -05:00
751904f27c buid: add depends for deskflow core
fixes #7955
2024-12-18 12:10:53 -05:00
b9247b4c27 refactor: cleanup windows deploy files 2024-12-18 12:10:53 -05:00
cfd0bb9262 refactor: clean up mac os deploy files 2024-12-18 12:10:53 -05:00
d128623df3 refactor: clean up deploy for linux 2024-12-18 12:10:53 -05:00
b641a885d5 refactor: rm cmake/Packaging.cmake, instead do the config_linux_name macro in place 2024-12-18 12:10:53 -05:00
3817489097 chore: remove old wix building and build on ci with cpack 2024-12-18 12:10:53 -05:00
f06a789d25 build: wix generation for windows with cpack 2024-12-18 12:10:53 -05:00
b6d5095871 build: windows install step for deskflow gui 2024-12-18 12:10:53 -05:00
a06d65b1f9 build: windows, create install step for server 2024-12-18 12:10:53 -05:00
56ecd88945 build: windows, create install step for client 2024-12-18 12:10:53 -05:00
5a45e6d102 build: windows, create install step for daemon 2024-12-18 12:10:53 -05:00
e4ecbdae8a fix: macOS correctly restore window when hidden with command+H 2024-12-18 09:52:17 -05:00
bf4f513d7e chore: format *.m and *.mm files 2024-12-18 09:52:17 -05:00
af6dac9eee fix: Always show the tray menu entry for the restore action on macOS 2024-12-18 09:52:17 -05:00
ebad12a922 refactor: use QList for the tray's Action List 2024-12-18 09:52:17 -05:00
8aec0dd5bb fix: UTF-16 surrogate handling.
The data pointer needs to move before decoding the second
surrogate, and not after. The first surrogate was begin decoded
again, resulting in an invalid codepoint.

This affected clipboard operations originating on Windows machines,
where the text is encoded in UTF-16 and copying characters from a
high plane (like emojis) was broken.
2024-12-18 08:28:47 -05:00
ddb443b550 fix: Mainwindow can not start off screen
Fixes #7451
2024-12-18 07:59:56 -05:00
6a816350c1 mv .vscode to new repo github.com:deskflow/.vscode.git 2024-12-17 14:10:03 -05:00
0c26893706 fix: fixes #7949 Fixup groupboxes for settings dialog make settings dialog a fixed height 2024-12-17 09:29:09 -05:00
53b9c0908e fix: Windows, avoid encoding empty data to the clipboard
Do not attempt to convert null data to clipboard format and exit
early
2024-12-17 14:19:24 +00:00
252d11a316 feat: Windows, Use a clipboard format listener to monitor the clipboard
On Windows monitor the clipboard using a Clipboard format listener instead
of the legacy clipboard viewer chain, which was unreliable as it required
other programs to maintain the clipboard chain properly and couldn't
recover it any window in the clipboard viewer chain stopped responding
to messages.

Monitor the clipboard sequence number to not process the clipboard more
than once.
2024-12-17 14:19:24 +00:00
5026eea60a Fix: Use tray icon to hide and show from tray correctly
Remove show / hide from the tray menu
 Remove always disabled "show" action from window menu
2024-12-16 17:17:19 +00:00
482aa7a049 chore: Add minimum macOS version to readme 2024-12-16 08:59:33 -05:00
e12432d3d8 Update README.md 2024-12-06 07:40:05 -05:00
0349c06fed build: ReAdd NDEBUG define 2024-12-05 07:50:26 -05:00
6b7291f4b1 chore: src/lib/server/Config remove redundant c_str call 2024-12-04 10:40:58 -05:00
991293dd0c chore: src/gui/Action use default constructor 2024-12-04 10:40:58 -05:00
2349ce7f52 chore: replace simple cases of typedef with using 2024-12-04 10:40:58 -05:00
1d43e7c626 chore: src/gui/Action initilize items in class when possible 2024-12-04 10:40:58 -05:00
48e357f111 chore: IArchTrayBarReceiver subclass should override virtual methods not mark them virtual 2024-12-04 10:40:58 -05:00
d225be501e chore: IArchTaskBarReeiver subclasses should return nullptr for empty icon not NULL 2024-12-04 10:40:58 -05:00
37acc3b2fc chore: IArchTaskBarReciver subclasses Icon pointer should not be a const 2024-12-04 10:40:58 -05:00
b783f6e754 chore: scripts/package.py, remove unused vars in package method 2024-12-04 10:40:58 -05:00
6e01cc6ce5 ci: add config option for build step 2024-12-04 10:05:34 -05:00
6498fe5a6b refactor: use Qt Required Version rm configure_qt macro for its one use 2024-12-04 10:05:34 -05:00
4e23460c6f refactor: no configure_openssl macro 2024-12-04 10:05:34 -05:00
7ce2845c9b refactor: place simple macros where they are used 2024-12-04 10:05:34 -05:00
c8e1e4f38f refactor: rm unneed macro to flatten code coverage logic 2024-12-04 10:05:34 -05:00
922ad66aff refactor: options in place
remove use of env vars to set build options
 users should set these at cmake configure time
2024-12-04 10:05:34 -05:00
b0d22926f9 refactor: rm :cmake/Defines move last macro to Bulid.cmake 2024-12-04 10:05:34 -05:00
81631cac32 refactor: set test names directly and call only configure_options in main cmakelists.txt 2024-12-04 10:05:34 -05:00
1685c6e946 chore: rm unneeded debug define 2024-12-04 10:05:34 -05:00
1e8ff50d59 refactor: mv cmake policy settings to main CMakelists.txt 2024-12-04 10:05:34 -05:00
5d591e3518 build: rm unneeed configure_ninja steps 2024-12-04 10:05:34 -05:00
57f6248b6a build: rm configure_build macro set items in main CMakeLists.txt 2024-12-04 10:05:34 -05:00
d6c682a923 chore: rm unused src/lib/gui/gui_config.h 2024-12-04 10:05:34 -05:00
4f8ae57ffd build: always include headers 2024-12-04 10:05:34 -05:00
a92f5b0351 refactor: correct osx deployment target and move to main CMakeLists.txt 2024-12-04 10:05:34 -05:00
0f0846f011 build: mv CXX Options to the Main CMakeLists.txt 2024-12-04 10:05:34 -05:00
86cca8a0d1 refactor: don't use a macro for a single line 2024-12-04 10:05:34 -05:00
eb9e507a1f chore: rm Unused Build_Time macro and define 2024-12-04 10:05:34 -05:00
03f1408a98 refactor: mv src/lib/gui/VersionChecker => src/gui/src/ 2024-12-04 10:05:34 -05:00
7f9fd80f98 refactor: remove workarounds for unsupported ms vc versions 2024-12-04 10:05:34 -05:00
c5cfdc2b69 refactor: AboutDialog, show the version tweak only if its not 0, when showing the tweak also show the sha 2024-12-04 10:05:34 -05:00
7656b49f1b refactor: set GIT_SHA_SHORT with git command 2024-12-04 10:05:34 -05:00
c05a87b716 refactor: rm src/lib/common/copyright, add to src/lib/common/constants 2024-12-04 10:05:34 -05:00
4a83eb711f build: generate version info, use it for all sources of version 2024-12-04 10:05:34 -05:00
f321f6596b build: make an interface lib out of the common folder 2024-12-04 10:05:34 -05:00
18bc419b7a build: remove unused DESKFLOW_REVISION and DESKFLOW_VERSION_STAGE defines 2024-12-04 10:05:34 -05:00
25660049e4 Add windows requirement and flathub link to readme 2024-11-25 21:15:07 +00:00
9fcf261245 build: use CPACK_WIX_UPGRADE_GUID for wix GUID
Remove unuseable 32bit Parts
2024-11-25 20:50:58 +00:00
59d9454df1 build: install License files 2024-11-25 20:50:58 +00:00
14f66e2dee refactor: simplify linux os-release parsing 2024-11-25 20:50:58 +00:00
882b71ea84 ci: consistant upload name for flatpak fixes 7911 2024-11-25 19:37:13 +00:00
d26339d94a ci: remove unused test-actions workflow 2024-11-25 19:27:05 +00:00
079bfdc854 chore: update metadata long desc 2024-11-21 14:55:58 +00:00
3003670b94 ci: use x86_64 for job names 2024-11-21 14:55:58 +00:00
79c17e3564 ci: use master version of flatpak builder 2024-11-21 14:55:58 +00:00
397f9f0fac ci: add linux to flatpak bundle name 2024-11-21 14:55:58 +00:00
40ff14473d build: use linux for distro name is its no defined 2024-11-21 14:55:58 +00:00
b16a03c3ad fix: flatpak recipe should not clean up "lib/debug" 2024-11-21 14:55:58 +00:00
f11178327d chore: remove unused python parts 2024-11-21 14:27:01 +00:00
c6f352ac4a refactor: move most of the remaing packaging info into deploy 2024-11-21 14:27:01 +00:00
2cdbd8f491 build: use CPack for macOS to create dmg 2024-11-21 14:27:01 +00:00
a63435e64a build: use cmake to make the macOS bundle 2024-11-21 14:27:01 +00:00
9084a49034 Release 1.17.2
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / lint-clang (push) Waiting to run
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-amd64 (push) Blocked by required conditions
Continuous Integration / debian-13-amd64 (push) Blocked by required conditions
Continuous Integration / fedora-40-amd64 (push) Blocked by required conditions
Continuous Integration / fedora-41-amd64 (push) Blocked by required conditions
Continuous Integration / opensuse-amd64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2024-11-20 08:24:13 -05:00
ceaeb7fef4 ci: build flatpaks 2024-11-20 08:47:13 +00:00
328ab0cc0c feat: fix flatpak recipe 2024-11-20 08:47:13 +00:00
11896e652f fix: single typo in README.md
`brew instal` works as intended, but only because Homebrew has aliases for a few common typos
2024-11-17 16:32:24 -05:00
147869e3a5 build: remove DESKFLOW_SHOW_DEV_THANKS define 2024-11-15 12:20:17 +00:00
25dd0ddfbc build: rm DAEMON_BINARY_NAME 2024-11-15 12:20:17 +00:00
45a61310a4 build: rm CORE_BINARY_NAME define 2024-11-15 12:20:17 +00:00
2213f3f746 build:rm CLIENT_BINARY_NAME define 2024-11-15 12:20:17 +00:00
e52ce58541 build: rm SERVER_BINARY_NAME define 2024-11-15 12:20:17 +00:00
078ec61e9a build: rm GUI_BINARY_NAME define 2024-11-15 12:20:17 +00:00
e446397740 build: rm DESKFLOW_MAC_BUNDLE_CODE 2024-11-15 12:20:17 +00:00
5a98245ddf build: rm DESKFLOW_RES_DIR define 2024-11-15 12:20:17 +00:00
366932a188 build: rm DESKFLOW_HELP_TEXT define 2024-11-15 12:20:17 +00:00
bdcf770de6 build: rm DESKFLOW_VERSION_URL define 2024-11-15 12:20:17 +00:00
e865397f12 build: rm DESKFLOW_WEBSITE_URL define 2024-11-15 12:20:17 +00:00
97ea628c14 build: rm DESKFLOW_MAINTAINER define 2024-11-15 12:20:17 +00:00
b5d0417714 build: rm DESKFLOW_AUTHOR_NAME define 2024-11-15 12:20:17 +00:00
403830ceea build: rm DESKFLOW_APP_NAME define
Unify Server APP USER_CONFIG_NAME and SYSTEM_CONFIG_NAME
 Some unix users may need to move their config to deskflow.conf from .deskflow.conf
2024-11-15 12:20:17 +00:00
9b59acdf26 build: rm DESKFLOW_DOMAIN define 2024-11-15 12:20:17 +00:00
46a6f74fb7 build: rm DESKFLOW_APP_ID define 2024-11-15 12:20:17 +00:00
937813cb2e fix: MainWindow not saving initial update flag 2024-11-14 08:19:13 -05:00
7bf474a54a feat: SettingsDialog, Allow user to toggle the check for updates settings
fixes: #7890
2024-11-14 08:19:13 -05:00
2990de322f fix: SettingsDialog ui generating nonsence alignment tags when edited 2024-11-14 08:19:13 -05:00
6dea7f3437 chore: adjust branding light / dark colors to dddddd / 555555 2024-11-14 11:00:27 +00:00
d141fce533 chore: update the deskflow shipped icon to have proper padding 2024-11-14 11:00:27 +00:00
ab244debed Rename CI badge to match new .yml filename 2024-11-12 16:17:22 -05:00
215706fa1e ci: rename ci.yml to => continuous-integration.yml 2024-11-12 14:10:03 +00:00
4e1fee92fd build: add metainfo 2024-11-12 14:00:59 +00:00
ee35f8d87d refactor: mv res/dist/wix => deploy/dist/wix 2024-11-12 14:00:59 +00:00
9b6c7f805f refactor: mv res/dist/mac => deploy/dist/mac 2024-11-12 14:00:59 +00:00
391df0bae0 refactor: mv res/dist/flatpak => deploy/res/flatpak 2024-11-12 14:00:59 +00:00
a64680c1fb chore: rm unneeded res/dist/flatpak/flatpak-desktop.patch 2024-11-12 14:00:59 +00:00
6e5c6bcf80 refactor: mv res/dist/arch => deploy/dist/arch 2024-11-12 14:00:59 +00:00
5ddc7f8b0c refactor: mv res/dist/linux/app.desktop.in => deploy/org.deskflow.deskflow.desktop 2024-11-12 14:00:59 +00:00
363fb5621d refactor: mv res/app.png and res/app.svg => deploy 2024-11-12 14:00:59 +00:00
e9749d8394 chore rm: unused app.svg 2024-11-12 14:00:59 +00:00
a53e289a45 refactor: mv res/win/version.rc.in => deploy/version.rc.in 2024-11-12 14:00:59 +00:00
e6fbf983e9 chore: alphabetize app.qrc resource file 2024-11-12 14:00:59 +00:00
a0666f0167 refactor mv: res/gui => src/gui/res 2024-11-12 14:00:59 +00:00
aba9c08352 refactor: use theme icon for document open fallback to the folder icon 2024-11-12 14:00:59 +00:00
4359075b06 feat: use platform native styles when possible
With Qt 6.7+ Light and Dark theme support is now provided by the mac os default theme
2024-11-12 14:00:59 +00:00
77c4707ec5 refactor: mv src/lib/gui/TrayIcon => src/gui/src/TrayIcon 2024-11-12 14:00:59 +00:00
18e66271ae refactor: mv res/app.ico src/gui/src/app.ico 2024-11-12 14:00:59 +00:00
031c393e0d refactor: mv res/gui/win/app.rc => src/gui/src/app.rc 2024-11-12 14:00:59 +00:00
c3cef678b0 chore: rm unused res/License.rtf 2024-11-12 14:00:59 +00:00
8ad06a8193 chore: rm unused res/License.tex 2024-11-12 14:00:59 +00:00
77f971ccb7 chore: rm unused res/doxygen.cfg.in 2024-11-12 14:00:59 +00:00
3815bc6f5c ci: update winget release for new filename scheme 2024-11-08 16:23:26 +00:00
944f68bf81 docs: Update readme to use latest for the stable link and continuous to continuous 2024-11-08 16:14:23 +00:00
1062 changed files with 23074 additions and 42590 deletions

View File

@ -1,6 +1,6 @@
name: Bug report
description: If you find a bug in Deskflow, please let us know so we can fix it.
labels: ["bug", "triage", "unanswered"]
type: "Triage [bug]"
body:
- type: markdown
attributes:
@ -22,12 +22,16 @@ body:
validations:
required: true
- type: input
- type: textarea
id: version
attributes:
label: Deskflow version number
description: You can find the Deskflow version number on the about screen.
placeholder: 1.2.3.4
label: Deskflow version info
description: You can find the Deskflow version number on the About screen.
placeholder: |
Deskflow: 1.2.3.4 (deadc0de)
Qt: 3.2.1
System: Hannah Montana Linux (Workstation Edition)
Session: Unity (Compiz)
validations:
required: true
@ -51,7 +55,7 @@ body:
id: os
attributes:
label: Operating systems (OS)
description: Which operating systems (OS) are you using?
description: Operating systems (OS) in use for all servers and clients
options:
- label: Windows
- label: macOS
@ -110,8 +114,7 @@ body:
label: Deskflow configuration
description: |
Please provide a very brief description of your configuration.
Let us know the OS of the server/host/primary and the OS of the client/guest/secondary.
This will help us understand how you're using Deskflow.
Let us know what OS your server and client are running.
placeholder: |
- Windows 11 server, macOS 15 client
- Each computer has a single monitor
@ -122,9 +125,8 @@ body:
attributes:
label: What steps will reproduce the problem?
description: |
Please list the steps to reproduce the issue.
Please list the _numbered steps_ to reproduce the issue.
If you're not sure, please provide as much detail as possible.
This will help us understand the problem.
placeholder: |
1. Start Deskflow
2. Click 'Configure Server'

View File

@ -1,6 +1,6 @@
name: Feature request
description: Had an idea how to improve Deskflow? Share it with us.
labels: ["enhancement", "triage", "unanswered"]
type: "Triage [feature]"
body:
- type: markdown
attributes:

View File

@ -1,23 +0,0 @@
# Important: Do not be tempted to cache the .venv dir (Python virtual environment).
# When the runner environment changes (e.g. Python is upgraded), the venv will need to be
# re-created. Trying to upgrade a venv can be complex and it's usually more practical re-create it.
# We don't save much time anyway by caching the venv so it's not worth the added complexity.
name: "Setup Python venv"
description: "Creates a Python virtual environment (venv)"
runs:
using: "composite"
steps:
- name: Setup Python venv
run: |
if [ "${{ runner.os }}" == "Windows" ]; then
python=python
else
python=python3
fi
echo "Setting up Python venv, bin=$python"
$python -m venv .venv
shell: bash

View File

@ -9,8 +9,12 @@ inputs:
description: "Used only on linux distro type: debian, fedora, suse, arch"
required: false
mac-qt-version:
description: "The verison of Qt to install on mac os"
qt-version:
description: "The version of Qt to install (Windows & macOS)"
required: false
qt-install-dir:
description: "The path to install Qt into (Windows & macOS)"
required: false
outputs:
@ -33,30 +37,26 @@ runs:
apt update -qqq > /dev/null
apt install -qqq cmake build-essential ninja-build \
xorg-dev libx11-dev libxtst-dev libssl-dev \
libglib2.0-dev libgdk-pixbuf-2.0-dev libnotify-dev \
libxkbfile-dev qt6-base-dev qt6-tools-dev \
libgtk-3-dev libgtest-dev libgmock-dev libpugixml-dev \
libglib2.0-dev libxkbfile-dev qt6-base-dev qt6-tools-dev \
libgtk-3-dev libgtest-dev libgmock-dev \
libei-dev libportal-dev libtomlplusplus-dev libcli11-dev -y >/dev/null
elif [ ${{inputs.like}} == "fedora" ]; then
dnf install -y cmake make ninja-build gcc-c++ \
rpm-build openssl-devel glib2-devel \
gdk-pixbuf2-devel libXtst-devel libnotify-devel \
libxkbfile-devel qt6-qtbase-devel qt6-qttools-devel \
gtk3-devel gtest-devel gmock-devel pugixml-devel \
libXtst-devel libxkbfile-devel qt6-qtbase-devel qt6-qttools-devel \
gtk3-devel gtest-devel gmock-devel \
libei-devel libportal-devel tomlplusplus-devel \
cli11-devel
elif [ ${{inputs.like}} == "suse" ]; then
zypper refresh
zypper install -y --force-resolution \
cmake make ninja gcc-c++ rpm-build libopenssl-devel \
glib2-devel gdk-pixbuf-devel libXtst-devel libnotify-devel \
libxkbfile-devel qt6-base-devel qt6-tools-devel gtk3-devel \
googletest-devel googlemock-devel pugixml-devel libei-devel \
glib2-devel libXtst-devel libxkbfile-devel qt6-base-devel qt6-tools-devel gtk3-devel \
googletest-devel googlemock-devel libei-devel \
libportal-devel tomlplusplus-devel cli11-devel
elif [ ${{ inputs.like }} == "arch" ]; then
pacman -Syu --noconfirm base-devel cmake ninja \
gcc openssl glib2 gdk-pixbuf2 libxtst libnotify \
libxkbfile gtest pugixml libei libportal \
gcc openssl glib2 libxtst libxkbfile gtest libei libportal \
qt6-base qt6-tools gtk3 tomlplusplus cli11
else
echo "Unknown like"
@ -67,13 +67,13 @@ runs:
shell: bash
- name: Install Qt
if: ${{runner.os == 'macOS' }}
if: ${{runner.os != 'Linux' }}
uses: jurplel/install-qt-action@v4
with:
dir: "/Users/runner"
version: ${{inputs.mac-qt-version}}
dir: ${{inputs.qt-install-dir}}
version: ${{inputs.qt-version}}
cache: true
cache-key-prefix: ${{matrix.target.os}}-${{env.qt-version}}
cache-key-prefix: ${{matrix.target.os}}-${{inputs.qt-version}}
# Install Ninja with an action instead of using Chocolatey, as it's more
# reliable and faster. The Ninja install action is pretty good as it
@ -87,7 +87,8 @@ runs:
id: vcpkg
uses: johnwason/vcpkg-action@v6
with:
manifest-dir: ${{ github.workspace }}
pkgs: gtest openssl
extra-args: --classic
triplet: x64-windows-release
token: ${{ github.token }}
github-binarycache: true
@ -95,6 +96,8 @@ runs:
- name: Install Wix
if: ${{ runner.os == 'Windows' }}
run: |
dotnet tool install --global wix --version 4.0.4
wix extension add --global WixToolset.UI.wixext/4.0.4
dotnet tool install --global wix --version 5.0.2
wix extension add --global WixToolset.UI.wixext/5.0.2
wix extension add --global WixToolset.Util.wixext/5.0.2
wix extension add --global WixToolset.Firewall.wixext/5.0.2
shell: pwsh

View File

@ -1,26 +1,21 @@
name: "Lint error"
name: "Lint Check"
description: "Checks for lint errors and posts a helpful comment"
inputs:
format-command:
description: "The command to run to fix lint errors"
required: true
format-tool:
description: "The name of the linting tool"
required: true
runs:
using: "composite"
steps:
- name: Install Dependencies
run: pipx install --global clang-format==20.1.0
shell: bash
- name: Run format command
run: ${{ inputs.format-command }}
run: find src/ -regex '.*\.\(cpp\|hpp\|cc\|cxx\|h\|c\|m\|mm\)' -exec clang-format -i {} \;
shell: bash
- name: Find changes
id: changes
run: |
file=${{ inputs.format-tool }}.diff
file=clang-format.diff
diff=$(git diff | tee $file)
if [ -z "$diff" ]; then
@ -43,7 +38,7 @@ runs:
if: steps.changes.outputs.diff
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.format-tool }}-diff
name: clang-format-diff
path: ${{ steps.changes.outputs.file }}
if-no-files-found: error
@ -54,9 +49,9 @@ runs:
code_block="\`\`\`"
summary=$(cat<<EOF
❌ \`${{ inputs.format-tool }}\`: It looks like your changes don't match our code style.
❌ \`clang-format\`: It looks like your changes don't match our code style.
🛠️ Please either run \`${{ inputs.format-command }}\` or apply this patch with \`git apply\`:
🛠️ Please either run \`clang-format -i\` on the file or apply this patch with \`git apply\`:
[\`${{ steps.changes.outputs.file }}\`](${{ steps.upload.outputs.artifact-url }})
$code_block diff
@ -67,7 +62,7 @@ runs:
echo "$summary" >> $GITHUB_STEP_SUMMARY
file="ci_summary.md"
echo "❌🛠️ \`${{ inputs.format-tool }}\`: Lint errors, fix available." >> $file
echo "❌🛠️ \`clang-format\`: Lint errors, fix available." >> $file
echo "file=$file" >> $GITHUB_OUTPUT
shell: bash
@ -75,7 +70,7 @@ runs:
if: steps.summary.outputs.file
uses: actions/upload-artifact@v4
with:
name: summary-${{ inputs.format-tool }}
name: summary-clang-format
path: ${{ steps.summary.outputs.file }}
if-no-files-found: error

View File

@ -1,21 +0,0 @@
name: "Lint clang"
description: "Lint with Clang formatter"
runs:
using: "composite"
steps:
- name: Setup Python venv
uses: ./.github/actions/init-python
- name: Install dependencies
shell: bash
run: |
source .venv/bin/activate
pip install pyyaml clang_format
- name: Linting with Clang formatter
uses: ./.github/actions/lint-error
with:
format-command: ./scripts/lint_clang.py -f
format-tool: "clang-format"

View File

@ -21,8 +21,8 @@ runs:
Invoke-WebRequest https://aka.ms/wingetcreate/latest -OutFile wingetcreate.exe
$packageId = "Deskflow.Deskflow"
$installerUrl = "https://github.com/deskflow/deskflow/releases/download/v${{ inputs.release-version }}/deskflow-${{ inputs.release-version }}.0_win64.msi"
$installerUrl = "https://github.com/deskflow/deskflow/releases/download/v${{ inputs.release-version }}/deskflow-${{ inputs.release-version }}-win-x64.msi"
# Submit package update
.\wingetcreate.exe update "$packageId" `
--version "${{ inputs.release-version }}" `

View File

@ -11,7 +11,7 @@ name: CI comment
on:
workflow_run:
workflows: ["CI"]
workflows: ["Continuous Integration"]
types:
- completed

View File

@ -44,7 +44,7 @@ jobs:
apt install -qqq git > /dev/null
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Install dependencies
uses: ./.github/actions/install-dependencies

View File

@ -2,7 +2,7 @@
# Runs on all platforms (Windows, macOS, and Linux)
# for all events (pull request, release, and schedule).
name: CI
name: Continuous Integration
on:
push:
@ -34,7 +34,7 @@ jobs:
# Always run this job, even if not on PR, since other jobs need it.
pr-comment-flags:
runs-on: ubuntu-latest
needs: lint-clang
needs: lint-check
outputs:
no-sonar: ${{ steps.check.outputs.no-sonar }}
@ -61,7 +61,7 @@ jobs:
# Quality gate to allow PR merge, used in the branch protection rules.
ci-passed:
runs-on: ubuntu-latest
needs: [test-results, unix]
needs: [test-results, unix, flatpak]
steps:
- run: echo "✅ CI passed" > $GITHUB_STEP_SUMMARY
@ -82,7 +82,18 @@ jobs:
- name: Test summary
uses: ./.github/actions/test-summary
lint-clang:
reuse-lint:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: REUSE Compliance Check
uses: fsfe/reuse-action@v4
lint-check:
needs: [reuse-lint]
runs-on: ubuntu-latest
timeout-minutes: 5
@ -90,11 +101,11 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Linting Clang
uses: ./.github/actions/lint-clang
- name: Lint Checker
uses: ./.github/actions/lint-check
analyse-valgrind:
needs: lint-clang
needs: lint-check
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/valgrind-analysis.yml
@ -106,7 +117,7 @@ jobs:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
main-build:
needs: lint-clang
needs: lint-check
name: ${{ matrix.target.name }}
runs-on: ${{ matrix.target.runs-on }}
container: ${{ matrix.target.container }}
@ -120,55 +131,100 @@ jobs:
target:
- name: "windows-2022-x64"
runs-on: "windows-2022"
timeout: 120 #Windows can take while if it has to build vcpkg cache
timeout: 30
config-args: "-G Ninja"
qt-install-dir: "C:"
- name: "macos-14-arm64"
runs-on: "macos-14"
timeout: 10
arch: arm64
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"arm64\" -DMACOSX_DEPLOYMENT_TARGET=12"
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"arm64\""
qt-install-dir: "/Users/runner"
- name: "macos-13-x64"
runs-on: macos-13
timeout: 20
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" -DMACOSX_DEPLOYMENT_TARGET=12"
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"x86_64\""
qt-install-dir: "/Users/runner"
- name: "debian-13-amd64"
- name: "debian-13-x86_64"
runs-on: ubuntu-latest
container: debian:trixie-slim
like: "debian"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-41-amd64"
- name: "debian-13-arm64"
runs-on: ubuntu-24.04-arm
container: debian:trixie-slim
like: "debian"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-41-x86_64"
runs-on: ubuntu-latest
container: fedora:41
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-40-amd64"
- name: "fedora-41-arm64"
runs-on: ubuntu-24.04-arm
container: fedora:41
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-40-x86_84"
runs-on: ubuntu-latest
container: fedora:40
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "opensuse-amd64"
- name: "fedora-40-arm64"
runs-on: ubuntu-24.04-arm
container: fedora:40
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "opensuse-x86_84"
runs-on: ubuntu-latest
container: opensuse/tumbleweed:latest
like: "suse"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "archlinux-amd64"
- name: "opensuse-arm64"
runs-on: ubuntu-24.04-arm
container: opensuse/tumbleweed:latest
like: "suse"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "archlinux-x86_84"
runs-on: ubuntu-latest
container: archlinux:latest
like: "arch"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "ubuntu-25.04-x86_64"
runs-on: ubuntu-latest
container: ubuntu:25.04
like: "debian"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "ubuntu-25.04-arm64"
runs-on: ubuntu-24.04-arm
container: ubuntu:25.04
like: "debian"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
steps:
# Make sure the container has git before we do anything else
- name: Install Git on Container
@ -190,7 +246,7 @@ jobs:
# Fancy checkout gets all the tags
# it also makes sure we can use git --describe correctly
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
# This effectively runs `vcvarsall.bat`, etc. It's not actually installing
# VC++ as that's already pre-installed on the Windows runner.
@ -202,29 +258,23 @@ jobs:
id: get-deps
uses: ./.github/actions/install-dependencies
with:
mac-qt-version: 6.7.2
qt-version: 6.8.2
qt-install-dir: ${{matrix.target.qt-install-dir}}
like: ${{ matrix.target.like }}
- name: Setup Python
if: ${{runner.os != 'Linux' }}
run: python ./scripts/setup_venv.py
- name: Get version
uses: ./.github/actions/get-version
- name: Configure
run: ${{env.CMAKE_CONFIGURE}} ${{ matrix.target.config-args }} ${{ steps.get-deps.outputs.vcpkg-cmake-config }} -DPACKAGE_VERSION_LABEL=${{env.DESKFLOW_PACKAGE_VERSION}}
run: ${{env.CMAKE_CONFIGURE}} ${{ matrix.target.config-args }} ${{ steps.get-deps.outputs.vcpkg-cmake-config }} -DPACKAGE_VERSION_LABEL="${{env.DESKFLOW_PACKAGE_VERSION}}"
- name: Build
shell: bash
run: |
if [[ "$RUNNER_OS" == "Linux" && "${{matrix.target.like}}" != "arch" ]]; then
cmake --build build -j8 --target package
if [[ "${{matrix.target.like}}" != "arch" ]]; then
cmake --build build --config Release -j8 --target package
else
cmake --build build -j8
fi
if [ ${{ matrix.target.like }} == "arch" ];then
cmake --build build --config Release -j8
useradd -m build
sudo chown -R build build
cd build
@ -241,23 +291,6 @@ jobs:
with:
job: ${{ matrix.target.name }}
- name: Package
if: ${{ runner.os != 'Linux' }}
shell: bash
run: |
python ./scripts/package.py --package-version ${{env.DESKFLOW_PACKAGE_VERSION}}
mv dist/deskflow* build/
env:
WINDOWS_PFX_CERTIFICATE: ${{ secrets.WINDOWS_PFX }}
WINDOWS_PFX_PASSWORD: ${{ secrets.WINDOWS_PFX_PASS }}
APPLE_CODESIGN_ID: ${{ secrets.APPLE_CODESIGN_ID }}
APPLE_P12_CERTIFICATE: ${{ secrets.APPLE_P12_CERTIFICATE }}
APPLE_P12_PASSWORD: ${{ secrets.APPLE_P12_PASSWORD }}
APPLE_NOTARY_USER: ${{ secrets.APPLE_NOTARY_USER }}
APPLE_NOTARY_PASSWORD: ${{ secrets.APPLE_NOTARY_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
- name: Upload
uses: actions/upload-artifact@v4
with:
@ -266,7 +299,7 @@ jobs:
# Technically, "unix" is a misnomer, but we use it here to mean "Unix-like BSD-derived".
unix:
needs: lint-clang
needs: lint-check
name: unix-${{ matrix.distro.name }}
runs-on: ${{ vars.CI_UNIX_RUNNER || 'ubuntu-24.04' }}
timeout-minutes: 20
@ -282,7 +315,7 @@ jobs:
# Fancy checkout gets all the tags
# it also makes sure we can use git --describe correctly
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Build on FreeBSD
if: ${{ matrix.distro.name == 'freebsd' }}
@ -298,6 +331,54 @@ jobs:
export QT_QPA_PLATFORM=offscreen
./build/bin/unittests
./build/bin/integtests || true
flatpak:
needs: lint-check
name: flatpak-${{matrix.flatpak.arch}}
runs-on: ${{matrix.flatpak.runs-on}}
timeout-minutes: 60
container:
image: ghcr.io/flathub-infra/flatpak-github-actions:kde-6.8
options: --privileged
strategy:
fail-fast: false
matrix:
flatpak:
- runs-on: ubuntu-latest
arch: x86_64
- runs-on: ubuntu-24.04-arm
arch: aarch64
steps:
- name: Check out repository
uses: sithlord48/fancy-checkout@v1
- run: git config --global protocol.file.allow always
- name: Get version
uses: ./.github/actions/get-version
- name: Lint appsteam
run: flatpak-builder-lint appstream deploy/linux/org.deskflow.deskflow.metainfo.xml
- name: Lint manifest
run: flatpak-builder-lint manifest deploy/linux/flatpak/org.deskflow.deskflow.yml
- name: Build
uses: flathub-infra/flatpak-github-actions/flatpak-builder@53987ffa5f687586936d85fdce3f440848bea04d
with:
bundle: deskflow-${{env.DESKFLOW_PACKAGE_VERSION}}-linux-${{matrix.flatpak.arch}}.flatpak
manifest-path: deploy/linux/flatpak/org.deskflow.deskflow.yml
cache-key: flatpak-builder-${{matrix.flatpak.arch}}-2.0
arch: ${{matrix.flatpak.arch}}
upload-artifact: false
- name: Validate build
run: flatpak-builder-lint --exceptions --user-exceptions deploy/linux/flatpak/ci-build-lint-exceptions.json repo repo
- name: Upload
uses: actions/upload-artifact@v4
with:
name: package-${{ env.PACKAGE_PREFIX }}-flatpak-${{matrix.flatpak.arch}}
path: ${{github.workspace}}/deskflow[-_]*.flatpak
release:
needs: ci-passed
@ -306,7 +387,7 @@ jobs:
steps:
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Get version
uses: ./.github/actions/get-version
@ -351,7 +432,7 @@ jobs:
runs-on: windows-latest
steps:
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Get version
uses: ./.github/actions/get-version

View File

@ -28,7 +28,7 @@ jobs:
apt install -qqq git curl unzip gcovr > /dev/null
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Install project dependencies
uses: ./.github/actions/install-dependencies

View File

@ -1,41 +0,0 @@
name: Test actions
# Intended to only be run manually for testing actions in isolation.
on:
workflow_dispatch:
jobs:
test-summary:
runs-on: ubuntu-latest
name: Test summary (${{ matrix.message.name }})
strategy:
matrix:
message:
- name: success
text: "|Success|✅|✅|"
expect: ""
- name: failure
text: "|Failure|❌|❌|"
expect: "❌🔬 Tests failed: 2"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Generate
shell: bash
run: |
echo "${{ matrix.message.text }}" > test-result.md
- name: Upload
uses: actions/upload-artifact@v4
with:
path: test-result.md
name: test-result-${{ matrix.message.name }}
- name: Test
uses: ./.github/actions/test-summary
with:
download-pattern: test-result-${{ matrix.message.name }}
upload-name: summary-${{ matrix.message.name }}

View File

@ -17,7 +17,7 @@ jobs:
apt install -qqq git valgrind > /dev/null
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
uses: sithlord48/fancy-checkout@v1
- name: Install dependencies
uses: ./.github/actions/install-dependencies

7
.gitignore vendored
View File

@ -10,7 +10,6 @@
/tmp
/vcpkg
/vcpkg_installed
/scripts/**/*.pyc
/.cache
/.venv
aqtinstall.log
@ -34,3 +33,9 @@ CMakeLists.txt.user
CMakeCache.txt
CMakeUserPresets.json
CMakeFiles/*
# vscode folder
/.vscode
# scripts folder
/scripts

View File

@ -1,11 +0,0 @@
{
"recommendations": [
"ms-vscode.cmake-tools",
"twxs.cmake",
"llvm-vs-code-extensions.vscode-clangd",
"ms-vscode.cpptools",
"vadimcn.vscode-lldb",
"cheshirekow.cmake-format",
"jacqueslucke.gcov-viewer"
]
}

135
.vscode/launch.json vendored
View File

@ -1,135 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "unix - gui",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow",
"preLaunchTask": "kill-build"
},
{
"name": "unix - unittests",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/unittests",
"args": [ "${input:gtest-args}" ],
"preLaunchTask": "build"
},
{
"name": "unix - integtests",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/integtests",
"args": [ "${input:gtest-args}" ],
"preLaunchTask": "build",
},
{
"name": "unix - server",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow-server",
"args": ["--config-toml", "deskflow-config.toml"],
"preLaunchTask": "kill-build"
},
{
"name": "unix - client",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow-client",
"args": ["--config-toml", "deskflow-config.toml"],
"preLaunchTask": "kill-build"
},
{
"name": "unix - attach",
"type": "lldb",
"request": "attach",
"pid": "${command:pickProcess}"
},
{
"name": "windows - gui",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow",
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "kill-build"
},
{
"name": "windows - unittests",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/unittests",
"args": [ "${input:gtest-args}" ],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "build"
},
{
"name": "windows - integtests",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/integtests",
"args": [ "${input:gtest-args}" ],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "build"
},
{
"name": "windows - server",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow-server",
"args": ["--config-toml", "deskflow-config.toml"],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "kill-build"
},
{
"name": "windows - client",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow-client",
"args": ["--config-toml", "deskflow-config.toml"],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "kill-build"
},
{
"name": "windows - daemon",
"type": "cppvsdbg",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflow-daemon",
"args": ["-f"],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "build"
},
{
"name": "windows - attach",
"type": "cppvsdbg",
"request": "attach",
"processId": "${command:pickProcess}"
},
{
"name": "install_deps.py",
"type": "debugpy",
"request": "launch",
"program": "scripts/install_deps.py",
"console": "integratedTerminal"
}
],
"inputs": [
{
"id": "gtest-args",
"type": "promptString",
"description": "Test arguments",
"default": "--gtest_filter=*"
}
]
}

172
.vscode/tasks.json vendored
View File

@ -1,172 +0,0 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "cmake",
"command": "build",
"targets": ["all"],
"preset": "${command:cmake.activeBuildPresetName}",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": {
"base": "$gcc",
"fileLocation": ["absolute"]
}
},
{
"label": "clean",
"type": "cmake",
"command": "build",
"targets": ["clean"],
"preset": "${command:cmake.activeBuildPresetName}",
"group": "build"
},
{
"label": "clean-gcda",
"type": "shell",
"command": "find . -name '*.gcda' -delete",
"windows": {
"command": "$null"
},
"presentation": {
"reveal": "silent"
}
},
{
"label": "clean-qt",
"type": "shell",
"command": "rm -r build/src/gui build/src/lib/gui",
"windows": {
"command": "remove-item -recurse build/src/gui,build/src/lib/gui"
}
},
{
"label": "clean-config",
"type": "shell",
"linux": {
"command": "rm -r ~/.config/Deskflow/Deskflow.conf"
},
"windows": {
"command": "remove-item -recurse $env:APPDATA\\Deskflow\\Deskflow"
},
"osx": {
"command": "rm -r ~/Library/Application\\ Support/Deskflow/Deskflow"
}
},
{
"label": "tests",
"dependsOn": ["integtests", "unittests"],
"problemMatcher": []
},
{
"label": "kill",
"type": "shell",
"command": "killall deskflow; killall deskflow-client; killall deskflow-server || true",
"windows": {
"command": "taskkill /F /IM deskflow.exe /IM deskflow-client.exe /IM deskflow-client.exe; $true"
},
"presentation": {
"reveal": "silent"
}
},
{
"label": "kill-build",
"dependsOn": ["kill", "build"],
"problemMatcher": []
},
{
"label": "gui",
"type": "process",
"command": "${workspaceFolder}/build/bin/deskflow",
"dependsOn": ["build", "kill"],
"problemMatcher": [],
"windows": {
"command": "${workspaceFolder}/build/bin/deskflow.exe"
}
},
{
"label": "restart daemon",
"type": "shell",
"command": "python scripts/daemon.py --restart",
"dependsOn": ["build"]
},
{
"label": "reinstall daemon",
"type": "shell",
"command": "python scripts/daemon.py --reinstall",
"dependsOn": ["build"]
},
{
"label": "stop daemon",
"type": "shell",
"command": "python scripts/daemon.py --stop"
},
{
"label": "unittests (current)",
"type": "shell",
"command": "python",
"args": [
"./scripts/tests.py",
"--unit-tests",
"--ignore-return-code",
"--filter-file=${file}"
],
"dependsOn": ["build", "clean-gcda"]
},
{
"label": "integtests (current)",
"type": "shell",
"command": "python",
"args": [
"./scripts/tests.py",
"--integ-tests",
"--ignore-return-code",
"--filter-file=${file}"
],
"dependsOn": ["build", "clean-gcda"]
},
{
"label": "unittests",
"type": "shell",
"command": "python",
"args": ["./scripts/tests.py", "--unit-tests", "--ignore-return-code"],
"dependsOn": ["build", "clean-gcda"]
},
{
"label": "integtests",
"type": "shell",
"command": "python",
"args": ["./scripts/tests.py", "--integ-tests", "--ignore-return-code"],
"dependsOn": ["build", "clean-gcda"]
},
{
"label": "unittests (current, valgrind)",
"type": "shell",
"command": "python",
"args": [
"./scripts/tests.py",
"--unit-tests",
"--ignore-return-code",
"--filter-file=${file}",
"--valgrind"
],
"dependsOn": ["build", "clean-gcda"]
},
{
"label": "integtests (current, valgrind)",
"type": "shell",
"command": "python",
"args": [
"./scripts/tests.py",
"--integ-tests",
"--ignore-return-code",
"--filter-file=${file}",
"--valgrind"
],
"dependsOn": ["build", "clean-gcda"]
}
]
}

View File

@ -1,93 +1,165 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
# Copyright (C) 2009 Nick Bolton
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# SPDX-FileCopyrightText: 2024 Deskflow Developers
# SPDX-FileCopyrightText: 2012 - 2024 Symless Ltd
# SPDX-FileCopyrightText: 2009 - 2012 Nick Bolton
# SPDX-License-Identifier: MIT
# Why CMake 3.8?
# This allows package maintainers to create reproducible builds:
# > New in version 3.8: If the SOURCE_DATE_EPOCH environment variable is set,
# > its value will be used instead of the current time.
# > See https://reproducible-builds.org/specs/source-date-epoch/ for details.
cmake_minimum_required(VERSION 3.24)
# Link items by fill path
cmake_policy(SET CMP0003 NEW)
# Fix define escaping
cmake_policy(SET CMP0005 NEW)
# Set CXX Requirements
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Fallback for when git can not be found
set(DESKFLOW_VERSION_MAJOR 1)
set(DESKFLOW_VERSION_MINOR 17)
set(DESKFLOW_VERSION_MINOR 21)
set(DESKFLOW_VERSION_PATCH 1)
set(DESKFLOW_VERSION_TWEAK 0)
# Get the version from git if it's a git repository
# cmake-format: off
if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git)
find_package(Git)
if(GIT_FOUND)
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --long --match v* --always
COMMAND ${GIT_EXECUTABLE} rev-parse --short=8 HEAD
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GITREV
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
string(FIND ${GITREV} "v" isRev)
if(NOT ifRev EQUAL -1)
string(REGEX MATCH [0-9]+ MAJOR ${GITREV})
string(REGEX MATCH \\.[0-9]+ MINOR ${GITREV})
string(REPLACE "." "" MINOR "${MINOR}")
string(REGEX MATCH [0-9]+\- PATCH ${GITREV})
string(REPLACE "-" "" PATCH "${PATCH}")
string(REGEX MATCH \-[0-9]+\- TWEAK ${GITREV})
string(REPLACE "-" "" TWEAK "${TWEAK}")
set(DESKFLOW_VERSION_MAJOR ${MAJOR})
set(DESKFLOW_VERSION_MINOR ${MINOR})
set(DESKFLOW_VERSION_PATCH ${PATCH})
set(DESKFLOW_VERSION_TWEAK ${TWEAK})
elseif(NOT ${GITREV} STREQUAL "")
set(DESKFLOW_VERSION_TWEAK ${GITREV})
OUTPUT_VARIABLE GIT_SHA_SHORT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${GIT_EXECUTABLE} rev-list --tags --count
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GIT_TAG_COUNT
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(GIT_TAG_COUNT EQUAL 0)
set(DESKFLOW_VERSION_TWEAK "9999")
else()
execute_process(
COMMAND ${GIT_EXECUTABLE} describe --long --match v* --always
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
OUTPUT_VARIABLE GITREV
ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
)
string(FIND ${GITREV} "v" isRev)
if(NOT ifRev EQUAL -1)
string(REGEX MATCH [0-9]+ MAJOR ${GITREV})
string(REGEX MATCH \\.[0-9]+ MINOR ${GITREV})
string(REPLACE "." "" MINOR "${MINOR}")
string(REGEX MATCH [0-9]+\- PATCH ${GITREV})
string(REPLACE "-" "" PATCH "${PATCH}")
string(REGEX MATCH \-[0-9]+\- TWEAK ${GITREV})
string(REPLACE "-" "" TWEAK "${TWEAK}")
set(DESKFLOW_VERSION_MAJOR ${MAJOR})
set(DESKFLOW_VERSION_MINOR ${MINOR})
set(DESKFLOW_VERSION_PATCH ${PATCH})
set(DESKFLOW_VERSION_TWEAK ${TWEAK})
elseif(NOT ${GITREV} STREQUAL "")
set(DESKFLOW_VERSION_TWEAK ${GITREV})
endif()
endif()
endif()
endif()
# cmake-format: on
set(DESKFLOW_VERSION
"${DESKFLOW_VERSION_MAJOR}.${DESKFLOW_VERSION_MINOR}.${DESKFLOW_VERSION_PATCH}.${DESKFLOW_VERSION_TWEAK}"
)
set(DESKFLOW_VERSION_MS_CSV
"${DESKFLOW_VERSION_MAJOR},${DESKFLOW_VERSION_MINOR},${DESKFLOW_VERSION_PATCH},${DESKFLOW_VERSION_TWEAK}"
)
add_definitions(-DDESKFLOW_VERSION="${DESKFLOW_VERSION}")
#Define our project
project(
deskflow
VERSION ${DESKFLOW_VERSION}
VERSION "${DESKFLOW_VERSION_MAJOR}.${DESKFLOW_VERSION_MINOR}.${DESKFLOW_VERSION_PATCH}.${DESKFLOW_VERSION_TWEAK}"
DESCRIPTION "Mouse and keyboard sharing utility"
LANGUAGES C CXX)
# Define Additional "PROJECT" vars for packaging and metadata
set(CMAKE_PROJECT_PROPER_NAME "Deskflow")
set(CMAKE_PROJECT_VENDOR "${CMAKE_PROJECT_PROPER_NAME} Devs")
set(CMAKE_PROJECT_COPYRIGHT "(C) 2024-2025 ${CMAKE_PROJECT_VENDOR}")
set(CMAKE_PROJECT_CONTACT "${CMAKE_PROJECT_PROPER_NAME} <maintainers@deskflow.org>")
#Unset the vars used in the project call
unset(DESKFLOW_VERSION_MAJOR)
unset(DESKFLOW_VERSION_MINOR)
unset(DESKFLOW_VERSION_PATCH)
unset(DESKFLOW_VERSION_TWEAK)
message(STATUS "Building ${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION}")
include(cmake/Definitions.cmake)
include(cmake/Build.cmake)
include(cmake/Libraries.cmake)
include(cmake/Packaging.cmake)
# Set lib versions
set(REQUIRED_OPENSSL_VERSION 3.0)
set(REQUIRED_LIBEI_VERSION 1.3)
set(REQUIRED_LIBPORTAL_VERSION 0.8)
set(REQUIRED_QT_VERSION 6.7.0)
if (MSVC)
# On Windows, require that the same MSVC runtime is used as on the host.
# Mitigates things like access violations caused by accidental ABI-compatibility breakage.
set(REQUIRED_MSVC_RUNTIME_MAJOR 14)
cmake_host_system_information(
RESULT REQUIRED_MSVC_RUNTIME_MINOR
QUERY WINDOWS_REGISTRY
"HKLM/SOFTWARE/Microsoft/VisualStudio/${REQUIRED_MSVC_RUNTIME_MAJOR}.0/VC/Runtimes/x64"
VALUE "Minor")
if (REQUIRED_MSVC_RUNTIME_MINOR)
message(STATUS "MSVC runtime: ${REQUIRED_MSVC_RUNTIME_MAJOR}.${REQUIRED_MSVC_RUNTIME_MINOR}")
else()
message(FATAL_ERROR "MSVC runtime registry entry not found")
endif()
endif()
# Control debug item visibility
# When not set logging is forced to DEBUG and show code locations
# Also exposes a test menu
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Disabling debug build")
add_definitions(-DNDEBUG)
endif()
# Set required macOS SDK
if(APPLE)
set(CMAKE_OSX_DEPLOYMENT_TARGET 12)
endif()
# Set Output Folders
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
include(cmake/Libraries.cmake)
include(GNUInstallDirs)
configure_definitions()
configure_build()
configure_libs()
configure_packaging()
add_subdirectory(doc)
add_subdirectory(src)
post_config_all()
# Install License, License is in the App Bundle on mac os (src/gui)
if(WIN32)
install(
FILES ${PROJECT_SOURCE_DIR}/LICENSE
DESTINATION .
)
install(
FILES ${PROJECT_SOURCE_DIR}/LICENSES/LicenseRef-OpenSSL-Exception.txt
DESTINATION .
RENAME LICENSE_EXCEPTION
)
elseif(UNIX AND NOT APPLE)
install(
FILES ${PROJECT_SOURCE_DIR}/LICENSE
DESTINATION share/licenses/deskflow
)
install(
FILES ${PROJECT_SOURCE_DIR}/LICENSES/LicenseRef-OpenSSL-Exception.txt
DESTINATION share/licenses/deskflow
RENAME LICENSE_EXCEPTION
)
endif()
option(BUILD_INSTALLER "Build installer" ON)
if(BUILD_INSTALLER)
add_subdirectory(deploy)
endif()

117
LICENSES/GPL-2.0-only.txt Normal file
View File

@ -0,0 +1,117 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and modification follow.
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker.
signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice

176
LICENSES/LGPL-2.1-only.txt Normal file
View File

@ -0,0 +1,176 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.]
Preamble
The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below.
When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things.
To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others.
Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs.
When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library.
We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances.
For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system.
Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library.
Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library.
You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful.
(For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.)
These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library.
In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.
Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange.
If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things:
a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution.
d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place.
e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute.
7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above.
b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License.
11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances.
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new versions of the Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License).
To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
one line to give the library's name and an idea of what it does.
Copyright (C) year name of author
This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in
the library `Frob' (a library for tweaking knobs) written
by James Random Hacker.
signature of Ty Coon, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!

18
LICENSES/MIT.txt Normal file
View File

@ -0,0 +1,18 @@
MIT License
Copyright (c) <year> <copyright holders>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@ -1,13 +1,14 @@
![Deskflow](https://github.com/user-attachments/assets/f005b958-24df-4f4a-9bfd-4f834dae59d6)
> [!NOTE]
> **Deskflow** is the official upstream project for [Synergy](https://symless.com/synergy).
> [!TIP]
> [Synergy](https://symless.com/synergy) sponsors the Deskflow project by contributing code and providing financial support.
>
> - [**Bounties**](https://github.com/deskflow/deskflow/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22%F0%9F%92%8E%20bounty%22) - Earn while contributing to open source
> - [**Rewarded**](https://github.com/deskflow/deskflow/issues?q=label%3A%22%F0%9F%92%B0%20rewarded%22%20) - Issues with a rewarded bounty
>
> **Deskflow** is the official upstream project for Synergy.
> Purchasing a Synergy license is one way to support Deskflows growth and sustainability.
>
> The Deskflow project was established to cultivate community-driven development where everyone can collaborate.
> Synergy sponsors the Deskflow project by contributing code and providing financial support.
>
> More info: [Relationship with Synergy](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy)
> Learn more: [Relationship with Synergy](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy)
**Deskflow** is a free and open source keyboard and mouse sharing app.
Use the keyboard, mouse, or trackpad of one computer to control nearby computers,
@ -15,7 +16,7 @@ and work seamlessly between them.
It's like a software KVM (but without the video).
TLS encryption is enabled by default. Wayland is supported. Clipboard sharing is supported.
[![Downloads: Stable Release](https://img.shields.io/github/downloads/deskflow/deskflow/v1.17.0/total?style=for-the-badge&logo=github&label=Download%20Stable)](https://github.com/deskflow/deskflow/releases/tag/v1.17.0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[![Downloads: Continuous Build](https://img.shields.io/github/downloads/deskflow/deskflow/continuous/total?style=for-the-badge&logo=github&label=Download%20Continuous)](https://github.com/deskflow/deskflow/releases)
[![Downloads: Stable Release](https://img.shields.io/github/downloads/deskflow/deskflow/latest/total?style=for-the-badge&logo=github&label=Download%20Stable)](https://github.com/deskflow/deskflow/releases/latest)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[![Downloads: Continuous Build](https://img.shields.io/github/downloads/deskflow/deskflow/continuous/total?style=for-the-badge&logo=github&label=Download%20Continuous)](https://github.com/deskflow/deskflow/releases/continuous)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[![Download From Flathub](https://img.shields.io/flathub/downloads/org.deskflow.deskflow?style=for-the-badge&logo=flathub&label=Download%20from%20flathub)](https://flathub.org/apps/org.deskflow.deskflow)
To use Deskflow you can use one of our [packages](https://github.com/deskflow/deskflow/releases), install `deskflow` (if available in your package repository), or [build it](#build-quick-start) yourself from source.
@ -25,16 +26,16 @@ To use Deskflow you can use one of our [packages](https://github.com/deskflow/de
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/deskflow/deskflow?logo=github)](https://github.com/deskflow/deskflow/commits/master/)
[![GitHub top language](https://img.shields.io/github/languages/top/deskflow/deskflow?logo=github)](https://github.com/deskflow/deskflow/commits/master/)
[![GitHub License](https://img.shields.io/github/license/deskflow/deskflow?logo=github)](LICENSE)
[![REUSE status](https://api.reuse.software/badge/github.com/deskflow/deskflow)](https://api.reuse.software/info/github.com/deskflow/deskflow)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=deskflow_deskflow&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=deskflow_deskflow)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=deskflow_deskflow&metric=coverage)](https://sonarcloud.io/summary/new_code?id=deskflow_deskflow)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=deskflow_deskflow&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=deskflow_deskflow)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=deskflow_deskflow&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=deskflow_deskflow)
[![CI](https://github.com/deskflow/deskflow/actions/workflows/ci.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/ci.yml)
[![CI](https://github.com/deskflow/deskflow/actions/workflows/continuous-integration.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/continuous-integration.yml)
[![CodeQL Analysis](https://github.com/deskflow/deskflow/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/codeql-analysis.yml)
[![SonarCloud Analysis](https://github.com/deskflow/deskflow/actions/workflows/sonarcloud-analysis.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/sonarcloud-analysis.yml)
## Project Values
- Motivated by the community interests (not business-driven)
@ -63,8 +64,17 @@ For instructions on building Deskflow, use the wiki page: [Building](https://git
We support all major operating systems, including Windows, macOS, Linux, and Unix-like BSD-derived.
All Linux distributions are supported, primarily focusing on:
Debian, Ubuntu, Linux Mint, Fedora, RHEL, AlmaLinux, Rocky Linux, Arch Linux, openSUSE, Gentoo.
> [!NOTE]
> On Windows, you will need to install the
> [Microsoft Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-microsoft-visual-c-redistributable-version).
> Download latest: [`vc_redist.x64.exe`](https://aka.ms/vs/17/release/vc_redist.x64.exe)
Windows 10 or higher is required.
macOS 12 or higher is required.
Linux requires libei 1.3+ and libportal 0.8+ for the server/client. Additionally, Qt 6.7+ is required for the GUI.
Linux users with systems not meeting these requirements should use flatpak in place of a native package.
We officially support FreeBSD, and would also like to support: OpenBSD, NetBSD, DragonFly, Solaris.
@ -96,7 +106,7 @@ To add our tap, run:
brew tap deskflow/homebrew-tap
```
Then install either:
- Stable: `brew instal deskflow`
- Stable: `brew install deskflow`
- Continuous: `brew install deskflow-dev`
@ -131,12 +141,14 @@ Learn more: [Relationship with Synergy](https://github.com/deskflow/deskflow/wik
Yes, Deskflow has network compatibility with all forks:
- Requires Deskflow >= v1.17.0.96
- Deskflow will *just work* with Input Leap and Barrier (server or client).
- Connecting a Deskflow client to a Synergy server will also *just work*.
- To connect a Synergy client, you need to select the Synergy protocol in the Deskflow server settings.
- Connecting a Deskflow client to a Synergy 1 server will also *just work*.
- To connect a Synergy 1 client, you need to select the Synergy protocol in the Deskflow server settings.
_Note:_ Only Synergy 1 is compatible with Deskflow (Synergy 3 is not yet compatible).
### Is Deskflow compatible with Lan Mouse?
We would love to see compatibility with Lan Mouse. This maybe quite an effort as currently they way they handle the generated input is very different.
We would love to see compatibility with Lan Mouse. This may be quite an effort as currently the way they handle the generated input is very different.
### If I want to solve issues in Deskflow do I need to contribute to a fork?
@ -160,6 +172,8 @@ who is the author of `libei`, a major contributor to `libportal`, and the author
implementation in Deskflow. Others such as Olivier Fourdan and Povilas Kanapickas helped with the
Wayland implementation.
Some features _may_ be unavailable or broken on Wayland. Please see the [known Wayland issues](https://github.com/deskflow/deskflow/discussions/7499).
### Where did it all start?
Deskflow was first created as Synergy in 2001 by Chris Schoeneman.
@ -181,4 +195,4 @@ Deskflow is made by possible by these contributors.
## License
This project is licensed under [GPL-2.0](LICENSE) with an [OpenSSL exception](LICENSE_EXCEPTION).
This project is licensed under [GPL-2.0](LICENSE) with an [OpenSSL exception](LICENSES/LicenseRef-OpenSSL-Exception.txt).

206
REUSE.toml Normal file
View File

@ -0,0 +1,206 @@
# SPDX-FileCopyrightText: 2025 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
version = 1
SPDX-PackageName = "deskflow"
SPDX-PackageSupplier = "Deskflow Devs"
SPDX-PackageDownloadLocation = "https://github.com/deskflow/deskflow"
[[annotations]]
path = ".github/**"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = ".clang-format"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = ".editorconfig"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = ".gitattributes"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = ".gitignore"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "cspell.json"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "README.md"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "SECURITY.md"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "sonar-project.properties"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "vcpkg.json"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "vcpkg-configuration.json"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "doc/**"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "deploy/mac/dmg-background.tiff"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "deploy/mac/dmg-volume.icns"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "deploy/linux/deskflow.png"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "deploy/linux/flatpak/**"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "deploy/linux/org.deskflow.deskflow.metainfo.xml"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "deploy/windows/wix-banner.png"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "deploy/windows/wix-dialog.png"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "deploy/windows/wix-patch.xml.in"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/apps/deskflow-client/deskflow-client.exe.manifest"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/apps/deskflow-core/deskflow-core.exe.manifest"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/apps/deskflow-server/deskflow-server.exe.manifest"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/apps/res/icons/deskflow-**/**/**/**.svg"
precedence = "override"
SPDX-FileCopyrightText = "Kde Breeze Icons"
SPDX-License-Identifier = "LGPL-2.1-only"
[[annotations]]
path = "src/apps/res/icons/deskflow-**/apps/64/deskflow*.svg"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "src/apps/res/image/welcome.png"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "src/apps/res/Deskflow.icns"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "src/apps/res/deskflow.ico"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "src/apps/res/deskflow.plist.in"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "MIT"
[[annotations]]
path = "src/apps/res/deskflow.qrc"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only"
[[annotations]]
path = "src/apps/res/icons/deskflow-**/index.theme"
precedence = "override"
SPDX-FileCopyrightText = "Chris Rizzitello <sithlord48@gmail.com>"
SPDX-License-Identifier = "LGPL-2.1-only"
[[annotations]]
path = "src/lib/gui/MainWindow.ui"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only WITH LicenseRef-OpenSSL-Exception"
[[annotations]]
path = "src/lib/gui/dialogs/*.ui"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only WITH LicenseRef-OpenSSL-Exception"

11
SECURITY.md Normal file
View File

@ -0,0 +1,11 @@
# Security Policy
## Supported Versions
The latest minor release is supported and receives security updates:
https://github.com/deskflow/deskflow/releases
## Reporting a Vulnerability
Please report vulnerabilities on our issue tracker as bugs:
https://github.com/deskflow/deskflow/issues

View File

@ -1,104 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
macro(configure_build)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib")
if(APPLE)
message(STATUS "Configuring for Apple")
set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0")
endif()
set_build_date()
configure_file_shared()
endmacro()
macro(set_build_date)
# Since CMake 3.8.0, `string(TIMESTAMP ...)` respects `SOURCE_DATE_EPOCH` env var if set,
# which allows package maintainers to create reproducible builds.
# We require CMake 3.8.0 in the root `CMakeLists.txt` for this reason.
string(TIMESTAMP BUILD_DATE "%Y-%m-%d" UTC)
message(STATUS "Build date: ${BUILD_DATE}")
add_definitions(-DBUILD_DATE="${BUILD_DATE}")
endmacro()
macro(configure_file_shared)
configure_file(${PROJECT_SOURCE_DIR}/src/lib/gui/gui_config.h.in
${PROJECT_BINARY_DIR}/config/gui_config.h)
endmacro()
macro(post_config)
# Build to a temp bin dir on Windows and then copy to the final bin dir
# (ignore copy fail). It is neccesary to do this. Since the binary may already
# be running and you can't write to a running binary (on Windows). It's common
# to use Deskflow to develop Deskflow (i.e. eating your own dog food immediately
# making it).
if(WIN32)
if(NOT target)
message(FATAL_ERROR "target not set")
endif()
set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
${BIN_TEMP_DIR})
endif()
endmacro()
macro(post_config_all)
if(WIN32)
# Always try to copy the files to the bin directory after every build and deliberatly ignore
# copy errors, usually the error is because a running process has locked the file.
#
# It is useful to copy every time because the copy may have failed last time due to the file
# being in use, and we'll usually want to try again (after killing the process).
#
# Yes, this looks like a ridiculous thing to do, but it really is necessary to
# use a Python script to copy files on Windows. Why? Two reasons:
#
# 1. Windows file locks (on running processes) creates a very painful development
# experience; you can't overwrite the binary you're running it.
# Why not just stop the process? Windows services are an abject PITA to manage,
# and we don't always care about overwriting all binaries.
#
# 2. The Windows copy command is limited and gives vague/misleading errors.
# The CMake copy command also has similar shortfalls.
#
# Patches welcome! :)
add_custom_target(
run_post_build ALL
COMMAND ${Python_EXECUTABLE} ${PROJECT_SOURCE_DIR}/scripts/fancy_copy.py
${BIN_TEMP_DIR} ${PROJECT_BINARY_DIR}/bin --ignore-errors
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
VERBATIM
COMMENT "Copying files to bin dir")
add_dependencies(
run_post_build
${GUI_BINARY_NAME}
${CLIENT_BINARY_NAME}
${SERVER_BINARY_NAME}
${DAEMON_BINARY_NAME})
endif()
endmacro()

View File

@ -1,72 +1,11 @@
# SOURCE https://github.com/bilke/cmake-modules/blob/master/CodeCoverage.cmake
# Copyright (c) 2012 - 2017, Lars Bilke
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors
# may be used to endorse or promote products derived from this software without
# specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
# ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# CHANGES:
#
# 2012-01-31, Lars Bilke
# - Enable Code Coverage
#
# 2013-09-17, Joakim Söderberg
# - Added support for Clang.
# - Some additional usage instructions.
#
# 2016-02-03, Lars Bilke
# - Refactored functions to use named parameters
#
# 2017-06-02, Lars Bilke
# - Merged with modified version from github.com/ufz/ogs
#
# 2019-05-06, Anatolii Kurotych
# - Remove unnecessary --coverage flag
#
# 2019-12-13, FeRD (Frank Dana)
# - Deprecate COVERAGE_LCOVR_EXCLUDES and COVERAGE_GCOVR_EXCLUDES lists in favor
# of tool-agnostic COVERAGE_EXCLUDES variable, or EXCLUDE setup arguments.
# - CMake 3.4+: All excludes can be specified relative to BASE_DIRECTORY
# - All setup functions: accept BASE_DIRECTORY, EXCLUDE list
# - Set lcov basedir with -b argument
# - Add automatic --demangle-cpp in lcovr, if 'c++filt' is available (can be
# overridden with NO_DEMANGLE option in setup_target_for_coverage_lcovr().)
# - Delete output dir, .info file on 'make clean'
# - Remove Python detection, since version mismatches will break gcovr
# - Minor cleanup (lowercase function names, update examples...)
#
# 2019-12-19, FeRD (Frank Dana)
# - Rename Lcov outputs, make filtered file canonical, fix cleanup for targets
#
# 2020-01-19, Bob Apthorpe
# - Added gfortran support
#
# 2020-02-17, FeRD (Frank Dana)
# - Make all add_custom_target()s VERBATIM to auto-escape wildcard characters
# in EXCLUDEs, and remove manual escaping from gcovr targets
#
# SPDX-FileCopyrightText: 2020 Bob Apthrope
# SPDX-FileCopyrightText: 2019 Anatolii Kurotych
# SPDX-FileCopyrightText: 2019 - 2020 Frank Dana
# SPDX-FileCopyrightText: 2013 Joakim Söderberg
# SPDX-FileCopyrightText: 2012 - 2017 Lars Bilke
# SPDX-License-Identifier: MIT
# USAGE:
#
# 1. Copy this file into your cmake modules path.

View File

@ -1,220 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2012-2024 Symless Ltd.
# Copyright (C) 2009-2012 Nick Bolton
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
macro(configure_definitions)
configure_meta()
configure_ninja()
configure_options()
set(INTEG_TESTS_BIN integtests)
set(UNIT_TESTS_BIN unittests)
if(NOT "$ENV{GIT_SHA}" STREQUAL "")
# Shorten the Git SHA to 8 chars for readability
string(SUBSTRING "$ENV{GIT_SHA}" 0 8 GIT_SHA_SHORT)
message(STATUS "Short Git SHA: ${GIT_SHA_SHORT}")
add_definitions(-DGIT_SHA_SHORT="${GIT_SHA_SHORT}")
endif()
if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
message(STATUS "Disabling debug build")
add_definitions(-DNDEBUG)
endif()
# TODO: find out why we need these, and remove them if we don't.
if(COMMAND cmake_policy)
cmake_policy(SET CMP0003 NEW)
cmake_policy(SET CMP0005 NEW)
endif()
# TODO: explain why we're adding headers to sources.
if(${CMAKE_GENERATOR} STREQUAL "Unix Makefiles")
set(ADD_HEADERS_TO_SOURCES FALSE)
else()
set(ADD_HEADERS_TO_SOURCES TRUE)
endif()
set(BIN_TEMP_DIR ${PROJECT_BINARY_DIR}/temp/bin)
endmacro()
macro(configure_meta)
set(DESKFLOW_APP_ID
"deskflow"
CACHE STRING "ID of the app for filenames, etc")
set(DESKFLOW_DOMAIN
"deskflow.org"
CACHE STRING "Domain of the app maintainer (not a URL)")
set(DESKFLOW_APP_NAME
"Deskflow"
CACHE STRING "App name (used in GUI title bar, etc)")
set(DESKFLOW_AUTHOR_NAME
"Deskflow"
CACHE STRING "Author name (also used as organization name)")
set(DESKFLOW_MAINTAINER
"Deskflow <maintainers@deskflow.org>"
CACHE STRING "Maintainer email address in RFC 5322 mailbox format")
set(DESKFLOW_WEBSITE_URL
"https://deskflow.org"
CACHE STRING "URL of the app website")
set(DESKFLOW_VERSION_URL
"https://api.deskflow.org/version"
CACHE STRING "URL to get the latest version")
set(DESKFLOW_HELP_TEXT
"Report a bug"
CACHE STRING "Text label for the help menu item")
set(DESKFLOW_RES_DIR
"${PROJECT_SOURCE_DIR}/res"
CACHE STRING "Resource directory for images, etc")
set(DESKFLOW_MAC_BUNDLE_CODE
"DFLW"
CACHE STRING "Mac bundle code (4 characters)")
set(DESKFLOW_SHOW_DEV_THANKS
true
CACHE BOOL "Show developer thanks message")
message(VERBOSE "App ID: ${DESKFLOW_APP_ID}")
message(VERBOSE "App domain: ${DESKFLOW_DOMAIN}")
message(VERBOSE "App name: ${DESKFLOW_APP_NAME}")
message(VERBOSE "Author name: ${DESKFLOW_AUTHOR_NAME}")
message(VERBOSE "Maintainer: ${DESKFLOW_MAINTAINER}")
message(VERBOSE "Website URL: ${DESKFLOW_WEBSITE_URL}")
message(VERBOSE "Version URL: ${DESKFLOW_VERSION_URL}")
message(VERBOSE "Help text: ${DESKFLOW_HELP_TEXT}")
message(VERBOSE "Res dir: ${DESKFLOW_RES_DIR}")
message(VERBOSE "Mac bundle code: ${DESKFLOW_MAC_BUNDLE_CODE}")
message(VERBOSE "Show dev thanks: ${DESKFLOW_SHOW_DEV_THANKS}")
# TODO: We need to move this to configure_file() in the future, which is much cleaner.
add_definitions(-DDESKFLOW_APP_ID="${DESKFLOW_APP_ID}")
add_definitions(-DDESKFLOW_DOMAIN="${DESKFLOW_DOMAIN}")
add_definitions(-DDESKFLOW_APP_NAME="${DESKFLOW_APP_NAME}")
add_definitions(-DDESKFLOW_AUTHOR_NAME="${DESKFLOW_AUTHOR_NAME}")
add_definitions(-DDESKFLOW_MAINTAINER="${DESKFLOW_MAINTAINER}")
add_definitions(-DDESKFLOW_WEBSITE_URL="${DESKFLOW_WEBSITE_URL}")
add_definitions(-DDESKFLOW_VERSION_URL="${DESKFLOW_VERSION_URL}")
add_definitions(-DDESKFLOW_HELP_TEXT="${DESKFLOW_HELP_TEXT}")
add_definitions(-DDESKFLOW_RES_DIR="${DESKFLOW_RES_DIR}")
if(DESKFLOW_SHOW_DEV_THANKS)
message(VERBOSE "Showing developer thanks message")
add_definitions(-DDESKFLOW_SHOW_DEV_THANKS)
else()
message(VERBOSE "Not showing developer thanks message")
endif()
configure_bin_names()
endmacro()
macro(configure_bin_names)
set(GUI_BINARY_NAME
"deskflow"
CACHE STRING "Filename of the GUI binary")
set(SERVER_BINARY_NAME
"deskflow-server"
CACHE STRING "Filename of the server binary")
set(CLIENT_BINARY_NAME
"deskflow-client"
CACHE STRING "Filename of the client binary")
set(CORE_BINARY_NAME
"deskflow-core"
CACHE STRING "Filename of the core binary")
set(DAEMON_BINARY_NAME
"deskflow-daemon"
CACHE STRING "Filename of the daemon binary")
message(VERBOSE "GUI binary: ${GUI_BINARY_NAME}")
message(VERBOSE "Server binary: ${SERVER_BINARY_NAME}")
message(VERBOSE "Client binary: ${CLIENT_BINARY_NAME}")
message(VERBOSE "Core binary: ${CORE_BINARY_NAME}")
message(VERBOSE "Daemon binary: ${DAEMON_BINARY_NAME}")
add_definitions(-DGUI_BINARY_NAME="${GUI_BINARY_NAME}")
add_definitions(-DSERVER_BINARY_NAME="${SERVER_BINARY_NAME}")
add_definitions(-DCLIENT_BINARY_NAME="${CLIENT_BINARY_NAME}")
add_definitions(-DCORE_BINARY_NAME="${CORE_BINARY_NAME}")
add_definitions(-DDAEMON_BINARY_NAME="${DAEMON_BINARY_NAME}")
endmacro()
macro(configure_ninja)
# use response files so that ninja can compile on windows, otherwise you get
# an error when linking qt: "The input line is too long."
set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1)
set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@")
set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@")
set(CMAKE_NINJA_FORCE_RESPONSE_FILE
1
CACHE INTERNAL "")
endmacro()
macro(configure_options)
set(DEFAULT_BUILD_GUI ON)
set(DEFAULT_BUILD_INSTALLER ON)
set(DEFAULT_BUILD_TESTS ON)
# unified binary is off by default for now, for backwards compatibility.
set(DEFAULT_BUILD_UNIFIED OFF)
# coverage is off by default because it's GCC only and a developer preference.
set(DEFAULT_ENABLE_COVERAGE OFF)
if("$ENV{DESKFLOW_BUILD_MINIMAL}" STREQUAL "true")
set(DEFAULT_BUILD_GUI OFF)
set(DEFAULT_BUILD_INSTALLER OFF)
endif()
if("$ENV{DESKFLOW_BUILD_TESTS}" STREQUAL "false")
set(DEFAULT_BUILD_TESTS OFF)
endif()
if("$ENV{DESKFLOW_BUILD_UNIFIED}" STREQUAL "true")
set(DEFAULT_BUILD_UNIFIED ON)
endif()
if("$ENV{DESKFLOW_ENABLE_COVERAGE}" STREQUAL "true")
set(DEFAULT_ENABLE_COVERAGE ON)
endif()
option(BUILD_GUI "Build GUI" ${DEFAULT_BUILD_GUI})
option(BUILD_INSTALLER "Build installer" ${DEFAULT_BUILD_INSTALLER})
option(BUILD_TESTS "Build tests" ${DEFAULT_BUILD_TESTS})
option(BUILD_UNIFIED "Build unified binary" ${DEFAULT_BUILD_UNIFIED})
option(ENABLE_COVERAGE "Enable test coverage" ${DEFAULT_ENABLE_COVERAGE})
endmacro()

View File

@ -1,20 +1,6 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set(LIBEI_MIN_VERSION 1.3)
set(LIBPORTAL_MIN_VERSION 0.8)
# SPDX-FileCopyrightText: 2024 - 2025 Deskflow Developers
# SPDX-FileCopyrightText: 2024 Symless Ltd
# SPDX-License-Identifier: MIT
macro(configure_libs)
@ -22,13 +8,66 @@ macro(configure_libs)
if(UNIX)
configure_unix_libs()
elseif(WIN32)
configure_windows_libs()
find_package(Python REQUIRED QUIET)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2 /Ob2")
list(APPEND libs Wtsapi32 Userenv Wininet comsuppw Shlwapi version)
add_definitions(
/DWIN32
/D_WINDOWS
/D_CRT_SECURE_NO_WARNINGS
/D_XKEYCHECK_H
)
endif()
configure_qt()
configure_openssl()
configure_coverage()
find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS Core Widgets Network)
if(UNIX AND NOT APPLE)
find_package(Qt6 ${REQUIRED_QT_VERSION} REQUIRED COMPONENTS DBus Xml)
endif()
# Define the location of Qt deployment tool
if(WIN32)
if (CMAKE_BUILD_TYPE STREQUAL "Debug" AND NOT VCPKG_INSTALL_DIR STREQUAL "")
find_program(DEPLOYQT windeployqt.debug.bat)
else()
find_program(DEPLOYQT windeployqt)
endif()
elseif(APPLE)
find_program(DEPLOYQT macdeployqt)
endif()
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
message(STATUS "Qt version: ${Qt6_VERSION}")
option(ENABLE_COVERAGE "Enable test coverage" OFF)
if(ENABLE_COVERAGE)
message(STATUS "Enabling code coverage")
include(cmake/CodeCoverage.cmake)
append_coverage_compiler_flags()
set(test_exclude subprojects/* build/* src/test/*)
set(test_src ${PROJECT_SOURCE_DIR}/src)
# Apparently solves the bug in gcov where it returns negative counts and confuses gcovr.
# > Got negative hit value in gcov line 'branch 2 taken -1' caused by a bug in gcov tool
# Bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68080
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-update=atomic")
setup_target_for_coverage_gcovr_xml(
NAME coverage-integtests
EXECUTABLE integtests
BASE_DIRECTORY ${test_src}
EXCLUDE ${test_exclude}
)
setup_target_for_coverage_gcovr_xml(
NAME coverage-unittests
EXECUTABLE unittests
BASE_DIRECTORY ${test_src}
EXCLUDE ${test_exclude}
)
endif()
endmacro()
@ -50,30 +89,13 @@ macro(configure_unix_libs)
include(CheckSymbolExists)
include(CheckCSourceCompiles)
check_include_file_cxx(istream HAVE_ISTREAM)
check_include_file_cxx(ostream HAVE_OSTREAM)
check_include_file_cxx(sstream HAVE_SSTREAM)
check_include_files(inttypes.h HAVE_INTTYPES_H)
check_include_files(locale.h HAVE_LOCALE_H)
check_include_files(memory.h HAVE_MEMORY_H)
check_include_files(stdlib.h HAVE_STDLIB_H)
check_include_files(strings.h HAVE_STRINGS_H)
check_include_files(string.h HAVE_STRING_H)
check_include_files(sys/select.h HAVE_SYS_SELECT_H)
check_include_files(sys/socket.h HAVE_SYS_SOCKET_H)
check_include_files(sys/stat.h HAVE_SYS_STAT_H)
check_include_files(sys/time.h HAVE_SYS_TIME_H)
check_include_files(sys/utsname.h HAVE_SYS_UTSNAME_H)
check_include_files(unistd.h HAVE_UNISTD_H)
check_include_files(wchar.h HAVE_WCHAR_H)
check_function_exists(getpwuid_r HAVE_GETPWUID_R)
check_function_exists(gmtime_r HAVE_GMTIME_R)
check_function_exists(nanosleep HAVE_NANOSLEEP)
check_function_exists(sigwait HAVE_POSIX_SIGWAIT)
check_function_exists(strftime HAVE_STRFTIME)
check_function_exists(vsnprintf HAVE_VSNPRINTF)
check_function_exists(inet_aton HAVE_INET_ATON)
# For some reason, the check_function_exists macro doesn't detect the
@ -100,11 +122,6 @@ macro(configure_unix_libs)
endif()
check_type_size(char SIZEOF_CHAR)
check_type_size(int SIZEOF_INT)
check_type_size(long SIZEOF_LONG)
check_type_size(short SIZEOF_SHORT)
# pthread is used on both Linux and Mac
check_library_exists("pthread" pthread_create "" HAVE_PTHREAD)
if(HAVE_PTHREAD)
@ -114,103 +131,55 @@ macro(configure_unix_libs)
endif()
if(APPLE)
configure_mac_libs()
set(CMAKE_CXX_FLAGS "--sysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1")
find_library(lib_ScreenSaver ScreenSaver)
find_library(lib_IOKit IOKit)
find_library(lib_ApplicationServices ApplicationServices)
find_library(lib_Foundation Foundation)
find_library(lib_Carbon Carbon)
find_library(lib_UserNotifications UserNotifications)
list(APPEND libs
${lib_ScreenSaver} ${lib_IOKit} ${lib_ApplicationServices}
${lib_Foundation} ${lib_Carbon} ${lib_UserNotifications}
)
add_definitions(-DWINAPI_CARBON=1 -D_THREAD_SAFE)
else()
configure_xorg_libs()
configure_wayland_libs()
find_package(pugixml REQUIRED)
include(FindPkgConfig)
find_package(PkgConfig)
if(PKG_CONFIG_FOUND)
pkg_check_modules(lib_glib REQUIRED IMPORTED_TARGET glib-2.0)
pkg_search_module(PC_GDKPIXBUF gdk-pixbuf-2.0)
include_directories(${PC_GDKPIXBUF_INCLUDE_DIRS})
pkg_check_modules(lib_gdkpixbuf REQUIRED IMPORTED_TARGET gdk-pixbuf-2.0)
pkg_check_modules(lib_notify REQUIRED IMPORTED_TARGET libnotify)
add_definitions(-DHAVE_GDK_PIXBUF=1 -DHAVE_LIBNOTIFY=1)
pkg_check_modules(LIBXKBCOMMON REQUIRED xkbcommon)
pkg_check_modules(GLIB2 REQUIRED glib-2.0)
find_library(LIBM m)
include_directories(${LIBXKBCOMMON_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIRS}
${LIBM_INCLUDE_DIRS})
else()
message(WARNING "pkg-config not found, skipping libnotify and gdk-pixbuf")
message(WARNING "pkg-config not found, skipping wayland libraries")
endif()
endif()
# For config.h, set some static values; it may be a good idea to make these
# values dynamic for non-standard UNIX compilers.
set(ACCEPT_TYPE_ARG3 socklen_t)
set(HAVE_CXX_BOOL 1)
set(HAVE_CXX_CASTS 1)
set(HAVE_CXX_EXCEPTIONS 1)
set(HAVE_CXX_MUTABLE 1)
set(HAVE_CXX_STDLIB 1)
set(HAVE_PTHREAD_SIGNAL 1)
set(SELECT_TYPE_ARG1 int)
set(SELECT_TYPE_ARG234 " (fd_set *)")
set(SELECT_TYPE_ARG5 " (struct timeval *)")
set(STDC_HEADERS 1)
set(TIME_WITH_SYS_TIME 1)
set(HAVE_SOCKLEN_T 1)
# Unix only: For config.h, save the results based on a template (config.h.in).
# Note that this won't work on Windows because filenames are not case sensitive,
# and we have header files named "Config.h" (upper case 'C').
configure_file(${CMAKE_SOURCE_DIR}/src/lib/config.h.in
${CMAKE_BINARY_DIR}/src/lib/config.h @ONLY)
configure_file(${CMAKE_SOURCE_DIR}/src/lib/Config.h.in
${CMAKE_BINARY_DIR}/src/lib/Config.h @ONLY)
add_definitions(-DSYSAPI_UNIX=1 -DHAVE_CONFIG_H)
endmacro()
#
# Apple macOS
#
macro(configure_mac_libs)
set(CMAKE_CXX_FLAGS
"--sysroot ${CMAKE_OSX_SYSROOT} ${CMAKE_CXX_FLAGS} -DGTEST_USE_OWN_TR1_TUPLE=1"
)
find_library(lib_ScreenSaver ScreenSaver)
find_library(lib_IOKit IOKit)
find_library(lib_ApplicationServices ApplicationServices)
find_library(lib_Foundation Foundation)
find_library(lib_Carbon Carbon)
list(
APPEND
libs
${lib_ScreenSaver}
${lib_IOKit}
${lib_ApplicationServices}
${lib_Foundation}
${lib_Carbon})
find_library(lib_UserNotifications UserNotifications)
list(APPEND libs ${lib_UserNotifications})
add_definitions(-DWINAPI_CARBON=1 -D_THREAD_SAFE)
endmacro()
macro(configure_wayland_libs)
include(FindPkgConfig)
if(PKG_CONFIG_FOUND)
pkg_check_modules(LIBXKBCOMMON REQUIRED xkbcommon)
pkg_check_modules(GLIB2 REQUIRED glib-2.0 gio-2.0)
find_library(LIBM m)
include_directories(${LIBXKBCOMMON_INCLUDE_DIRS} ${GLIB2_INCLUDE_DIRS}
${LIBM_INCLUDE_DIRS})
else()
message(WARNING "pkg-config not found, skipping wayland libraries")
endif()
endmacro()
#
# X.org/X11 for Linux, BSD, etc
#
@ -229,8 +198,6 @@ macro(configure_xorg_libs)
HAVE_X11_EXTENSIONS_DPMS_H)
check_include_files("X11/extensions/Xinerama.h"
HAVE_X11_EXTENSIONS_XINERAMA_H)
check_include_files("${XKBlib};X11/extensions/XKBstr.h"
HAVE_X11_EXTENSIONS_XKBSTR_H)
check_include_files("X11/extensions/XKB.h" HAVE_XKB_EXTENSION)
check_include_files("X11/extensions/XTest.h" HAVE_X11_EXTENSIONS_XTEST_H)
check_include_files("${XKBlib}" HAVE_X11_XKBLIB_H)
@ -312,107 +279,3 @@ macro(configure_xorg_libs)
add_definitions(-DWINAPI_XWINDOWS=1)
endmacro()
#
# Windows
#
macro(configure_windows_libs)
set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} /MP /D _BIND_TO_CURRENT_VCLIBS_VERSION=1")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /O2 /Ob2")
list(
APPEND
libs
Wtsapi32
Userenv
Wininet
comsuppw
Shlwapi)
add_definitions(
/DWIN32
/D_WINDOWS
/D_CRT_SECURE_NO_WARNINGS
/DDESKFLOW_VERSION=\"${DESKFLOW_VERSION}\"
/D_XKEYCHECK_H)
configure_file(${PROJECT_SOURCE_DIR}/res/win/version.rc.in
${PROJECT_BINARY_DIR}/src/version.rc @ONLY)
configure_openssl()
endmacro()
macro(configure_qt)
find_package(
Qt6
COMPONENTS Core Widgets Network
REQUIRED)
message(STATUS "Qt version: ${Qt6_VERSION}")
set(GUI_RES_DIR ${DESKFLOW_RES_DIR}/gui)
set(GUI_QRC_FILE ${GUI_RES_DIR}/app.qrc)
endmacro()
macro(configure_openssl)
# Apple has to use static libraries because "Use of the Apple-provided OpenSSL
# libraries by apps is strongly discouraged."
# https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/SecureNetworkCommunicationAPIs/SecureNetworkCommunicationAPIs.html
# TODO: How about bundling the OpenSSL .dylib files with the app so they can be updated?
if(APPLE)
set(OPENSSL_USE_STATIC_LIBS TRUE)
endif()
find_package(OpenSSL 3.0 REQUIRED COMPONENTS SSL Crypto)
if(WIN32) #Used for dev in TLS and WIX
cmake_path(SET OPENSSL_ROOT_DIR NORMALIZE "${OPENSSL_INCLUDE_DIR}/..")
message(VERBOSE "Set OPENSSL_ROOT_DIR: ${OPENSSL_ROOT_DIR}")
set(OPENSSL_EXE_DIR "${OPENSSL_ROOT_DIR}/tools/openssl")
add_definitions(-DOPENSSL_EXE_DIR="${OPENSSL_EXE_DIR}")
endif()
endmacro()
macro(configure_coverage)
if(ENABLE_COVERAGE)
message(STATUS "Enabling code coverage")
include(cmake/CodeCoverage.cmake)
append_coverage_compiler_flags()
set(test_exclude subprojects/* build/* src/test/*)
set(test_src ${PROJECT_SOURCE_DIR}/src)
# Apparently solves the bug in gcov where it returns negative counts and confuses gcovr.
# > Got negative hit value in gcov line 'branch 2 taken -1' caused by a bug in gcov tool
# Bug report: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68080
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-update=atomic")
setup_target_for_coverage_gcovr_xml(
NAME
coverage-${INTEG_TESTS_BIN}
EXECUTABLE
${INTEG_TESTS_BIN}
BASE_DIRECTORY
${test_src}
EXCLUDE
${test_exclude})
setup_target_for_coverage_gcovr_xml(
NAME
coverage-${UNIT_TESTS_BIN}
EXECUTABLE
${UNIT_TESTS_BIN}
BASE_DIRECTORY
${test_src}
EXCLUDE
${test_exclude})
else()
message(STATUS "Code coverage is disabled")
endif()
endmacro()

View File

@ -1,259 +0,0 @@
# SPDX-FileCopyrightText: (C) 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-FileCopyrightText: (C) 2012 - 2024 Symless Ltd.
# SPDX-FileCopyrightText: (C) 2009 - 2012 Nick Bolton
# SPDX-License-Identifier: MIT
#
# If enabled, configure packaging based on OS.
#
macro(configure_packaging)
message(VERBOSE "Configuring Packaging")
set(DESKFLOW_PROJECT_RES_DIR ${PROJECT_SOURCE_DIR}/res)
if(${BUILD_INSTALLER})
set(CPACK_PACKAGE_NAME ${DESKFLOW_APP_ID})
set(CPACK_PACKAGE_CONTACT ${DESKFLOW_MAINTAINER})
set(CPACK_PACKAGE_DESCRIPTION ${CMAKE_PROJECT_DESCRIPTION})
set(CPACK_PACKAGE_VENDOR ${DESKFLOW_AUTHOR_NAME})
set(CPACK_RESOURCE_FILE_LICENSE ${PROJECT_SOURCE_DIR}/LICENSE)
set(CPACK_PACKAGE_VERSION ${CMAKE_PROJECT_VERSION})
#Prevent this override from being written in the package
if(NOT PACKAGE_VERSION_LABEL)
set (PACKAGE_VERSION_LABEL "${CPACK_PACKAGE_VERSION}")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
configure_windows_packaging()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
configure_mac_packaging()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
configure_linux_packaging()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "|.*BSD")
message(STATUS "BSD packaging not yet supported")
set(OS_STRING ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
endif()
set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${PACKAGE_VERSION_LABEL}-${OS_STRING}")
message(STATUS "Package Basename: ${CPACK_PACKAGE_FILE_NAME}")
include(CPack)
else()
message(STATUS "Not configuring installer")
endif()
endmacro()
#
# Windows installer
#
macro(configure_windows_packaging)
cmake_path(SET QT_PATH NORMALIZE "${Qt6_DIR}../../")
set(DESKFLOW_MSI_64_GUID
"027D1C8A-E7A5-4754-BB93-B2D45BFDBDC8"
CACHE STRING "GUID for 64-bit MSI installer")
set(DESKFLOW_MSI_32_GUID
"8F57C657-BC87-45E6-840E-41242A93511C"
CACHE STRING "GUID for 32-bit MSI installer")
configure_files(${PROJECT_SOURCE_DIR}/res/dist/wix
${PROJECT_BINARY_DIR}/installer)
if(CMAKE_SYSTEM_PROCESSOR MATCHES AMD64)
set(OS_STRING "win-x64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
set(OS_STRING "win-arm64")
else()
set(OS_STRING "win-${CMAKE_SYSTEM_PROCESSOR}")
endif()
endmacro()
#
# macOS app bundle
#
macro(configure_mac_packaging)
set(CMAKE_INSTALL_RPATH
"@loader_path/../Libraries;@loader_path/../Frameworks")
set(DESKFLOW_BUNDLE_SOURCE_DIR
${PROJECT_SOURCE_DIR}/res/dist/mac/bundle
CACHE PATH "Path to the macOS app bundle")
set(DESKFLOW_BUNDLE_DIR ${PROJECT_BINARY_DIR}/bundle/${DESKFLOW_APP_NAME}.app)
set(DESKFLOW_BUNDLE_BINARY_DIR ${DESKFLOW_BUNDLE_DIR}/Contents/MacOS)
configure_files(${DESKFLOW_BUNDLE_SOURCE_DIR} ${DESKFLOW_BUNDLE_DIR})
set(OS_STRING "macos-${CMAKE_SYSTEM_PROCESSOR}")
file(RENAME ${DESKFLOW_BUNDLE_DIR}/Contents/Resources/App.icns
${DESKFLOW_BUNDLE_DIR}/Contents/Resources/${DESKFLOW_APP_NAME}.icns)
endmacro()
#
# Linux packages
#
macro(configure_linux_package_name)
# Get Distro name information
execute_process(
COMMAND bash "-c" "cat /etc/os-release | grep ^ID= | sed 's/ID=//g'"
OUTPUT_VARIABLE _DISTRO_NAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\"" "" DISTRO_NAME "${_DISTRO_NAME}")
message(STATUS "Distro Name: ${DISTRO_NAME}")
execute_process(
COMMAND bash "-c"
"cat /etc/os-release | grep ^ID_LIKE= | sed 's/ID_LIKE=//g'"
OUTPUT_VARIABLE _DISTRO_LIKE
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\"" "" DISTRO_LIKE "${_DISTRO_LIKE}")
message(STATUS "Distro Like: ${DISTRO_LIKE}")
execute_process(
COMMAND
bash "-c"
"cat /etc/os-release | grep ^VERSION_CODENAME= | sed 's/VERSION_CODENAME=//g'"
OUTPUT_VARIABLE _DISTRO_CODENAME
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\"" "" DISTRO_CODENAME "${_DISTRO_CODENAME}")
message(STATUS "Distro Codename: ${DISTRO_CODENAME}")
execute_process(
COMMAND bash "-c"
"cat /etc/os-release | grep ^VERSION_ID= | sed 's/VERSION_ID=//g'"
OUTPUT_VARIABLE _DISTRO_VERSION_ID
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\"" "" DISTRO_VERSION_ID "${_DISTRO_VERSION_ID}")
message(STATUS "Distro ID: ${DISTRO_VERSION_ID}")
# Check if Debian-link
string(REGEX MATCH debian|buntu DEBTYPE "${DISTRO_LIKE}")
if((NOT ("${DEBTYPE}" STREQUAL "")) OR ("${DISTRO_NAME}" STREQUAL "debian"))
set(CPACK_GENERATOR "DEB")
endif()
# Check if Rpm-like
string(REGEX MATCH suse|fedora|rhel RPMTYPE "${DISTRO_LIKE}")
string(REGEX MATCH fedora|suse|rhel RPMNAME "${DISTRO_NAME}")
if((NOT ("${RPMTYPE}" STREQUAL "")) OR (NOT ("${RPMNAME}" STREQUAL "")))
set(CPACK_GENERATOR "RPM")
endif()
# Disto specific name adjustments
if("${DISTRO_NAME}" STREQUAL "opensuse-tumbleweed")
set(DISTRO_NAME "opensuse")
set(DISTRO_CODENAME "tumbleweed")
elseif("${DISTRO_NAME}" STREQUAL "arch")
# Arch linux is rolling the version id reported is the date of last iso.
set(DISTRO_VERSION_ID "")
endif()
# Determain the code name to be used if any
if(NOT "${DISTRO_VERSION_ID}" STREQUAL "")
set(CN_STRING "${DISTRO_VERSION_ID}-")
endif()
if(NOT "${DISTRO_CODENAME}" STREQUAL "")
set(CN_STRING "${DISTRO_CODENAME}-")
endif()
set(OS_STRING "${DISTRO_NAME}-${CN_STRING}${CMAKE_SYSTEM_PROCESSOR}")
endmacro()
macro(configure_linux_packaging)
# Gather distro info
# This is used in package names
configure_linux_package_name()
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${DESKFLOW_MAINTAINER})
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
set(CPACK_RPM_PACKAGE_GROUP "Applications/System")
# HACK: The GUI depends on the Qt6 QPA plugins package, but that's not picked
# up by shlibdeps on Ubuntu 22 (though not a problem on Ubuntu 24 and Debian
# 12), so we must add it manually.
set(CPACK_DEBIAN_PACKAGE_DEPENDS "qt6-qpa-plugins")
set(source_desktop_file ${DESKFLOW_PROJECT_RES_DIR}/dist/linux/app.desktop.in)
set(configured_desktop_file ${PROJECT_BINARY_DIR}/app.desktop)
set(install_desktop_file ${DESKFLOW_APP_ID}.desktop)
configure_file(${source_desktop_file} ${configured_desktop_file} @ONLY)
install(
FILES ${configured_desktop_file}
DESTINATION share/applications
RENAME ${install_desktop_file})
install(
FILES ${DESKFLOW_RES_DIR}/app.png
DESTINATION share/pixmaps
RENAME ${DESKFLOW_APP_ID}.png)
# Prepare PKGBUILD for Arch Linux
configure_file(${DESKFLOW_PROJECT_RES_DIR}/dist/arch/PKGBUILD.in
${CMAKE_BINARY_DIR}/PKGBUILD @ONLY)
endmacro()
#
# Same as the `configure_file` command but for directories recursively.
#
macro(configure_files srcDir destDir)
message(VERBOSE "Configuring directory ${destDir}")
make_directory(${destDir})
file(
GLOB_RECURSE sourceFiles
RELATIVE ${srcDir}
${srcDir}/*)
file(
GLOB_RECURSE templateFiles
LIST_DIRECTORIES false
RELATIVE ${srcDir}
${srcDir}/*.in)
list(REMOVE_ITEM sourceFiles ${templateFiles})
foreach(sourceFile ${sourceFiles})
set(sourceFilePath ${srcDir}/${sourceFile})
if(IS_DIRECTORY ${sourceFilePath})
message(VERBOSE "Copying directory ${sourceFile}")
make_directory(${destDir}/${sourceFile})
else()
message(VERBOSE "Copying file ${sourceFile}")
configure_file(${sourceFilePath} ${destDir}/${sourceFile} COPYONLY)
endif()
endforeach(sourceFile)
foreach(templateFile ${templateFiles})
set(sourceTemplateFilePath ${srcDir}/${templateFile})
string(REGEX REPLACE "\.in$" "" templateFile ${templateFile})
message(VERBOSE "Configuring file ${templateFile}")
configure_file(${sourceTemplateFilePath} ${destDir}/${templateFile} @ONLY)
endforeach(templateFile)
endmacro(configure_files)
macro(check_is_rpm)
# Check if RPM-like.
endmacro()

View File

@ -11,9 +11,10 @@
"codesigning",
"Compat",
"contribs",
"daemonized",
"Daun",
"Devs",
"Deskflow",
"Devs",
"distro",
"distros",
"dmgbuild",
@ -24,6 +25,8 @@
"gdrive",
"Hadzhylov",
"Hetu",
"HINSTANCE",
"HKLM",
"hotspots",
"Hutterer",
"ifdef",
@ -39,6 +42,7 @@
"Libera",
"libportal",
"LLDB",
"logonui",
"Lysytsia",
"macdeployqt",
"msvc",
@ -48,6 +52,8 @@
"Oleksandr",
"Olena",
"outputdir",
"outputter",
"outputters",
"pacman",
"Petroules",
"Pixmap",
@ -57,8 +63,10 @@
"Priddy",
"psutil",
"pyproject",
"qobject",
"qputenv",
"readf",
"Redist",
"Regen",
"Repology",
"Rizzitello",
@ -67,9 +75,11 @@
"Schoeneman",
"Serhii",
"shemp",
"SNAPPROCESS",
"Sorin",
"subproject",
"subprojects",
"Toolhelp",
"trackpad",
"Trixie",
"unittests",

41
deploy/CMakeLists.txt Normal file
View File

@ -0,0 +1,41 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
# Copy License with txt ext for picky package creation tools
file(COPY_FILE
${CMAKE_SOURCE_DIR}/LICENSE
${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt
ONLY_IF_DIFFERENT
)
# Generic Package Items
set(CPACK_STRIP_FILES TRUE)
set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
set(CPACK_PACKAGE_CONTACT ${CMAKE_PROJECT_CONTACT})
set(CPACK_PACKAGE_DESCRIPTION ${CMAKE_PROJECT_DESCRIPTION})
set(CPACK_PACKAGE_VENDOR ${CMAKE_PROJECT_VENDOR})
set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_CURRENT_BINARY_DIR}/LICENSE.txt)
set(CPACK_PACKAGE_VERSION ${CMAKE_PROJECT_VERSION})
#Prevent this override from being written in the package
if(NOT PACKAGE_VERSION_LABEL)
set (PACKAGE_VERSION_LABEL "${CPACK_PACKAGE_VERSION}")
endif()
if(WIN32)
include(windows/deploy.cmake)
elseif(UNIX AND NOT APPLE)
include(linux/deploy.cmake)
elseif(APPLE)
include(mac/deploy.cmake)
else()
message(STATUS "UNKNOWN System: ${CMAKE_SYSTEM_NAME}")
endif()
# Always use "deskflow" for start of name
set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${PACKAGE_VERSION_LABEL}-${OS_STRING}")
message(STATUS "Package Basename: ${CPACK_PACKAGE_FILE_NAME}")
include(CPack)

View File

@ -0,0 +1,41 @@
# SPDX-FileCopyrightText: 2024 Deskflow Developers
# SPDX-License-Identifier: MIT
# Maintainer: Deskflow Developers
pkgname=deskflow
pkgver=@CMAKE_PROJECT_VERSION@
pkgrel=1
pkgdesc="Mouse and keyboard sharing utility"
url='https://deskflow.org'
arch=('i686' 'x86_64' 'armv7h' 'aarch64')
license=(LicenseRef-GPL-2.0-only-WITH-OpenSSL-Exception)
conflicts=('synergy-git' 'synergy-1.6' 'synergy1-bin' 'synergy2-bin' 'synergy3-bin' 'synergy3-beta-bin' 'synergy3-stable-bin' 'barrier' 'barrier-git' 'barrier-headless' 'barrier-headless-git' 'input-leap' 'input-leap-git' 'input-leap-headless-git' 'input-leap-headless' 'waynergy' 'waynergy-git' 'qsynergy' 'slim-synergy' 'quicksynergy' 'deskflow')
provides=("deskflow-git${pkgver}")
depends=(
'gcc-libs'
'glibc'
'openssl'
'libx11'
'libxi'
'libxkbfile'
'libxext'
'libxtst'
'libxinerama'
'libxkbcommon-x11'
'hicolor-icon-theme'
'qt6-base'
'qt6-tools'
'libei'
'libportal'
'tomlplusplus'
'cli11'
)
options=('!debug')
package() {
# By default, `makepkg` will run from the `src` directory, which would
# only install the binaries, and not the .desktop file, etc. To install
# everything, we need to set DESTDIR.
cd $startdir
DESTDIR=$pkgdir cmake --install .
}

108
deploy/linux/deploy.cmake Normal file
View File

@ -0,0 +1,108 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
# HACK This is set when the files is included so its the real path
# calling CMAKE_CURRENT_LIST_DIR after include would return the wrong scope var
set(MY_DIR ${CMAKE_CURRENT_LIST_DIR})
# Install our desktop file
install(
FILES ${MY_DIR}/org.deskflow.deskflow.desktop
DESTINATION share/applications
)
# Install our icon
install(
FILES ${MY_DIR}/deskflow.png
DESTINATION share/icons/hicolor/512x512/apps/
RENAME org.deskflow.deskflow.png
)
# Install our metainfo
install(
FILES ${MY_DIR}/org.deskflow.deskflow.metainfo.xml
DESTINATION share/metainfo/
)
# Prepare PKGBUILD for Arch Linux
configure_file(
${MY_DIR}/arch/PKGBUILD.in
${CMAKE_BINARY_DIR}/PKGBUILD
@ONLY
)
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
set(CPACK_RPM_PACKAGE_LICENSE "GPLv2")
set(CPACK_RPM_PACKAGE_GROUP "Applications/System")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
# Get Distro name information
if(EXISTS "/etc/os-release")
FILE(STRINGS "/etc/os-release" RELEASE_FILE_CONTENTS)
else()
message(FATAL_ERROR "Unable to read file /etc/os-release")
endif()
foreach(LINE IN LISTS RELEASE_FILE_CONTENTS)
if( "${LINE}" MATCHES "^ID=")
string(REGEX REPLACE "^ID=" "" DISTRO_NAME ${LINE})
string(REGEX REPLACE "\"" "" DISTRO_NAME ${DISTRO_NAME})
message(DEBUG "Distro Name :${DISTRO_NAME}")
elseif( "${LINE}" MATCHES "^ID_LIKE=")
string(REGEX REPLACE "^ID_LIKE=" "" DISTRO_LIKE "${LINE}")
string(REGEX REPLACE "\"" "" DISTRO_LIKE ${DISTRO_LIKE})
message(DEBUG "Distro Like :${DISTRO_LIKE}")
elseif( "${LINE}" MATCHES "^VERSION_CODENAME=")
string(REGEX REPLACE "^VERSION_CODENAME=" "" DISTRO_CODENAME "${LINE}")
string(REGEX REPLACE "\"" "" DISTRO_CODENAME "${DISTRO_CODENAME}")
message(DEBUG "Distro Codename:${DISTRO_CODENAME}")
elseif( "${LINE}" MATCHES "^VERSION_ID=")
string(REGEX REPLACE "^VERSION_ID=" "" DISTRO_VERSION_ID "${LINE}")
string(REGEX REPLACE "\"" "" DISTRO_VERSION_ID "${DISTRO_VERSION_ID}")
message(DEBUG "Distro VersionID:${DISTRO_VERSION_ID}")
endif()
endforeach()
# Check if Debian-link
string(REGEX MATCH debian|buntu DEBTYPE "${DISTRO_LIKE}")
string(REGEX MATCH debian|deepin|uos DEBNAME "${DISTRO_NAME}")
if((NOT ("${DEBTYPE}" STREQUAL "")) OR (NOT ("${DEBNAME}" STREQUAL "")))
set(CPACK_GENERATOR "DEB")
endif()
# Check if Rpm-like
string(REGEX MATCH suse|fedora|rhel RPMTYPE "${DISTRO_LIKE}")
string(REGEX MATCH fedora|suse|rhel RPMNAME "${DISTRO_NAME}")
if((NOT ("${RPMTYPE}" STREQUAL "")) OR (NOT ("${RPMNAME}" STREQUAL "")))
set(CPACK_GENERATOR "RPM")
endif()
# Disto specific name adjustments
if("${DISTRO_NAME}" STREQUAL "opensuse-tumbleweed")
set(DISTRO_NAME "opensuse")
set(DISTRO_CODENAME "tumbleweed")
elseif("${DISTRO_NAME}" STREQUAL "arch")
# Arch linux is rolling the version id reported is the date of last iso.
set(DISTRO_VERSION_ID "")
endif()
# Determain the code name to be used if any
if(NOT "${DISTRO_VERSION_ID}" STREQUAL "")
set(CN_STRING "${DISTRO_VERSION_ID}-")
endif()
if(NOT "${DISTRO_CODENAME}" STREQUAL "")
set(CN_STRING "${DISTRO_CODENAME}-")
endif()
if("${DISTRO_NAME}" STREQUAL "")
set(DISTRO_NAME "linux")
endif()
set(OS_STRING "${DISTRO_NAME}-${CN_STRING}${CMAKE_SYSTEM_PROCESSOR}")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "|.*BSD")
message(STATUS "BSD packaging not yet supported")
set(OS_STRING ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR})
endif()

BIN
deploy/linux/deskflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,6 @@
{
"org.deskflow.deskflow": [
"appstream-external-screenshot-url",
"appstream-screenshots-not-mirrored-in-ostree"
]
}

View File

@ -0,0 +1,96 @@
app-id: org.deskflow.deskflow
runtime: org.kde.Platform
runtime-version: "6.8"
sdk: org.kde.Sdk
command: deskflow
finish-args:
- --share=ipc
- --socket=wayland
- --socket=fallback-x11
- --share=network
- --device=dri
- --talk-name=org.kde.StatusNotifierWatcher
cleanup:
- /include
- "*.a"
- /bin/ei-debug-events
- /lib/cmake
- /lib/pkgconfig
- /share/pkgconfig
- /share/tomlplusplus
- /share/cmake
- /share/doc
- /share/gir-1.0
- /lib/girepository-1.0
modules:
- name: python3-Jinja2
buildsystem: simple
build-commands:
- pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
--prefix=${FLATPAK_DEST} --no-build-isolation Jinja2
sources:
- type: file
url: https://files.pythonhosted.org/packages/30/6d/6de6be2d02603ab56e72997708809e8a5b0fbfee080735109b40a3564843/Jinja2-3.1.3-py3-none-any.whl
sha256: 7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa
- type: file
url: https://files.pythonhosted.org/packages/87/5b/aae44c6655f3801e81aa3eef09dbbf012431987ba564d7231722f68df02d/MarkupSafe-2.1.5.tar.gz
sha256: d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b
cleanup:
- '*'
- name: libei
buildsystem: meson
config-opts:
- -Ddocumentation=[]
- -Dtests=disabled
- -Dliboeffis=disabled
sources:
- type: git
url: https://gitlab.freedesktop.org/libinput/libei
tag: 1.4.0
commit: 5d6d8e6590df210b75559a889baa9459c68d9366
- name: libportal
buildsystem: meson
config-opts:
- -Ddocs=false
- -Dtests=false
- -Dportal-tests=false
- -Dvapi=false
- -Dbackend-qt6=auto
sources:
- type: git
url: https://github.com/flatpak/libportal.git
tag: 0.9.1
commit: 8f5dc8d192f6e31dafe69e35219e3b707bde71ce
- name: cli11
buildsystem: cmake-ninja
config-opts:
- -DCLI11_BUILD_TESTS=OFF
sources:
- type: git
url: https://github.com/CLIUtils/CLI11
tag: v2.4.2
commit: 6c7b07a878ad834957b98d0f9ce1dbe0cb204fc9
- name: tomlplusplus
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/marzer/tomlplusplus
tag: v3.4.0
commit: 30172438cee64926dc41fdd9c11fb3ba5b2ba9de
- name: gtest
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/google/googletest.git
tag: v1.15.2
commit: b514bdc898e2951020cbdca1304b75f5950d1f59
cleanup:
- '*'
- name: deskflow
buildsystem: cmake-ninja
config-opts:
- "-DCMAKE_BUILD_TYPE=Release"
sources:
- type: dir
path: ../../../

View File

@ -1,11 +1,13 @@
# SPDX-FileCopyrightText: 2024 Deskflow Developers
# SPDX-License-Identifier: MIT
[Desktop Entry]
Type=Application
Version=1.0
Name=@DESKFLOW_APP_NAME@
Name=Deskflow
Comment=Mouse and keyboard sharing utility
Path=/usr/bin
Exec=/usr/bin/@GUI_BINARY_NAME@
Icon=@DESKFLOW_APP_ID@
Exec=deskflow
Icon=org.deskflow.deskflow
Terminal=false
Categories=Utility;
Keywords=keyboard;mouse;sharing;network;share;

View File

@ -0,0 +1,360 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<id>org.deskflow.deskflow</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-2.0+</project_license>
<name>Deskflow</name>
<developer id="org.deskflow">
<name>Deskflow Developers</name>
</developer>
<summary>Software Keyboard and mouse sharing</summary>
<description>
<p>
Use the keyboard, mouse, or trackpad of one computer to control nearby computers, and work seamlessly between them.
</p>
</description>
<launchable type="desktop-id">org.deskflow.deskflow.desktop</launchable>
<url type="homepage">https://deskflow.org</url>
<url type="bugtracker">https://github.com/deskflow/deskflow/issues</url>
<screenshots>
<screenshot type="default">
<image>https://deskflow.org/screenshots/deskflow.png</image>
<caption>Deskflow's mainwindow on KDE</caption>
</screenshot>
<screenshot>
<image>https://deskflow.org/screenshots/deskflow-dark.png</image>
<caption>Deskflow's mainwindow on KDE (dark mode)</caption>
</screenshot>
</screenshots>
<provides> <id>org.deskflow.deskflow.desktop</id> </provides>
<categories>
<category>Utility</category>
</categories>
<keywords>
<keyword translate="no">Input</keyword>
<keyword translate="no">Sharing</keyword>
<keyword translate="no">KVM</keyword>
<keyword translate="no">Synergy</keyword>
</keywords>
<branding>
<color type="primary" scheme_preference="light">#dddddd</color>
<color type="primary" scheme_preference="dark">#555555</color>
</branding>
<content_rating type="oars-1.0" />
<releases>
<release version="1.21.1" date="2025-03-31" urgency="high">
<description>
<p>This stable release fixes a few critical bugs in 1.21.0. For the full changelog see the release page.</p>
<ul>
<li>Fix: Flatpak can't save settings'</li>
<li>Fix: Crash on localfingerprint dialog</li>
<li>Fix: Check for updates settings reading from wrong value</li>
<li>Fix: Windows settings saving blocked for non admin users </li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.21.1</url>
</release>
<release version="1.21.0" date="2025-03-27" urgency="high">
<description>
<p>This stable release removes some dependencies, additionally fixes several bugs. For the full changelog see the release page.</p>
<ul>
<li>Cleanup unused classes</li>
<li>New Settings class</li>
<li>Remove need for pugixml</li>
<li>Remove need for libNotify</li>
<li>Remove need for gio</li>
<li>Remove need for gitkpixbuf</li>
<li>Fix issues with windows installer when msvc is missing</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.21.0</url>
</release>
<release version="1.20.1" date="2025-03-07" urgency="low">
<description>
<p>This stable release introduces a Windows dependency requirement and fixes a macOS bug.</p>
<ul>
<li>Fix: macOS menu bar icon invisible when menu bar is light</li>
<li>Feature: Add Windows installer check for Visual C++ Redistributable</li>
<li>Feature: Prevent Windows binaries running if MSVC runtime too old</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.20.1</url>
</release>
<release version="1.20.0" date="2025-03-03" urgency="high">
<description>
<p>This stable release fixes a few security issues, additionally fixes several bugs and adds a few new features. For the full changelog see the release page.</p>
<ul>
<li>Feature: Peer Id Checking - Fixes CVE-2021-42072 and CVE-2021-42073</li>
<li>Feature: Use Sha256 fingerprints</li>
<li>Feature: Gui cleanup and improvements</li>
<li>Remove: Inverse connection option</li>
<li>Fix: Screen Corner option</li>
<li>Fix: Show new client dialog</li>
<li>Win32: Daemon Improvements</li>
<li>Win32: Fix clear settings</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.20.0</url>
</release>
<release version="1.19.0" date="2025-01-31" urgency="high">
<description>
<p>This stable release fixes several bugs and adds a few new features. For the full changelog see the release page.</p>
<ul>
<li>Feature: New Fallback icon theme</li>
<li>Feature: Allow only one gui instance</li>
<li>Fix: Modifier remapping on macOS</li>
<li>Fix: Show Screen icons again in the server settings</li>
<li>Fix: Show the TLS Label</li>
<li>Fix: Mainwindow restore </li>
<li>Fix: Hotkey with more then one action now work again</li>
<li>Better Detection of evdev on BSD</li>
<li>Better language detection on X11</li>
<li>Better deal with screen changes on wayland</li>
<li>Remove Legacy tray icons</li>
<li>Lots of Internal Cleanup</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.19.0</url>
</release>
<release version="1.18.0" date="2024-12-26" urgency="high">
<description>
<p>This stable release fixes a few security issues, additionally fixes several bugs and adds a few new features. For the full changelog see the release page.</p>
<ul>
<li>Fix CVE-2021-42075: Close connection on app-level handshake failure</li>
<li>Fix CVE-2021-42074: Handle SSL race conditions and segmentation fault</li>
<li>Fix CVE-2021-42076: Enforce maximum message length </li>
<li>Add a visiblity toggle for the log</li>
<li>Fix deskflow will now hide or show when the tray icon is clicked</li>
<li>Fix how Utf-16 surrogates are handled</li>
<li>Avoid encoding empty data to the clipboard on Windows</li>
<li>Create new Tray Icons for windows</li>
<li>Always show the tray menu entry for the restore action on macOS</li>
<li>Correctly restore window when hidden with command+H on macOS</li>
<li>Update the windows clipboard format listener to monitor the clipboard</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.18.0</url>
</release>
<release version="1.17.2" date="2024-11-20" urgency="medium">
<description>
<p>This stable Release contains alot of internal refactoring.</p>
<ul>
<li>docs: Update readme to use latest for the stable link and continuous</li>
<li>chore: rm unused res/doxygen.cfg.in</li>
<li>chore: rm unused res/License.tex</li>
<li>chore: rm unused res/License.rtf</li>
<li>refactor: mv res/gui/win/app.rc => src/gui/src/app.rc</li>
<li>refactor: mv res/app.ico src/gui/src/app.ico</li>
<li>refactor: mv src/lib/gui/TrayIcon => src/gui/src/TrayIcon</li>
<li>feat: use platform native styles when possible</li>
<li>refactor: use theme icon for document open fallback to the folder icon</li>
<li>refactor mv: res/gui => src/gui/res</li>
<li>chore: alphabetize app.qrc resource file</li>
<li>chore rm: unused app.svg</li>
<li>refactor: mv res/app.png and res/app.svg => deploy</li>
<li>refactor: mv res/dist/linux/app.desktop.in => deploy/org.deskflow.desktop</li>
<li>refactor: mv res/dist/arch => deploy/dist/arch</li>
<li>chore: rm unneeded res/dist/flatpak/flatpak-desktop.patch</li>
<li>refactor: mv res/dist/flatpak => deploy/res/flatpak</li>
<li>refactor: mv res/dist/mac => deploy/dist/mac</li>
<li>refactor: mv res/dist/wix => deploy/dist/wix</li>
<li>build: add metainfo</li>
<li>ci: rename ci.yml to => continuous-integration.yml</li>
<li>Rename CI badge to match new .yml filename</li>
<li>chore: update the deskflow shipped icon to have proper padding</li>
<li>chore: adjust branding light / dark colors to dddddd / 555555</li>
<li>fix: SettingsDialog ui generating nonsence alignment tags when edited</li>
<li>feat: SettingsDialog, Allow user to toggle the check for updates settings</li>
<li>fix: MainWindow not saving initial update flag</li>
<li>build: rm DESKFLOW_APP_ID define</li>
<li>build: rm DESKFLOW_DOMAIN define</li>
<li>build: rm DESKFLOW_APP_NAME define</li>
<li>build: rm DESKFLOW_AUTHOR_NAME define</li>
<li>build: rm DESKFLOW_MAINTAINER define</li>
<li>build: rm DESKFLOW_WEBSITE_URL define</li>
<li>build: rm DESKFLOW_VERSION_URL define</li>
<li>build: rm DESKFLOW_HELP_TEXT define</li>
<li>build: rm DESKFLOW_RES_DIR define</li>
<li>build: rm DESKFLOW_MAC_BUNDLE_CODE</li>
<li>build: rm GUI_BINARY_NAME define</li>
<li>build: rm SERVER_BINARY_NAME define</li>
<li>build:rm CLIENT_BINARY_NAME define</li>
<li>build: rm CORE_BINARY_NAME define</li>
<li>build: rm DAEMON_BINARY_NAME</li>
<li>build: remove DESKFLOW_SHOW_DEV_THANKS define</li>
<li>fix: single typo in README.md</li>
<li>feat: fix flatpak recipe</li>
<li>ci: build flatpaks</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.17.2</url>
</release>
<release version="1.17.1" date="2024-11-07" urgency="high">
<description>
<p>This stable release has a very long changelog some notable ones are.</p>
<ul>
<li>Remove word 'beta' from Wayland message</li>
<li>docs: Update `README.md` with Matrix link</li>
<li>Make `README.md` more relevant to current repo state</li>
<li>Use #pragma once for headers</li>
<li>Remove Python `.venv` dir caching to reduce complexity</li>
<li>Add discussion value to project values in README.md</li>
<li>Use modern Qt connections in GUI</li>
<li>chore: rm unused string_utils file</li>
<li>build: findSSL via cmake</li>
<li>fix: Set correct QGuiApplication::desktopFileName</li>
<li>feat: Use native style on KDE Plasma</li>
<li>build: Don't force CMAKE_INSTALL_PREFIX</li>
<li>CI: Requires Lint to pass before running other jobs. Allow CI to be skipped for non code changes</li>
<li>Move res/config.h.in -> src/lib/config.h.in</li>
<li>build: Drop warnings_as_errors</li>
<li>chore: cmake user files to gitignore</li>
<li>chore: add basic .gitattributes</li>
<li>Use high res icons and remove unused</li>
<li>Coverage for `AboutDialog.cpp`</li>
<li>CI cleanup and consolidation</li>
<li>Remove dead `test-dist-upload.yml` file</li>
<li>fix: align --display explanation in help message</li>
<li>Use version from Git tags instead of `VERSION` file</li>
<li>Add leading edge philosophy to README.md</li>
<li>Fixed minor typos in the bug report template</li>
<li>Change TLS dir to same as Qt config</li>
<li>Restore `pull_request` trigger for `codeql-analysis.yml`</li>
<li>Fixed error count logic for test summary</li>
<li>Solve QCheckBox 6.7+ warning and exclude GUI from coverage</li>
<li>build: set project description</li>
<li>fix: Check for errors before reading version string</li>
<li>ci: clearer and cleaner steps</li>
<li>Arch package fixup</li>
<li>Force LF in gitattributes</li>
<li>docs: Add other build type to bug report template</li>
<li>Fixed code style in `ci.yml` workflow</li>
<li>Remove `cmake-format` linter (more harm than good)</li>
<li>Ignore paths for CodeQL Analysis</li>
<li>Always run PR comments job</li>
<li>docs: Add .editorconfig file</li>
<li>Remove Wayland experimental pop</li>
<li>build: linux packages with proper names using cpack</li>
<li>ci: vcpkg cache working</li>
<li>fix: Use `OPENSSL_EXE_DIR` instead of `OPENSSL_ROOT_DIR` on Windows</li>
<li>build: Add `gtest-args` for VS Code users</li>
<li>chore: Replace assert with warning for screen boundary issue</li>
<li>chore: resolve cmake cap nits</li>
<li>fix: Let users select version number and build in About Dialog</li>
<li>Adjust Clang-format linter rules</li>
<li>chore: Update feature request template</li>
<li>build: update required ssl to 3.0+</li>
<li>ci: Use `cmake` instead of `make` directly for Arch package</li>
<li>build: Require cmake 3.24</li>
<li>ci: use vcpkg action on ci to cache</li>
<li>ci: Remove CMake presets</li>
<li>build: get CLI11 via file download if not on system</li>
<li>ci: remove unused cache step</li>
<li>build: arch package won't install /bin</li>
<li>build: use File to dl toml++ if not on system</li>
<li>ci: Catch std::exception on toml::parse_file</li>
<li>Optional FreeBSD integtests and reduce CMake arg dupe</li>
<li>fix: server config dialog show event</li>
<li>docs: Checkbox for continuous build on bug template</li>
<li>build: use vcpkg for all depends, vcpkg action on ci to cache</li>
<li>Remove `.ui` files from being the base class</li>
<li>Protocol interoperability for Input Leap (Barrier) and Synergy</li>
<li>build: arch package requires tomlplusplus and cli11</li>
<li>build: Use Fetch Content for Gtest</li>
<li>fix:#7760 use a proper fedora package name</li>
<li>Static cast screen column count for scan alert 559</li>
<li>build: remove stale meson parts for wintoast</li>
<li>ci: Normalize CI step names, descriptions, etc</li>
<li>ci: New macOS CI with Qt action</li>
<li>Drop `.ui` file for setup wizard</li>
<li>Clazy nits</li>
<li>ci: Bump containers for analyze workflows</li>
<li>ci: use fancy checkout action</li>
<li>Fix the windows installer</li>
<li>build: Require libei and libportal on linux</li>
<li>Unify Jobs into one matrix</li>
<li>docs: Update Readme</li>
<li>ci: remove unused libportal check from Librarires.cmake</li>
<li>docs: Remove confusing value line in readme</li>
<li>Simplify build by using Docker containers directly</li>
<li>docs: Remote build containers badge</li>
<li>Elaborate on settings dialog help (what's this)</li>
<li>Mosty glob free</li>
<li>build: update package names for linux to be more unified</li>
<li>chore: add link to wayland discussion</li>
<li>docs: readme add mac os xattr note</li>
<li>Update README.md to restore sponsor link</li>
<li>docs: Fixed sponsor link in README</li>
<li>User docs</li>
<li>chore: settingsDialog rm unused CoreTool include</li>
<li>Do not build deskflow legacy</li>
<li>build: add deskflow devs to binaries copyright</li>
<li>doc: correct target for documents</li>
<li>docs: Improve error messages around Doxygen</li>
<li>fix: crash on --help arg</li>
<li>docs: contributors on readme</li>
<li>Clean up scripts directory</li>
<li>No UI about dialog</li>
<li>chore: add homebrew tap info to readme</li>
<li>chore: Replace screen leave/enter asserts with warnings</li>
<li>CI: added updated winget package submission</li>
<li>ci: Use GITHUB_TOKEN in place of PAT</li>
<li>ci: use pre-release for continuous to stop it from grabbing latest tag</li>
<li>ci: git-version-action: Always report described version</li>
<li>ci: adjust pacakge script to use the names we would like when in cpack</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.17.1</url>
</release>
<release version="1.17.0" date="2024-10-02" urgency="low">
<description>
<p>This is the first Deskflow release.</p>
<ul>
<li>Use Deskflow Name</li>
<li>fix: windows build typos</li>
<li>Fix broken CI caused by renaming project to Deskflow</li>
<li>fix: protocol compatibility with Synergy</li>
<li>Remove Google Drive upload and always upload to GitHub</li>
<li>fix: stuck keys on leave</li>
<li>ci: always upgrade packages on arch</li>
<li>ci: option to skip changelog lint in PR</li>
<li>docs: fixed link to config.yaml in README.md</li>
<li>docs: add sponsor badge and blurb to readme</li>
<li>ci: lint and add comment to PR on fail</li>
<li>docs: add build type to bug report form</li>
<li>docs: add extra badges and fix sponsor link</li>
<li>build: default to system tomlplusplus and CLI11</li>
<li>ci: give write permission for PR comments</li>
<li>build: fixed option name for SYSTEM_TOMLPLUSPLUS</li>
<li>build: script to create Python virtual env</li>
<li>build: set BUILD_DATE instead of using __DATE__</li>
<li>ci: delete ChangeLog because it's redundant</li>
<li>feat: use new Deskflow graphics</li>
<li>fix: various typos found by unit193</li>
<li>docs: add new logo to readme and update screenshot</li>
<li>ci: use workflow_run to comment on PRs</li>
<li>feat: change most domains to Deskflow</li>
<li>feat: ask for permission before update check</li>
<li>ci: remove restore-keys for vcpkg and use local bootstrap</li>
<li>ci: add pr comment based on ci result</li>
<li>ci: add link back to workflow summary in pr comment</li>
<li>ci: use github.event.workflow_run.id for CI summary comment</li>
<li>ci: check for summaries dir before building message</li>
<li>ci: handle files with same name in ci comment workflow</li>
<li>ci: fixed syntax error in ci comment workflow</li>
<li>ci: use braces block for formatting in ci comment</li>
<li>ci: use job summary instead of pr comment</li>
<li>ci: lookup pr number by head sha for ci comment</li>
<li>fix: Update onMouseMoveSecondary to allow offset adjustments</li>
<li>ci: lock qt version to 6.7.2 on win/mac</li>
<li>docs: Fixed broken URL in README.md</li>
<li>fix: Use library config for Windows OpenSSL</li>
<li>Relocate commercial code downstream</li>
<li>build: Bump min libei and libportal versions</li>
<li>Use sonarsource/sonarcloud-github-c-cpp</li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.17.0</url>
</release>
</releases>
</component>

20
deploy/mac/deploy.cmake Normal file
View File

@ -0,0 +1,20 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
# HACK This is set when the files is included so its the real path
# calling CMAKE_CURRENT_LIST_DIR after include would return the wrong scope var
set(MY_DIR ${CMAKE_CURRENT_LIST_DIR})
install(CODE "execute_process(COMMAND
${DEPLOYQT}
\"\${CMAKE_INSTALL_PREFIX}/${CMAKE_PROJECT_PROPER_NAME}.app\"
-timestamp -codesign=-
)")
set(OS_STRING "macos-${CMAKE_SYSTEM_PROCESSOR}")
set(CPACK_PACKAGE_ICON "${MY_DIR}/dmg-volume.icns")
set(CPACK_DMG_BACKGROUND_IMAGE "${MY_DIR}/dmg-background.tiff")
set(CPACK_DMG_DS_STORE_SETUP_SCRIPT "${MY_DIR}/generate_ds_store.applescript")
set(CPACK_DMG_VOLUME_NAME "${CMAKE_PROJECT_PROPER_NAME}")
set(CPACK_DMG_SLA_USE_RESOURCE_FILE_LICENSE ON)
set(CPACK_GENERATOR "DragNDrop")

View File

@ -0,0 +1,48 @@
-- SPDX-FileCopyrightText: 2020 Chris Rizzitello <sithlord48@gmail.com>
-- SPDX-License-Identifier: MIT
on run argv
set image_name to item 1 of argv
tell application "Finder"
tell disk image_name
-- wait for the image to finish mounting
set open_attempts to 0
repeat while open_attempts < 5
try
open
delay 5
set open_attempts to 5
close
on error errStr number errorNumber
set open_attempts to open_attempts + 1
delay 10
end try
end repeat
-- open the image the first time and save a DS_Store with just
-- background and icon setup
open
set current view of container window to icon view
set theViewOptions to the icon view options of container window
set background picture of theViewOptions to file ".background:background.tiff"
set arrangement of theViewOptions to not arranged
set icon size of theViewOptions to 100
set text size of theViewOptions to 16
close
open
tell container window
set sidebar width to 0
set statusbar visible to false
set toolbar visible to false
set pathbar visible to false
set the bounds to { 200, 120, 800, 520 }
set position of item "Deskflow.app" to { 144, 190 }
set position of item "Applications" to { 455, 190 }
end tell
close
end tell
end tell
end run

View File

@ -0,0 +1,70 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
# HACK This is set when the files is included so its the real path
# calling CMAKE_CURRENT_LIST_DIR after include would return the wrong scope var
set(MY_DIR ${CMAKE_CURRENT_LIST_DIR})
install(CODE "execute_process(
COMMAND ${DEPLOYQT} --no-compiler-runtime --no-system-d3d-compiler --no-quick-import -network \"\${CMAKE_INSTALL_PREFIX}/deskflow.exe\"
)")
# Setup OS_STRING
if(CMAKE_SYSTEM_PROCESSOR MATCHES AMD64)
set(OS_STRING "win-x64")
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
set(OS_STRING "win-arm64")
else()
set(OS_STRING "win-${CMAKE_SYSTEM_PROCESSOR}")
endif()
# If Wix4+ is installed make a package
find_program(WIX_APP wix)
if (NOT "${WIX_APP}" STREQUAL "")
set(CPACK_WIX_VERSION 4)
list(APPEND CPACK_GENERATOR "WIX")
endif()
set(CPACK_PACKAGE_NAME "${CMAKE_PROJECT_PROPER_NAME}")
# Menu Entry
set(CPACK_WIX_PROGRAM_MENU_FOLDER "${CMAKE_PROJECT_PROPER_NAME}")
set(CPACK_PACKAGE_EXECUTABLES "deskflow" "${CMAKE_PROJECT_PROPER_NAME}")
# Default Install Path
set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CMAKE_PROJECT_PROPER_NAME}")
# Wix Specific Values
set(CPACK_WIX_UPGRADE_GUID "027D1C8A-E7A5-4754-BB93-B2D45BFDBDC8")
set(CPACK_WIX_UI_BANNER "${MY_DIR}/wix-banner.png")
set(CPACK_WIX_UI_DIALOG "${MY_DIR}/wix-dialog.png")
# Required Extra Extenstions
list(APPEND CPACK_WIX_EXTENSIONS "WixToolset.Util.wixext" "WixToolset.Firewall.wixext")
# Make sure to also put the xmlns for the ext into the wix block on generated files
list(APPEND CPACK_WIX_CUSTOM_XMLNS "util=http://wixtoolset.org/schemas/v4/wxs/util" "firewall=http://wixtoolset.org/schemas/v4/wxs/firewall")
# The patch has to know the full path of our msm file
configure_file(
${MY_DIR}/wix-patch.xml.in
${CMAKE_CURRENT_BINARY_DIR}/wix-patch.xml @ONLY
)
# This patch set ups filewall rules, the service and msm module
set(CPACK_WIX_PATCH_FILE "${CMAKE_CURRENT_BINARY_DIR}/wix-patch.xml")
# Creates a DLL that can be used by our MSI for custom actions.
configure_file(
${MY_DIR}/wix-custom.h.in
${CMAKE_CURRENT_BINARY_DIR}/wix-custom.h @ONLY
)
add_library(
wix-custom SHARED
${MY_DIR}/wix-custom.cpp
)
target_include_directories(wix-custom PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
set_target_properties(wix-custom PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
)
target_link_libraries(wix-custom PRIVATE Msi)

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -0,0 +1,72 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#include "wix-custom.h"
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
// Include after Windows.h
#include <MsiQuery.h>
#include <stdio.h>
#include <string>
namespace {
// Warning: DLL will crash with error code 1603 if we exceed this.
const auto kLogLineMax = 1024;
// Prefixes log messages with the app name so they're easier to find/filter.
const std::string kLogPrefix = std::string(kAppId) + " installer: ";
// Note: Resized to log line max when used.
static std::string s_logMessageBuffer; // NOSONAR - Must be mutable.
} // namespace
// This log output can be viewed by using the DebugView program.
#define MS_LOG_DEBUG(message, ...) \
s_logMessageBuffer.resize(kLogLineMax); \
sprintf(s_logMessageBuffer.data(), message, __VA_ARGS__); \
OutputDebugStringA((kLogPrefix + s_logMessageBuffer + "\n").c_str())
extern "C" __declspec(dllexport) UINT __stdcall CheckVCRedist(MSIHANDLE hInstall)
{
const auto kKeyName = TEXT("SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\x64");
const auto kValueName = TEXT("Minor");
const auto kProperty = "VC_REDIST_VERSION_OK";
MS_LOG_DEBUG("checking for msvc redist v%d.%d", kWindowsRuntimeMajor, kWindowsRuntimeMinor);
HKEY hKey;
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, kKeyName, 0, KEY_READ, &hKey) != ERROR_SUCCESS) {
MS_LOG_DEBUG("msvc redist registry key not found");
return ERROR_FUNCTION_FAILED;
}
MS_LOG_DEBUG("msvc redist registry key found, querying minor version");
DWORD minorVersion = 0;
DWORD size = sizeof(DWORD);
RegQueryValueEx(hKey, kValueName, nullptr, nullptr, (LPBYTE)&minorVersion, &size);
RegCloseKey(hKey);
MS_LOG_DEBUG("msvc redist minor version: %lu", minorVersion);
if (minorVersion < kWindowsRuntimeMinor) {
MS_LOG_DEBUG("msvc redist minor version %lu too low, expected >= %d", minorVersion, kWindowsRuntimeMinor);
// Returning success allows the installer will show a friendly error message.
return ERROR_SUCCESS;
}
MS_LOG_DEBUG("msvc redist version ok, setting: %s", kProperty);
if (MsiSetProperty(hInstall, kProperty, "ok") != ERROR_SUCCESS) {
MS_LOG_DEBUG("failed to set property: %s", kProperty);
return ERROR_FUNCTION_FAILED;
}
MS_LOG_DEBUG("msvc redist version check successful");
return ERROR_SUCCESS;
}

View File

@ -0,0 +1,14 @@
/*
* Deskflow -- mouse and keyboard sharing utility
* SPDX-FileCopyrightText: (C) 2025 Symless Ltd.
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#pragma once
const auto kAppId = "@CMAKE_PROJECT_NAME@";
// clang-format off
const auto kWindowsRuntimeMajor = @REQUIRED_MSVC_RUNTIME_MAJOR@;
const auto kWindowsRuntimeMinor = @REQUIRED_MSVC_RUNTIME_MINOR@;
// clang-format on

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

@ -0,0 +1,78 @@
<CPackWiXPatch>
<CPackWiXFragment Id="CM_CP_deskflow_daemon.exe">
<ServiceInstall
Id="ServiceInstall"
Name="Deskflow"
DisplayName="Deskflow"
Description="Runs the Core process on secure desktops (UAC prompts, login screen, etc)."
ErrorControl="normal"
Start="auto"
Type="ownProcess">
<util:ServiceConfig
ResetPeriodInDays="1"
RestartServiceDelayInSeconds="1"
FirstFailureActionType="restart"
SecondFailureActionType="restart"
ThirdFailureActionType="none"
/>
</ServiceInstall>
<ServiceControl Id="ServiceControl" Name="Deskflow" Remove="uninstall" Start="install" Stop="both"/>
</CPackWiXFragment>
<CPackWiXFragment Id="CM_CP_deskflow_server.exe">
<firewall:FirewallException Id="ServerFirewallException" Name="Deskflow Server" Program="[INSTALL_ROOT]deskflow-server.exe" Scope="any"/>
</CPackWiXFragment>
<CPackWiXFragment Id="CM_CP_deskflow_client.exe">
<firewall:FirewallException Id="ClientFirewallException" Name="Deskflow Client" Program="[INSTALL_ROOT]deskflow-client.exe" Scope="any"/>
</CPackWiXFragment>
<CPackWiXFragment Id="#PRODUCT">
<Property Id="VC_REDIST_INSTALLED">
<RegistrySearch
Id="FindVCRedist"
Root="HKLM"
Key="SOFTWARE\Microsoft\VisualStudio\@REQUIRED_MSVC_RUNTIME_MAJOR@.0\VC\Runtimes\x64"
Name="Installed"
Type="raw" />
</Property>
<Binary Id="CustomDLL" SourceFile="@CMAKE_CURRENT_BINARY_DIR@/wix-custom.dll" />
<UI>
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="RunDeskflow"
Condition= "NOT Installed" />
</UI>
<CustomAction
Id="CheckVCRedist"
BinaryRef="CustomDLL"
DllEntry="CheckVCRedist"
Execute="immediate" />
<CustomAction
Id="ShowVCRedistError"
Error="Microsoft Visual C++ Redistributable v@REQUIRED_MSVC_RUNTIME_MAJOR@.@REQUIRED_MSVC_RUNTIME_MINOR@ or later is required. Please download and install the latest version and then restart the installation. See our documentation for instructions." />
<CustomAction
Id="RunDeskflow"
ExeCommand="[INSTALL_ROOT]deskflow.exe"
Directory="INSTALL_ROOT"
Execute="immediate"
Impersonate="yes"
Return="asyncNoWait" />
<InstallExecuteSequence>
<Custom
Action="CheckVCRedist"
Before="InstallInitialize"
Condition="NOT Installed AND VC_REDIST_INSTALLED" />
<Custom
Action="ShowVCRedistError"
Before="InstallInitialize"
Condition="NOT Installed AND (NOT VC_REDIST_INSTALLED OR NOT VC_REDIST_VERSION_OK)" />
</InstallExecuteSequence>
</CPackWiXFragment>
</CPackWiXPatch>

View File

@ -1,3 +1,26 @@
# GUI Config
The search order for a setting file is:
1. `<install-path>/settings/Deskflow.conf`
1. `<XDG_CONFIG_HOME>/Deskflow/Deskflow.conf`
1. A user settings file
1. A system settings file
A new settings file will be created in the user path if no settings file is found.
The path of the settings file will be used as the base for all other config files.
### Windows
- System: `C:\ProgramData\Deskflow\Deskflow.conf`
- User: `C:\Users\userName\AppData\Local\Deskflow\Deskflow.conf`
### Linux
- System: `/etc/Deskflow/Deskflow.conf`
- User: `~/.config/Deskflow/Deskflow.conf`
### macOS
- System: `/Library/Deskflow/Deskflow.conf`
- User: `~/Library/Deskflow/Deskflow.conf`
# Server Config Examples
The `deskflow-server` command accepts the `-c` or `--config` option, which takes one argument,

View File

@ -1,102 +0,0 @@
{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf460
{\fonttbl\f0\fswiss\fcharset0 Helvetica;\f1\froman\fcharset0 Times-Roman;}
{\colortbl;\red255\green255\blue255;}
{\info
{\title Original file was gpl-2.0.tex}
{\doccomm Created using latex2rtf 1.9.19a on Sun Jul 12 19:21:22 2009}}\paperw12280\paperh15900\margl2680\margr2700\margb1760\margt2540\vieww12280\viewh15900\viewkind1
\deftab720
\pard\pardeftab720\ri0\qj
\f0\fs24 \cf0 \
\pard\pardeftab720\ri0\qc
\f1\fs30 \cf0 GNU GENERAL PUBLIC LICENSE
\f0\fs24 \
\
\
\pard\pardeftab720\ri0\qc
\f1 \cf0 Version 2, June 1991\
\
\
Copyright \'a9 1989, 1991 Free Software Foundation, Inc.\
\pard\pardeftab720\ri0\sb240\qc
\cf0 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA\
\pard\pardeftab720\ri0\qc
\cf0 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. \
\pard\pardeftab720\ri0\qc
\b\fs26 \cf0 Preamble
\b0\fs24 \
\pard\pardeftab720\ri0\qj
\cf0 The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software\'97to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation\'92s software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.\
When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.\
To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.\
For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.\
We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.\
Also, for each author\'92s protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors\'92 reputations.\
Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone\'92s free use or not licensed at all.\
The precise terms and conditions for copying, distribution and modification follow.\
\pard\pardeftab720\ri0\qc
\fs31 \cf0 Terms and Conditions For Copying, Distribution and Modification
\fs24 \
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 1. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The \'93Program\'94, below, refers to any such program or work, and a \'93work based on the Program\'94 means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term \'93modification\'94.) Each licensee is addressed as \'93you\'94.\
\pard\pardeftab720\li600\ri0\qj
\cf0 Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 2. You may copy and distribute verbatim copies of the Program\'92s source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.\
\pard\pardeftab720\li600\ri0\qj
\cf0 You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 3. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:\
\pard\pardeftab720\li1200\fi-300\ri0\sb50\qj
\cf0 (a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.\
(b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.\
(c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)\
\pard\pardeftab720\li600\ri0\sb100\qj
\cf0 These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.\
\pard\pardeftab720\li600\fi-300\ri0\qj
\cf0 Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.\
In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 4. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:\
\pard\pardeftab720\li1200\fi-300\ri0\sb50\qj
\cf0 (a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\
(b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,\
(c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)\
\pard\pardeftab720\li600\ri0\sb100\qj
\cf0 The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.\
\pard\pardeftab720\li600\fi-300\ri0\qj
\cf0 If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 5. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.\
6. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.\
7. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients\'92 exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.\
8. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.\
\pard\pardeftab720\li600\ri0\qj
\cf0 If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.\
It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.\
This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 9. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.\
10. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.\
\pard\pardeftab720\li600\ri0\qj
\cf0 Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and \'93any later version\'94, you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.\
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 11. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.\
\pard\pardeftab720\li600\ri0\qc
\fs31 \cf0 No Warranty
\fs24 \
\pard\pardeftab720\li600\fi-300\ri0\sb50\qj
\cf0 12. Because the program is licensed free of charge, there is no warranty for the program, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the program \'93as is\'94 without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program is with you. Should the program prove defective, you assume the cost of all necessary servicing, repair or correction.
\f0 \
\f1 13. In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the program as permitted above, be liable to you for damages, including any general, special, incidental or consequential damages arising out of the use or inability to use the program (including but not limited to loss of data or data being rendered inaccurate or losses sustained by you or third parties or a failure of the program to operate with any other programs), even if such holder or other party has been advised of the possibility of such damages.
\f0 \
\pard\pardeftab720\ri0\sb100\qc
\f1\fs31 \cf0 End of Terms and Conditions
\fs24 }

View File

@ -1,422 +0,0 @@
\documentclass[11pt]{article}
\title{GNU GENERAL PUBLIC LICENSE}
\date{Version 2, June 1991}
\begin{document}
\maketitle
\begin{center}
{\parindent 0in
Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.
\bigskip
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
\bigskip
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
}
\end{center}
\begin{center}
{\bf\large Preamble}
\end{center}
The licenses for most software are designed to take away your freedom to
share and change it. By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free software---to
make sure the software is free for all its users. This General Public
License applies to most of the Free Software Foundation's software and to
any other program whose authors commit to using it. (Some other Free
Software Foundation software is covered by the GNU Library General Public
License instead.) You can apply it to your programs, too.
When we speak of free software, we are referring to freedom, not price.
Our General Public Licenses are designed to make sure that you have the
freedom to distribute copies of free software (and charge for this service
if you wish), that you receive source code or can get it if you want it,
that you can change the software or use pieces of it in new free programs;
and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid anyone to
deny you these rights or to ask you to surrender the rights. These
restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether gratis or
for a fee, you must give the recipients all the rights that you have. You
must make sure that they, too, receive or can get the source code. And
you must show them these terms so they know their rights.
We protect your rights with two steps: (1) copyright the software, and (2)
offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain that
everyone understands that there is no warranty for this free software. If
the software is modified by someone else and passed on, we want its
recipients to know that what they have is not the original, so that any
problems introduced by others will not reflect on the original authors'
reputations.
Finally, any free program is threatened constantly by software patents.
We wish to avoid the danger that redistributors of a free program will
individually obtain patent licenses, in effect making the program
proprietary. To prevent this, we have made it clear that any patent must
be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
\begin{center}
{\Large \sc Terms and Conditions For Copying, Distribution and
Modification}
\end{center}
%\renewcommand{\theenumi}{\alpha{enumi}}
\begin{enumerate}
\addtocounter{enumi}{-1}
\item
This License applies to any program or other work which contains a notice
placed by the copyright holder saying it may be distributed under the
terms of this General Public License. The ``Program'', below, refers to
any such program or work, and a ``work based on the Program'' means either
the Program or any derivative work under copyright law: that is to say, a
work containing the Program or a portion of it, either verbatim or with
modifications and/or translated into another language. (Hereinafter,
translation is included without limitation in the term ``modification''.)
Each licensee is addressed as ``you''.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
\item You may copy and distribute verbatim copies of the Program's source
code as you receive it, in any medium, provided that you conspicuously
and appropriately publish on each copy an appropriate copyright notice
and disclaimer of warranty; keep intact all the notices that refer to
this License and to the absence of any warranty; and give any other
recipients of the Program a copy of this License along with the Program.
You may charge a fee for the physical act of transferring a copy, and you
may at your option offer warranty protection in exchange for a fee.
\item
You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
\begin{enumerate}
\item
You must cause the modified files to carry prominent notices stating that
you changed the files and the date of any change.
\item
You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
\item
If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
\end{enumerate}
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
\item
You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
\begin{enumerate}
\item
Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
\item
Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
\item
Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
\end{enumerate}
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
\item
You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
\item
You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
\item
Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
\item
If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
\item
If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
\item
The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and ``any
later version'', you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
\item
If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
\begin{center}
{\Large\sc
No Warranty
}
\end{center}
\item
{\sc Because the program is licensed free of charge, there is no warranty
for the program, to the extent permitted by applicable law. Except when
otherwise stated in writing the copyright holders and/or other parties
provide the program ``as is'' without warranty of any kind, either expressed
or implied, including, but not limited to, the implied warranties of
merchantability and fitness for a particular purpose. The entire risk as
to the quality and performance of the program is with you. Should the
program prove defective, you assume the cost of all necessary servicing,
repair or correction.}
\item
{\sc In no event unless required by applicable law or agreed to in writing
will any copyright holder, or any other party who may modify and/or
redistribute the program as permitted above, be liable to you for damages,
including any general, special, incidental or consequential damages arising
out of the use or inability to use the program (including but not limited
to loss of data or data being rendered inaccurate or losses sustained by
you or third parties or a failure of the program to operate with any other
programs), even if such holder or other party has been advised of the
possibility of such damages.}
\end{enumerate}
\begin{center}
{\Large\sc End of Terms and Conditions}
\end{center}
\pagebreak[2]
\section*{Appendix: How to Apply These Terms to Your New Programs}
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.
To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
``copyright'' line and a pointer to where the full notice is found.
\begin{quote}
one line to give the program's name and a brief idea of what it does. \\
Copyright (C) yyyy name of author \\
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
\end{quote}
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
\begin{quote}
Gnomovision version 69, Copyright (C) yyyy name of author \\
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. \\
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
\end{quote}
The hypothetical commands {\tt show w} and {\tt show c} should show the
appropriate parts of the General Public License. Of course, the commands
you use may be called something other than {\tt show w} and {\tt show c};
they could even be mouse-clicks or menu items---whatever suits your
program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a ``copyright disclaimer'' for the program, if
necessary. Here is a sample; alter the names:
\begin{quote}
Yoyodyne, Inc., hereby disclaims all copyright interest in the program \\
`Gnomovision' (which makes passes at compilers) written by James Hacker. \\
signature of Ty Coon, 1 April 1989 \\
Ty Coon, President of Vice
\end{quote}
This General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications
with the library. If this is what you want to do, use the GNU Library
General Public License instead of this License.
\end{document}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

View File

@ -1,59 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="400"
viewBox="0 -960 16000 16000"
width="400"
fill="#e8eaed"
version="1.1"
id="svg58"
sodipodi:docname="deskflow-icon.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
inkscape:export-filename="deskflow.png"
inkscape:export-xdpi="4000"
inkscape:export-ydpi="4000"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs62" />
<sodipodi:namedview
id="namedview60"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="1.4142136"
inkscape:cx="140.71425"
inkscape:cy="220.61732"
inkscape:window-width="1920"
inkscape:window-height="1011"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg58" />
<g
id="g312"
transform="matrix(1.0746139,0,0,0.99657266,-596.91134,-9.7327822)"
inkscape:label="deskflow">
<path
style="fill:#3366cc;fill-opacity:1;stroke-width:22.0314"
d="m 10822.775,14277.69 c -725.441,-75.758 -1360.4107,-335.408 -2953.399,-1207.698 -1184.4329,-648.572 -1657.2077,-869.797 -2159.0787,-1010.295 -195.3193,-54.679 -239.4632,-58.606 -660.9423,-58.798 -412.4131,-0.187 -465.9968,4.307 -616.8795,51.442 -617.2354,192.932 -1111.1495,547.318 -1705.8871,1223.984 -372.355,423.649 -452.1256,475.865 -726.9905,475.865 -232.6962,0 -389.3132,-114.626 -538.1425,-393.859 -97.6499,-183.208 -136.2498,-354.745 -136.943,-608.569 -0.9871,-361.332 90.7554,-581.303 405.6158,-972.546 454.315,-564.53 1071.3806,-1096.759 1627.0063,-1403.32 574.0763,-316.742 1301.046,-474.5294 1911.1995,-414.8217 877.7976,85.8977 1479.4495,322.5197 3173.8588,1248.2357 1360.4629,743.271 1887.4222,972.691 2357.3612,1026.316 962.745,109.86 1619.788,-234.099 2426.041,-1270.024 265.988,-341.759 440.291,-523.347 538.01,-560.5 85.218,-32.404 353.332,-26.223 440.38,10.151 114.885,48.003 290.277,236.695 363.058,390.589 90.975,192.367 115.643,338.837 106.757,633.906 -7.394,245.557 -11.399,264.246 -91.148,425.591 -151.774,307.052 -552.228,834.715 -929.562,1224.851 -709.182,733.24 -1400.349,1092.826 -2291.735,1192.297 -223.305,24.917 -275.771,24.644 -538.58,-2.799 z"
id="path3393"
inkscape:label="wave 3" />
<path
style="fill:#33b2cc;fill-opacity:1;stroke-width:26.9658"
d="M 10691.975,9232.2954 C 10023.904,9138.2267 9291.0238,8829.9773 7943.0848,8076.1112 6609.9067,7330.5005 6198.1922,7138.9358 5652.3423,7010.2615 c -243.5381,-57.4099 -347.9813,-65.1846 -698.6764,-52.0098 -350.6523,13.1729 -447.6471,28.2841 -648.4026,101.0161 -564.5998,204.5483 -1088.9878,604.082 -1609.3308,1226.1566 -346.6786,414.4566 -584.4059,525.2808 -885.347,412.7324 -192.604,-72.0329 -433.8052,-423.3421 -490.3134,-714.1418 -38.1396,-196.2741 -16.3788,-517.0343 47.5576,-701.0115 146.4281,-421.345 909.508,-1246.3029 1581.9071,-1710.1823 963.612,-664.7841 1984.7795,-839.4204 3092.0317,-528.7881 635.0677,178.1644 1074.5795,381.1158 2396.9103,1106.8098 963.7205,528.8895 1563.7032,820.226 1945.1742,944.5303 309.63,100.896 861.648,137.9622 1159.223,77.8413 588.657,-118.9268 1115.294,-522.1996 1702.251,-1303.4965 310.762,-413.655 424.656,-516.4984 632.476,-571.1126 312.793,-82.2063 660.875,196.9193 776.17,622.3954 40.112,148.0341 49.106,237.616 42.717,425.5773 -11.234,330.4785 -72.528,487.867 -338.44,868.9363 -740.488,1061.1785 -1618.249,1744.1642 -2516.836,1958.3492 -314.615,74.9868 -841.585,101.7751 -1149.443,58.4277 z"
id="path1767"
inkscape:label="wave 2" />
<path
style="fill:#33cc99;fill-opacity:1;stroke-width:26.9658"
d="M 10576.744,4172.4544 C 9875.4106,4054.5311 9254.561,3795.6536 8047.1318,3117.6748 6298.7948,2135.9727 5901.1838,1973.7358 5169.1286,1943.3652 c -309.4699,-12.839 -457.2545,-4.6405 -640.2217,35.5164 -623.6823,136.8833 -1265.1525,579.7083 -1843.7689,1272.8049 -261.4251,313.1489 -336.0185,374.0949 -523.4853,427.7108 -333.9533,95.5119 -631.6749,-125.6455 -797.5,-592.4091 -65.1417,-183.3604 -70.0111,-219.3096 -60.5107,-446.7291 15.0698,-360.7299 102.7469,-573.6147 372.566,-904.6099 1271.6034,-1559.91423 2646.1446,-2145.742 4181.6081,-1782.19574 680.9761,161.23227 1320.8731,447.96799 2599.9925,1165.04794 1490.1626,835.3921 2027.4634,1046.8526 2657.2604,1045.7931 824.736,-1.3855 1475.964,-418.6346 2184.35,-1399.53052 316.552,-438.32663 413.046,-512.11801 670.274,-512.57528 154.752,-0.27638 193.077,12.59982 339.34,113.99621 259.074,179.60222 391.048,479.99014 391.048,890.06929 0,346.9967 -62.66,514.2152 -341.533,911.4521 -1108.285,1578.6765 -2362.287,2243.4278 -3781.804,2004.7481 z"
id="path970"
inkscape:label="wave 1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 4.9 KiB

View File

@ -1,40 +0,0 @@
# Maintainer: @DESKFLOW_MAINTAINER@
pkgname=@DESKFLOW_APP_ID@
pkgver=@DESKFLOW_VERSION@
pkgrel=1
pkgdesc="Mouse and keyboard sharing utility"
url='@DESKFLOW_WEBSITE_URL@'
arch=('i686' 'x86_64' 'armv6h' 'armv7h' 'aarch64')
license=('GPL-2.0-only')
depends=(
'gcc-libs'
'glibc'
'openssl'
'libx11'
'libxi'
'libxkbfile'
'libxext'
'libxtst'
'libxinerama'
'libxkbcommon-x11'
'libnotify'
'hicolor-icon-theme'
'pugixml'
'qt6-base'
'qt6-tools'
'libei'
'libportal'
'tomlplusplus'
'cli11'
)
conflicts=('synergy-git' 'synergy1-bin' 'synergy2-bin' 'synergy3-bin')
options=('!debug')
package() {
# By default, `makepkg` will run from the `src` directory, which would
# only install the binaries, and not the .desktop file, etc. To install
# everything, we need to set DESTDIR.
cd $startdir
DESTDIR=$pkgdir cmake --install .
}

View File

@ -1,42 +0,0 @@
app-id: org.deskflow.Deskflow
runtime: org.kde.Platform
runtime-version: "5.15-21.08"
sdk: org.kde.Sdk
rename-icon: deskflow
rename-desktop-file: deskflow.desktop
modules:
- name: openssl
buildsystem: simple
build-commands:
- "./config --prefix=/var/run/host/usr/local/ssl"
- "make"
- "make install_sw"
sources:
- type: archive
url: https://github.com/openssl/openssl/archive/OpenSSL_1_1_1n.tar.gz
sha256: 6b2d2440ced8c802aaa61475919f0870ec556694c466ebea460e35ea2b14839e
- name: libnotify
buildsystem: meson
config-opts:
- "-Dman=false"
- "-Dgtk_doc=false"
sources:
- type: git
url: https://gitlab.gnome.org/GNOME/libnotify.git
- name: deskflow
buildsystem: cmake-ninja
config-opts:
- "-DCMAKE_BUILD_TYPE=Release"
sources:
- type: dir
path: ../
- type: patch
path: flatpak-desktop.patch
command: deskflow
finish-args:
- "--share=ipc"
- "--socket=x11"
- "--share=network"
- "--device=dri"
- "--talk-name=org.a11y.*"
- "--filesystem=host"

View File

@ -1,14 +0,0 @@
diff --git a/res/deskflow.desktop b/res/deskflow.desktop
index fa987bdf..9513dbf3 100644
--- a/res/deskflow.desktop
+++ b/res/deskflow.desktop
@@ -3,8 +3,7 @@ Type=Application
Version=1.0
Name=Deskflow
Comment=Keyboard and mouse sharing solution
-Path=/usr/bin
-Exec=/usr/bin/deskflow
+Exec=
Icon=deskflow
Terminal=false
Categories=Utility;

View File

@ -1,31 +0,0 @@
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>@DESKFLOW_APP_NAME@</string>
<key>CFBundleExecutable</key>
<string>@DESKFLOW_APP_ID@</string>
<key>CFBundleIconFile</key>
<string>@DESKFLOW_APP_NAME@.icns</string>
<key>CFBundleIdentifier</key>
<string>@DESKFLOW_APP_ID@</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>@DESKFLOW_APP_NAME@</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>@DESKFLOW_MAC_BUNDLE_CODE@</string>
<key>CFBundleShortVersionString</key>
<string>@DESKFLOW_VERSION@</string>
<key>CFBundleVersion</key>
<string>@DESKFLOW_VERSION@</string>
<key>NSHumanReadableCopyright</key>
<string>© 2024 Deskflow Developers</string>
<key>LSMinimumSystemVersion</key>
<string>10.9.0</string>
</dict>
</plist>

View File

@ -1 +0,0 @@
APPL@DESKFLOW_MAC_BUNDLE_CODE@

View File

@ -1,69 +0,0 @@
# -*- coding: utf-8 -*-
# Example: https://dmgbuild.readthedocs.io/en/latest/example.html
from __future__ import unicode_literals
import os.path
app = defines.get("app")
app_basename = os.path.basename(app)
format = defines.get("format", "UDBZ")
size = defines.get("size", None)
files = [app]
symlinks = {"Applications": "/Applications"}
icon = os.path.join(app, "Contents/Resources/Volume.icns")
icon_locations = {
app_basename: (144, 190),
"Applications": (455, 190),
}
background = os.path.join(app, "Contents/Resources/Background.tiff")
show_status_bar = False
show_tab_view = False
show_toolbar = False
show_pathbar = False
show_sidebar = False
sidebar_width = 180
window_rect = ((200, 120), (620, 420))
default_view = "icon-view"
show_icon_preview = False
include_icon_view_settings = "auto"
include_list_view_settings = "auto"
arrange_by = None
grid_offset = (0, 0)
grid_spacing = 100
scroll_position = (0, 0)
label_pos = "bottom"
text_size = 16
icon_size = 100
list_icon_size = 16
list_text_size = 12
list_scroll_position = (0, 0)
list_sort_by = "name"
list_use_relative_dates = True
list_calculate_all_sizes = (False,)
list_columns = ("name", "date-modified", "size", "kind", "date-added")
list_column_widths = {
"name": 300,
"date-modified": 181,
"date-created": 181,
"date-added": 181,
"date-last-opened": 181,
"size": 97,
"kind": 115,
"label": 100,
"version": 75,
"comments": 300,
}
list_column_sort_directions = {
"name": "ascending",
"date-modified": "descending",
"date-created": "descending",
"date-added": "descending",
"date-last-opened": "descending",
"size": "descending",
"kind": "ascending",
"label": "ascending",
"version": "ascending",
"comments": "ascending",
}

View File

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="AppBrowseDlg" Width="370" Height="270" Title="!(loc.BrowseDlg_Title)">
<Control Id="PathEdit" Type="PathEdit" X="25" Y="202" Width="320" Height="18" Property="_BrowseProperty" Indirect="yes" />
<Control Id="OK" Type="PushButton" X="240" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUIOK)">
<Publish Event="SetTargetPath" Value="[_BrowseProperty]">1</Publish>
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="Reset" Value="0">1</Publish>
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
<Control Id="ComboLabel" Type="Text" X="25" Y="58" Width="44" Height="10" TabSkip="no" Text="!(loc.BrowseDlgComboLabel)" />
<Control Id="DirectoryCombo" Type="DirectoryCombo" X="70" Y="55" Width="220" Height="80" Property="_BrowseProperty" Indirect="yes" Fixed="yes" Remote="yes">
<Subscribe Event="IgnoreChange" Attribute="IgnoreChange" />
</Control>
<Control Id="WixUI_Bmp_Up" Type="PushButton" X="298" Y="55" Width="19" Height="19" ToolTip="!(loc.BrowseDlgWixUI_Bmp_UpTooltip)" Icon="yes" FixedSize="yes" IconSize="16" Text="!(loc.BrowseDlgWixUI_Bmp_Up)">
<Publish Event="DirectoryListUp" Value="0">1</Publish>
</Control>
<Control Id="NewFolder" Type="PushButton" X="325" Y="55" Width="19" Height="19" ToolTip="!(loc.BrowseDlgNewFolderTooltip)" Icon="yes" FixedSize="yes" IconSize="16" Text="!(loc.BrowseDlgNewFolder)">
<Publish Event="DirectoryListNew" Value="0">1</Publish>
</Control>
<Control Id="DirectoryList" Type="DirectoryList" X="25" Y="83" Width="320" Height="98" Property="_BrowseProperty" Sunken="yes" Indirect="yes" TabSkip="no" />
<Control Id="PathLabel" Type="Text" X="25" Y="190" Width="320" Height="10" TabSkip="no" Text="!(loc.BrowseDlgPathLabel)" />
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" TabSkip="no" Text="!(loc.BrowseDlgBannerBitmap)" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="Title" Type="Text" X="15" Y="15" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.BrowseDlgTitle)" />
</Dialog>
</UI>
</Fragment>
</Wix>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
First-time install dialog sequence:
- WixUI_WelcomeDlg
- WixUI_LicenseAgreementDlg
- WixUI_InstallDirDlg
- WixUI_VerifyReadyDlg
- WixUI_DiskCostDlg
Maintenance dialog sequence:
- WixUI_MaintenanceWelcomeDlg
- WixUI_MaintenanceTypeDlg
- WixUI_InstallDirDlg
- WixUI_VerifyReadyDlg
Patch dialog sequence:
- WixUI_WelcomeDlg
- WixUI_VerifyReadyDlg
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI Id="AppDlgSequence">
<TextStyle Id="WixUI_Font_Normal" FaceName="Roboto" Size="9" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Roboto" Size="14" />
<TextStyle Id="WixUI_Font_Title" FaceName="Roboto" Size="12" Bold="yes" Blue="255" Red="255" Green="255"/>
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="InstallDir" />
<DialogRef Id="BrowseDlg" />
<DialogRef Id="DiskCostDlg" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="AppBrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
<Publish Dialog="AppBrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="StartGui">NOT Installed</Publish>
<Publish Dialog="AppWelcome" Control="Next" Event="NewDialog" Value="AppInstallDirDlg" Order="1">1</Publish>
<Publish Dialog="AppWelcome" Control="Next" Event="NewDialog" Value="AppVerifyReadyDlg">Installed AND PATCH</Publish>
<Publish Dialog="AppInstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="AppInstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
<Publish Dialog="AppInstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="AppInstallDirDlg" Control="Next" Event="NewDialog" Value="AppVerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
<Publish Dialog="AppInstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="AppInstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="AppBrowseDlg" Order="2">1</Publish>
<Publish Dialog="AppInstallDirDlg" Control="Back" Event="NewDialog" Value="AppWelcome" Order="2">1</Publish>
<Publish Dialog="AppVerifyReadyDlg" Control="Back" Event="NewDialog" Value="AppInstallDirDlg" Order="1">NOT Installed</Publish>
<Publish Dialog="AppVerifyReadyDlg" Control="Back" Event="NewDialog" Value="AppMaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
<Publish Dialog="AppVerifyReadyDlg" Control="Back" Event="NewDialog" Value="AppInstallDirDlg" Order="2">Installed AND PATCH</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="AppMaintenanceTypeDlg">1</Publish>
<Publish Dialog="AppMaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="AppVerifyReadyDlg">1</Publish>
<Publish Dialog="AppMaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="AppVerifyReadyDlg">1</Publish>
<Publish Dialog="AppMaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
<UIRef Id="WixUI_Common" />
</Fragment>
</Wix>

View File

@ -1,24 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include Include.wxi?>
<Fragment>
<UI Id="AppInstallDirDlg">
<Dialog Id="AppInstallDirDlg" Width="370" Height="270" Title="!(loc.InstallDirDlg_Title)">
<Control Id="Title" Type="Text" X="15" Y="15" Width="200" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.InstallDirDlgTitle)" />
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)" />
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="SpawnDialog" Value="CancelDlg" />
</Control>
<Control Id="InstallDirDlgBackground" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[CommonBackground]" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="FolderLabel" Transparent="yes" Type="Text" X="20" Y="70" Width="290" Height="30" NoPrefix="yes" Text="!(loc.InstallDirDlgFolderLabel)" />
<Control Id="Folder" Type="PathEdit" X="20" Y="90" Width="320" Height="18" Property="WIXUI_INSTALLDIR" Indirect="yes" />
<Control Id="ChangeFolder" Type="PushButton" X="20" Y="112" Width="56" Height="17" Text="!(loc.InstallDirDlgChange)" />
</Dialog>
</UI>
</Fragment>
</Wix>

View File

@ -1,58 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) Microsoft Corporation. All rights reserved.
The use and distribution terms for this software are covered by the
Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php)
which can be found in the file CPL.TXT at the root of this distribution.
By using this software in any fashion, you are agreeing to be bound by
the terms of this license.
You must not remove this notice, or any other, from this software.
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI>
<Dialog Id="AppMaintenanceTypeDlg" Width="370" Height="270" Title="!(loc.MaintenanceTypeDlg_Title)">
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[CommonBackground]" />
<Control Id="ChangeButton" Type="PushButton" X="40" Y="65" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgChangeButtonTooltip)" Default="yes" Text="!(loc.MaintenanceTypeDlgChangeButton)">
<Publish Property="WixUI_InstallMode" Value="Change">1</Publish>
<Condition Action="disable">ARPNOMODIFY</Condition>
</Control>
<Control Id="ChangeText" Transparent="yes" Type="Text" X="60" Y="85" Width="280" Height="20" Text="!(loc.MaintenanceTypeDlgChangeText)">
<Condition Action="hide">ARPNOMODIFY</Condition>
</Control>
<Control Id="ChangeDisabledText" Transparent="yes" Type="Text" X="60" Y="85" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgChangeDisabledText)" Hidden="yes">
<Condition Action="show">ARPNOMODIFY</Condition>
</Control>
<Control Id="RepairButton" Type="PushButton" X="40" Y="118" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgRepairButtonTooltip)" Text="!(loc.MaintenanceTypeDlgRepairButton)">
<Publish Property="WixUI_InstallMode" Value="Repair">1</Publish>
<Condition Action="disable">ARPNOREPAIR</Condition>
</Control>
<Control Id="RepairText" Transparent="yes" Type="Text" X="60" Y="138" Width="280" Height="30" Text="!(loc.MaintenanceTypeDlgRepairText)">
<Condition Action="hide">ARPNOREPAIR</Condition>
</Control>
<Control Id="RepairDisabledText" Transparent="yes" Type="Text" X="60" Y="138" Width="280" Height="30" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRepairDisabledText)" Hidden="yes">
<Condition Action="show">ARPNOREPAIR</Condition>
</Control>
<Control Id="RemoveButton" Type="PushButton" X="40" Y="171" Width="80" Height="17" ToolTip="!(loc.MaintenanceTypeDlgRemoveButtonTooltip)" Text="!(loc.MaintenanceTypeDlgRemoveButton)">
<Publish Property="WixUI_InstallMode" Value="Remove">1</Publish>
<Condition Action="disable">ARPNOREMOVE</Condition>
</Control>
<Control Id="RemoveText" Transparent="yes" Type="Text" X="60" Y="191" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRemoveText)">
<Condition Action="hide">ARPNOREMOVE</Condition>
</Control>
<Control Id="RemoveDisabledText" Transparent="yes" Type="Text" X="60" Y="191" Width="280" Height="20" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgRemoveDisabledText)" Hidden="yes">
<Condition Action="show">ARPNOREMOVE</Condition>
</Control>
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)" />
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUINext)" />
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
<Control Id="Title" Type="Text" X="15" Y="15" Width="340" Height="15" Transparent="yes" NoPrefix="yes" Text="!(loc.MaintenanceTypeDlgTitle)" />
</Dialog>
</UI>
</Fragment>
</Wix>

View File

@ -1,140 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include Include.wxi?>
<Fragment>
<UI>
<Dialog Id="AppVerifyReadyDlg" Width="370" Height="270" Title="!(loc.VerifyReadyDlg_Title)" TrackDiskSpace="yes">
<Control Id="Install" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgInstall)">
<Condition Action="show">NOT Installed AND ALLUSERS</Condition>
<Condition Action="enable">NOT Installed</Condition>
<Condition Action="default">NOT Installed</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="InstallNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgInstall)">
<Condition Action="show">NOT Installed AND NOT ALLUSERS</Condition>
<Condition Action="enable">NOT Installed</Condition>
<Condition Action="default">NOT Installed</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="Change" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgChange)">
<Condition Action="show">WixUI_InstallMode = "Change" AND ALLUSERS AND (ADDLOCAL OR REMOVE)</Condition>
<Condition Action="enable">WixUI_InstallMode = "Change"</Condition>
<Condition Action="default">WixUI_InstallMode = "Change"</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="ChangeNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgChange)">
<Condition Action="show">WixUI_InstallMode = "Change" AND (NOT ALLUSERS OR (NOT ADDLOCAL AND NOT REMOVE))</Condition>
<Condition Action="enable">WixUI_InstallMode = "Change"</Condition>
<Condition Action="default">WixUI_InstallMode = "Change"</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="Repair" Type="PushButton" X="212" Y="243" Width="80" Height="17" Default="yes" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRepair)">
<Condition Action="show">WixUI_InstallMode = "Repair"</Condition>
<Condition Action="enable">WixUI_InstallMode = "Repair"</Condition>
<Condition Action="default">WixUI_InstallMode = "Repair"</Condition>
<Publish Event="ReinstallMode" Value="ecmus"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="Reinstall" Value="All"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="Remove" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRemove)">
<Condition Action="show">WixUI_InstallMode = "Remove" AND ALLUSERS</Condition>
<Condition Action="enable">WixUI_InstallMode = "Remove"</Condition>
<Publish Event="Remove" Value="All"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="RemoveNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgRemove)">
<Condition Action="show">WixUI_InstallMode = "Remove" AND NOT ALLUSERS</Condition>
<Condition Action="enable">WixUI_InstallMode = "Remove"</Condition>
<Publish Event="Remove" Value="All"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="Update" Type="PushButton" ElevationShield="yes" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgUpdate)">
<Condition Action="show">WixUI_InstallMode = "Update" AND ALLUSERS</Condition>
<Condition Action="enable">WixUI_InstallMode = "Update"</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="UpdateNoShield" Type="PushButton" ElevationShield="no" X="212" Y="243" Width="80" Height="17" Hidden="yes" Disabled="yes" Text="!(loc.VerifyReadyDlgUpdate)">
<Condition Action="show">WixUI_InstallMode = "Update" AND NOT ALLUSERS</Condition>
<Condition Action="enable">WixUI_InstallMode = "Update"</Condition>
<Publish Event="EndDialog" Value="Return"><![CDATA[OutOfDiskSpace <> 1]]></Publish>
<Publish Event="SpawnDialog" Value="OutOfRbDiskDlg">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST="P" OR NOT PROMPTROLLBACKCOST)</Publish>
<Publish Event="EndDialog" Value="Return">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="EnableRollback" Value="False">OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND PROMPTROLLBACKCOST="D"</Publish>
<Publish Event="SpawnDialog" Value="OutOfDiskDlg">(OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 1) OR (OutOfDiskSpace = 1 AND PROMPTROLLBACKCOST="F")</Publish>
</Control>
<Control Id="InstallTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="{\WixUI_Font_Title}Ready to install">
<Condition Action="show">NOT Installed</Condition>
</Control>
<Control Id="InstallText" Transparent="yes" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" Text="!(loc.VerifyReadyDlgInstallText)">
<Condition Action="show">NOT Installed</Condition>
</Control>
<Control Id="ChangeTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgChangeTitle)">
<Condition Action="show">WixUI_InstallMode = "Change"</Condition>
</Control>
<Control Id="ChangeText" Transparent="yes" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" Text="!(loc.VerifyReadyDlgChangeText)">
<Condition Action="show">WixUI_InstallMode = "Change"</Condition>
</Control>
<Control Id="RepairTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgRepairTitle)">
<Condition Action="show">WixUI_InstallMode = "Repair"</Condition>
</Control>
<Control Id="RepairText" Transparent="yes" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgRepairText)">
<Condition Action="show">WixUI_InstallMode = "Repair"</Condition>
</Control>
<Control Id="RemoveTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgRemoveTitle)">
<Condition Action="show">WixUI_InstallMode = "Remove"</Condition>
</Control>
<Control Id="RemoveText" Transparent="yes" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgRemoveText)">
<Condition Action="show">WixUI_InstallMode = "Remove"</Condition>
</Control>
<Control Id="UpdateTitle" Type="Text" X="15" Y="15" Width="300" Height="15" Transparent="yes" NoPrefix="yes" Hidden="yes" Text="!(loc.VerifyReadyDlgUpdateTitle)">
<Condition Action="show">WixUI_InstallMode = "Update"</Condition>
</Control>
<Control Id="UpdateText" Transparent="yes" Type="Text" X="25" Y="70" Width="320" Height="80" Hidden="yes" NoPrefix="yes" Text="!(loc.VerifyReadyDlgUpdateText)">
<Condition Action="show">WixUI_InstallMode = "Update"</Condition>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
<Control Id="Back" Type="PushButton" X="156" Y="243" Width="56" Height="17" Text="!(loc.WixUIBack)">
<Condition Action="default">WixUI_InstallMode = "Remove"</Condition>
</Control>
<Control Id="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[CommonBackground]" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
</Dialog>
</UI>
</Fragment>
</Wix>

View File

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. -->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<?include Include.wxi?>
<Fragment>
<UI Id="AppWelcome">
<Property Id="AppWelcomeBackground">welcome_background</Property>
<Binary Id="welcome_background" SourceFile="$(var.ResDir)\dist\wix\images\welcome_background.png"/>
<Dialog Id="AppWelcome" Width="370" Height="270" Title="!(loc.WelcomeDlg_Title)">
<Control Id="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Default="yes" Text="!(loc.WixUINext)">
<Publish Property="WixUI_InstallMode" Value="Update">Installed AND PATCH</Publish>
</Control>
<Control Id="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Cancel="yes" Text="!(loc.WixUICancel)">
<Publish Event="SpawnDialog" Value="CancelDlg">1</Publish>
</Control>
<Control Id="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" TabSkip="no" Text="[AppWelcomeBackground]" />
<Control Id="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Disabled="yes" Text="!(loc.WixUIBack)" />
<Control Id="BottomLine" Type="Line" X="0" Y="234" Width="370" Height="0" />
</Dialog>
<InstallUISequence>
<Show Dialog="AppWelcome" Before="ProgressDlg" Overridable="yes">NOT Installed OR PATCH</Show>
</InstallUISequence>
</UI>
</Fragment>
</Wix>

View File

@ -1,72 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
First-time install dialog sequence:
- WixUI_WelcomeDlg
- WixUI_LicenseAgreementDlg
- WixUI_InstallDirDlg
- WixUI_VerifyReadyDlg
- WixUI_DiskCostDlg
Maintenance dialog sequence:
- WixUI_MaintenanceWelcomeDlg
- WixUI_MaintenanceTypeDlg
- WixUI_InstallDirDlg
- WixUI_VerifyReadyDlg
Patch dialog sequence:
- WixUI_WelcomeDlg
- WixUI_VerifyReadyDlg
-->
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<UI Id="DeskflowDlgSequence">
<TextStyle Id="WixUI_Font_Normal" FaceName="Roboto" Size="9" />
<TextStyle Id="WixUI_Font_Bigger" FaceName="Roboto" Size="14" />
<TextStyle Id="WixUI_Font_Title" FaceName="Roboto" Size="12" Bold="yes" Blue="255" Red="255" Green="255"/>
<Property Id="DefaultUIFont" Value="WixUI_Font_Normal" />
<Property Id="WixUI_Mode" Value="InstallDir" />
<DialogRef Id="BrowseDlg" />
<DialogRef Id="DiskCostDlg" />
<DialogRef Id="ErrorDlg" />
<DialogRef Id="FatalError" />
<DialogRef Id="FilesInUse" />
<DialogRef Id="MsiRMFilesInUse" />
<DialogRef Id="PrepareDlg" />
<DialogRef Id="ProgressDlg" />
<DialogRef Id="ResumeDlg" />
<DialogRef Id="UserExit" />
<Publish Dialog="DeskflowBrowseDlg" Control="OK" Event="DoAction" Value="WixUIValidatePath" Order="3">1</Publish>
<Publish Dialog="DeskflowBrowseDlg" Control="OK" Event="SpawnDialog" Value="InvalidDirDlg" Order="4"><![CDATA[WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="EndDialog" Value="Return" Order="999">1</Publish>
<Publish Dialog="ExitDialog" Control="Finish" Event="DoAction" Value="StartGui">NOT Installed</Publish>
<Publish Dialog="DeskflowWelcome" Control="Next" Event="NewDialog" Value="DeskflowInstallDirDlg" Order="1">1</Publish>
<Publish Dialog="DeskflowWelcome" Control="Next" Event="NewDialog" Value="DeskflowVerifyReadyDlg">Installed AND PATCH</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="Next" Event="SetTargetPath" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="Next" Event="DoAction" Value="WixUIValidatePath" Order="2">NOT WIXUI_DONTVALIDATEPATH</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="Next" Event="SpawnDialog" Value="InvalidDirDlg" Order="3"><![CDATA[NOT WIXUI_DONTVALIDATEPATH AND WIXUI_INSTALLDIR_VALID<>"1"]]></Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="Next" Event="NewDialog" Value="DeskflowVerifyReadyDlg" Order="4">WIXUI_DONTVALIDATEPATH OR WIXUI_INSTALLDIR_VALID="1"</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="ChangeFolder" Property="_BrowseProperty" Value="[WIXUI_INSTALLDIR]" Order="1">1</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="ChangeFolder" Event="SpawnDialog" Value="DeskflowBrowseDlg" Order="2">1</Publish>
<Publish Dialog="DeskflowInstallDirDlg" Control="Back" Event="NewDialog" Value="DeskflowWelcome" Order="2">1</Publish>
<Publish Dialog="DeskflowVerifyReadyDlg" Control="Back" Event="NewDialog" Value="DeskflowInstallDirDlg" Order="1">NOT Installed</Publish>
<Publish Dialog="DeskflowVerifyReadyDlg" Control="Back" Event="NewDialog" Value="DeskflowMaintenanceTypeDlg" Order="2">Installed AND NOT PATCH</Publish>
<Publish Dialog="DeskflowVerifyReadyDlg" Control="Back" Event="NewDialog" Value="DeskflowInstallDirDlg" Order="2">Installed AND PATCH</Publish>
<Publish Dialog="MaintenanceWelcomeDlg" Control="Next" Event="NewDialog" Value="DeskflowMaintenanceTypeDlg">1</Publish>
<Publish Dialog="DeskflowMaintenanceTypeDlg" Control="RepairButton" Event="NewDialog" Value="DeskflowVerifyReadyDlg">1</Publish>
<Publish Dialog="DeskflowMaintenanceTypeDlg" Control="RemoveButton" Event="NewDialog" Value="DeskflowVerifyReadyDlg">1</Publish>
<Publish Dialog="DeskflowMaintenanceTypeDlg" Control="Back" Event="NewDialog" Value="MaintenanceWelcomeDlg">1</Publish>
<Property Id="ARPNOMODIFY" Value="1" />
</UI>
<UIRef Id="WixUI_Common" />
</Fragment>
</Wix>

View File

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define AppId="@DESKFLOW_APP_ID@"?>
<?define Name="@DESKFLOW_APP_NAME@"?>
<?define Version="@DESKFLOW_VERSION@"?>
<?define Author="@DESKFLOW_AUTHOR_NAME@"?>
<?define BinDir="@CMAKE_RUNTIME_OUTPUT_DIRECTORY@"?>
<?define ProjectResDir="@DESKFLOW_PROJECT_RES_DIR@"?>
<?define ResDir="@DESKFLOW_RES_DIR@"?>
<?define QtDir="@QT_PATH@"?>
<?define QtBinDir="$(var.QtDir)\bin"?>
<?if $(var.Platform) = "x64"?>
<?define ProgramFilesFolder="ProgramFiles64Folder"?>
<?define PlatformSimpleName="64-bit"?>
<?define UpgradeGuid="@DESKFLOW_MSI_64_GUID@"?>
<?else?>
<?define ProgramFilesFolder="ProgramFilesFolder"?>
<?define PlatformSimpleName="32-bit"?>
<?define UpgradeGuid="@DESKFLOW_MSI_32_GUID@"?>
<?endif?>
<?define QtPluginsPath="$(var.QtDir)\plugins"?>
<?define OpenSslExeDir="@OPENSSL_EXE_DIR@"?>
<?define OpenSslDllDir="@OPENSSL_ROOT_DIR@/bin"?>
<?define GuiBin="@GUI_BINARY_NAME@.exe"?>
<?define ServerBin="@SERVER_BINARY_NAME@.exe"?>
<?define ClientBin="@CLIENT_BINARY_NAME@.exe"?>
<?define CoreBin="@CORE_BINARY_NAME@.exe"?>
<?define DaemonBin="@DAEMON_BINARY_NAME@.exe"?>
</Include>

View File

@ -1,31 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29411.108
MinimumVisualStudioVersion = 10.0.40219.1
Project("{930C7802-8A8C-48F9-8165-68863BCCD9DD}") = "Installer", "Installer.wixproj", "{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
Debug|x64 = Debug|x64
Release|x86 = Release|x86
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Debug|x86.ActiveCfg = Debug|x86
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Debug|x86.Build.0 = Debug|x86
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Debug|x64.ActiveCfg = Debug|x64
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Debug|x64.Build.0 = Debug|x64
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Release|x86.ActiveCfg = Release|x86
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Release|x86.Build.0 = Release|x86
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Release|x64.ActiveCfg = Release|x64
{D4BA9F39-6A35-4C8F-9CB2-67FCBE5CAB17}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {2E0AA1C9-0F14-4FE4-8F18-430484EFBACE}
EndGlobalSection
EndGlobal

View File

@ -1,41 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ProductVersion>3.11</ProductVersion>
<ProjectGuid>{d4ba9f39-6a35-4c8f-9cb2-67fcbe5cab17}</ProjectGuid>
<SchemaVersion>2.0</SchemaVersion>
<OutputName>Installer</OutputName>
<OutputType>Package</OutputType>
<OutputPath>bin\$(Configuration)\</OutputPath>
<IntermediateOutputPath>wix\obj\$(Configuration)\</IntermediateOutputPath>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(SolutionDir)/AppWelcome.wxs" />
<Compile Include="$(SolutionDir)/AppInstallDirDlg.wxs" />
<Compile Include="$(SolutionDir)/AppBrowseDlg.wxs" />
<Compile Include="$(SolutionDir)/AppVerifyReadyDlg.wxs" />
<Compile Include="$(SolutionDir)/AppMaintenanceTypeDlg.wxs" />
<Compile Include="$(SolutionDir)/AppDlgSequence.wxs" />
<Compile Include="$(SolutionDir)/Product.wxs" />
<Content Include="$(SolutionDir)/Include.wxi" />
</ItemGroup>
<ItemGroup>
<WixExtension Include="WixUtilExtension">
<HintPath>C:\Program Files (x86)\WiX Toolset v3.11\bin\WixUtilExtension.dll</HintPath>
<Name>WixUtilExtension</Name>
</WixExtension>
<WixExtension Include="WixUIExtension">
<HintPath>C:\Program Files (x86)\WiX Toolset v3.11\bin\WixUIExtension.dll</HintPath>
<Name>WixUIExtension</Name>
</WixExtension>
<WixExtension Include="WixFirewallExtension">
<HintPath>C:\Program Files (x86)\WiX Toolset v3.11\bin\WixFirewallExtension.dll</HintPath>
<Name>WixFirewallExtension</Name>
</WixExtension>
</ItemGroup>
<Import Project="$(WixTargetsPath)" Condition=" '$(WixTargetsPath)' != '' " />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets"
Condition=" '$(WixTargetsPath)' == '' AND Exists('$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets') " />
</Project>

View File

@ -1,166 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:fire="http://schemas.microsoft.com/wix/FirewallExtension" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
<?include Include.wxi?>
<Product Id="*" Language="1033" Manufacturer="$(var.Author)" Name="$(var.Name) ($(var.PlatformSimpleName))" UpgradeCode="$(var.UpgradeGuid)" Version="$(var.Version)">
<Package Compressed="yes" InstallScope="perMachine" InstallerVersion="301"/>
<MajorUpgrade DowngradeErrorMessage="A newer version of $(var.Name) is already installed."/>
<MediaTemplate EmbedCab="yes"/>
<!-- causes ICE61 warning, but stops user from installing many instances from nightly builds. -->
<Upgrade Id="$(var.UpgradeGuid)">
<UpgradeVersion Minimum="0.0.0.0" Property="UPGRADE"/>
</Upgrade>
<Feature Id="ProductFeature" Title="$(var.Name)">
<ComponentGroupRef Id="ProductComponents"/>
<ComponentGroupRef Id="OpenSSLComponents"/>
<ComponentGroupRef Id="ProductQtStylesComponents"/>
<ComponentGroupRef Id="ProductQtPluginComponents"/>
<ComponentRef Id="RegistryEntries"/>
<MergeRef Id="VC_Redist"/>
</Feature>
<DirectoryRef Id="TARGETDIR">
<Component Guid="7CF3564D-1F8E-4D3D-9781-E1EE22D5BD67" Id="RegistryEntries">
<RegistryKey Id="$(var.AppId)_server" ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes" Key="Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" Root="HKLM">
<RegistryValue Name="[INSTALLFOLDER]$(var.ServerBin)" Type="string" Value="~ HIGHDPIAWARE WIN7RTM"/>
</RegistryKey>
<RegistryKey Id="$(var.AppId)_client" Root="HKLM"
Key="Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryValue Type="string" Name="[INSTALLFOLDER]$(var.ClientBin)" Value="~ HIGHDPIAWARE WIN7RTM"/>
</RegistryKey>
<RegistryKey Id="$(var.AppId)" Root="HKLM"
Key="Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers"
ForceCreateOnInstall="yes" ForceDeleteOnUninstall="yes">
<RegistryValue Type="string" Name="[INSTALLFOLDER]$(var.GuiBin)" Value="~ HIGHDPIAWARE WIN7RTM"/>
</RegistryKey>
<!-- Windows 8 and later only -->
<Condition><![CDATA[Installed OR (VersionNT >= 602)]]></Condition>
</Component>
<?if $(var.Platform) = x64 ?>
<Merge Id="VC_Redist" SourceFile="$(var.ProjectResDir)\dist\wix\msm\Microsoft_VC142_CRT_x64.msm" DiskId="1" Language="0"/>
<?else ?>
<Merge Id="VC_Redist" SourceFile="$(var.ProjectResDir)\dist\wix\msm\Microsoft_VC142_CRT_x86.msm" DiskId="1" Language="0"/>
<?endif ?>
</DirectoryRef>
<Property Id="CommonBackground">CommonBackground</Property>
<Binary Id="CommonBackground" SourceFile="$(var.ResDir)\dist\wix\images\common_background.png"/>
<Icon Id="AppIcon" SourceFile="$(var.ResDir)/app.ico"/>
<WixVariable Id="WixUIBannerBmp" Value="$(var.ResDir)\dist\wix\images\banner.png"/>
<WixVariable Id="WixUIDialogBmp" Value="$(var.ResDir)\dist\wix\images\dialog.png"/>
<Property Id="ARPPRODUCTICON" Value="AppIcon"/>
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLFOLDER"/>
<Property Id="LEGACY_UNINSTALL_EXISTS">
<RegistrySearch Id="LegacyRegistrySearch" Key="SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\$(var.Name)" Name="UninstallString" Root="HKLM" Type="file" Win64="no">
<FileSearch Id="LegacyFileSearch" Name="uninstall.exe"/>
</RegistrySearch>
</Property>
<Condition Message="An existing installation of $(var.Name) was detected, please uninstall it before continuing.">NOT LEGACY_UNINSTALL_EXISTS
</Condition>
<CustomAction ExeCommand="" FileKey="GuiProgram" Id="StartGui" Return="asyncNoWait"/>
<UI>
<UIRef Id="AppDlgSequence" />
</UI>
</Product>
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="$(var.ProgramFilesFolder)">
<Directory Id="INSTALLFOLDER" Name="$(var.Name)">
<Directory Id="OpenSSLDir" Name="OpenSSL"/>
<Directory Id="PlatformsDir" Name="Platforms"/>
<Directory Id="QTStylesDir" Name="styles"/>
</Directory>
</Directory>
<Directory Id="ProgramMenuFolder"/>
</Directory>
</Fragment>
<Fragment>
<ComponentGroup Directory="INSTALLFOLDER" Id="ProductComponents">
<Component Guid="EC9AD3B0-277C-4157-B5C8-5FD5B6A5F4AD" Id="Core">
<File KeyPath="yes" Source="$(var.BinDir)/$(var.DaemonBin)"/>
<ServiceInstall Description="Controls the $(var.Name) foreground processes." DisplayName="$(var.Name)" ErrorControl="normal" Id="ServiceInstall" Name="$(var.Name)" Start="auto" Type="ownProcess">
<util:ServiceConfig FirstFailureActionType="restart" ResetPeriodInDays="1" RestartServiceDelayInSeconds="1" SecondFailureActionType="restart" ThirdFailureActionType="restart"/>
</ServiceInstall>
<ServiceControl Id="ServiceControl" Name="$(var.Name)" Remove="uninstall" Start="install" Stop="both"/>
<File Source="$(var.BinDir)/$(var.ServerBin)">
<fire:FirewallException Id="ServerFirewallException" IgnoreFailure="yes" Name="$(var.Name) Server" Scope="any"/>
</File>
<File Source="$(var.BinDir)/$(var.ClientBin)">
<fire:FirewallException Id="ClientFirewallException" IgnoreFailure="yes" Name="$(var.Name) Client" Scope="any"/>
</File>
<?if $(var.Platform) = x64 ?>
<File Source="$(var.OpenSslDllDir)/libssl-3-x64.dll"/>
<File Source="$(var.OpenSslDllDir)/libcrypto-3-x64.dll"/>
<?else ?>
<File Source="$(var.OpenSslDllDir)/libssl-3.dll"/>
<File Source="$(var.OpenSslDllDir)/libcrypto-3.dll"/>
<?endif ?>
</Component>
<Component Guid="BAC8149B-6287-45BF-9C27-43D71ED40214" Id="Gui">
<File Id="GuiProgram" KeyPath="yes" Source="$(var.BinDir)/$(var.GuiBin)">
<Shortcut Advertise="yes" Directory="ProgramMenuFolder" Icon="$(var.GuiBin)" Id="GuiShortcut" Name="$(var.Name)">
<Icon Id="$(var.GuiBin)" SourceFile="$(var.ResDir)/app.ico"/>
</Shortcut>
<fire:FirewallException Id="GuiFirewallException" IgnoreFailure="yes" Name="$(var.Name)" Scope="any"/>
</File>
<?if $(var.Configuration) = "Debug" ?>
<File Source="$(var.BinDir)\Qt6Cored.dll"/>
<File Source="$(var.BinDir)\Qt6Guid.dll"/>
<File Source="$(var.BinDir)\Qt6Networkd.dll"/>
<File Source="$(var.BinDir)\Qt6Svgd.dll"/>
<File Source="$(var.BinDir)\Qt6Widgetsd.dll"/>
<File Source="$(var.BinDir)\styles\qmodernwindowsstyle.dll"/>
<!-- HACK: Normally the C++ redistributable solves this dependency, including it can cause problems -->
<File Source="C:\Program Files (x86)\Windows Kits\10\bin\$(var.Platform)\ucrt\ucrtbased.dll"/>
<?else ?>
<File Source="$(var.BinDir)\brotlicommon.dll"/>
<File Source="$(var.BinDir)\brotlidec.dll"/>
<File Source="$(var.BinDir)\bz2.dll"/>
<File Source="$(var.BinDir)\double-conversion.dll"/>
<File Source="$(var.BinDir)\freetype.dll"/>
<File Source="$(var.BinDir)\harfbuzz.dll"/>
<File Source="$(var.BinDir)\icudt74.dll"/>
<File Source="$(var.BinDir)\icuin74.dll"/>
<File Source="$(var.BinDir)\icuuc74.dll"/>
<File Source="$(var.BinDir)\libpng16.dll"/>
<File Source="$(var.BinDir)\pcre2-16.dll"/>
<File Source="$(var.BinDir)\Qt6Core.dll"/>
<File Source="$(var.BinDir)\Qt6Gui.dll"/>
<File Source="$(var.BinDir)\Qt6Network.dll"/>
<File Source="$(var.BinDir)\Qt6Svg.dll"/>
<File Source="$(var.BinDir)\Qt6Widgets.dll"/>
<File Source="$(var.BinDir)\zlib1.dll"/>
<File Source="$(var.BinDir)\zstd.dll"/>
<File Source="$(var.BinDir)\styles\qmodernwindowsstyle.dll"/>
<?endif ?>
</Component>
</ComponentGroup>
<ComponentGroup Directory="QTStylesDir" Id="ProductQtStylesComponents">
<Component Guid="96E0F8D8-64FD-4CE8-94D1-F6EDCBBB4995" Id="Styles">
<File Id="qmodernwindowsstyle" Source="$(var.BinDir)\styles\qmodernwindowsstyle.dll"/>
</Component>
</ComponentGroup>
<ComponentGroup Directory="PlatformsDir" Id="ProductQtPluginComponents">
<Component Guid="684EFA14-856B-440E-A5E6-E90E04E36B41" Id="QtPlatformPlugin">
<?if $(var.Configuration) = "Debug" ?>
<File Source="$(var.BinDir)\platforms\qwindowsd.dll"/>
<?else ?>
<File Source="$(var.BinDir)\platforms\qwindows.dll"/>
<?endif ?>
</Component>
</ComponentGroup>
<ComponentGroup Directory="OpenSSLDir" Id="OpenSSLComponents">
<Component Guid="92648F77-65A6-4B16-AC59-A1F37BD341B1" Id="OpenSSL">
<?if $(var.Platform) = x64 ?>
<File Id="OpenSSLDll1" Source="$(var.OpenSslDllDir)/libcrypto-3-x64.dll"/>
<File Id="OpenSSLDll2" Source="$(var.OpenSslDllDir)/libssl-3-x64.dll"/>
<?else ?>
<File Id="OpenSSLDll1" Source="$(var.OpenSslDllDir)/libcrypto-3.dll"/>
<File Id="OpenSSLDll2" Source="$(var.OpenSslDllDir)/libssl-3.dll"/>
<?endif ?>
<File Source="$(var.OpenSslExeDir)/openssl.exe"/>
<File Source="$(var.OpenSslExeDir)/openssl.cnf"/>
</Component>
</ComponentGroup>
</Fragment>
</Wix>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,17 +0,0 @@
<RCC>
<qresource>
<file>icons/64x64/video-display.png</file>
<file>icons/64x64/user-trash.png</file>
<file>image/logo-light.png</file>
<file>image/logo-dark.png</file>
<file>icons/64x64/padlock.png</file>
<file>icons/128x128/tray-dark.png</file>
<file>icons/128x128/tray-light.png</file>
<file>icons/128x128/tray.png</file>
<file>image/welcome.png</file>
<file>icons/64x64/folder.png</file>
<file>icons/64x64/copy-light.png</file>
<file>icons/64x64/copy-dark.png</file>
<file>image/placeholder.png</file>
</qresource>
</RCC>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 919 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1 +0,0 @@
IDI_ICON1 ICON DISCARDABLE "../../app.ico"

View File

@ -1,54 +0,0 @@
/*
Based on example from:
https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource?redirectedfrom=MSDN
*/
#include <windows.h>
#include <verrsrc.h>
#define VER_FILEVERSION @DESKFLOW_VERSION_MS_CSV@
#define VER_FILEVERSION_STR "@DESKFLOW_VERSION_MS@\0"
#define VER_PRODUCTVERSION @DESKFLOW_VERSION_MS_CSV@
#define VER_PRODUCTVERSION_STR "@DESKFLOW_VERSION@\0"
#define VER_COMPANYNAME_STR "@DESKFLOW_AUTHOR_NAME@\0"
#define VER_FILEDESCRIPTION_STR "@DESKFLOW_APP_NAME@\0"
#define VER_INTERNALNAME_STR "@DESKFLOW_APP_NAME@\0"
#define VER_LEGALCOPYRIGHT_STR "© 2024 Deskflow Developers\0"
#define VER_LEGALTRADEMARKS1_STR "All Rights Reserved\0"
#define VER_LEGALTRADEMARKS2_STR "\0"
#define VER_ORIGINALFILENAME_STR "\0"
#define VER_PRODUCTNAME_STR "@DESKFLOW_APP_NAME@\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEFLAGS 0 // No flags
FILEOS VOS__WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VFT2_UNKNOWN
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "CompanyName", VER_COMPANYNAME_STR
VALUE "FileDescription", VER_FILEDESCRIPTION_STR
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNALNAME_STR
VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
VALUE "LegalTrademarks1", VER_LEGALTRADEMARKS1_STR
VALUE "LegalTrademarks2", VER_LEGALTRADEMARKS2_STR
VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
VALUE "ProductName", VER_PRODUCTNAME_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END

View File

@ -1,76 +0,0 @@
#!/usr/bin/env python3
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import lib.env as env
env.ensure_in_venv(__file__)
import os, sys, argparse
import lib.windows as windows
import lib.colors as colors
DEFAULT_SERVICE_ID = "deskflow"
DEFAULT_BIN_NAME = "deskflow-daemon"
DEFAULT_SOURCE_DIR = os.path.join("build", "temp", "bin")
DEFAULT_TARGET_DIR = os.path.join("build", "bin")
IGNORE_PROCESSES = ["deskflow.exe"]
def main():
"""Entry point for the script."""
parser = argparse.ArgumentParser()
parser.add_argument("--reinstall", action="store_true")
parser.add_argument("--stop", action="store_true")
parser.add_argument("--restart", action="store_true")
parser.add_argument("--pause-on-exit", action="store_true")
parser.add_argument("--source-dir", default=DEFAULT_SOURCE_DIR)
parser.add_argument("--target-dir", default=DEFAULT_TARGET_DIR)
parser.add_argument("--bin-name", default=DEFAULT_BIN_NAME)
parser.add_argument("--ignore-processes", nargs="+", default=IGNORE_PROCESSES)
parser.add_argument("--service-id", default=DEFAULT_SERVICE_ID)
parser.add_argument("--verbose", action="store_true")
args = parser.parse_args()
if not env.is_windows():
print(
f"{colors.ERROR_TEXT} This script is only supported on Windows",
file=sys.stderr,
)
sys.exit(1)
service = windows.WindowsService(__file__, args)
try:
if args.reinstall:
service.reinstall()
elif args.stop:
service.stop()
elif args.restart:
service.restart()
else:
print("No action specified", file=sys.stderr)
exit(1)
except Exception as e:
print(f"{colors.ERROR_TEXT} {e}", file=sys.stderr)
if args.pause_on_exit:
input("Press enter to continue...")
if __name__ == "__main__":
main()

View File

@ -1,57 +0,0 @@
#!/usr/bin/env python3
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import lib.env as env
env.ensure_in_venv(__file__)
import argparse
import lib.file_utils as file_utils
import lib.colors as colors
def main():
"""
Cross platform script to copy files and directories.
This script was mostly created beause the default `copy` command on Windows is too noisy.
If this becomes complex it must be replaced with a library.
"""
parser = argparse.ArgumentParser()
parser.add_argument("source", help="Source pattern to copy from")
parser.add_argument("target", help="Destination pattern to copy to")
parser.add_argument(
"--ignore-errors", action="store_true", help="Ignore errors when copying"
)
parser.add_argument(
"--verbose", action="store_true", help="Print more information to the console"
)
args = parser.parse_args()
options = file_utils.CopyOptions(args.ignore_errors, args.verbose)
try:
file_utils.copy(args.source, args.target, options)
except Exception as e:
if not args.ignore_errors:
raise e
else:
print(f"{colors.ERROR_TEXT} {e}")
if __name__ == "__main__":
main()

View File

@ -1,55 +0,0 @@
import os, base64
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
temp_path = "tmp/certificate"
class Certificate:
"""
Installs a certificate from a base64 string, and returns the path to the certificate.
Once the context is exited, the certificate is removed from the filesystem.
Example usage:
with Certificate(base64) as cert_path:
print(f"Certificate path: {cert_path}")
"""
def __init__(self, base64, file_ext):
self.base64 = base64
self.temp_filename = f"{temp_path}.{file_ext}"
def __enter__(self):
print(f"Decoding certificate to temporary path: {self.temp_filename}")
try:
cert_bytes = base64.b64decode(self.base64)
except Exception as e:
raise ValueError("Failed to decode certificate base64") from e
os.makedirs(os.path.dirname(self.temp_filename), exist_ok=True)
with open(self.temp_filename, "wb") as cert_file:
cert_file.write(cert_bytes)
return self.temp_filename
def __exit__(self, _exc_type, _exc_value, _traceback):
# not strictly necessary for ci, but when run on a dev machine, it reduces the risk
# that private keys are left on the filesystem
print(f"Removing temporary certificate file: {self.temp_filename}")
os.remove(self.temp_filename)
# propagate exceptions
return False

View File

@ -1,156 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import subprocess
import sys
import lib.env as env
try:
import colorama # type: ignore
from colorama import Fore # type: ignore
colorama.init()
except ImportError:
class Fore:
RESET = ""
YELLOW = ""
def has_command(command):
platform = sys.platform
if platform == "win32":
cmd = f"where {command}"
else:
cmd = f"which {command}"
try:
subprocess.check_output(cmd, shell=True)
return True
except subprocess.CalledProcessError:
return False
def strip_continuation_sequences(command, strip_newlines=True):
"""
Remove the continuation sequences (\\) from a command.
To spread strings over multiple lines in YAML files, like in bash, a backslash is used at
the end of each line as continuation character.
"""
if isinstance(command, list):
raise ValueError("List commands are not supported")
cmd_continuation = " \\"
command = command.replace(cmd_continuation, "")
# Some versions of pyyaml will remove the newlines already, so always stripping
# makes the output more consistent.
if strip_newlines:
command = command.replace("\n", " ")
return command
def run(
command,
check=True, # true by default to fail fast
shell=False, # false by default for security
get_output=False,
print_cmd=False, # false by default for security
):
"""
Convenience wrapper around `subprocess.run` to:
- print the command before running it (if `print_cmd` is True)
This differs to `subprocess.run` in that by default it:
- checks the return code by default
- prints list commands as a readable string on failure
This is the same as `subprocess.run` in that it:
- does not use shell by default for security (shell is less secure)
Args:
command (str or list): The command to run.
check (bool): Raise an exception if the command fails.
shell (bool): Run the command in a shell (false by default for security)
get_output (bool): Return the output of the command.
print_cmd (bool): Print the command before running it (false by default for security)
"""
is_list_cmd = isinstance(command, list)
# create string version of list command, only for debugging purposes
command_str = command
if is_list_cmd:
command_str = " ".join(command)
if print_cmd:
print(f"Running: {command_str}")
else:
print("Running command...")
command_str = "***"
# TODO: You can definitely use a list command with shell=True on Windows,
# but can you use a string command with shell=False on Windows?
#
# The `subprocess.run` function has a little gotcha:
# - a string command must be used when `shell=True`
# - a list command must be used when shell isn't or `shell=False`
# however, it allows you to pass a string command when shell isn't used or `shell=False`
# then fails with a vague error message. same problem with list commands and `shell=True`
if not env.is_windows() and is_list_cmd and shell:
raise ValueError("List commands cannot be used when shell=True on Unix systems")
elif not is_list_cmd and not shell:
raise ValueError("String commands cannot be used when shell=False or not set")
# Flush the output to ensure the command is printed before the output of the command,
# which seems to happen in the GitHub runner logs.
sys.stdout.flush()
sys.stderr.flush()
try:
if get_output:
result = subprocess.run(
command,
shell=shell,
check=check,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True,
)
else:
result = subprocess.run(command, check=check, shell=shell)
except subprocess.CalledProcessError as e:
# Take control of how failed commands are printed:
# - if `print_cmd` is false, it will print `***` instead of the command
# - if the command was a list, the command is printed as a readable string
raise RuntimeError(
f"Command exited with code {e.returncode}: {command_str}"
) from None
except Exception:
# Take control of how failed commands are printed:
# - if `print_cmd` is false, it will print `***` instead of the command
# - if the command was a list, the command is printed as a readable string
raise RuntimeError(f"Command failed: {command_str}")
if result.returncode != 0:
print(
f"{Fore.YELLOW}Command exited with code {result.returncode}:{Fore.RESET} {command_str}",
file=sys.stderr,
)
return result

View File

@ -1,24 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import colorama # type: ignore
from colorama import Fore # type: ignore
colorama.init()
SUCCESS_TEXT = f"{Fore.LIGHTGREEN_EX}Success:{Fore.RESET}"
ERROR_TEXT = f"{Fore.LIGHTRED_EX}Error:{Fore.RESET}"
WARNING_TEXT = f"{Fore.LIGHTYELLOW_EX}Warning:{Fore.RESET}"
HINT_TEXT = f"{Fore.LIGHTBLUE_EX}Hint:{Fore.RESET}"

View File

@ -1,269 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, sys, subprocess
import lib.cmd_utils as cmd_utils
# The `.venv` dir seems to be most common for virtual environments.
VENV_DIR = ".venv"
def check_module(module):
try:
__import__(module)
return True
except ImportError:
print(f"Python is missing {module} module", file=sys.stderr)
return False
def get_os():
"""Detects the operating system."""
if sys.platform == "win32":
return "windows"
elif sys.platform == "darwin":
return "mac"
elif sys.platform.startswith("linux"):
return "linux"
else:
raise RuntimeError(f"Unsupported platform: {sys.platform}")
def is_windows():
return get_os() == "windows"
def is_mac():
return get_os() == "mac"
def is_linux():
return get_os() == "linux"
def get_linux_distro():
"""Detects the Linux distro."""
os_file = "/etc/os-release"
name = None
name_like = None
version_id = None
version_codename = None
if os.path.isfile(os_file):
with open(os_file) as f:
for line in f:
if line.startswith("ID="):
name = line.strip().split("=")[1].strip('"')
elif line.startswith("ID_LIKE="):
name_like = line.strip().split("=")[1].strip('"')
elif line.startswith("VERSION_ID="):
version_id = line.strip().split("=")[1].strip('"')
elif line.startswith("VERSION_CODENAME="):
version_codename = line.strip().split("=")[1].strip('"')
return name, name_like, version_id or version_codename
def get_env(name, required=True, default=None):
"""
Returns an env var (stripped) or optionally raises an error if not set.
If `default` is set, it will be returned even if `required` is True.
"""
value = os.getenv(name)
if value:
value = value.strip()
if not value:
if default:
return default
elif required:
raise ValueError(f"Required env var not set: {name}")
return value
def get_env_bool(name, default=False):
"""Returns a boolean value from an env var (stripped)."""
value = os.getenv(name)
if value:
value = value.strip()
if value is None:
return default
return value.lower() in ["true", "1", "yes"]
def get_venv_executable(binary="python"):
if sys.platform == "win32":
return os.path.join(VENV_DIR, "Scripts", binary)
else:
return os.path.join(VENV_DIR, "bin", binary)
def in_venv():
"""Returns True if the script is running in a Python virtual environment."""
return sys.prefix != sys.base_prefix
def ensure_in_venv(script_file, create_venv=False):
"""
Ensures the script is running in a Python virtual environment (venv).
If the script is not running in a venv, it will create one and re-run the script in the venv.
"""
check_dependencies(raise_error=True)
import venv
if in_venv():
print(f"Running in venv, executable: {sys.executable}", flush=True)
return
if create_venv and not os.path.exists(VENV_DIR):
print(f"Creating virtual environment at {VENV_DIR}")
venv.create(VENV_DIR, with_pip=True)
if os.path.exists(VENV_DIR):
script_file_abs = os.path.abspath(script_file)
print(f"Using virtual environment for: {script_file_abs}", flush=True)
python_executable = get_venv_executable()
result = subprocess.run([python_executable, script_file_abs] + sys.argv[1:])
sys.exit(result.returncode)
else:
print(
"The Python virtual environment (.venv) needs to be created before you can "
"run this script.\n"
"Please run: scripts/setup_venv.py"
)
sys.exit(1)
def install_requirements():
"""
Uses `pip` to install required Python modules from the `requirements.txt` file.
"""
check_dependencies(raise_error=True)
print("Updating pip...")
cmd_utils.run(
[sys.executable, "-m", "pip", "install", "--upgrade", "pip"],
shell=False,
print_cmd=True,
)
print("Installing required modules...")
cmd_utils.run(
[sys.executable, "-m", "pip", "install", "-e", "scripts"],
shell=False,
print_cmd=True,
)
def check_dependencies(raise_error=False):
"""
Returns True if pip and venv are available.
"""
has_pip = check_module("pip")
has_venv = check_module("venv")
if raise_error:
if not has_pip:
raise RuntimeError("Python is missing pip")
if not has_venv:
raise RuntimeError("Python is missing venv")
else:
return has_pip and has_venv
def ensure_dependencies():
"""
Ensures that pip and venv are available, and installs them if they are not.
This is normally only installs on Linux, as Windows and Mac usually come with pip and venv.
"""
if check_dependencies():
return
print("Installing Python dependencies...")
os = get_os()
if os != "linux":
# should not be a problem, since windows and mac come with pip and venv
raise RuntimeError(f"Unable to install Python dependencies on {os}")
has_sudo = cmd_utils.has_command("sudo")
sudo = "sudo" if has_sudo else ""
distro, distro_like, _version = get_linux_distro()
if not distro_like:
distro_like = distro
update_cmd = None
install_cmd = None
if distro == "rhel" or "rhel" in distro_like:
update_cmd = "yum check-update"
install_cmd = "yum install -y python3-pip" # rhel-like has venv already
elif "debian" in distro_like:
update_cmd = "apt update"
install_cmd = "apt install -y python3-pip python3-venv"
elif "fedora" in distro_like:
update_cmd = "dnf check-update"
install_cmd = "dnf install -y python3-pip python3-virtualenv"
elif "arch" in distro_like:
install_cmd = "pacman -Syu --noconfirm python-pip python-virtualenv"
elif "opensuse" in distro_like:
update_cmd = "zypper refresh"
install_cmd = "zypper install -y python3-pip python3-virtualenv"
else:
raise RuntimeError(f"Unable to install Python dependencies on {distro}")
if update_cmd:
# don't check the return code, as some package managers return non-zero exit codes
# under normal circumstances (e.g. dnf check-update returns 100 when there are
# updates available).
cmd_utils.run(
f"{sudo} {update_cmd}".strip(), check=False, shell=True, print_cmd=True
)
cmd_utils.run(f"{sudo} {install_cmd}".strip(), shell=True, print_cmd=True)
def import_colors():
import lib.colors as colors
return colors
def persist_lock_file(path):
"""
Persists a lock file and ensures the directory part of the path exists.
"""
dir_path = os.path.dirname(path)
if not os.path.exists(dir_path):
os.makedirs(dir_path, exist_ok=True)
with open(path, "w") as f:
f.write(str(os.getpid()))
def remove_lock_file(path):
"""
Removes a lock file if it exists.
"""
if os.path.exists(path):
os.remove(path)

View File

@ -1,104 +0,0 @@
# Deskflow -- mouse and keyboard sharing utility
# Copyright (C) 2024 Symless Ltd.
#
# This package is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# found in the file LICENSE that should have accompanied this file.
#
# This package is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import glob, os, shutil, sys
import lib.env as env
import lib.colors as colors
class CopyOptions:
def __init__(self, ignore_errors, verbose):
self.ignore_errors = ignore_errors
self.verbose = verbose
class CopyContext:
def __init__(self):
self.errors = 0
self.permission_error = False
def copy(source, target, options):
"""Copy files and directories from source to target."""
context = CopyContext()
if options.verbose:
print(f"Copying files from {source} to {target}")
try:
for match in glob.glob(source):
if os.path.isfile(match):
copy_file(match, target, options, context)
elif os.path.isdir(match):
copy_dir(match, target, options, context)
else:
raise RuntimeError(f"Path {match} is not a file or directory")
finally:
if context.errors and options.ignore_errors:
print(f"{colors.WARNING_TEXT} Ignored {context.errors} copy error(s)")
if context.permission_error and env.is_windows():
print(
f"{colors.HINT_TEXT} A Windows file permission error may mean that the file is in use"
)
def copy_dir(match, target, options, context):
if options.verbose:
print(f"Copying directory {match} to {target}")
try:
shutil.copytree(match, target, dirs_exist_ok=True)
except Exception as e:
handle_all_copy_errors(e, options, context)
def copy_file(match, target, options, context):
if options.verbose:
print(f"Copying file {match} to {target}")
try:
shutil.copy(match, target)
except Exception as e:
handle_all_copy_errors(e, options, context)
def handle_all_copy_errors(error, options, context):
if isinstance(error, shutil.Error):
for _, _, file_error in error.args[0]:
handle_copy_error(file_error, options, context)
else:
handle_copy_error(error, options, context)
if not options.ignore_errors:
raise error
def handle_copy_error(error, options, context):
if isinstance(error, PermissionError):
context.permission_error = True
if isinstance(error, str):
context.permission_error = error.startswith("[Errno 13] Permission denied")
context.errors += 1
if options.ignore_errors:
print(
f"{colors.WARNING_TEXT} Copy failed: {error}",
file=sys.stderr,
)

Some files were not shown because too many files have changed in this diff Show More