249 Commits

Author SHA1 Message Date
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
a80cea3ca7 Release 1.17.1
Some checks are pending
CI / pr-comment-flags (push) Blocked by required conditions
CI / ci-passed (push) Blocked by required conditions
CI / test-results (push) Blocked by required conditions
CI / lint-clang (push) Waiting to run
CI / analyse-valgrind (push) Blocked by required conditions
CI / analyse-sonarcloud (push) Blocked by required conditions
CI / macos-14-arm64 (push) Blocked by required conditions
CI / macos-13-x64 (push) Blocked by required conditions
CI / archlinux-amd64 (push) Blocked by required conditions
CI / debian-13-amd64 (push) Blocked by required conditions
CI / fedora-40-amd64 (push) Blocked by required conditions
CI / fedora-41-amd64 (push) Blocked by required conditions
CI / opensuse-amd64 (push) Blocked by required conditions
CI / windows-2022-x64 (push) Blocked by required conditions
CI / unix-freebsd (push) Blocked by required conditions
CI / release (push) Blocked by required conditions
CI / winget-publish (push) Blocked by required conditions
2024-11-08 07:05:58 -05:00
9929b09088 refactor: mv src/gui/src/ScreenSetupView => src/gui/src/widgets/ScreenSetupView 2024-11-08 07:05:58 -05:00
226c835ee9 refactor: mv src/gui/src/KeySequenceWidget => src/gui/src/widgets/KeySwquenceWidget 2024-11-08 07:05:58 -05:00
fbda5b4053 refactor: mv src/gui/src/TrashScreenWidget => src/gui/src/widgets/TrashScreenWidget 2024-11-08 07:05:57 -05:00
f31cb26e0b refactor: mv src/lib/gui/widgets => src/gui/src/widgets 2024-11-08 07:05:57 -05:00
1bbc581037 refactor: mv src/gui/src/ServerConfigDialog => src/gui/src/dialogs/ServerConfigDialog 2024-11-08 07:05:57 -05:00
ce45d74806 refactor: mv src/gui/src/ScreenSettingsDialog => src/gui/src/dialogs/ScreenSettingsDialog 2024-11-08 07:05:57 -05:00
916f1e6144 refactor: mv src/gui/src/HotkeyDialog => src/gui/src/dialogs/HotkeyDialog 2024-11-08 07:05:57 -05:00
4f4261a237 refactor: mv src/gui/src/AddClientDialog => src/gui/src/dialog/AddClientDialog 2024-11-08 07:05:57 -05:00
e06741e62e refactor: mv src/gui/src/ActionDialog => src/gui/src/dialogs/ActionDialog 2024-11-08 07:05:57 -05:00
585a895b4a refactor: Settings Dialog rm ui as base class 2024-11-08 07:05:56 -05:00
dc5c2b9422 refactor: mv src/lib/gui/dialogs/SettingsDialog => src/gui/src/dialogs/SettingsDialpg 2024-11-08 07:05:54 -05:00
3822336db2 ci: release on master or tags/v 2024-11-08 10:02:21 +00:00
5ca9afc3f7 ci: get-version strip refs/tags/v from DESKFLOW_PACKAGE_VERSION" 2024-11-08 10:02:21 +00:00
8273c0e70b chore: Replace screen leave/enter asserts with warnings 2024-11-06 20:55:59 -05:00
fa9b2d91d5 ci: release a file with packages sums 'sums.txt' with releases 2024-11-06 15:41:37 -05:00
170b4251f3 build: align window mac names with community norms 2024-11-06 12:45:28 -05:00
ddf6450486 build: use PACKAGE_VERSION_LABEL to set generated package's name
If unset use CPACK_PACKAGE_VERSION when set only replaces the version in the package's filename
2024-11-06 11:49:31 -05:00
4a769e6a7f ci: get-version action new DESKFLOW_PACKAGE_VERSION returns "continuous" when not a v* tag otherwise the tag
DESKFLOW_VERSION is the version described by git
2024-11-06 11:32:50 -05:00
07fb3a9a7a chore: add homebrew tap info to readme 2024-11-06 14:51:46 +00:00
155e4d6b32 refactor: ui less aboutDialog 2024-11-06 14:50:39 +00:00
f87b4bc0c2 refactor: mv AboutDialog to gui/src/dialogs/ 2024-11-06 14:50:39 +00:00
f66a0219f6 fix: isDarkMode Check
while newer Qt does provide a method to check if dark mode
  Its not always correct the old method is
  Anytime the text is lighter then the window its dark mode.
2024-11-06 14:50:39 +00:00
3a53149a48 docs: contributors on readme 2024-11-06 14:11:15 +00:00
45f328cd80 fix: crash on --help arg 2024-11-05 13:26:00 -05:00
1e3d332002 chore: add project version for windows rc 2024-11-05 13:17:08 -05:00
3359a2a9d9 build: add deskflow devs to binary copyright 2024-11-05 13:17:08 -05:00
e369af9d74 chore: remove scripts/lib/github.py file 2024-11-05 14:33:23 +00:00
afab39e7f8 chore: remove unused scripts/tests.py 2024-11-05 14:33:23 +00:00
e33405bef8 chore: remove unused package parts, do not allow package via python on linux 2024-11-05 14:33:23 +00:00
9875bc6613 chore: Remove unused install deps scripts and related parts 2024-11-05 14:33:23 +00:00
16a1ba8f45 ci: adjust pacakge script to use the names we would like when in cpack 2024-11-01 12:02:00 +00:00
37889e5659 ci: git-version-action: Always report described version 2024-11-01 11:52:45 +00:00
1835a2cab6 ci: use pre-release for continuous to stop it from grabbing latest tag also 2024-11-01 10:16:24 +00:00
8c314ad82c ci: Use GITHUB_TOKEN in place of PAT 2024-10-31 12:39:39 +00:00
da64ca577c docs: Improve error messages around Doxygen 2024-10-31 12:38:44 +00:00
232e8fafee doc: correct target for documents 2024-10-31 11:57:16 +00:00
fb686ede21 refactor: remove desktop legacy 2024-10-30 20:04:55 +00:00
ce784ab383 refactor: CoreTool use arch classes directly 2024-10-30 20:04:55 +00:00
946a2b778e refactor: rm unused coreTool include in tlscert.h 2024-10-30 20:04:55 +00:00
45bde73810 chore: settingsDialog rm unused CoreTool include 2024-10-30 17:41:17 +00:00
8b62f5b083 docs: cmake to generate doxygen 2024-10-30 16:50:12 +00:00
f74cce32a4 doc: New document mainpage 2024-10-30 16:50:12 +00:00
170d6f4889 docs: Add new doc/configuration.md 2024-10-30 16:50:12 +00:00
48a8111fc5 docs: Remove BUILD.md 2024-10-30 16:50:12 +00:00
656601f2ba docs: rm CONTRIBUTING.md 2024-10-30 16:50:12 +00:00
1880a157b6 ci: added updated winget package submission 2024-10-30 13:28:38 +00:00
3cb1980af3 docs: Fixed sponsor link 2024-10-29 14:27:39 +00:00
c24444c77e docs: Update README.md to restore sponsor link 2024-10-29 12:56:45 +00:00
675e10d7b1 docs: readme add mac os xattr note
add a tip for mac users to run xattr -c on the app post download
2024-10-28 12:22:41 +00:00
915760b899 chore: add link to wayland discussion
added an additional link to the linux wayland question pointing to the discussion
2024-10-28 11:56:08 +00:00
077412f7ec build: update package names for linux to be more unified
We are not making offical packages
    we should not set a rpm or debian revision
    we should do not have to use 'correct' names for deb / rpm
2024-10-25 20:29:05 +01:00
968037b85b build(cmd/deskflow-core):Explicit Sources 2024-10-24 15:11:03 -04:00
08d3347740 build(cmd/deskflow-legacy): Explicit Sources 2024-10-24 15:11:03 -04:00
ad6551262c build(cmd/deskflows): Explicit Sources 2024-10-24 15:11:03 -04:00
337d236f54 build(cmd/deskflowd): Explicit Sources 2024-10-24 15:11:03 -04:00
04d6895990 build(cmd/deskflowc): Explicit Sources 2024-10-24 15:11:03 -04:00
1b13c843aa build(lib/server): Explict Sources 2024-10-24 15:11:03 -04:00
9e2880f714 build(lib/platform): Explicit Sources 2024-10-24 15:11:03 -04:00
e8010eea60 build(lib/net): Explicit sources 2024-10-24 15:11:03 -04:00
75c0b53113 build(lib/mt): Explicit Sources 2024-10-24 15:11:03 -04:00
bf96a641bf build(lib/ipc): Explicit Sources 2024-10-24 15:11:03 -04:00
7db781b9bf build(lib/io): Explicit Sources 2024-10-24 15:11:03 -04:00
8bfe0c18bc build(lib/app): Explicit Sources 2024-10-24 15:11:03 -04:00
10f7b05a73 build(lib/client): Explicit Sources 2024-10-24 15:11:03 -04:00
ba97d63403 build(lib/base): Explicit Sources 2024-10-24 15:11:03 -04:00
da4b85b3fb build(lib/arch): Explicit Sources 2024-10-24 15:11:03 -04:00
5657152c58 chore(gui): Add _what's this_ for Windows service setting 2024-10-24 14:29:13 +01:00
9b4635b6d2 docs: Remote build containers badge
The build containers badge now points at a nonexistent workflow.
2024-10-23 15:24:01 -04:00
1aa6e8c6bb ci: add fedora-41 2024-10-23 14:13:37 +01:00
6846a97eec ci: Drop Docker container builds (not enough time saved)
Add user 'build' for arch to make a package
2024-10-23 14:13:37 +01:00
f26581f20a build: remove python dependency for non windows 2024-10-23 14:13:37 +01:00
01565ba9a9 ci: make sure git is installed before calling fancy-checkout
When we want to use the base runners they do not have git
   Install devscripts for debian images that will make packages
2024-10-23 14:13:37 +01:00
32b84f0a4b docs: Remove confusing reference in readme 2024-10-23 08:30:36 -04:00
d5a8dd7927 ci: remove unused libportal check from Librarires.cmake 2024-10-23 13:15:03 +01:00
dfbd612e2f doc: clean up readme 2024-10-22 20:13:17 +01:00
a406b51f96 ci: one matrix to run them all 2024-10-22 12:29:17 -04:00
b2532c81b9 ci: Add install-dependencies action 2024-10-22 12:29:17 -04:00
a362174e73 ci: only do release job when run on master 2024-10-22 09:42:32 -04:00
7b7ff81a9f build: Require libei and libportal from the system on linux
Removing remaining meson parts
2024-10-22 09:42:32 -04:00
2136af68b5 build(win32): resolve #7763 working windows installer
use correct QT_PATH
  Force install of depends
2024-10-22 10:53:51 +01:00
df91d845f7 build(win32): Link wintoast correctly 2024-10-22 10:53:51 +01:00
f967b9ed46 ci: use fancy checkout action 2024-10-21 15:24:06 -04:00
5d183c98e9 ci: Bump containers for analyze workflows 2024-10-21 14:15:05 -04:00
f3657edc80 refactor: use Q_EMIT 2024-10-21 14:30:02 +01:00
2a8a43a689 refactor: remove unused strings 2024-10-21 14:30:02 +01:00
498e3aa015 refactor: use static regularexpressions and matches 2024-10-21 14:30:02 +01:00
58323f515f refactor: use multi arg were possible 2024-10-21 14:30:02 +01:00
560345cf4f refactor: add context object for lambdas 2024-10-21 14:30:02 +01:00
90d27a174d refactor: do not include full modules in qt files 2024-10-21 14:30:02 +01:00
8b54b84880 refactor: use const for ranged loops 2024-10-21 14:30:02 +01:00
45050d3d36 refactor: use modern range for loops in place of old foreach macro 2024-10-21 14:30:02 +01:00
f0a946a0f1 refactor(SettingsWizard): Ui Less 2024-10-20 21:55:44 +01:00
db6b6b9386 refactor(SetupWizard): Foward declare appconfig 2024-10-20 21:55:44 +01:00
b10eb3baa8 refactor(SetupWizard): Do not use auto connect name for slot 2024-10-20 21:55:44 +01:00
9ea143c1df ci: unify cmake config command into a base env.CMAKE_CONFIGURE 2024-10-20 21:46:36 +01:00
a6b5879df3 ci: new mac os ci 2024-10-20 21:46:36 +01:00
1b904e7c02 ci: Normalize CI step names, descriptions, etc
Also:
- Surfaced the comment about the Kitware repo so it's more visible
- Remove the hard-coded CMake version in comment which is likely to get out of sync and confuse someone
2024-10-20 02:01:58 +01:00
f7ca548ee2 build: remove stale meson parts for wintoast 2024-10-19 20:53:10 -04:00
7c74b90620 fix scan alert #559 2024-10-19 19:49:21 -04:00
46915bff94 fix:#7760 use a proper fedora package name 2024-10-19 19:34:37 -04:00
949e1c0d71 build: Use Fetch Content for Gtest
Use Fetch Content to get gtest and gmock
2024-10-19 19:17:19 -04:00
b1fa9eadd9 build: arch package requires tomlplusplus and cli11 2024-10-19 19:00:21 -04:00
a786cdf972 chore: Set default server protocol to "Barrier" (determined by community vote)
Vote: https://github.com/deskflow/deskflow/discussions/7742
2024-10-19 23:46:42 +01:00
a5cd0fab9e feat: Option to change server protocol in GUI 2024-10-19 23:46:42 +01:00
512faeea28 test: Modularize hello back logic and add tests 2024-10-19 23:46:42 +01:00
47366f1272 feat: Dynamic client Barrier/Synergy hello back response to server 2024-10-19 23:46:42 +01:00
199f682e27 refactor: setupwizard ui is not longer the base of the class 2024-10-19 23:18:26 +01:00
afff2eb6ac refactor: serverconfigdialog ui is no longer base for the class 2024-10-19 23:18:26 +01:00
9167bf04f6 refactor: hotkeydialog ui no longer base of the class 2024-10-19 23:18:26 +01:00
0298a132c1 refactor: addclientdialog ui no longer base for the class 2024-10-19 23:18:26 +01:00
7b3d8c3dc3 refactor: actiondialog to not have ui as base of the class 2024-10-19 23:18:26 +01:00
06aa41e8f5 refactor: mainwindow ui not the base of the class 2024-10-19 23:18:26 +01:00
bf4a762124 build: use vcpkg for all depends, vcpkg action on ci to cache 2024-10-19 03:07:13 -04:00
7199e5f170 docs: Checkbox for continuous build on bug template 2024-10-18 19:09:07 -04:00
3d2883ad02 fix: remove server config dialog custom show event
Fixes Crash with Qt 6.8
2024-10-18 18:19:16 -04:00
6395630964 ci: Make integtests optional on FreeBSD and reduce CMake arg dupe
- Integration tests are flakey by nature, make them optional.
- This also includes a mini refactor of `ci.yml` to reduce some duplication.
2024-10-18 21:11:56 +01:00
a32463586c ci: Catch std::exception on toml::parse_file 2024-10-18 21:01:39 +01:00
9c9feba565 build: use File to dl toml++ if not on system 2024-10-18 15:02:34 -04:00
37fcec2554 build: arch package won't install /bin 2024-10-18 14:50:28 -04:00
246f5d59ab ci: remove unused cache step 2024-10-18 13:57:11 -04:00
710c1dd353 build: get CLI11 via file download if not on system 2024-10-18 13:34:10 -04:00
add8d5370a ci: Remove CMake presets 2024-10-18 18:23:26 +01:00
33b14ccc5c ci: cache vcpkg
Fixes:7712
2024-10-18 17:29:54 +01:00
ba5eaa4c90 build: Require cmake 3.24
Fixes:#7739
2024-10-18 15:22:35 +01:00
4ce81b59fb ci: Use cmake instead of make directly for Arch package 2024-10-18 12:19:37 +01:00
71e74735c0 build: update required ssl to 3.0+ 2024-10-18 06:49:02 +01:00
99251ad867 chore: Update feature request template
For a feature request we only want to know about the proposed feature
2024-10-17 21:39:48 +01:00
9b9ecb0d05 chore: Adjust Clang-format linter rules
120 Column Lines
 Block Indent for Bracket Align
 Custom Line Break Rules
 No Single Line Functions
2024-10-17 21:38:29 +01:00
3f2bb2531a fix: Let users select version number and build in About Dialog
Fixes: #7722
2024-10-17 19:51:00 +01:00
01d67e4614 chore: resolve cmake cap nits
Fixes: #7727
2024-10-17 13:37:50 +01:00
219958898e chore: Replace assert with warning for screen boundary issue 2024-10-17 11:17:05 +01:00
ae3bcfc809 build: Fixed deskflow-server binary name for VS Code users 2024-10-17 11:16:40 +01:00
dc9a5c0f12 build: Add gtest-args for VS Code users 2024-10-17 11:16:40 +01:00
1dc449fe0a fix: Use OPENSSL_EXE_DIR instead of OPENSSL_ROOT_DIR on Windows 2024-10-16 20:17:53 -04:00
52f616a15d ci: vcpkg cache working 2024-10-16 20:58:42 +01:00
da6b3942ae build: Linux packages with proper names 2024-10-16 16:51:24 +01:00
9a5c1a3212 chore: Remove Wayland experimental pop 2024-10-16 14:00:10 +01:00
8424ffa438 ci: Ignore .editorconfig in workflows 2024-10-15 23:08:28 +01:00
e2a0a97705 docs: Add .editorconfig file 2024-10-15 23:08:28 +01:00
78d086369b ci: Always run PR comments job 2024-10-15 22:49:35 +01:00
5f78d175c9 ci: Ignore paths for CodeQL Analysis 2024-10-15 22:19:02 +01:00
2b930a7b03 ci: Remove cmake-format linter 2024-10-15 22:03:15 +01:00
28c8aae9af ci: More consistent code style in ci.yml 2024-10-15 19:14:06 +01:00
3cc43bf1ce docs: Add other build type to bug report template 2024-10-15 18:44:34 +01:00
c78dccca71 Force LF in gitattributes 2024-10-15 18:02:20 +01:00
0a6f79fb31 build: Arch package needs pubixml 2024-10-15 17:16:29 +01:00
5925d42dbd build: allow PKGBUILD to build for more then just x86 2024-10-15 17:16:29 +01:00
6af331bd93 ci: clearer and cleaner steps 2024-10-15 14:17:33 +01:00
87b4e3b7fe fix: Check for errors before reading version string 2024-10-15 07:57:53 -04:00
23c4cadf17 build: set project description 2024-10-15 09:27:00 +01:00
6dcfcd50a2 ci: Add src/gui to coverage exclusions 2024-10-15 07:23:38 +01:00
f70528d082 build: Clean up warning for new QCheckBox signals With 6.7+ 2024-10-15 07:23:38 +01:00
f2f75ae7b9 ci: Fixed error count logic for test summary 2024-10-14 18:06:36 +01:00
572cc80577 ci: Restore pull_request trigger for codeql-analysis.yml 2024-10-14 18:00:17 +01:00
636e3eab96 feat: Respect XDG_CONFIG_HOME in server/client 2024-10-14 17:43:30 +01:00
9c4f6e6d0b chore: Change TLS dir to same as Qt config 2024-10-14 17:43:30 +01:00
3525b8a686 docs: Fixed minor typos in the bug report template 2024-10-14 17:06:24 +01:00
9b7cd1e250 docs: Add leading edge philosophy to README.md
I think it's important to help people understand the difference between Deskflow and Input Leap. e.g. We don't support Qt5, but IL seem to want to support Qt5.
2024-10-14 16:52:21 +01:00
26926a4a6a ci: run on tags v* and not on cron or dispatch 2024-10-14 09:22:28 -04:00
3991fc0d25 ci: use git version for packages 2024-10-14 09:22:28 -04:00
5cff026d7e build: get verson from git 2024-10-14 09:22:28 -04:00
e4b348c183 ci: make sure checkouts fetch tags 2024-10-14 09:22:28 -04:00
24db09b023 fix: align --display explanation in help message
Broken "." position was fixed like this.

Before:

        --display <display>  when in X mode, connect to the X server
                               at <display>
  .      --no-xinitthreads    do not call XInitThreads()

After:

        --display <display>  when in X mode, connect to the X server
                               at <display>.
        --no-xinitthreads    do not call XInitThreads()

Signed-off-by: Kentaro Hayashi <kenhys@xdump.org>
2024-10-14 13:11:30 +01:00
181c34e662 ci: attempt releases 2024-10-13 17:51:18 -04:00
ccfff7015a ci: working vcpkg cache 2024-10-13 16:15:33 -04:00
6b641a432a ci: Remove dead test-dist-upload.yml file 2024-10-13 15:42:23 -04:00
10873eddcd ci: lint-clang as composite action 2024-10-13 20:13:04 +01:00
5b76982093 ci: lint-cmake as composite action 2024-10-13 20:13:04 +01:00
c498e148b8 ci: do not auto create version tags on push to master 2024-10-13 20:13:04 +01:00
abe8146631 ci: Run CI when landing to master branch
No longer run sonar or codeQL on push to master
    They are auto run by the CI job

s
2024-10-13 20:13:04 +01:00
c630ad0952 test: Coverage for AboutDialog.cpp 2024-10-13 19:52:09 +01:00
ce35234f18 chore: Add issue not about mac os signing 2024-10-13 14:02:34 -04:00
c5247a15c7 chore: add note about known wayland issues in bug_template 2024-10-13 14:01:05 -04:00
c03e3f56a7 chore: update mono tray icons 2024-10-13 13:54:15 -04:00
821a9599ba chore: keep only a single copy of the windows icon 2024-10-13 13:54:15 -04:00
0361f850eb chore: remove unused warning icon 2024-10-13 13:54:15 -04:00
c66d7a6942 chore: Update tray icon 2024-10-13 13:54:15 -04:00
8340f106e7 chore: Update Padlock icon 2024-10-13 13:54:15 -04:00
b3775eb6fd chore: add basic .gitattributes
Don't add the items below to "Source" exports
     .github*
     .gitattributes
     .gitignore
2024-10-13 13:39:59 -04:00
e940b8526b chore: add more user files to gitignore
Add Spdx License info
  Add Cmake user files to gitignore
2024-10-13 13:37:06 -04:00
9604a9e747 ci: test results skipped if dependant skipped 2024-10-13 11:49:56 -04:00
fe67b92cdc build: Drop warnings_as_errors
This should not be used

It results in build failures when using different environments/toolchains that produce new warnings

This can especially happen on compiler or dependency updates
2024-10-12 22:13:50 -04:00
4500e7a1aa build: use @only to configure config.h 2024-10-12 21:06:55 -04:00
78a8bba7a4 refactor: move res/config.h.in -> src/lib/config.h.in 2024-10-12 21:06:55 -04:00
14dfcb672d ci: Allow ci to skip running if only specific files are changed 2024-10-12 20:37:17 -04:00
6c3b2b3e6b ci: Linting must pass before other jobs are run 2024-10-12 20:37:17 -04:00
f6b9a5f204 build: Don't force CMAKE_INSTALL_PREFIX
This should only ever be set from the outside, not the project itself

Distribution build systems will set it to the right value

This breaks installing it to a custom if desired
2024-10-12 12:59:04 -04:00
38631193b5 feat: Use native style on KDE Plasma
On Plasma it is preferred to use the default Breeze style instead of Fusion

Breeze also has dark mode support out of the box, so no need to work around that
2024-10-12 12:31:37 -04:00
c959e641cb fix: Set correct QGuiApplication::desktopFileName
The implicity default doesn't match the actual name of the desktop file.

This fixes e.g. the application icon on Wayland
2024-10-12 12:08:16 -04:00
02c5418b9e build(cmake): Require SSL 1.1.1 or higher
Link using OpenSSL provided alises
  Remove Windows specifc check ssl macro for simpler check
2024-10-12 14:23:56 +01:00
eedb3ad1c3 chore: rm unused string_utils file 2024-10-11 17:10:50 +01:00
159f49c5ee chore: use modern connections 2024-10-11 16:56:46 +01:00
80503cd2c6 docs: Add discussion value to project values in README.md 2024-10-11 08:50:24 -04:00
132e1975d3 ci: Remove cache of Python .venv as it added complexity 2024-10-11 13:24:08 +01:00
932ca44d75 build: use pragma once not ifndef def pattern for headers 2024-10-08 06:52:41 -04:00
e3ed711b98 docs: Make README.md more relevant to current repo state 2024-10-03 13:38:45 +01:00
32d36ab0be build: Bump version to 1.18.0 2024-10-02 16:13:19 +01:00
0c28a38d90 docs: Update README.md with Matrix link 2024-10-02 09:37:30 -04:00
049e34f7a5 chore: Remove word 'beta' from Wayland message 2024-10-02 09:17:57 -04:00
833 changed files with 20075 additions and 23711 deletions

View File

@ -13,16 +13,40 @@ BasedOnStyle: LLVM
# Turn off LLVM default alignment of params with the opening bracket,
# which can be less readable in some cases in our code base.
#
# Using `AlwaysBreak` will result in:
# Using `BlockIndent` will result in:
# void fooBarBazQuxHelloWorld(
# int a,
# int b);
# int b
# );
#
# Instead of:
# void fooBarBazQuxHelloWorld(int a,
# int b);
AlignAfterOpenBracket: AlwaysBreak
AlignAfterOpenBracket: BlockIndent
# Turn off LLVM default packing of ctor initializers.
# This makes it easier to see which members were initialized and in what order.
PackConstructorInitializers: CurrentLine
# up our limit to 120
ColumnLimit: 120
# Custom Breaking rules
BreakBeforeBraces: Custom
BraceWrapping:
AfterCaseLabel: false
AfterClass: true
AfterControlStatement: Never
AfterEnum: true
AfterFunction: true
AfterNamespace: false
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: false
BeforeElse: false
BeforeLambdaBody: false
BeforeWhile: false
# no single line functions
AllowShortFunctionsOnASingleLine: None

9
.editorconfig Normal file
View File

@ -0,0 +1,9 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
[{*.yml,*.yaml,*.json,CMakeLists.txt,*.cmake}]
indent_style = space
indent_size = 2

View File

@ -1,65 +0,0 @@
#
# Usage: Copy this .env.example file to .env
#
#
# App
#
# Shows the test menu in the GUI (on by default in debug mode)
# DESKFLOW_TEST_MENU=true
# Version checker URL to use (useful for testing)
# DESKFLOW_VERSION_URL="https://api.deskflow.org/version?fake=1.100.0"
# Enable debug logging in the GUI (on by default in debug mode)
# DESKFLOW_GUI_DEBUG=true
# Enable verbose logging in the GUI (always off by default)
# DESKFLOW_GUI_VERBOSE=true
# Reset all settings and delete all data on startup
# DESKFLOW_RESET_ALL=true
#
# Build
#
# [Windows] The version of Qt to build against (overrides the value in the config.yml file)
# QT_VERSION=1.2.3
#
# Packaging (optional)
#
# [Linux] Build extra packages (self-extracting tar.gz and tar.gz)
# LINUX_EXTRA_PACKAGES=true
# [Linux] Run the package command as a different user (requires sudo)
# LINUX_PACKAGE_USER=build
# [Windows] Base64 encoded PFX code signing certificate
# WINDOWS_PFX_CERTIFICATE="very-long-base64-encoded-string"
# [Windows] Password for the PFX code signing certificate
# WINDOWS_PFX_PASSWORD="super-secret-password"
# [macOS] Certificate ID for the Developer ID Application code signing certificate
# APPLE_CODESIGN_ID="Developer ID Application: Acme Inc (ABC123XYZ9)"
# [macOS] Base64 encoded P12 code signing certificate
# APPLE_P12_CERTIFICATE="very-long-base64-encoded-string"
# [macOS] Password for the P12 code signing certificate
# APPLE_P12_PASSWORD="super-secret-password"
# [macOS] Apple Team ID
# https://developer.apple.com/account/#/membership
# APPLE_TEAM_ID="ABC123XYZ9"
# [macOS] Apple ID used to notarize the app
# APPLE_NOTARY_USER="example@example.com"
# [macOS] App-specific password for the Apple ID
# https://support.apple.com/en-gb/102654
# APPLE_NOTARY_PASSWORD="super-secret-password"

9
.gitattributes vendored Normal file
View File

@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
#auto handle line feed
* text=auto eol=lf
.gitattributes export-ignore
.gitignore export-ignore
.github* export-ignore

View File

@ -27,7 +27,7 @@ body:
attributes:
label: Deskflow version number
description: You can find the Deskflow version number on the about screen.
placeholder: 1.2.3
placeholder: 1.2.3.4
validations:
required: true
@ -39,9 +39,10 @@ body:
options:
# Empty option to force selection
-
- Local developer build (built it yourself)
- Deskflow package (downloaded from Deskflow)
- Community package (apt, dnf, brew, etc.)
- Deskflow package (downloaded from us)
- Local developer build (built it myself)
- Other (please specify)
default: 0
validations:
required: true
@ -54,12 +55,40 @@ body:
options:
- label: Windows
- label: macOS
- label: Linux
- label: Linux (X11)
- label: Linux (Wayland)
- label: BSD-derived
- label: Other
- label: Other (please specify)
validations:
required: true
- type: checkboxes
id: linux-wayland
attributes:
label: Wayland on Linux
description: If using Wayland on Linux, please review the [known issues](https://github.com/deskflow/deskflow/discussions/7499) before reporting.
options:
- label: I have reviewed the Wayland [known issues](https://github.com/deskflow/deskflow/discussions/7499) and my issue is new
- label: I am not using Wayland on Linux
- type: checkboxes
id: mac-signing
attributes:
label: Signing on macOS
description: If using macOS and the app crashes, try [Apple's solution](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unknown-developer-mh40616/mac) before reporting.
options:
- label: I have authorized the app to run on my Mac
- label: I am not using macOS
- type: checkboxes
id: continuous-build
attributes:
label: Continuous build
description: Please try the latest [continuous build](https://github.com/deskflow/deskflow/releases) of Deskflow. It may have a fix for your issue.
options:
- label: I have tried the latest continuous build and the issue persists
- label: I am unable to try the latest continuous build
- type: textarea
id: os-version
attributes:
@ -87,8 +116,6 @@ body:
- Windows 11 server, macOS 15 client
- Each computer has a single monitor
- Windows is on the left, macOS is on the right
validations:
required: true
- type: textarea
id: repro-steps
@ -102,8 +129,6 @@ body:
1. Start Deskflow
2. Click 'Configure Server'
3. Click 'Apply'
validations:
required: true
- type: textarea
id: logs

View File

@ -6,85 +6,11 @@ body:
attributes:
value: Thanks for taking the time to help us improve Deskflow.
- type: dropdown
id: project
attributes:
label: Project
description: Are you using Deskflow or a fork/derivative?
options:
# Empty option to force selection
-
- Deskflow
- Barrier
- Input Leap
- Synergy
default: 0
validations:
required: true
- type: checkboxes
id: os
attributes:
label: Operating systems (OS)
description: Which operating systems (OS) are you using?
options:
- label: Windows
- label: macOS
- label: Linux
- label: BSD-derived
- label: Other
validations:
required: true
- type: textarea
id: os-version
id: request
attributes:
label: OS versions/distros
label: Feature Request
description: |
Please provide the version number of your operating system (OS).
If you're using Linux, please provide the name of the distribution.
placeholder: |
- Windows 11
- macOS 15
- Ubuntu 24.04
- FreeBSD 14.0
validations:
required: true
- type: textarea
id: config
attributes:
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.
placeholder: |
- Windows 11 server, macOS 15 client
- Each computer has a single monitor
- Windows is on the left, macOS is on the right
validations:
required: true
- type: textarea
id: problem
attributes:
label: What problem are you trying to solve?
description: |
The most important part of problem solving is understanding the problem.
The more detail you provide, the better we can understand your idea.
“If I had only one hour to save the world,
I would spend fifty-five minutes defining the problem,
and only five minutes finding the solution.”
— Albert Einstein
validations:
required: true
- type: textarea
id: solution
attributes:
label: What solution do you propose?
description: |
Please describe the solution you have in mind.
Please describe the feature you have in mind.
validations:
required: true

View File

@ -0,0 +1,34 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
name: "Add Kitware repo"
description: "Add Kitware repo for Debian-like distros"
inputs:
distro:
description: "Ubuntu codename, Kitware uses: noble, jammy, focal"
required: true
runs:
using: "composite"
steps:
# This mirrors instructions at https://apt.kitware.com
- name: Add repo
run: |
apt update -y -qqq
apt install ca-certificates gpg wget -y -qqq
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null \
| gpg --dearmor - \
> /usr/share/keyrings/kitware-archive-keyring.gpg
echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ ${{ inputs.distro }} main' \
> /etc/apt/sources.list.d/kitware.list
apt update -y -qqq
env:
# Prevent apt prompting for input.
DEBIAN_FRONTEND: noninteractive
shell: bash

View File

@ -6,10 +6,10 @@ runs:
steps:
- run: |
if [[ "${{ github.ref }}" == refs/tags/* ]]; then
echo "DESKFLOW_VERSION=${{ github.ref_name }}" >> $GITHUB_ENV
fi
if [[ "${{ github.event.inputs.version }}" != "" ]]; then
echo "DESKFLOW_VERSION=${{ github.event.inputs.version }}" >> $GITHUB_ENV
echo "DESKFLOW_VERSION=$(git describe --long | sed 's/-/./g;s/v//g' | grep -o '^[0-9]*.[0-9]*.[0-9]*.[0-9]*')">> $GITHUB_ENV
if [[ "$GITHUB_REF" == *"tags/v"* ]]; then
echo "DESKFLOW_PACKAGE_VERSION=$(echo $GITHUB_REF | sed 's,refs/tags/v,,g')">> $GITHUB_ENV
else
echo "DESKFLOW_PACKAGE_VERSION=continuous">> $GITHUB_ENV
fi
shell: bash

View File

@ -1,50 +1,23 @@
# 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 and caches a Python virtual environment"
inputs:
cache:
description: "Cache Python venv"
default: true
setup:
description: "Setup Python venv"
default: true
python-bin:
description: "Python binary to use"
default: "python3"
cache-key:
description: "Cache key (note: hash is appended)"
required: true
description: "Creates a Python virtual environment (venv)"
runs:
using: "composite"
steps:
- name: Check cache key
if: ${{ inputs.cache }}
run: |
if [ -z "${{ inputs.cache-key }}" ]; then
echo "Cache key is required"
exit 1
fi
shell: bash
- name: Cache Python venv
if: ${{ inputs.cache }}
uses: actions/cache@v4
with:
path: .venv
key: python-venv-${{ inputs.cache-key }}-${{ hashFiles('scripts/pyproject.toml') }}
# Use bash if to make output clearer in case of skipping.
- name: Setup Python venv
run: |
if [ "${{ inputs.setup }}" = "true" ]; then
echo "Setting up Python venv"
${{ inputs.python-bin }} -m venv .venv
if [ "${{ runner.os }}" == "Windows" ]; then
python=python
else
echo "Skipping Python venv setup"
python=python3
fi
echo "Setting up Python venv, bin=$python"
$python -m venv .venv
shell: bash

View File

@ -0,0 +1,100 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
name: "Install dependencies for deskflow"
description: "Install the dependencies needed to build deskflow"
inputs:
like:
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"
required: false
outputs:
vcpkg-cmake-config:
description: "windows vcpkg output for cmaket"
value: ${{ steps.vcpkg.outputs.vcpkg-cmake-config }}
runs:
using: "composite"
steps:
- name: Install Depends
run: |
if [ "$RUNNER_OS" == "Windows" ]; then
echo "Window not supported yet"
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install cmake googletest ninja openssl --quiet
elif [ "$RUNNER_OS" == "Linux" ]; then
if [ ${{inputs.like}} == "debian" ]; then
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 \
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 \
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 \
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 \
qt6-base qt6-tools gtk3 tomlplusplus cli11
else
echo "Unknown like"
fi
else
echo "Unknown OS: $RUNNER_OS"
fi
shell: bash
- name: Install Qt
if: ${{runner.os == 'macOS' }}
uses: jurplel/install-qt-action@v4
with:
dir: "/Users/runner"
version: ${{inputs.mac-qt-version}}
cache: true
cache-key-prefix: ${{matrix.target.os}}-${{env.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
# downloads directly from the `ninja-build` GitHub project releases.
- name: Install Ninja
if: ${{ runner.os == 'Windows' }}
uses: seanmiddleditch/gha-setup-ninja@master
- name: Build and cache vcpkg
if: ${{ runner.os == 'Windows' }}
id: vcpkg
uses: johnwason/vcpkg-action@v6
with:
manifest-dir: ${{ github.workspace }}
triplet: x64-windows-release
token: ${{ github.token }}
github-binarycache: true
- 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
shell: pwsh

21
.github/actions/lint-clang/action.yml vendored Normal file
View File

@ -0,0 +1,21 @@
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

@ -1,13 +1,24 @@
name: "Test Summary"
description: "Creates a markdown table from test results and uploads a summary file"
inputs:
download-pattern:
description: "The pattern to download test result rows"
required: false
default: test-result-*
upload-name:
description: "The artifact upload name for the summary"
required: false
default: summary-tests
runs:
using: "composite"
steps:
- name: Download test result rows
uses: actions/download-artifact@v4
with:
pattern: test-result-*
pattern: ${{ inputs.download-pattern }}
merge-multiple: true
path: rows
@ -44,24 +55,30 @@ runs:
table="${{ steps.markdown-table.outputs.markdown }}"
if [ -z "$table" ]; then
echo "No test results found" > $GITHUB_STEP_SUMMARY
echo "No test results found" | tee $GITHUB_STEP_SUMMARY >&2
exit 1
else
echo "$table" > $GITHUB_STEP_SUMMARY
fi
count=$(echo -n "$table" | grep -o "❌" | wc -l || echo 0)
count=$(echo "$table" | awk -v RS='' '{gsub(/[^❌]/, ""); print length}')
file="ci-summary.md"
if [ $count -gt 0 ]; then
file="ci-summary.md"
echo "❌🔬 Tests failed: $count" > $file
echo "❌🔬 Tests failed: $count" | tee $file
echo "file=$file" >> $GITHUB_OUTPUT
else
# For debugging; don't send success to CI summary (reduce noise).
echo > $file
echo "✅🔬 All tests passed"
fi
shell: bash
- name: Upload CI summary
if: steps.summary.outputs.file
uses: actions/upload-artifact@v4
with:
name: summary-tests
name: ${{ inputs.upload-name }}
path: ${{ steps.summary.outputs.file }}
if-no-files-found: error

View File

@ -0,0 +1,32 @@
name: Winget Publish
description: A composite action to publish packages to the Windows Package Manager (Winget) repository
inputs:
release-version:
description: "Version to publish to Winget package manager (without 'v' prefix)"
required: true
token:
description: "GitHub token with public read permissions on the source repo"
required: true
runs:
using: "composite"
steps:
- name: Submit package to Windows Package Manager Community Repository
if: ${{ runner.os == 'Windows' }}
env:
GITHUB_TOKEN: ${{ inputs.token }}
run: |
# Download latest wingetcreate
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 }}-win-x64.msi"
# Submit package update
.\wingetcreate.exe update "$packageId" `
--version "${{ inputs.release-version }}" `
--urls "$installerUrl" `
--submit `
--token "${{ inputs.token }}"
shell: pwsh

View File

@ -1,17 +0,0 @@
# syntax=docker/dockerfile:1
ARG BASE_IMAGE
FROM $BASE_IMAGE AS base
FROM base AS deps
RUN pacman -Syu --noconfirm git python sudo && \
pacman -Scc --noconfirm
RUN useradd -m build
WORKDIR /app
RUN --mount=type=bind,target=/app,rw \
./scripts/install_deps.py && \
pacman -Scc --noconfirm

View File

@ -1,17 +0,0 @@
# syntax=docker/dockerfile:1
ARG BASE_IMAGE
FROM $BASE_IMAGE AS base
FROM base AS deps
RUN apt update && \
apt dist-upgrade -y && \
apt install -y git python3 && \
apt clean
WORKDIR /app
RUN --mount=type=bind,target=/app,rw \
./scripts/install_deps.py && \
apt clean

View File

@ -1,16 +0,0 @@
# syntax=docker/dockerfile:1
ARG BASE_IMAGE
FROM $BASE_IMAGE AS base
FROM base AS deps
RUN dnf upgrade -y && \
dnf install -y git python3 && \
dnf clean all
WORKDIR /app
RUN --mount=type=bind,target=/app,rw \
./scripts/install_deps.py && \
dnf clean all

View File

@ -1,17 +0,0 @@
# syntax=docker/dockerfile:1
ARG BASE_IMAGE
FROM $BASE_IMAGE AS base
FROM base AS deps
RUN zypper refresh && \
zypper update -y && \
zypper install -y git python3 && \
zypper clean --all
WORKDIR /app
RUN --mount=type=bind,target=/app,rw \
./scripts/install_deps.py && \
zypper clean --all

View File

@ -1,128 +0,0 @@
# Weekly build of the Linux Docker containers.
#
# The objective is to reduce the problem where package updates often break the build process
# due to transient network errors.
#
# We use Docker Buildx instead of Docker Automated Builds so that we can create an image that is
# always at most a week out of date (instead of the last time a Dockerfile change was pushed).
name: Build containers
on:
workflow_dispatch:
schedule:
- cron: "0 5 * * 0"
jobs:
build-containers:
name: ${{ matrix.os.name }}
runs-on: ${{ matrix.os.runs-on }}
if: ${{ vars.BUILD_CONTAINERS }}
timeout-minutes: 10
strategy:
# Build all images even if some fail.
fail-fast: false
matrix:
os:
- name: debian-13-amd64
runs-on: ubuntu-latest
config-dir: debian
base-image: debian:trixie-slim
platform: amd64
- name: debian-12-amd64
runs-on: ubuntu-latest
config-dir: debian
base-image: debian:12-slim
platform: amd64
- name: debian-12-arm64
runs-on: ubuntu-24.04-2-core-arm64
config-dir: debian
base-image: arm64v8/debian:12-slim
platform: arm64
- name: ubuntu-24.04-amd64
runs-on: ubuntu-latest
config-dir: debian
base-image: ubuntu:24.04
platform: amd64
- name: ubuntu-22.04-amd64
runs-on: ubuntu-latest
config-dir: debian
base-image: ubuntu:22.04
platform: amd64
- name: fedora-40-amd64
runs-on: ubuntu-latest
config-dir: fedora
base-image: fedora:40
platform: amd64
- name: fedora-40-arm64
runs-on: ubuntu-24.04-2-core-arm64
config-dir: fedora
base-image: arm64v8/fedora:40
platform: arm64
- name: fedora-39-amd64
runs-on: ubuntu-latest
config-dir: fedora
base-image: fedora:39
platform: amd64
- name: rockylinux-9-amd64
runs-on: ubuntu-latest
config-dir: fedora
base-image: rockylinux:9
platform: amd64
- name: almalinux-9-amd64
runs-on: ubuntu-latest
config-dir: fedora
base-image: almalinux:9
platform: amd64
- name: opensuse-amd64
runs-on: ubuntu-latest
config-dir: opensuse
base-image: opensuse/tumbleweed:latest
platform: amd64
- name: archlinux-amd64
runs-on: ubuntu-latest
config-dir: archlinux
base-image: archlinux:latest
platform: amd64
- name: manjaro-amd64
config-dir: archlinux
runs-on: ubuntu-latest
base-image: manjarolinux/base:latest
platform: amd64
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
context: .
file: ./.github/docker/${{ matrix.os.config-dir }}/Dockerfile
tags: deskflow/deskflow:${{ matrix.os.name }}
build-args: BASE_IMAGE=${{ matrix.os.base-image }}
platforms: linux/${{ matrix.os.platform }}

View File

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

View File

@ -1,76 +0,0 @@
{
"distro": [
{
"name": "debian-13-amd64",
"container": "deskflow/deskflow:debian-13-amd64",
"runs-on": "ubuntu-latest",
"extra-packages": true
},
{
"name": "debian-12-arm64",
"container": "deskflow/deskflow:debian-12-arm64",
"runs-on": "ubuntu-24.04-4-core-arm64",
"extra-packages": true
},
{
"name": "debian-12-amd64",
"container": "deskflow/deskflow:debian-12-amd64",
"runs-on": "ubuntu-latest",
"extra-packages": true
},
{
"name": "ubuntu-24.04-amd64",
"container": "deskflow/deskflow:ubuntu-24.04-amd64",
"runs-on": "ubuntu-latest",
"extra-dep-args": "--meson-no-system libportal --meson-static libportal --subprojects",
"extra-cmake-args": "-DSYSTEM_LIBPORTAL=OFF -DSTATIC_LIBPORTAL=ON"
},
{
"name": "ubuntu-22.04-amd64",
"container": "deskflow/deskflow:ubuntu-22.04-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "fedora-40-arm64",
"container": "deskflow/deskflow:fedora-40-arm64",
"runs-on": "ubuntu-24.04-4-core-arm64"
},
{
"name": "fedora-40-amd64",
"container": "deskflow/deskflow:fedora-40-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "fedora-39-amd64",
"container": "deskflow/deskflow:fedora-39-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "opensuse-amd64",
"container": "deskflow/deskflow:opensuse-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "rockylinux-9-amd64",
"container": "deskflow/deskflow:rockylinux-9-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "almalinux-9-amd64",
"container": "deskflow/deskflow:almalinux-9-amd64",
"runs-on": "ubuntu-latest"
},
{
"name": "archlinux-amd64",
"container": "deskflow/deskflow:archlinux-amd64",
"runs-on": "ubuntu-latest",
"package-user": "build"
},
{
"name": "manjaro-amd64",
"container": "deskflow/deskflow:manjaro-amd64",
"runs-on": "ubuntu-latest",
"package-user": "build"
}
]
}

View File

@ -1,374 +0,0 @@
# All-in-one continuous integration (CI) workflow.
# Runs on all platforms (Windows, macOS, and Linux)
# for all events (pull request, release, and schedule).
name: CI
on:
workflow_dispatch:
inputs:
version:
description: Deskflow version number
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
schedule:
- cron: "0 5 * * *" # 5am UTC
env:
GIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
PACKAGE_PREFIX: "deskflow"
PACKAGE_PATH: ./dist
jobs:
pr-comment-flags:
runs-on: ubuntu-latest
if: ${{ github.event_name == 'pull_request' }}
outputs:
no-sonar: ${{ steps.check.outputs.no-sonar }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Check PR comment for flags
id: check
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
no_sonar="{no-sonar}"
if echo $PR_BODY | grep -q "$no_sonar"; then
echo "Flag $no_sonar found in PR body."
echo "no-sonar=true" >> $GITHUB_OUTPUT
else
echo "No $no_sonar flag found in PR body."
fi
# Quality gate to allow PR merge, used in the branch protection rules.
ci-passed:
runs-on: ubuntu-latest
needs: [lint-cmake, lint-clang, windows, macos, linux, unix]
steps:
- run: echo "✅ CI passed" > $GITHUB_STEP_SUMMARY
# Summary of test results, combined from test result artifacts.
# Runs even if the tests fail to provide a summary of the failures.
test-results:
needs: [windows, macos, linux]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Test summary
uses: ./.github/actions/test-summary
lint-cmake:
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/lint-cmake.yml
lint-clang:
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/lint-clang.yml
analyse-valgrind:
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/valgrind-analysis.yml
analyse-codeql:
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/codeql-analysis.yml
analyse-sonarcloud:
needs: pr-comment-flags
if: ${{ github.event_name == 'pull_request' && needs.pr-comment-flags.outputs.no-sonar != 'true' }}
uses: ./.github/workflows/sonarcloud-analysis.yml
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
windows:
name: ${{ matrix.target.name }}
runs-on: ${{ matrix.target.runs-on }}
container: ${{ matrix.target.container }}
timeout-minutes: 20
strategy:
# Normally, we want to fail fast, but in this case we shouldn't since one target may
# fail due to transient issues unrelated to the build.
fail-fast: false
matrix:
target:
- name: windows-2022-x64
runs-on: ${{ vars.CI_WINDOWS_RUNNER || 'windows-2022' }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get version
uses: ./.github/actions/get-version
- name: Cache vcpkg dir
uses: actions/cache@v4
with:
# We also need to cache the `LOCALAPPDATA` dir; without doing so, openssl
# rebuilds (after it is detected in cache) every time, which takes around 10 mins.
path: |
vcpkg
vcpkg_installed
${{ env.LOCALAPPDATA }}/vcpkg
key: vcpkg-${{ runner.os }}-${{ hashFiles('vcpkg.json', 'vcpkg-configuration.json') }}
# Should only restore the .venv directory from cache.
- name: Init Python venv
uses: ./.github/actions/init-python
with:
cache-key: ci-${{ matrix.target.name }}
setup: false
- name: Cache deps dir
uses: actions/cache@v4
with:
path: ./deps
key: ${{ runner.os }}-deps-${{ hashFiles('config.yaml') }}
# This effectively runs `vcvarsall.bat`, etc. It's not actually installing
# VC++ as that's already pre-installed on the Windows runner.
- name: Setup VC++ environment
uses: ilammy/msvc-dev-cmd@v1
# 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
# downloads directly from the `ninja-build` GitHub project releases.
- name: Install Ninja
uses: seanmiddleditch/gha-setup-ninja@master
- name: Install dependencies
env:
VCPKG_ROOT: "" # Unset deliberately to suppress 'already installed' warning.
run: python ./scripts/install_deps.py
- name: Configure
run: cmake -B build --preset=windows-release
- name: Build
run: cmake --build build -j8
- name: Tests
uses: ./.github/actions/run-tests
timeout-minutes: 2
with:
job: ${{ matrix.target.name }}
- name: Package
run: python ./scripts/package.py
env:
WINDOWS_PFX_CERTIFICATE: ${{ secrets.WINDOWS_PFX }}
WINDOWS_PFX_PASSWORD: ${{ secrets.WINDOWS_PFX_PASS }}
- name: Upload
uses: actions/upload-artifact@v4
with:
name: ${{ env.PACKAGE_PREFIX }}-${{ matrix.target.name }}
path: ${{ env.PACKAGE_PATH }}
macos:
name: ${{ matrix.target.name }}
runs-on: ${{ matrix.target.os }}
timeout-minutes: ${{ matrix.target.timeout }}
defaults:
run:
shell: ${{ matrix.target.shell }}
strategy:
# Normally, we want to fail fast, but in this case we shouldn't since one target may
# fail due to transient issues unrelated to the build.
fail-fast: false
matrix:
target:
- name: "macos-14-arm64"
timeout: 10
os: "macos-14"
arch: arm64
shell: "/usr/bin/arch -arch arm64e /bin/bash --noprofile --norc -eo pipefail {0}"
- name: ${{ vars.CI_MAC_INTEL_NAME || 'macos-13-x64' }}
timeout: 20
os: ${{ vars.CI_MAC_INTEL_RUNNER || 'macos-13' }}
arch: x64
shell: "bash"
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Get version
uses: ./.github/actions/get-version
# Should only restore the .venv directory from cache.
- name: Setup Python venv
uses: ./.github/actions/init-python
with:
cache-key: ci-${{ matrix.target.name }}
setup: false
- name: Cache deps dir
uses: actions/cache@v4
with:
path: ./deps
key: ${{ runner.os }}-deps-${{ hashFiles('config.yaml') }}
- name: Install dependencies
run: ./scripts/install_deps.py
- name: Configure
run: cmake -B build --preset=macos-release
- name: Build
run: cmake --build build -j8
- name: Tests
uses: ./.github/actions/run-tests
timeout-minutes: 2
with:
job: ${{ matrix.target.name }}
- name: Package
run: ./scripts/package.py
env:
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:
name: ${{ env.PACKAGE_PREFIX }}-${{ matrix.target.name }}
path: ${{ env.PACKAGE_PATH }}
linux-matrix:
runs-on: ubuntu-latest
outputs:
json-matrix: ${{ steps.filter.outputs.json }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Filter JSON
uses: ./.github/actions/filter-json
id: filter
with:
json-file: .github/workflows/ci-linux.json
condition: '"${{ vars.CI_USE_LINUX_ARM_RUNNER }}" != "true"'
jq-filter: .distro |= map(select(.["runs-on"] | contains("arm64") | not))
linux:
needs: linux-matrix
name: linux-${{ matrix.distro.name }}
runs-on: ${{ matrix.distro.runs-on }}
container: ${{ matrix.distro.container }}
timeout-minutes: 20
strategy:
# Normally, we want to fail fast, but in this case we shouldn't since one distro may
# fail due to transient issues unrelated to the build.
fail-fast: false
matrix: ${{fromJson(needs.linux-matrix.outputs.json-matrix)}}
steps:
- name: Checkout
uses: actions/checkout@v4
# Should only restore the .venv directory from cache.
- name: Setup Python venv
uses: ./.github/actions/init-python
with:
cache-key: ci-${{ matrix.distro.name }}
setup: false
- name: Get version
uses: ./.github/actions/get-version
- name: Config Git safe dir
run: git config --global --add safe.directory $GITHUB_WORKSPACE
- name: Install dependencies
run: ./scripts/install_deps.py ${{ matrix.distro.extra-dep-args }}
env:
# Prevent apt prompting for input.
DEBIAN_FRONTEND: noninteractive
- name: Configure
run: cmake -B build --preset=linux-release ${{ matrix.distro.extra-cmake-args }}
- name: Build
run: cmake --build build -j8
- name: Tests
uses: ./.github/actions/run-tests
timeout-minutes: 2
with:
job: linux-${{ matrix.distro.name }}
- name: Package
env:
LINUX_EXTRA_PACKAGES: ${{ matrix.distro.extra-packages }}
LINUX_PACKAGE_USER: ${{ matrix.distro.package-user }}
run: ./scripts/package.py
- name: Upload
uses: actions/upload-artifact@v4
with:
name: ${{ env.PACKAGE_PREFIX }}-${{ matrix.distro.name }}
path: ${{ env.PACKAGE_PATH }}
# Technically, "unix" is a misnomer, but we use it here to mean "Unix-like BSD-derived".
unix:
name: unix-${{ matrix.distro.name }}
runs-on: ${{ vars.CI_UNIX_RUNNER || 'ubuntu-24.04' }}
timeout-minutes: 20
env:
DESKFLOW_BUILD_CMD: |
./scripts/install_deps.sh;
cmake -B build;
cmake --build build -j16;
export QT_QPA_PLATFORM=offscreen;
./build/bin/unittests
./build/bin/integtests
strategy:
fail-fast: false
matrix:
distro:
- name: freebsd
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Build on FreeBSD
if: ${{ matrix.distro.name == 'freebsd' }}
uses: vmactions/freebsd-vm@v1
with:
usesh: true
run: ${{ env.DESKFLOW_BUILD_CMD }}

View File

@ -1,8 +1,25 @@
name: "CodeQL Analysis"
# According to the docs, the CodeQL workflow should be triggered directly by push to master
# and by pull requests (we only run this on open PRs as it's very slow). We also use the
# `workflow_dispatch` event is also enabled to allow manual triggering of the workflow for testing.
#
# We should not trigger this workflow with `workflow_call` as this causes the error:
# "1 configuration present on `master` was not found"
#
# Sadly, this means we can't roll it into our monolithic CI workflow.
on:
workflow_dispatch:
workflow_call:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths-ignore:
- '**/*.md'
- '.github/ISSUE_TEMPLATE/**'
- '.editorconfig'
- '.env-example'
- '.gitignore'
- '.gitattributes'
- 'cspell.json'
push:
branches: [master]
@ -11,8 +28,8 @@ jobs:
if: ${{ !github.event.pull_request.draft }}
name: Analyze
runs-on: ${{ vars.CODEQL_RUNNER || 'ubuntu-24.04' }}
container: deskflow/deskflow:ubuntu-24.04-amd64
runs-on: ubuntu-latest
container: debian:trixie-slim
timeout-minutes: 20
strategy:
@ -21,24 +38,18 @@ jobs:
language: ["cpp"]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install container dependencies
run: |
apt update -qqq > /dev/null
apt install -qqq git > /dev/null
- name: Config Git safe dir
run: git config --global --add safe.directory $GITHUB_WORKSPACE
# Should only restore the .venv directory from cache.
- name: Init Python venv
uses: ./.github/actions/init-python
with:
cache-key: "codeql"
setup: false
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
- name: Install dependencies
run: ./scripts/install_deps.py
env:
# Prevent apt prompting for input.
DEBIAN_FRONTEND: noninteractive
uses: ./.github/actions/install-dependencies
with:
like: "debian"
- name: Initialize CodeQL
uses: github/codeql-action/init@v3

View File

@ -0,0 +1,391 @@
# All-in-one continuous integration (CI) workflow.
# Runs on all platforms (Windows, macOS, and Linux)
# for all events (pull request, release, and schedule).
name: Continuous Integration
on:
push:
branches: [master]
tags:
- 'v*'
pull_request:
types:
- opened
- reopened
- synchronize
- ready_for_review
paths-ignore:
- '**/*.md'
- '.github/ISSUE_TEMPLATE/**'
- '.editorconfig'
- '.env-example'
- '.gitignore'
- '.gitattributes'
- 'cspell.json'
env:
GIT_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
PACKAGE_PREFIX: "deskflow"
PACKAGE_PATH: ./dist
CMAKE_CONFIGURE: "cmake -Bbuild -DCMAKE_BUILD_TYPE=Release -DCMAKE_COMPILE_WARNING_AS_ERROR=ON"
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
outputs:
no-sonar: ${{ steps.check.outputs.no-sonar }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Check PR comment for flags
if: ${{ github.event_name == 'pull_request' }}
id: check
env:
PR_BODY: ${{ github.event.pull_request.body }}
run: |
no_sonar="{no-sonar}"
if echo $PR_BODY | grep -q "$no_sonar"; then
echo "Flag $no_sonar found in PR body."
echo "no-sonar=true" >> $GITHUB_OUTPUT
else
echo "No $no_sonar flag found in PR body."
fi
# Quality gate to allow PR merge, used in the branch protection rules.
ci-passed:
runs-on: ubuntu-latest
needs: [test-results, unix, flatpak]
steps:
- run: echo "✅ CI passed" > $GITHUB_STEP_SUMMARY
# Summary of test results, combined from test result artifacts.
# Runs even if the tests fail to provide a summary of the failures.
test-results:
needs: main-build
if: always() && needs.main-build.result != 'skipped'
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Test summary
uses: ./.github/actions/test-summary
lint-clang:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Linting Clang
uses: ./.github/actions/lint-clang
analyse-valgrind:
needs: lint-clang
if: ${{ github.event_name == 'pull_request' }}
uses: ./.github/workflows/valgrind-analysis.yml
analyse-sonarcloud:
needs: pr-comment-flags
if: ${{ needs.pr-comment-flags.outputs.no-sonar != 'true' }}
uses: ./.github/workflows/sonarcloud-analysis.yml
secrets:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
main-build:
needs: lint-clang
name: ${{ matrix.target.name }}
runs-on: ${{ matrix.target.runs-on }}
container: ${{ matrix.target.container }}
timeout-minutes: ${{ matrix.target.timeout }}
strategy:
# Normally, we want to fail fast, but in this case we shouldn't since one target may
# fail due to transient issues unrelated to the build.
fail-fast: false
matrix:
target:
- name: "windows-2022-x64"
runs-on: "windows-2022"
timeout: 120 #Windows can take while if it has to build vcpkg cache
config-args: "-G Ninja"
- name: "macos-14-arm64"
runs-on: "macos-14"
timeout: 10
arch: arm64
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"arm64\" -DMACOSX_DEPLOYMENT_TARGET=12"
- name: "macos-13-x64"
runs-on: macos-13
timeout: 20
config-args: "-DCMAKE_OSX_ARCHITECTURES=\"x86_64\" -DMACOSX_DEPLOYMENT_TARGET=12"
- name: "debian-13-amd64"
runs-on: ubuntu-latest
container: debian:trixie-slim
like: "debian"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-41-amd64"
runs-on: ubuntu-latest
container: fedora:41
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "fedora-40-amd64"
runs-on: ubuntu-latest
container: fedora:40
like: "fedora"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "opensuse-amd64"
runs-on: ubuntu-latest
container: opensuse/tumbleweed:latest
like: "suse"
timeout: 20
config-args: "-G Ninja -DCMAKE_INSTALL_PREFIX=/usr"
- name: "archlinux-amd64"
runs-on: ubuntu-latest
container: archlinux:latest
like: "arch"
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
if: ${{ matrix.target.container }}
shell: bash
run : |
if [ "${{matrix.target.like}}" == "debian" ]; then
apt update -qqq > /dev/null && apt install -qqq git devscripts > /dev/null
elif [ "${{matrix.target.like}}" == "fedora" ]; then
dnf install -y git
elif [ "${{matrix.target.like}}" == "suse" ]; then
zypper refresh
zypper install -y --force-resolution git
elif [ "${{matrix.target.like}}" == "arch" ]; then
pacman -Syu --noconfirm git
else
echo "Unknown: ${{matrix.target.like}}"
fi
# 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
# This effectively runs `vcvarsall.bat`, etc. It's not actually installing
# VC++ as that's already pre-installed on the Windows runner.
- name: Setup VC++ environment
if: ${{ runner.os == 'Windows' }}
uses: ilammy/msvc-dev-cmd@v1
- name: Install dependencies
id: get-deps
uses: ./.github/actions/install-dependencies
with:
mac-qt-version: 6.7.2
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}}
- name: Build
shell: bash
run: |
if [[ "$RUNNER_OS" == "Linux" && "${{matrix.target.like}}" != "arch" ]]; then
cmake --build build -j8 --target package
else
cmake --build build -j8
fi
if [ ${{ matrix.target.like }} == "arch" ];then
useradd -m build
sudo chown -R build build
cd build
sudo -u build makepkg -s
export OSNAME=$(cat /etc/os-release | grep ^ID= | sed 's/ID=//g')
export ARCH=$(uname -m)
mv *.pkg.tar.zst deskflow-${{env.DESKFLOW_PACKAGE_VERSION}}-${OSNAME}-${ARCH}.pkg.tar.zst
cd ..
fi
- name: Tests
uses: ./.github/actions/run-tests
timeout-minutes: 2
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:
name: package-${{ env.PACKAGE_PREFIX }}-${{ matrix.target.name }}
path: ${{github.workspace}}/build/deskflow[-_]*.*
# Technically, "unix" is a misnomer, but we use it here to mean "Unix-like BSD-derived".
unix:
needs: lint-clang
name: unix-${{ matrix.distro.name }}
runs-on: ${{ vars.CI_UNIX_RUNNER || 'ubuntu-24.04' }}
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
distro:
- name: freebsd
steps:
# 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
- name: Build on FreeBSD
if: ${{ matrix.distro.name == 'freebsd' }}
uses: vmactions/freebsd-vm@v1
with:
usesh: true
run: |
./scripts/install_deps.sh
${{env.CMAKE_CONFIGURE}} -G Ninja
cmake --build build -j16
# Integration tests are flakey by nature, make them optional.
export QT_QPA_PLATFORM=offscreen
./build/bin/unittests
./build/bin/integtests || true
flatpak:
needs: lint-clang
runs-on: ubuntu-latest
container:
image: bilelmoussaoui/flatpak-github-actions:kde-6.7
options: --privileged
steps:
- name: Check out repository
uses: sithlord48/fancy-checkout@v1.0.0
- run: git config --global protocol.file.allow always
- name: Get version
uses: ./.github/actions/get-version
- uses: flatpak/flatpak-github-actions/flatpak-builder@v6
name: "Build"
with:
bundle: deskflow-${{env.DESKFLOW_PACKAGE_VERSION}}-x86_64.flatpak
manifest-path: deploy/dist/flatpak/org.deskflow.deskflow.yml
cache-key: flatpak-builder-${{ github.sha }}
upload-artifact: false
- name: Upload
uses: actions/upload-artifact@v4
with:
name: package-${{ env.PACKAGE_PREFIX }}-flatpak
path: ${{github.workspace}}/deskflow[-_]*.flatpak
release:
needs: ci-passed
if: (github.ref == 'refs/heads/master') || (contains(github.ref, '/tags/v'))
runs-on: ubuntu-latest
steps:
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
- name: Get version
uses: ./.github/actions/get-version
- name: Download artifacts
uses: actions/download-artifact@v4
- name: Generate package checksums
id: generate_notes
shell: bash
run: |
mv $GITHUB_WORKSPACE/package-*/deskflow-* .
rm -rf $GITHUB_WORKSPACE/package-*
echo "Build: ${{env.DESKFLOW_VERSION }}" > sums.txt
sha256sum deskflow-* >> sums.txt
- name: Deploy continuous
if: (github.ref == 'refs/heads/master') && !(contains(github.ref, '/tags/v'))
uses: crowbarmaster/GH-Automatic-Releases@latest
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "continuous"
prerelease: true
title: 'Continuous Build'
files: |
deskflow-*
sums.txt
- name: Deploy release
if: contains(github.ref, '/tags/v')
uses: crowbarmaster/GH-Automatic-Releases@latest
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
files: |
deskflow-*
sums.txt
winget-publish:
needs: release
if: contains(github.ref, 'tags/v')
runs-on: windows-latest
steps:
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
- name: Get version
uses: ./.github/actions/get-version
- name: Submit
uses: ./.github/actions/winget-publish
with:
release-version: ${{env.DESKFLOW_PACKAGE_VERSION}}
token: ${{ secrets.WINGET_DEPLOY_TOKEN }}

View File

@ -1,53 +0,0 @@
name: Create tag
on:
workflow_dispatch:
push:
branches:
- master
- release/**
jobs:
create-tag:
if: ${{ vars.CREATE_TAGS }}
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Fetch all tags
fetch-depth: 0
- name: Read version file
run: echo "CURRENT_VERSION=$(cat VERSION)" >> $GITHUB_ENV
- name: Override stage
if: ${{ !startsWith(github.ref, 'refs/heads/release') }}
run: echo "OVERRIDE_STAGE=snapshot" >> $GITHUB_ENV
- name: Get next version
id: next-version
uses: symless/actions/next-version@master
with:
current-version: ${{ env.CURRENT_VERSION }}
override-stage: ${{ env.OVERRIDE_STAGE }}
- name: Create and push Git tag
run: |
git tag ${{ steps.next-version.outputs.next-version }}
git push origin ${{ steps.next-version.outputs.next-version }}
shell: bash
- name: Trigger CI workflow
uses: actions/github-script@v7
with:
script: |
await github.rest.actions.createWorkflowDispatch({
owner: context.repo.owner,
repo: context.repo.repo,
workflow_id: 'ci.yml',
ref: '${{ steps.next-version.outputs.next-version }}'
});

View File

@ -1,31 +0,0 @@
name: "Lint Clang"
on:
workflow_dispatch:
workflow_call:
jobs:
lint-clang:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python venv
uses: ./.github/actions/init-python
with:
cache-key: "lint-clang"
- name: Install dependencies
run: |
source .venv/bin/activate
pip install pyyaml clang_format
- name: Linting with Clang format
id: lint-clang
uses: ./.github/actions/lint-error
with:
format-command: ./scripts/lint_clang.py -f
format-tool: "clang-format"

View File

@ -1,31 +0,0 @@
name: "Lint CMake"
on:
workflow_dispatch:
workflow_call:
jobs:
lint-cmake:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Python venv
uses: ./.github/actions/init-python
with:
cache-key: "lint-cmake"
- name: Install dependencies
run: |
source .venv/bin/activate
pip install pyyaml cmake_format
- name: Linting with CMake formatter
id: lint-cmake
uses: ./.github/actions/lint-error
with:
format-command: ./scripts/lint_cmake.py -f
format-tool: "cmake-format"

View File

@ -6,15 +6,13 @@ on:
secrets:
SONAR_TOKEN:
required: true
push:
branches: [master]
jobs:
sonarcloud-analysis:
if: ${{ vars.SONAR_SCANNER_ENABLED }}
runs-on: ${{ vars.SONAR_SCANNER_RUNNER || 'ubuntu-24.04' }}
container: deskflow/deskflow:ubuntu-22.04-amd64
runs-on: ubuntu-latest
container: debian:trixie-slim
timeout-minutes: 20
env:
@ -24,36 +22,29 @@ jobs:
CPU_CORE_COUNT: ${{ vars.SONAR_SCANNER_CPU_COUNT || 4 }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Fetch all history for SonarScanner blame data
fetch-depth: 0
- name: Config Git safe dir
run: git config --global --add safe.directory $GITHUB_WORKSPACE
# Should only restore the .venv directory from cache.
- name: Init Python venv
uses: ./.github/actions/init-python
with:
cache-key: "sonarcloud"
setup: false
- name: Install dependencies
- name: Install container dependencies
run: |
./scripts/install_deps.py &&
apt install curl unzip -y &&
pip install gcovr
env:
# Prevent apt prompting for input.
DEBIAN_FRONTEND: noninteractive
apt update -qqq > /dev/null
apt install -qqq git curl unzip gcovr > /dev/null
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
- name: Install project dependencies
uses: ./.github/actions/install-dependencies
with:
like: "debian"
- name: Install sonar-scanner and build-wrapper
uses: sonarsource/sonarcloud-github-c-cpp@v3
- name: Configure
run: cmake -B build --preset=linux-debug -DENABLE_COVERAGE=ON
run: |
cmake -B build \
-G "Ninja" \
-DCMAKE_BUILD_TYPE="Debug" \
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DENABLE_COVERAGE=ON
- name: Build
run: |

41
.github/workflows/test-actions.yml vendored Normal file
View File

@ -0,0 +1,41 @@
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

@ -1,38 +0,0 @@
# Used only for testing the `dist-upload` action.
# Triggered using 'Run workflow' in the Actions tab.
name: Test dist upload
on:
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Make test dist
run: |
mkdir dist
echo "test" > dist/test
- name: Upload to GitHub
if:
uses: ./.github/actions/dist-upload
with:
use-github: true
github-target-filename: "test"
- name: Upload to Google Drive
if:
uses: ./.github/actions/dist-upload
with:
use_gdrive: true
gdrive-target-base-dir: "test"
gdrive-secret-key: ${{ secrets.GOOGLE_DRIVE_KEY }}
gdrive-parent-folder-id: ${{ secrets.GOOGLE_DRIVE_TECH_DRIVE }}
package-version: 1.0.0-test

View File

@ -7,33 +7,25 @@ on:
jobs:
valgrind-analysis:
runs-on: ubuntu-latest
container: deskflow/deskflow:ubuntu-22.04-amd64
container: debian:trixie-slim
timeout-minutes: 10
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install container dependencies
run: |
apt update -qqq > /dev/null
apt install -qqq git valgrind > /dev/null
- name: Config Git safe dir
run: git config --global --add safe.directory $GITHUB_WORKSPACE
# Should only restore the .venv directory from cache.
- name: Init Python venv
uses: ./.github/actions/init-python
with:
cache-key: "valgrind"
setup: false
- name: Fancy Checkout
uses: sithlord48/fancy-checkout@v1.0.0
- name: Install dependencies
run: |
./scripts/install_deps.py &&
apt install valgrind -y
env:
# Prevent apt prompting for input.
DEBIAN_FRONTEND: noninteractive
uses: ./.github/actions/install-dependencies
with:
like: "debian"
- name: Configure
run: cmake -B build --preset=linux-release
run: cmake -B build -G "Ninja"
- name: Build
run: cmake --build build -j8

14
.gitignore vendored
View File

@ -1,3 +1,8 @@
# SPDX-FileCopyrightText: Copyright (C) 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-FileCopyrightText: Copyright (C) 2011 Symless Ltd.
# SPDX-FileCopyrightText: Copyright (C) 2010 Jason Axelson <BostonVaulter@gmail.com>
# SPDX-License-Identifier: MIT
# temp dirs created during build
/build
/dist
@ -20,3 +25,12 @@ deskflow-config.toml
/scripts/*.egg-info
/*.user
*.ui.autosave
#Generic linux files
**/*.directory
#CMake ignores
CMakeLists.txt.user
CMakeCache.txt
CMakeUserPresets.json
CMakeFiles/*

16
.vscode/launch.json vendored
View File

@ -15,6 +15,7 @@
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/unittests",
"args": [ "${input:gtest-args}" ],
"preLaunchTask": "build"
},
{
@ -23,14 +24,15 @@
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/integtests",
"preLaunchTask": "build"
"args": [ "${input:gtest-args}" ],
"preLaunchTask": "build",
},
{
"name": "unix - server",
"type": "lldb",
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/deskflows",
"program": "${workspaceFolder}/build/bin/deskflow-server",
"args": ["--config-toml", "deskflow-config.toml"],
"preLaunchTask": "kill-build"
},
@ -64,6 +66,7 @@
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/unittests",
"args": [ "${input:gtest-args}" ],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "build"
},
@ -73,6 +76,7 @@
"cwd": "${workspaceRoot}",
"request": "launch",
"program": "${workspaceFolder}/build/bin/integtests",
"args": [ "${input:gtest-args}" ],
"internalConsoleOptions": "openOnSessionStart",
"preLaunchTask": "build"
},
@ -119,5 +123,13 @@
"program": "scripts/install_deps.py",
"console": "integratedTerminal"
}
],
"inputs": [
{
"id": "gtest-args",
"type": "promptString",
"description": "Test arguments",
"default": "--gtest_filter=*"
}
]
}

3
.vscode/tasks.json vendored
View File

@ -14,9 +14,6 @@
"problemMatcher": {
"base": "$gcc",
"fileLocation": ["absolute"]
},
"presentation": {
"revealProblems": "onProblem"
}
},
{

View File

@ -1,50 +0,0 @@
# Build Deskflow
## Developer Quick Start
Deskflow is free and open source software, and anyone is welcome to build it,
run it, tinker with it, redistribute it as part of their own app, etc.
These instructions will build Deskflow, which doesn't require a license
or serial key. Check the [Build Guide](https://github.com/deskflow/deskflow/wiki/Build-Guide)
wiki page if you have problems.
**1. Dependencies:**
*Linux, macOS, or BSD-derived:*
```
./scripts/install_deps.sh
```
*Windows:*
```
python scripts/install_deps.py
```
**2. Configure:**
*Linux, macOS, or BSD-derived:*
```
cmake -B build
```
*Windows:*
```
cmake -B build --preset=windows-release
```
**3. Build:**
```
cmake --build build -j8
```
**4. Test:**
```
./build/bin/unittests
./build/bin/integtests
```
**5. Run**
```
./build/bin/deskflow
```

View File

@ -1,7 +0,0 @@
brew 'make'
brew 'cmake'
brew 'openssl'
brew 'ninja'
brew 'googletest'
brew 'tomlplusplus'
brew 'cli11'

View File

@ -19,22 +19,76 @@
# > 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.8)
cmake_minimum_required(VERSION 3.24)
project(deskflow C CXX)
# Fallback for when git can not be found
set(DESKFLOW_VERSION_MAJOR 1)
set(DESKFLOW_VERSION_MINOR 17)
set(DESKFLOW_VERSION_PATCH 2)
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
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()
# 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}
DESCRIPTION "Mouse and keyboard sharing utility"
LANGUAGES C CXX)
message(STATUS "Building ${CMAKE_PROJECT_NAME}-${CMAKE_PROJECT_VERSION}")
include(cmake/Version.cmake)
include(cmake/Definitions.cmake)
include(cmake/Build.cmake)
include(cmake/Libraries.cmake)
include(cmake/Packaging.cmake)
set_version()
include(GNUInstallDirs)
configure_definitions()
configure_build()
configure_libs()
configure_packaging()
add_subdirectory(doc)
add_subdirectory(src)
add_subdirectory(deploy)
post_config_all()

View File

@ -1,134 +0,0 @@
{
"version": 2,
"configurePresets": [
{
"name": "base",
"hidden": true,
"binaryDir": "${sourceDir}/build",
"cacheVariables": {
"CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
}
},
{
"name": "minimal",
"hidden": true,
"environment": {
"DESKFLOW_BUILD_MINIMAL": "ON"
}
},
{
"name": "windows",
"inherits": "base",
"hidden": true,
"generator": "Ninja",
"cacheVariables": {
"CMAKE_C_COMPILER": "cl.exe",
"CMAKE_CXX_COMPILER": "cl.exe"
},
"architecture": {
"value": "x64",
"strategy": "external"
},
"toolset": {
"value": "host=x64",
"strategy": "external"
}
},
{
"name": "linux",
"hidden": true,
"inherits": "base",
"generator": "Unix Makefiles"
},
{
"name": "macos",
"hidden": true,
"inherits": "base",
"generator": "Unix Makefiles"
},
{
"name": "windows-debug",
"inherits": "windows",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "windows-release",
"inherits": "windows",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "linux-debug",
"inherits": "linux",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "linux-release",
"inherits": "linux",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "macos-debug",
"inherits": "macos",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "macos-release",
"inherits": "macos",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "windows-debug-min",
"inherits": ["windows", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "windows-release-min",
"inherits": ["windows", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "linux-debug-min",
"inherits": ["linux", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "linux-release-min",
"inherits": ["linux", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
},
{
"name": "macos-debug-min",
"inherits": ["macos", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug"
}
},
{
"name": "macos-release-min",
"inherits": ["macos", "minimal"],
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Release"
}
}
]
}

View File

@ -1,12 +0,0 @@
# Contributing to Deskflow
Hello future community member!
Deskflow is free and open source software, and anyone is welcome to build it,
run it, tinker with it, redistribute it as part of their own app, etc.
See our wiki page on [contributing](https://github.com/deskflow/deskflow/wiki/Contributing) for more
information. We look forward to reviewing your PR!
Thanks,
The Deskflow community

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- install with: choco install Chocolatey.config -y -->
<packages>
<package id="wixtoolset" />
<package id="visualstudio2022buildtools"
packageParameters="--includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Workload.VCTools " />
</packages>

2494
Doxyfile

File diff suppressed because it is too large Load Diff

225
README.md
View File

@ -1,59 +1,55 @@
![Deskflow](https://github.com/user-attachments/assets/f005b958-24df-4f4a-9bfd-4f834dae59d6)
> [!TIP]
> We're on Libera Chat IRC network (`#deskflow` or `#deskflow-dev`).
>
> Or if you want to stay on GitHub, you can [start a new discussion](https://github.com/deskflow/deskflow/discussions).
> [!IMPORTANT]
> 🚀 Deskflow is now the upstream project for Synergy.
> [!NOTE]
> **Deskflow** is the official upstream project for [Synergy](https://symless.com/synergy).
> Purchasing a Synergy license is one way to support Deskflows growth and sustainability.
>
> The project has been renamed to draw a line between the community-run project (now Deskflow),
> and the commercially licensed product, Synergy.
> 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.
>
> We are currently in the process of renaming the project to Deskflow and moving all licensing code
> downstream.
>
> Hold on to your butts, this is going to be a hell of a ride.
>
> [Join the discussion](https://github.com/deskflow/deskflow/discussions/7517)
[![Sponsored by: Synergy](https://raw.githubusercontent.com/deskflow/deskflow-artwork/b2c72a3e60a42dee793bd47efc275b5ee0bdaa5f/misc/synergy-sponsor.svg)](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy)
[![GitHub Release](https://img.shields.io/github/v/release/deskflow/deskflow?display_name=release&label=latest%20version)](https://github.com/deskflow/deskflow/releases)
[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/deskflow/deskflow)](https://github.com/deskflow/deskflow/commits/master/)
![GitHub top language](https://img.shields.io/github/languages/top/deskflow/deskflow)
[![GitHub License](https://img.shields.io/github/license/deskflow/deskflow)](LICENSE)
[![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)
[![CI](https://github.com/deskflow/deskflow/actions/workflows/ci.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/ci.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)
[![Build containers](https://github.com/deskflow/deskflow/actions/workflows/build-containers.yml/badge.svg)](https://github.com/deskflow/deskflow/actions/workflows/build-containers.yml)
> More info: [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,
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.
**Wayland support:** Experimental support in
[Deskflow v1.16](https://github.com/deskflow/deskflow/releases/tag/1.16.0-beta%2Br2)
(required >= GNOME 46 or KDE Plasma 6.1).
[![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)
![Deskflow GUI](https://github.com/user-attachments/assets/883660dc-f3f5-4b69-8821-a079a58d3882)
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.
To use Deskflow you can follow the [Build Quick Start](#build-quick-start),
use one of our packages, or if it's available by your favorite package repository,
install `deskflow` (see: [installing packages](#how-to-install-packages)).
> [!TIP]
> For macOS users, the easiest way to install and stay up to date is to use [Homebrew](https://brew.sh) with our [homebrew-tap](https://github.com/deskflow/homebrew-tap).
## Project values
[![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)
[![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/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)
- Privacy by default (no update check or phone home on by default)
- Nothing customer-related (this is all moved downstream to Synergy)
- Privacy by default (e.g. update check is off by default)
- Leading edge releases (we don't focus on supporting older systems)
- Decisions are discussed and documented publicly with majority rule
- Have fun; we don't need to worry about impressing anyone
## Ways to get involved
> [!TIP]
> Join us! Real-time discussion on Matrix: [`#deskflow:matrix.org`](https://matrix.to/#/#deskflow:matrix.org)
>
> Alternatively, we have [other ways](https://github.com/deskflow/deskflow/wiki/Chat-with-us) to communicate.
>
Here are a few ways to join in with the project and get involved:
* Build the latest `master` version (see below) and [report a bug](https://github.com/deskflow/deskflow/issues)
* [Submit a PR](https://github.com/deskflow/deskflow/wiki/Contributing) (pull request) with a bug fix or improvement
@ -61,85 +57,7 @@ Here are a few ways to join in with the project and get involved:
## Build Quick Start
> [!TIP]
> Check the [Build Guide](https://github.com/deskflow/deskflow/wiki/Build-Guide)
> wiki page if you have problems.
**1. Dependencies:**
You can either copy/paste the commands for your OS from [`config.yaml`](config.yaml) or use the deps script.
*Linux, macOS, or BSD-derived:*
```
./scripts/install_deps.sh
```
*Windows:*
```
python scripts/install_deps.py
```
**2. Configure:**
*Linux, macOS, or BSD-derived:*
```
cmake -B build
```
*Windows:*
```
cmake -B build --preset=windows-release
```
**3. Build:**
```
cmake --build build -j8
```
**4. Test:**
```
./build/bin/unittests
./build/bin/integtests
```
**5. Run**
```
./build/bin/deskflow
```
## How to install (packages)
*macOS:*
*(coming soon)*
```
brew install deskflow
```
*Fedora, Red Hat, etc:*
*(coming soon)*
```
sudo dnf install deskflow
```
*Debian, Ubuntu, etc:*
*(coming soon)*
```
sudo apt install deskflow
```
*Arch, Manjaro, etc:*
*(coming soon)*
```
sudo pacman -S deskflow
```
*Windows:*
*(coming soon)*
```
choco install deskflow
```
**Note:** We are working with package maintainers to have our new package name adopted.
For instructions on building Deskflow, use the wiki page: [Building](https://github.com/deskflow/deskflow/wiki/Building)
## Operating Systems
@ -150,9 +68,42 @@ Debian, Ubuntu, Linux Mint, Fedora, RHEL, AlmaLinux, Rocky Linux, Arch Linux, op
We officially support FreeBSD, and would also like to support: OpenBSD, NetBSD, DragonFly, Solaris.
## Repology
Repology monitors a huge number of package repositories and other sources comparing package
versions across them and gathering other information.
[![Repology](https://repology.org/badge/vertical-allrepos/deskflow.svg?exclude_unsupported=1)](https://repology.org/project/deskflow/versions)
**Note:** We are working with package maintainers to have our new package name adopted.
## Installing on macOS
When you install Deskflow on macOS, you need to allow accessibility access (Privacy & Security) to both the `Deskflow` app and the `deskflow` process.
If using Sequoia, you may also need to allow `Deskflow` under Local Network settings (Privacy & Security).
When prompted by the OS, go to the settings and enable the access.
If you are upgrading and you already have `Deskflow` or `deskflow`
on the allowed list you will need to manually remove them before accessibility access can be granted to the new version.
macOS users who download directly from releases may need to run `xattr -c /Applications/Deskflow.app` after copying the app to the `Applications` dir.
It is recommend to install Deskflow using [Homebrew](https://brew.sh) from our [homebrew-tap](https://github.com/deskflow/homebrew-tap)
To add our tap, run:
```
brew tap deskflow/homebrew-tap
```
Then install either:
- Stable: `brew install deskflow`
- Continuous: `brew install deskflow-dev`
## Collaborative Projects
In the open source developer community, similar projects collaborate for the betterment of all
In the open source developer community, similar projects collaborate for the improvement of all
mouse and keyboard sharing tools. We aim for idea sharing and interoperability.
* [**Lan Mouse**](https://github.com/feschber/lan-mouse) -
@ -162,16 +113,30 @@ mouse and keyboard sharing tools. We aim for idea sharing and interoperability.
Deskflow/Synergy-derivative with the goal of continuing what Barrier started, after Barrier
became a dead fork.
* [**Synergy**](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy) -
Downstream commercial fork and Deskflow sponsor, geared toward adapting upstream to customer
Downstream commercial fork and Deskflow sponsor, geared toward adapting to customer
needs, offering business and enterprise licensing.
## FAQ
### Is Deskflow compatible with Lan Mouse or Input Leap?
### What is the relationship with Synergy?
We would love to see compatibility between our fellow open source projects, Lan Mouse and
Input Leap. This idea is discussed from time in the communities for all of our projects,
so it may happen in the not-too-distant future.
[![Sponsored by: Synergy](https://raw.githubusercontent.com/deskflow/deskflow-artwork/b2c72a3e60a42dee793bd47efc275b5ee0bdaa5f/misc/synergy-sponsor.svg)](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy)
Synergy sponsors the Deskflow project by contributing code and providing financial support while maintaining its customer-oriented code downstream.
Learn more: [Relationship with Synergy](https://github.com/deskflow/deskflow/wiki/Relationship-with-Synergy)
### Is Deskflow compatible with Synergy, Input Leap, or Barrier?
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.
### 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.
### If I want to solve issues in Deskflow do I need to contribute to a fork?
@ -201,12 +166,18 @@ Deskflow was first created as Synergy in 2001 by Chris Schoeneman.
Read about the [history of the project](https://github.com/deskflow/deskflow/wiki/History) on our
wiki.
## Repology
## Meow'Dib (our mascot)
Repology monitors a huge number of package repositories and other sources comparing package
versions across them and gathering other information.
![Meow'Dib](https://github.com/user-attachments/assets/726f695c-3dfb-4abd-875d-ed658f6c610f)
[![Repology](https://repology.org/badge/vertical-allrepos/deskflow.svg?exclude_unsupported=1)](https://repology.org/project/deskflow/versions)
## Deskflow Contributors
Deskflow is made by possible by these contributors.
<a href = "https://github.com/deskflow/deskflow/graphs/contributors">
<img src = "https://contrib.rocks/image?repo=deskflow/deskflow"/>
</a>
## License

View File

@ -1 +0,0 @@
1.17.0

View File

@ -1,10 +0,0 @@
format:
# Solves line ending issues on Windows.
line_ending: "auto"
# Any more than 4 args, and function calls become hard to read.
max_pargs_hwrap: 4
markup:
# Disable formatting of comments entirely, as this is annoying.
enable_markup: false

View File

@ -26,22 +26,11 @@ macro(configure_build)
set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0")
endif()
warnings_as_errors()
set_build_date()
configure_file_shared()
endmacro()
macro(warnings_as_errors)
if(WIN32)
message(STATUS "Enabling warnings as errors (MSVC)")
add_compile_options(/WX)
elseif(UNIX)
message(STATUS "Enabling warnings as errors (GNU/Clang)")
add_compile_options(-Werror)
endif()
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.
@ -106,10 +95,10 @@ macro(post_config_all)
add_dependencies(
run_post_build
${GUI_BINARY_NAME}
${CLIENT_BINARY_NAME}
${SERVER_BINARY_NAME}
${DAEMON_BINARY_NAME})
deskflow
deskflow-client
deskflow-server
deskflow-daemon)
endif()
endmacro()

View File

@ -16,7 +16,6 @@
macro(configure_definitions)
configure_meta()
configure_ninja()
configure_options()
@ -52,128 +51,6 @@ macro(configure_definitions)
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")
set(LEGACY_BINARY_NAME
"deskflow-legacy"
CACHE STRING "Filename of the legacy 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}")
message(VERBOSE "Legacy binary: ${LEGACY_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}")
add_definitions(-DLEGACY_BINARY_NAME="${LEGACY_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."

View File

@ -23,18 +23,12 @@ macro(configure_libs)
configure_unix_libs()
elseif(WIN32)
configure_windows_libs()
find_package(Python REQUIRED QUIET)
endif()
configure_python()
configure_qt()
configure_openssl()
configure_coverage()
configure_tomlplusplus()
configure_cli11()
if(BUILD_TESTS)
configure_gtest()
endif()
endmacro()
@ -163,7 +157,8 @@ macro(configure_unix_libs)
# 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(res/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/lib/config.h)
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)
@ -205,9 +200,6 @@ macro(configure_wayland_libs)
include(FindPkgConfig)
if(PKG_CONFIG_FOUND)
configure_libei()
configure_libportal()
pkg_check_modules(LIBXKBCOMMON REQUIRED xkbcommon)
pkg_check_modules(GLIB2 REQUIRED glib-2.0 gio-2.0)
find_library(LIBM m)
@ -219,140 +211,6 @@ macro(configure_wayland_libs)
endmacro()
macro(configure_libei)
option(SYSTEM_LIBEI "Use system libei" ON)
if(SYSTEM_LIBEI)
pkg_check_modules(LIBEI QUIET "libei-1.0 >= ${LIBEI_MIN_VERSION}")
if(LIBEI_FOUND)
message(STATUS "libei version: ${LIBEI_VERSION}")
add_definitions(-DWINAPI_LIBEI=1)
include_directories(${LIBEI_INCLUDE_DIRS})
else()
message(WARNING "libei >= ${LIBEI_MIN_VERSION} not found")
endif()
else()
set(libei_bin_dir ${PROJECT_BINARY_DIR}/meson/subprojects/libei/src)
set(libei_src_dir ${PROJECT_SOURCE_DIR}/subprojects/libei)
find_library(
LIBEI_LINK_LIBRARIES
NAMES ei
PATHS ${libei_bin_dir}
NO_DEFAULT_PATH)
if(LIBEI_LINK_LIBRARIES)
message(STATUS "Using local subproject libei")
set(LIBEI_FOUND true)
add_definitions(-DWINAPI_LIBEI=1)
set(LIBEI_INCLUDE_DIRS ${libei_src_dir}/src)
include_directories(${LIBEI_INCLUDE_DIRS})
else()
message(WARNING "Local libei not found")
endif()
endif()
endmacro()
macro(configure_libportal)
option(SYSTEM_LIBPORTAL "Use system libportal" ON)
if(SYSTEM_LIBPORTAL)
pkg_check_modules(LIBPORTAL QUIET "libportal >= ${LIBPORTAL_MIN_VERSION}")
if(LIBPORTAL_FOUND)
message(STATUS "libportal version: ${LIBPORTAL_VERSION}")
check_libportal()
else()
message(WARNING "libportal >= ${LIBPORTAL_MIN_VERSION} not found")
endif()
else()
set(libportal_bin_dir
${PROJECT_BINARY_DIR}/meson/subprojects/libportal/libportal)
set(libportal_src_dir ${PROJECT_SOURCE_DIR}/subprojects/libportal)
option(LIBPORTAL_STATIC "Use the static libportal binary" OFF)
if(LIBPORTAL_STATIC)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
endif()
find_library(
LIBPORTAL_LINK_LIBRARIES
NAMES portal
PATHS ${libportal_bin_dir}
NO_DEFAULT_PATH)
if(LIBPORTAL_LINK_LIBRARIES)
message(STATUS "Using local subproject libportal")
set(LIBPORTAL_FOUND true)
set(LIBPORTAL_INCLUDE_DIRS ${libportal_src_dir})
message(STATUS "libportal library file: ${LIBPORTAL_LINK_LIBRARIES}")
# HACK: Somehow `check_symbol_exists` doesn't pick up on the symbols even though
# they are actually there. Since we use master branch of libportal, for now we'll
# assume that the symbols are there.
set(HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS true)
set(HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL true)
set(HAVE_LIBPORTAL_INPUTCAPTURE true)
set(HAVE_LIBPORTAL_OUTPUT_NONE true)
else()
message(WARNING "Local libportal not found")
endif()
endif()
if(LIBPORTAL_FOUND)
add_definitions(-DWINAPI_LIBPORTAL=1)
include_directories(${LIBPORTAL_INCLUDE_DIRS})
endif()
endmacro()
# libportal 0.7 has xdp_session_connect_to_eis but it doesn't have remote desktop session restore or
# the inputcapture code, so let's check for explicit functions that bits depending on what we have
macro(check_libportal)
include(CMakePushCheckState)
include(CheckCXXSourceCompiles)
cmake_push_check_state(RESET)
set(CMAKE_REQUIRED_INCLUDES
"${CMAKE_REQUIRED_INCLUDES};${LIBPORTAL_INCLUDE_DIRS};${GLIB2_INCLUDE_DIRS}"
)
set(CMAKE_REQUIRED_LIBRARIES
"${CMAKE_REQUIRED_LIBRARIES};${LIBPORTAL_LINK_LIBRARIES};${GLIB2_LINK_LIBRARIES}"
)
check_symbol_exists(xdp_session_connect_to_eis "libportal/portal.h"
HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS)
check_symbol_exists(
xdp_portal_create_remote_desktop_session_full "libportal/portal.h"
HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL)
check_symbol_exists(xdp_input_capture_session_connect_to_eis
"libportal/inputcapture.h" HAVE_LIBPORTAL_INPUTCAPTURE)
# check_symbol_exists cant check for enum values
check_cxx_source_compiles(
"#include <libportal/portal.h>
int main() { XdpOutputType out = XDP_OUTPUT_NONE; }
" HAVE_LIBPORTAL_OUTPUT_NONE)
cmake_pop_check_state()
if(NOT HAVE_LIBPORTAL_SESSION_CONNECT_TO_EIS)
message(WARNING "xdp_session_connect_to_eis not found")
endif()
if(NOT HAVE_LIBPORTAL_CREATE_REMOTE_DESKTOP_SESSION_FULL)
message(WARNING "xdp_portal_create_remote_desktop_session_full not found")
endif()
if(NOT HAVE_LIBPORTAL_INPUTCAPTURE)
message(WARNING "xdp_input_capture_session_connect_to_eis not found")
endif()
if(NOT HAVE_LIBPORTAL_OUTPUT_NONE)
message(WARNING "XDP_OUTPUT_NONE not found")
endif()
endmacro()
#
# X.org/X11 for Linux, BSD, etc
#
@ -460,8 +318,6 @@ endmacro()
#
macro(configure_windows_libs)
configure_wintoast()
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")
@ -482,37 +338,8 @@ macro(configure_windows_libs)
/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()
configure_windows_openssl()
endmacro()
macro(configure_windows_openssl)
set(OPENSSL_ROOT_DIR ${PROJECT_SOURCE_DIR}/vcpkg_installed/x64-windows)
set(OPENSSL_EXE_DIR ${OPENSSL_ROOT_DIR}/tools/openssl)
if(EXISTS ${OPENSSL_EXE_DIR})
message(VERBOSE "OpenSSL exe dir: ${OPENSSL_EXE_DIR}")
add_definitions(-DOPENSSL_EXE_DIR="${OPENSSL_EXE_DIR}")
else()
message(FATAL_ERROR "OpenSSL exe dir not found: ${OPENSSL_EXE_DIR}")
endif()
if(EXISTS ${OPENSSL_ROOT_DIR})
message(VERBOSE "OpenSSL root dir: ${OPENSSL_ROOT_DIR}")
else()
message(FATAL_ERROR "OpenSSL root dir not found: ${OPENSSL_ROOT_DIR}")
endif()
endmacro()
macro(configure_python)
if(WIN32)
find_package(Python REQUIRED QUIET)
else()
find_package(Python3 REQUIRED QUIET)
endif()
endmacro()
macro(configure_qt)
@ -524,9 +351,6 @@ macro(configure_qt)
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)
@ -538,65 +362,12 @@ macro(configure_openssl)
set(OPENSSL_USE_STATIC_LIBS TRUE)
endif()
find_package(OpenSSL REQUIRED)
include_directories(${OPENSSL_INCLUDE_DIR})
endmacro()
macro(configure_gtest)
file(GLOB gtest_base_dir ${PROJECT_SOURCE_DIR}/subprojects/googletest-*)
if(gtest_base_dir)
set(DEFAULT_SYSTEM_GTEST OFF)
else()
set(DEFAULT_SYSTEM_GTEST ON)
endif()
# Arch Linux package maintainers:
# We do care about not bundling libs and didn't mean to cause upset. We made some mistakes
# and we're trying to put that right.
# The comment "They BUNDLE a fucking zip for cryptopp" in deskflow.git/PKGBUILD is only
# relevant to a very version of old the code, so the comment should probably be removed.
# If there are any problems like this in future, please do feel free send us a patch! :)
option(SYSTEM_GTEST "Use system GoogleTest" ${DEFAULT_SYSTEM_GTEST})
if(SYSTEM_GTEST)
message(VERBOSE "Using system GoogleTest")
find_package(GTest)
if(GTEST_FOUND)
# Ordinarily, we'd use GTEST_LIBRARIES, but it seems that these do not always export
# the required libraries (e.g. gmock) on some OS (e.g macOS with brew).
set(GTEST_LIB GTest::gtest)
set(GMOCK_LIB GTest::gmock)
else()
message(
FATAL_ERROR
"Google Test not found, re-configure with -DBUILD_TESTS=OFF or -DSYSTEM_GTEST=OFF"
)
endif()
else()
if(NOT EXISTS ${gtest_base_dir})
message(
FATAL_ERROR
"Google Test subproject not found, reconfigure with -DBUILD_TESTS=OFF"
)
endif()
message(VERBOSE "Using local GoogleTest")
set(gtest_dir ${gtest_base_dir}/googletest)
set(gmock_dir ${gtest_base_dir}/googlemock)
include_directories(${gtest_dir} ${gmock_dir} ${gtest_dir}/include
${gmock_dir}/include)
add_library(gtest STATIC ${gtest_dir}/src/gtest-all.cc)
add_library(gmock STATIC ${gmock_dir}/src/gmock-all.cc)
if(UNIX)
# Ignore noisy GoogleTest warnings
set_target_properties(gtest PROPERTIES COMPILE_FLAGS "-w")
set_target_properties(gmock PROPERTIES COMPILE_FLAGS "-w")
endif()
set(GTEST_LIB gtest)
set(GMOCK_LIB gmock)
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()
@ -639,80 +410,3 @@ macro(configure_coverage)
message(STATUS "Code coverage is disabled")
endif()
endmacro()
macro(configure_wintoast)
# WinToast is a pretty niche library, and there doesn't seem to be an installable package,
# so we rely on building from source.
file(GLOB WINTOAST_DIR ${PROJECT_SOURCE_DIR}/subprojects/WinToast-*)
if(WINTOAST_DIR)
set(HAVE_WINTOAST true)
add_definitions(-DHAVE_WINTOAST=1)
include_directories(${WINTOAST_DIR}/include)
else()
message(WARNING "Subproject 'WinToast' not found")
endif()
endmacro()
macro(configure_tomlplusplus)
file(GLOB tomlplusplus_dir ${PROJECT_SOURCE_DIR}/subprojects/tomlplusplus-*)
if(tomlplusplus_dir)
set(DEFAULT_SYSTEM_TOMLPLUSPLUS OFF)
else()
set(DEFAULT_SYSTEM_TOMLPLUSPLUS ON)
endif()
option(SYSTEM_TOMLPLUSPLUS "Use system tomlplusplus"
${DEFAULT_SYSTEM_TOMLPLUSPLUS})
if(SYSTEM_TOMLPLUSPLUS)
message(VERBOSE "Using system tomlplusplus")
find_package(tomlplusplus)
if(tomlplusplus_FOUND)
message(STATUS "tomlplusplus version: ${tomlplusplus_VERSION}")
else()
message(WARNING "System tomlplusplus not found")
endif()
else()
if(EXISTS ${tomlplusplus_dir})
message(VERBOSE "Using local tomlplusplus")
set(HAVE_TOMLPLUSPLUS true)
add_definitions(-DHAVE_TOMLPLUSPLUS=1)
include_directories(${tomlplusplus_dir}/include)
else()
message(WARNING "Local tomlplusplus subproject not found")
endif()
endif()
endmacro()
macro(configure_cli11)
file(GLOB cli11_dir ${PROJECT_SOURCE_DIR}/subprojects/CLI11-*)
if(cli11_dir)
set(DEFAULT_SYSTEM_CLI11 OFF)
else()
set(DEFAULT_SYSTEM_CLI11 ON)
endif()
option(SYSTEM_CLI11 "Use system CLI11" ${DEFAULT_SYSTEM_CLI11})
if(SYSTEM_CLI11)
message(VERBOSE "Using system CLI11")
find_package(CLI11)
if(CLI11_FOUND)
message(STATUS "CLI11 version: ${CLI11_VERSION}")
else()
message(WARNING "System CLI11 not found")
endif()
else()
if(EXISTS ${cli11_dir})
message(VERBOSE "Using local CLI11")
set(HAVE_CLI11 true)
add_definitions(-DHAVE_CLI11=1)
include_directories(${cli11_dir}/include)
else()
message(WARNING "Local CLI11 subproject not found at: ${cli11_dir}")
endif()
endif()
endmacro()

View File

@ -1,33 +1,31 @@
# 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/>.
# 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 "Mouse and keyboard sharing utility")
set(CPACK_PACKAGE_VENDOR ${DESKFLOW_AUTHOR_NAME})
set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME})
set(CPACK_PACKAGE_CONTACT "Deskflow <maintainers@deskflow.org>")
set(CPACK_PACKAGE_DESCRIPTION ${CMAKE_PROJECT_DESCRIPTION})
set(CPACK_PACKAGE_VENDOR "Deskflow")
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")
@ -36,8 +34,12 @@ macro(configure_packaging)
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")
@ -50,10 +52,7 @@ endmacro()
#
macro(configure_windows_packaging)
message(VERBOSE "Configuring Windows installer")
set(CPACK_PACKAGE_VERSION ${DESKFLOW_VERSION_MS})
set(QT_PATH $ENV{CMAKE_PREFIX_PATH})
cmake_path(SET QT_PATH NORMALIZE "${Qt6_DIR}../../")
set(DESKFLOW_MSI_64_GUID
"027D1C8A-E7A5-4754-BB93-B2D45BFDBDC8"
@ -63,9 +62,17 @@ macro(configure_windows_packaging)
"8F57C657-BC87-45E6-840E-41242A93511C"
CACHE STRING "GUID for 32-bit MSI installer")
configure_files(${PROJECT_SOURCE_DIR}/res/dist/wix
configure_files(${PROJECT_SOURCE_DIR}/deploy/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()
#
@ -73,36 +80,99 @@ endmacro()
#
macro(configure_mac_packaging)
message(VERBOSE "Configuring macOS app bundle")
set(CPACK_PACKAGE_VERSION ${DESKFLOW_VERSION})
set(CMAKE_INSTALL_RPATH
"@loader_path/../Libraries;@loader_path/../Frameworks")
set(DESKFLOW_BUNDLE_SOURCE_DIR
${PROJECT_SOURCE_DIR}/res/dist/mac/bundle
${PROJECT_SOURCE_DIR}/deploy/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_DIR ${PROJECT_BINARY_DIR}/bundle/Deskflow.app)
set(DESKFLOW_BUNDLE_BINARY_DIR ${DESKFLOW_BUNDLE_DIR}/Contents/MacOS)
configure_files(${DESKFLOW_BUNDLE_SOURCE_DIR} ${DESKFLOW_BUNDLE_DIR})
file(RENAME ${DESKFLOW_BUNDLE_DIR}/Contents/Resources/App.icns
${DESKFLOW_BUNDLE_DIR}/Contents/Resources/${DESKFLOW_APP_NAME}.icns)
set(OS_STRING "macos-${CMAKE_SYSTEM_PROCESSOR}")
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)
message(VERBOSE "Configuring Linux packaging")
# Gather distro info
# This is used in package names
configure_linux_package_name()
set(CPACK_PACKAGE_VERSION ${DESKFLOW_VERSION_LINUX})
set(CPACK_GENERATOR "DEB;RPM;TGZ")
set(CPACK_DEBIAN_PACKAGE_MAINTAINER ${DESKFLOW_MAINTAINER})
set(CPACK_DEBIAN_PACKAGE_SECTION "utils")
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS ON)
@ -114,33 +184,6 @@ macro(configure_linux_packaging)
# 12), so we must add it manually.
set(CPACK_DEBIAN_PACKAGE_DEPENDS "qt6-qpa-plugins")
# The default for CMake seems to be /usr/local, which seems uncommon. While
# the default /usr/local prefix causes the app to appear on Debian and Fedora,
# it doesn't seem to appear on Arch Linux. Setting the prefix to /usr seems to
# work on a wider variety of distros, and that also seems to be where most
# apps install to.
set(CMAKE_INSTALL_PREFIX /usr)
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()
#
@ -184,3 +227,9 @@ macro(configure_files srcDir destDir)
endforeach(templateFile)
endmacro(configure_files)
macro(check_is_rpm)
# Check if RPM-like.
endmacro()

View File

@ -1,94 +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/>.
# Either get the version number from the environment or from the VERSION file.
# On Windows, we also set a special 4-digit MSI version number.
macro(set_version)
set(DESKFLOW_VERSION $ENV{DESKFLOW_VERSION})
string(STRIP "${DESKFLOW_VERSION}" DESKFLOW_VERSION)
if(NOT DESKFLOW_VERSION)
file(READ "${PROJECT_SOURCE_DIR}/VERSION" DESKFLOW_VERSION)
string(STRIP "${DESKFLOW_VERSION}" DESKFLOW_VERSION)
endif()
message(STATUS "Version number (semver): " ${DESKFLOW_VERSION})
add_definitions(-DDESKFLOW_VERSION="${DESKFLOW_VERSION}")
# Useful for copyright (e.g. in macOS bundle .plist.in and Windows version .rc
# file)
string(TIMESTAMP DESKFLOW_BUILD_YEAR "%Y")
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set_windows_version()
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
set_linux_version()
endif()
endmacro()
macro(set_four_part_version)
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ "${DESKFLOW_VERSION}")
set(VERSION_MAJOR "${CMAKE_MATCH_1}")
set(VERSION_MINOR "${CMAKE_MATCH_2}")
set(VERSION_PATCH "${CMAKE_MATCH_3}")
# Find the revision number, which is the number after the 'r'.
string(REGEX MATCH "r([0-9]+)$" _ "${DESKFLOW_VERSION}")
set(VERSION_REVISION "${CMAKE_MATCH_1}")
if(NOT VERSION_REVISION)
set(VERSION_REVISION "0")
endif()
set(DESKFLOW_VERSION_FOUR_PART
"${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_REVISION}")
endmacro()
# MSI requires a 4-digit number and doesn't accept semver.
macro(set_windows_version)
set_four_part_version()
# Dot-separated version number for MSI and Windows version .rc file.
set(DESKFLOW_VERSION_MS ${DESKFLOW_VERSION_FOUR_PART})
message(VERBOSE "Version number for (Microsoft 4-part): "
${DESKFLOW_VERSION_MS})
# CSV version number for Windows version .rc file.
set(DESKFLOW_VERSION_MS_CSV
"${VERSION_MAJOR},${VERSION_MINOR},${VERSION_PATCH},${VERSION_REVISION}")
message(VERBOSE "Version number for (Microsoft CSV): "
${DESKFLOW_VERSION_MS_CSV})
endmacro()
macro(set_linux_version)
# Replace the first occurrence of '-' with '~' for Linux versioning; the '-'
# char is reserved for use at at the end of the version string to indicate a
# package revision. Debian has always used this convention, but support for
# this was also introduced in RPM 4.10.0.
string(REGEX REPLACE "-" "~" DESKFLOW_VERSION_LINUX "${DESKFLOW_VERSION}")
message(STATUS "Version number (DEB/RPM): ${DESKFLOW_VERSION_LINUX}")
# Arch does not support SemVer or DEB/RPM version format, so use the four-part
# version format which funnily enough is what Microsoft requires for MSI.
set_four_part_version()
message(STATUS "Version number (4-part): ${DESKFLOW_VERSION_FOUR_PART}")
endmacro()

View File

@ -1,205 +0,0 @@
config:
windows:
dependencies:
# We only run `choco` when not in CI env because it's pretty unreliable and slow.
# The Chocolatey mirror cannot be 100% reliable (according to docs) so it will often fail
# with an error `503 (Service Unavailable: Back-end server is at capacity)` which causes
# the nightly CI to fail intermittently.
command-elevated: if not defined CI (choco install Chocolatey.config -y)
# We only run `winget` when not in CI env; it's not available on the GitHub Windows runner.
# It's simpler to solve dependencies like Ninja with a GitHub workflow action, and cmake is
# already installed on the Windows runner.
command: if not defined CI (winget install ninja-build.ninja cmake)
qt:
version: 6.7.2
mirror: https://qt.mirror.constant.com/
base-dir: ./deps/qt
mac:
dependencies:
command: brew bundle --file=Brewfile
qt:
version: 6.7.2
mirror: https://qt.mirror.constant.com/
base-dir: ./deps/qt
linux:
debian: &debian
dependencies:
command-pre: sudo apt-get update
command: |
sudo apt-get install -y \
cmake \
make \
ninja-build \
g++ \
file \
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 \
libei-dev \
libportal-dev \
libtomlplusplus-dev \
libcli11-dev
optional: [libei-dev, libportal-dev, libtomlplusplus-dev]
linuxmint:
<<: *debian
ubuntu:
<<: *debian
fedora: &fedora
dependencies: &fedora_deps
command-pre: sudo dnf check-update
command: |
sudo 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 \
libei-devel \
libportal-devel \
tomlplusplus-devel \
cli11-devel
optional: [libei-devel, libportal-devel]
# RHEL is not actually supported yet, since it doesn't have Qt6 libs.
# We simply use it as a base for Alma Linux and Rocky Linux.
rhel: &rhel
<<: *fedora
dependencies: &rhel_deps
<<: *fedora_deps
command-pre: |
sudo dnf check-update;
sudo dnf install -y epel-release;
dnf config-manager --set-enabled crb
rocky:
<<: *rhel
dependencies:
<<: *rhel_deps
almalinux:
<<: *rhel
dependencies:
<<: *rhel_deps
opensuse-tumbleweed: &opensuse-tumbleweed
dependencies:
command-pre: sudo zypper refresh
command: sudo 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 \
libportal-devel \
tomlplusplus-devel \
cli11-devel
arch: &arch
dependencies:
command: sudo pacman -Syu --noconfirm \
base-devel \
cmake \
ninja \
gcc \
openssl \
glib2 \
gdk-pixbuf2 \
libxtst \
libnotify \
libxkbfile \
gtest \
pugixml \
libei \
libportal \
qt6-base \
qt6-tools \
gtk3 \
tomlplusplus \
cli11
manjaro:
<<: *arch
subprojects:
libei:
dependencies:
debian: &debian_libei |
sudo apt-get install -y \
python3-attr \
python3-jinja2 \
libsystemd-dev &&
pip install attrs jinja2
ubuntu: *debian_libei
linuxmint: *debian_libei
fedora: &fedora_libei |
sudo dnf install -y \
python3-attrs \
python3-jinja2 \
systemd-devel &&
pip install attrs jinja2
rhel: *fedora_libei
rocky: *fedora_libei
almalinux: *fedora_libei
libportal:
dependencies:
debian: &debian_libportal |
sudo apt-get install -y \
python3-dbusmock \
python3-pytest \
valac \
protobuf-c-compiler \
protobuf-compiler \
libglib2.0 \
libgtk-3-dev \
libprotobuf-c-dev \
libsystemd-dev \
libgirepository1.0-dev
ubuntu: *debian_libportal
linuxmint: *debian_libportal

View File

@ -7,13 +7,14 @@
"aqtinstall",
"Axelson",
"Breen",
"cmakelang",
"codesign",
"codesigning",
"Compat",
"contribs",
"Daun",
"Devs",
"Deskflow",
"distro",
"distros",
"dmgbuild",
"dotenv",
@ -31,6 +32,7 @@
"Kanapickas",
"keychain",
"Keychains",
"Kitware",
"Kutytska",
"Lanz",
"libei",
@ -49,18 +51,22 @@
"pacman",
"Petroules",
"Pixmap",
"Pointee",
"Poschta",
"Povilas",
"Priddy",
"psutil",
"pyproject",
"qputenv",
"readf",
"Regen",
"Repology",
"Rizzitello",
"runas",
"Sbârnea",
"Schoeneman",
"Serhii",
"shemp",
"Sorin",
"subproject",
"subprojects",
@ -68,12 +74,14 @@
"Trixie",
"unittests",
"Valgrind",
"vbuffer",
"vcpkg",
"venv",
"vmactions",
"Volker",
"whot",
"winget",
"writef",
"XWINDOWS"
],
"ignoreWords": [],

41
deploy/CMakeLists.txt Normal file
View File

@ -0,0 +1,41 @@
# SPDX-FileCopyrightText: 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
# Handle Pre install Items
if(WIN32)
# Configure the windows version rc file
configure_file(
${CMAKE_CURRENT_LIST_DIR}/version.rc.in
${PROJECT_BINARY_DIR}/src/version.rc @ONLY
)
elseif(NOT APPLE)
# Install our desktop file
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/org.deskflow.deskflow.desktop
DESTINATION share/applications
)
# Install our icon
install(
FILES ${CMAKE_CURRENT_LIST_DIR}/deskflow.png
DESTINATION share/icons/hicolor/512x512/apps/
RENAME org.deskflow.deskflow.png
)
# Install our metainfo
install(
FILES ${CMAKE_CURRENT_SOURCE_DIR}/org.deskflow.deskflow.metainfo.xml
DESTINATION share/metainfo/
)
# Prepare PKGBUILD for Arch Linux
configure_file(
${CMAKE_CURRENT_LIST_DIR}/dist/arch/PKGBUILD.in
${CMAKE_BINARY_DIR}/PKGBUILD
@ONLY
)
endif()

BIN
deploy/deskflow.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -1,11 +1,11 @@
# Maintainer: @DESKFLOW_MAINTAINER@
# Maintainer: Deskflow Developers
pkgname=@DESKFLOW_APP_ID@
pkgver=@DESKFLOW_VERSION_FOUR_PART@
pkgname=deskflow
pkgver=@DESKFLOW_VERSION@
pkgrel=1
pkgdesc="Mouse and keyboard sharing utility"
url='@DESKFLOW_WEBSITE_URL@'
arch=('x86_64')
url='https://deskflow.org'
arch=('i686' 'x86_64' 'armv6h' 'armv7h' 'aarch64')
license=('GPL-2.0-only')
depends=(
'gcc-libs'
@ -20,10 +20,13 @@ depends=(
'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')
@ -31,7 +34,7 @@ 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 run `make install` with the root Makefile.
# everything, we need to set DESTDIR.
cd $startdir
make install DESTDIR=$pkgdir
DESTDIR=$pkgdir cmake --install .
}

View File

@ -0,0 +1,115 @@
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/debug
- /lib/girepository-1.0
modules:
- name: python3-attrs
buildsystem: simple
build-commands:
- pip3 install --verbose --exists-action=i --no-index --find-links="file://${PWD}"
--prefix=${FLATPAK_DEST} --no-build-isolation attrs
sources:
- type: file
url: https://files.pythonhosted.org/packages/e0/44/827b2a91a5816512fcaf3cc4ebc465ccd5d598c45cefa6703fcf4a79018f/attrs-23.2.0-py3-none-any.whl
sha256: 99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1
cleanup:
- '*'
- 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.3.0
commit: 997b7c0f37faea4f8bae59613c8f27370925d5b0
- 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.8.1
commit: 26c15008cbe579f57f89468384f8efc033f25f6f
- name: puixml
buildsystem: cmake-ninja
sources:
- type: git
url: https://github.com/zeux/pugixml
tag: v1.14
commit: db78afc2b7d8f043b4bc6b185635d949ea2ed2a8
- 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

@ -4,27 +4,27 @@
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>@DESKFLOW_APP_NAME@</string>
<string>Deskflow</string>
<key>CFBundleExecutable</key>
<string>@DESKFLOW_APP_ID@</string>
<string>deskflow</string>
<key>CFBundleIconFile</key>
<string>@DESKFLOW_APP_NAME@.icns</string>
<string>Deskflow.icns</string>
<key>CFBundleIdentifier</key>
<string>@DESKFLOW_APP_ID@</string>
<string>org.deskflow.deskflow</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>@DESKFLOW_APP_NAME@</string>
<string>Deskflow</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>@DESKFLOW_MAC_BUNDLE_CODE@</string>
<string>DFLW</string>
<key>CFBundleShortVersionString</key>
<string>@DESKFLOW_VERSION@</string>
<key>CFBundleVersion</key>
<string>@DESKFLOW_VERSION@</string>
<key>NSHumanReadableCopyright</key>
<string>© 2012-@DESKFLOW_BUILD_YEAR@ Symless Ltd</string>
<string>© 2024 Deskflow Developers</string>
<key>LSMinimumSystemVersion</key>
<string>10.9.0</string>
</dict>

View File

@ -0,0 +1 @@
APPLDFLW

View File

@ -7,7 +7,7 @@
<Fragment>
<UI Id="AppWelcome">
<Property Id="AppWelcomeBackground">welcome_background</Property>
<Binary Id="welcome_background" SourceFile="$(var.ResDir)\dist\wix\images\welcome_background.png"/>
<Binary Id="welcome_background" SourceFile="$(var.DeployResDir)\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)">

View File

@ -1,30 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define AppId="@DESKFLOW_APP_ID@"?>
<?define Name="@DESKFLOW_APP_NAME@"?>
<?define Version="@DESKFLOW_VERSION_MS@"?>
<?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"?>
<?define LegacyBin="@LEGACY_BINARY_NAME@.exe"?>
</Include>
<?xml version="1.0" encoding="utf-8"?>
<Include>
<?define AppId="deskflow"?>
<?define Name="Deskflow"?>
<?define Version="@DESKFLOW_VERSION@"?>
<?define Author="Deskflow"?>
<?define BinDir="@CMAKE_RUNTIME_OUTPUT_DIRECTORY@"?>
<?define ProjectIcon="@CMAKE_SOURCE_DIR@/src/gui/src/deskflow.ico"?>
<?define DeployResDir="@CMAKE_SOURCE_DIR@/deploy"?>
<?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="deskflow.exe"?>
<?define ServerBin="deskflow-server.exe"?>
<?define ClientBin="deskflow-client.exe"?>
<?define CoreBin="deskflow-core.exe"?>
<?define DaemonBin="deskflow-daemon.exe"?>
</Include>

View File

@ -1,154 +1,166 @@
<?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>
<File Source="$(var.BinDir)/$(var.LegacyBin)" />
<?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)\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)\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>
<?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.DeployResDir)\dist\wix\msm\Microsoft_VC142_CRT_x64.msm" DiskId="1" Language="0"/>
<?else ?>
<Merge Id="VC_Redist" SourceFile="$(var.DeployResDir)\dist\wix\msm\Microsoft_VC142_CRT_x86.msm" DiskId="1" Language="0"/>
<?endif ?>
</DirectoryRef>
<Property Id="CommonBackground">CommonBackground</Property>
<Binary Id="CommonBackground" SourceFile="$(var.DeployResDir)\dist\wix\images\common_background.png"/>
<Icon Id="AppIcon" SourceFile="$(var.ProjectIcon)"/>
<WixVariable Id="WixUIBannerBmp" Value="$(var.DeployResDir)\dist\wix\images\banner.png"/>
<WixVariable Id="WixUIDialogBmp" Value="$(var.DeployResDir)\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.ProjectIcon)"/>
</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>

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 154 KiB

View File

@ -1,11 +1,10 @@
[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,260 @@
<?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_name>Deskflow Developers</developer_name>
<summary>Software Keyboard and mouse sharing</summary>
<description>
<p>
Use your keyboard and mouse to control other machines on the network or be controle
</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://github.com/user-attachments/assets/883660dc-f3f5-4b69-8821-a079a58d3882</image>
</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.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-7" urgency="high">
<description>
<p>This stable Release Has a very long chagelog 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>

View File

@ -10,16 +10,16 @@ https://learn.microsoft.com/en-us/windows/win32/menurc/versioninfo-resource?redi
#define VER_FILEVERSION_STR "@DESKFLOW_VERSION_MS@\0"
#define VER_PRODUCTVERSION @DESKFLOW_VERSION_MS_CSV@
#define VER_PRODUCTVERSION_STR "@DESKFLOW_VERSION_MS@\0"
#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 "Copyright (C) Symless Ltd. @DESKFLOW_BUILD_YEAR@\0"
#define VER_COMPANYNAME_STR "Deskflow\0"
#define VER_FILEDESCRIPTION_STR "Deskflow\0"
#define VER_INTERNALNAME_STR "Deskflow\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"
#define VER_PRODUCTNAME_STR "Deskflow\0"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION

31
doc/CMakeLists.txt Normal file
View File

@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: 2019 - 2024 Chris Rizzitello <sithlord48@gmail.com>
# SPDX-License-Identifier: MIT
find_package(Doxygen QUIET)
option(BUILD_DOCS "Build and install documents" ${DOXYGEN_FOUND})
if (BUILD_DOCS AND DOXYGEN_FOUND)
set(DOXYGEN_EXTRACT_ALL YES)
set(DOXYGEN_STRIP_FROM_PATH ${CMAKE_SOURCE_DIR})
set(DOXYGEN_USE_MDFILE_AS_MAINPAGE mainpage.md)
set(DOXYGEN_QUIET YES)
# Files used to make our documents
# User facing documents will not include doxy comments in source code
doxygen_add_docs(user-docs ${CMAKE_SOURCE_DIR}/doc COMMENT "Generating user documentation" ALL)
# HACK Only these will show in your IDE
target_sources(user-docs PRIVATE
mainpage.md
configuration.md
)
install(
DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/html"
DESTINATION ${CMAKE_INSTALL_DOCDIR}
COMPONENT deskflow_docs)
else()
message(STATUS "Doxygen not found, skipping docs build")
endif()

168
doc/configuration.md Normal file
View File

@ -0,0 +1,168 @@
# Server Config Examples
The `deskflow-server` command accepts the `-c` or `--config` option, which takes one argument,
the path to a server configuration file. The format is non-standard but similar to YAML.
Comments begin with the `#` character and continue to the end of line.
Comments may appear anywhere the syntax permits.
Each `section` element must have a matching `end` element.
## Stacked Example
Stack one computer's screen on top of another's.
```
# +-------+
# | curly |
# | |
# +-------+
# +-------+ +-------+
# | moe | | larry |
# | | | |
# +-------+ +-------+
section: screens
# three hosts named: moe, larry, and curly
moe:
larry:
curly:
end
section: links
# larry is to the right of moe and curly is above moe.
moe:
right = larry
up = curly
# moe is to the left of larry and curly is above larry.
larry:
left = moe
up = curly
# larry is below curly.
curly:
down = larry
end
section: aliases
# curly is also known as shemp
curly:
shemp
end
```
## Horizontal Example
Align all screens horizontally.
```
# +-------+ +-------+ +-------+
# | moe | | larry | | curly |
# | | | | | |
# +-------+ +-------+ +-------+
section: screens
# three hosts named: moe, larry, and curly
moe:
larry:
curly:
end
section: links
# curly is to the right of larry and moe is to the left of larry.
larry:
right = curly
left = moe
# larry is to the right of moe.
moe:
right = larry
# larry is to the left of curly.
curly:
left = larry
end
```
## Span Example
Span two screens on one computer across the screens of two computers.
```
# +-------+ +-------+
# | curly | | curly |
# | | | |
# +-------+ +-------+
# +-------+ +-------+
# | moe | | larry |
# | | | |
# +-------+ +-------+
section: screens
# three hosts named: moe, larry, and curly
moe:
larry:
curly:
end
section: links
# larry is to the right of moe and curly is above moe.
moe:
right = larry
up = curly
# moe is to the left of larry and curly is above larry.
larry:
left = moe
up = curly
# larry is below curly.
curly:
down = larry
end
```
# Example file for `--config-toml` arg
```
[server.args]
no-daemon = true
no-tray = true
debug = "DEBUG"
name = "moe"
address = ":24800"
[client.args]
no-daemon = true
no-tray = true
debug = "DEBUG2"
name = "larry"
_last = "moe:24800"
```
# Example `.env` file
```
#
# App
#
# Shows the test menu in the GUI (on by default in debug mode)
# DESKFLOW_TEST_MENU=true
# Version checker URL to use (useful for testing)
# DESKFLOW_VERSION_URL="https://api.deskflow.org/version?fake=1.100.0"
# Enable debug logging in the GUI (on by default in debug mode)
# DESKFLOW_GUI_DEBUG=true
# Enable verbose logging in the GUI (always off by default)
# DESKFLOW_GUI_VERBOSE=true
# Reset all settings and delete all data on startup
# DESKFLOW_RESET_ALL=true
```

View File

@ -1,37 +0,0 @@
# sample deskflow configuration file
#
# comments begin with the # character and continue to the end of
# line. comments may appear anywhere the syntax permits.
section: screens
# three hosts named: moe, larry, and curly
moe:
larry:
curly:
end
section: links
# larry is to the right of moe and curly is above moe
moe:
right = larry
up = curly
# moe is to the left of larry and curly is above larry.
# note that curly is above both moe and larry and moe
# and larry have a symmetric connection (they're in
# opposite directions of each other).
larry:
left = moe
up = curly
# larry is below curly. if you move up from moe and then
# down, you'll end up on larry.
curly:
down = larry
end
section: aliases
# curly is also known as shemp
curly:
shemp
end

View File

@ -1,55 +0,0 @@
# sample deskflow configuration file
#
# comments begin with the # character and continue to the end of
# line. comments may appear anywhere the syntax permits.
# This example uses 3 computers. A laptop and two desktops (one a mac)
# They are arranged in the following configuration with Desktop1 acting as the server
# Desktop 2 has 3 screens arranged around desktop1
#
# +--------+ +---------+
# |Desktop2| |Desktop2 |
# | | | |
# +--------+ +---------+
# +-------+ +--------+ +---------+
# |Laptop | |Desktop1| |Desktop2 |
# | | | | | |
# +-------+ +--------+ +---------+
#
# The laptop comes and goes but that doesn't really affect this configuration
# The screens section is for the logical or short name of the computers
section: screens
# three computers that are logically named: desktop1, desktop2, and laptop
desktop1:
desktop2:
laptop:
end
section: links
# larry is to the right of moe and curly is above moe
moe:
right = larry
up = curly
# moe is to the left of larry and curly is above larry.
# note that curly is above both moe and larry and moe
# and larry have a symmetric connection (they're in
# opposite directions of each other).
larry:
left = moe
up = curly
# larry is below curly. if you move up from moe and then
# down, you'll end up on larry.
curly:
down = larry
end
# The aliases section is to map the full names of the computers to their logical names used in the screens section
# One way to find the actual name of a comptuer is to run hostname from a command window
section: aliases
# Laptop is actually known as John-Smiths-MacBook-3.local
desktop2:
John-Smiths-MacBook-3.local
end

View File

@ -1,39 +0,0 @@
# sample deskflow configuration file
#
# comments begin with the # character and continue to the end of
# line. comments may appear anywhere the syntax permits.
# +-------+ +--------+ +---------+
# |Laptop | |Desktop1| |iMac |
# | | | | | |
# +-------+ +--------+ +---------+
section: screens
# three hosts named: Laptop, Desktop1, and iMac
# These are the nice names of the hosts to make it easy to write the config file
# The aliases section below contain the "actual" names of the hosts (their hostnames)
Laptop:
Desktop1:
iMac:
end
section: links
# iMac is to the right of Desktop1
# Laptop is to the left of Desktop1
Desktop1:
right = iMac
left = Laptop
# Desktop1 is to the right of Laptop
Laptop:
right = Desktop1
# Desktop1 is to the left of iMac
iMac:
left = Desktop1
end
section: aliases
# The "real" name of iMac is John-Smiths-iMac-3.local. If we wanted we could remove this alias and instead use John-Smiths-iMac-3.local everywhere iMac is above. Hopefully it should be easy to see why using an alias is nicer
iMac:
John-Smiths-iMac-3.local
end

16
doc/mainpage.md Normal file
View File

@ -0,0 +1,16 @@
![Deskflow](https://github.com/user-attachments/assets/f005b958-24df-4f4a-9bfd-4f834dae59d6)
**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,
and work seamlessly between them.
## Configuration
Our [Configuration] page has example configurations
## More info
For more info, see our [Wiki](https://github.com/deskflow/deskflow/wiki).
[Configuration]:configuration.md

View File

@ -1,56 +0,0 @@
# For now, we're only using Meson to resolve dependencies. CMake is called separately.
# In future, we may completely replace CMake with Meson.
# Where available, we use system packages, otherwise we use subprojects.
# Subprojects are also used to get the latest version during development.
project('deskflow', 'cpp')
if host_machine.system() == 'windows'
subproject('wintoast')
endif
system_tomlplusplus = get_option('system-tomlplusplus')
if system_tomlplusplus
dependency('tomlplusplus', required: false)
else
subproject('tomlplusplus')
endif
system_cli11 = get_option('system-cli11')
if system_cli11
dependency('cli11', required: false)
else
subproject('cli11')
endif
system_gtest = get_option('system-gtest')
if system_gtest
dependency('gtest', required: false)
else
subproject('gtest')
endif
if host_machine.system() == 'linux'
system_libei = get_option('system-libei')
if system_libei
dependency('libei-1.0', required: false)
else
# Using the subproject is only useful for development; it's not intended for normal use.
# GNOME46 or above is required as this has the required bits for libei.
# Building on anything older is pointless as you won't be able to actually connect to anything.
subproject('libei', default_options: ['tests=disabled', 'liboeffis=disabled'])
endif
system_libportal = get_option('system-libportal')
if system_libportal
dependency('libportal', required: false)
else
# Using the subproject is only useful for development; it's not intended for normal use.
subproject('libportal', default_options: [
'docs=false',
'backend-gtk3=enabled',
'backend-qt6=disabled'
])
endif
endif

View File

@ -1,5 +0,0 @@
option('system-gtest', type: 'boolean', value: true, description: 'Use system gtest')
option('system-libportal', type: 'boolean', value: true, description: 'Use system libportal')
option('system-libei', type: 'boolean', value: true, description: 'Use system libei')
option('system-tomlplusplus', type: 'boolean', value: true, description: 'Use system tomlplusplus')
option('system-cli11', type: 'boolean', value: true, description: 'Use system cli11')

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,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 +0,0 @@
APPL@DESKFLOW_MAC_BUNDLE_CODE@

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 450 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 926 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 693 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

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