diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 5a9116636..a41968983 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -12,7 +12,7 @@ concurrency: cancel-in-progress: true jobs: - codeql-analysis: + analyze: name: Analyze runs-on: ubuntu-latest diff --git a/.github/workflows/job-test-linux-ubuntu.yml b/.github/workflows/job-test-linux-ubuntu.yml index 24a738728..edd75f27b 100644 --- a/.github/workflows/job-test-linux-ubuntu.yml +++ b/.github/workflows/job-test-linux-ubuntu.yml @@ -24,12 +24,8 @@ jobs: distro: - "22.04" - "20.04" - - "18.04" flag: - "-j" - include: - - distro: "16.04" - flag: "-j1" steps: - name: Checkout git repo diff --git a/.github/workflows/job-test-windows.yml b/.github/workflows/job-test-windows.yml index 69dd59775..89c9d471c 100644 --- a/.github/workflows/job-test-windows.yml +++ b/.github/workflows/job-test-windows.yml @@ -18,9 +18,9 @@ jobs: GIT_COMMIT: ${{ github.sha }} BONJOUR_BASE_DIR: ${{ github.workspace }}\deps\bonjour QT_BASE_DIR: ${{ github.workspace }}\deps\Qt - QT_VERSION: 5.12.6 + QT_VERSION: 5.15.2 QT_BASE_URL: http://qt.mirror.constant.com/ - QT_LIB_DIR: ${{ github.workspace }}\deps\Qt\5.12.6 + QT_LIB_DIR: ${{ github.workspace }}\deps\Qt\5.15.2 steps: - name: Checkout git repo @@ -39,8 +39,8 @@ jobs: if: steps.cache-qt.outputs.cache-hit != 'true' run: | pip install aqtinstall - python -m aqt install --outputdir $env:QT_BASE_DIR --base $env:QT_BASE_URL $env:QT_VERSION windows desktop win64_msvc2017_64 - cd $env:QT_LIB_DIR\msvc2017_64 + python -m aqt install --outputdir $env:QT_BASE_DIR --base $env:QT_BASE_URL $env:QT_VERSION windows desktop win64_msvc2019_64 + cd $env:QT_LIB_DIR\msvc2019_64 dir - name: Cache Bonjour @@ -66,7 +66,7 @@ jobs: - name: Build env: - CMAKE_PREFIX_PATH: "${{ env.QT_LIB_DIR }}\\msvc2017_64\\" + CMAKE_PREFIX_PATH: "${{ env.QT_LIB_DIR }}\\msvc2019_64\\" run: | mkdir build cd build diff --git a/.gitignore b/.gitignore index 3cfd0dd6c..612af41f5 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,5 @@ flatpak/build flatpak/export flatpak/synergy.desktop flatpak/*.flatpak +*.code-workspace +*.idx diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 000000000..ffcf81391 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,7 @@ +{ + "recommendations": [ + "ms-vscode.cmake-tools", + "twxs.cmake", + "llvm-vs-code-extensions.vscode-clangd" + ] +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 000000000..ec81b42bc --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,13 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cmake", + "label": "build", + "command": "build", + "targets": ["all"], + "preset": "${command:cmake.activeBuildPresetName}", + "group": "build" + } + ] +} diff --git a/CMakeLists.txt b/CMakeLists.txt index 467523f0a..5688283b4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,9 +14,18 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -cmake_minimum_required (VERSION 3.4) +cmake_minimum_required (VERSION 3.5) project (synergy-core C CXX) +# use response files so that ninja can compile on windows, +# otherwise you get an error when linking qt: +# "The input line is too long." +set(CMAKE_C_USE_RESPONSE_FILE_FOR_OBJECTS 1) +set(CMAKE_CXX_USE_RESPONSE_FILE_FOR_OBJECTS 1) +set(CMAKE_C_RESPONSE_FILE_LINK_FLAG "@") +set(CMAKE_CXX_RESPONSE_FILE_LINK_FLAG "@") +set(CMAKE_NINJA_FORCE_RESPONSE_FILE 1 CACHE INTERNAL "") + if (DEFINED ENV{SYNERGY_NO_LEGACY}) option (SYNERGY_BUILD_LEGACY_GUI "Build the legacy GUI" OFF) option (SYNERGY_BUILD_LEGACY_INSTALLER "Build the legacy installer" OFF) @@ -50,7 +59,7 @@ else() option (SYNERGY_BUSINESS "Build Business" OFF) endif() -set (CMAKE_CXX_STANDARD 14) +set (CMAKE_CXX_STANDARD 20) set (CMAKE_CXX_EXTENSIONS OFF) set (CMAKE_CXX_STANDARD_REQUIRED ON) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") @@ -90,8 +99,6 @@ else() set (SYNERGY_ADD_HEADERS TRUE) endif() - - set (libs) include_directories (BEFORE SYSTEM ${PROJECT_SOURCE_DIR}/ext/googletest/googletest/include) @@ -325,6 +332,7 @@ if (UNIX) endif() elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows") + 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") @@ -337,6 +345,7 @@ elseif (${CMAKE_SYSTEM_NAME} MATCHES "Windows") /DSYNERGY_VERSION=\"${SYNERGY_VERSION}\" /D_XKEYCHECK_H ) + endif() # diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 000000000..45dd3d5d3 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,32 @@ +{ + "version": 2, + "configurePresets": [ + { + "name": "windows", + "displayName": "Windows", + "generator": "Ninja", + "binaryDir": "${sourceDir}/build", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Debug", + "CMAKE_C_COMPILER": "cl.exe", + "CMAKE_CXX_COMPILER": "cl.exe", + "CMAKE_EXPORT_COMPILE_COMMANDS": "ON" + }, + "architecture": { + "value": "x64", + "strategy": "external" + }, + "toolset": { + "value": "host=x64", + "strategy": "external" + } + } + ], + "buildPresets": [ + { + "name": "windows", + "displayName": "Windows", + "configurePreset": "windows" + } + ] +} diff --git a/ChangeLog b/ChangeLog index dc26c9d0d..53b99cbb0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,7 +12,7 @@ Enhancements: - #7282 Improve error handling for thread jobs - #7284 Change session ID info log message to DEBUG2 -CI changes: +Build/CI: - #7283 Update all workflows and fix broken macOS workflows - #7313 Fix CodeQL workflow: Failed to perl 404 Not Found @@ -21,6 +21,7 @@ CI changes: - #7319 Remove workflows for slow self-hosted RPi runners - #7320 Move build_version.py script to scripts dir - #7321 Switch to GitHub hosted Mac M1 runner +- #7322 Use C++20 and add VSCode tasks config # 1.14.6 diff --git a/cmake/Version.cmake b/cmake/Version.cmake index 2d79b1c54..2862925a0 100644 --- a/cmake/Version.cmake +++ b/cmake/Version.cmake @@ -1,5 +1,3 @@ -cmake_minimum_required (VERSION 3.4) - # # Synergy Version # diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 52041aed0..7a100ae31 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -1,5 +1,3 @@ -cmake_minimum_required (VERSION 3.4) - find_package (Qt5 COMPONENTS Core Widgets Network LinguistTools) set (CMAKE_AUTOMOC ON) set (CMAKE_AUTORCC ON) diff --git a/src/gui/gui.pro b/src/gui/gui.pro deleted file mode 100644 index 7d1427ae3..000000000 --- a/src/gui/gui.pro +++ /dev/null @@ -1,206 +0,0 @@ -QT += widgets \ - network -TEMPLATE = app -TARGET = synergy -DEFINES += VERSION_STAGE=\\\"$$QMAKE_VERSION_STAGE\\\" -DEFINES += VERSION_REVISION=\\\"$$QMAKE_VERSION_REVISION\\\" -DEFINES -= UNICODE -DEFINES += _MBCS -DEPENDPATH += . \ - res -INCLUDEPATH += . \ - src \ - ../lib/shared/ -FORMS += src/MainWindowBase.ui \ - src/AboutDialogBase.ui \ - src/ServerConfigDialogBase.ui \ - src/ScreenSettingsDialogBase.ui \ - src/ActionDialogBase.ui \ - src/HotkeyDialogBase.ui \ - src/SettingsDialogBase.ui \ - src/SetupWizardBase.ui \ - src/AddClientDialogBase.ui \ - src/ActivationDialog.ui \ - src/CancelActivationDialog.ui \ - src/FailedLoginDialog.ui -SOURCES += src/main.cpp \ - src/MainWindow.cpp \ - src/AboutDialog.cpp \ - src/ServerConfig.cpp \ - src/ServerConfigDialog.cpp \ - src/ScreenSetupView.cpp \ - src/Screen.cpp \ - src/ScreenSetupModel.cpp \ - src/NewScreenWidget.cpp \ - src/TrashScreenWidget.cpp \ - src/ScreenSettingsDialog.cpp \ - src/BaseConfig.cpp \ - src/HotkeyDialog.cpp \ - src/ActionDialog.cpp \ - src/Hotkey.cpp \ - src/Action.cpp \ - src/KeySequence.cpp \ - src/KeySequenceWidget.cpp \ - src/SettingsDialog.cpp \ - src/AppConfig.cpp \ - src/QSynergyApplication.cpp \ - src/VersionChecker.cpp \ - src/SetupWizard.cpp \ - src/IpcClient.cpp \ - src/IpcReader.cpp \ - src/Ipc.cpp \ - src/SynergyLocale.cpp \ - src/QUtility.cpp \ - src/ZeroconfServer.cpp \ - src/ZeroconfThread.cpp \ - src/ZeroconfRegister.cpp \ - src/ZeroconfBrowser.cpp \ - src/ZeroconfService.cpp \ - src/DataDownloader.cpp \ - src/AddClientDialog.cpp \ - src/CommandProcess.cpp \ - src/CoreInterface.cpp \ - src/Fingerprint.cpp \ - src/SslCertificate.cpp \ - src/WebClient.cpp \ - src/ActivationNotifier.cpp \ - src/ActivationDialog.cpp \ - src/CancelActivationDialog.cpp \ - src/FailedLoginDialog.cpp \ - ../lib/shared/SerialKey.cpp \ - src/LicenseManager.cpp -HEADERS += src/MainWindow.h \ - src/AboutDialog.h \ - src/ServerConfig.h \ - src/ServerConfigDialog.h \ - src/ScreenSetupView.h \ - src/Screen.h \ - src/ScreenSetupModel.h \ - src/NewScreenWidget.h \ - src/TrashScreenWidget.h \ - src/ScreenSettingsDialog.h \ - src/BaseConfig.h \ - src/HotkeyDialog.h \ - src/ActionDialog.h \ - src/Hotkey.h \ - src/Action.h \ - src/KeySequence.h \ - src/KeySequenceWidget.h \ - src/SettingsDialog.h \ - src/AppConfig.h \ - src/QSynergyApplication.h \ - src/VersionChecker.h \ - src/SetupWizard.h \ - src/IpcClient.h \ - src/IpcReader.h \ - src/Ipc.h \ - src/SynergyLocale.h \ - src/QUtility.h \ - src/ZeroconfServer.h \ - src/ZeroconfThread.h \ - src/ZeroconfRegister.h \ - src/ZeroconfRecord.h \ - src/ZeroconfBrowser.h \ - src/ZeroconfService.h \ - src/DataDownloader.h \ - src/AddClientDialog.h \ - src/CommandProcess.h \ - src/ProcessorArch.h \ - src/CoreInterface.h \ - src/Fingerprint.h \ - src/SslCertificate.h \ - src/WebClient.h \ - src/ActivationNotifier.h \ - src/ElevateMode.h \ - src/ActivationDialog.h \ - src/CancelActivationDialog.h \ - src/FailedLoginDialog.h \ - ../lib/shared/EditionType.h \ - ../lib/shared/SerialKey.h \ - src/LicenseManager.h -TRANSLATIONS = res/lang/gui_ar-SA.ts \ - res/lang/gui_bg-BG.ts \ - res/lang/gui_ca-ES.ts \ - res/lang/gui_cs-CZ.ts \ - res/lang/gui_cy-GB.ts \ - res/lang/gui_da-DK.ts \ - res/lang/gui_de-DE.ts \ - res/lang/gui_el-GR.ts \ - res/lang/gui_es-ES.ts \ - res/lang/gui_et-EE.ts \ - res/lang/gui_fi-FI.ts \ - res/lang/gui_fr-FR.ts \ - res/lang/gui_gl-ES.ts \ - res/lang/gui_he-IL.ts \ - res/lang/gui_hr-HR.ts \ - res/lang/gui_hu-HU.ts \ - res/lang/gui_id-ID.ts \ - res/lang/gui_it-IT.ts \ - res/lang/gui_ja-JP.ts \ - res/lang/gui_ko-KR.ts \ - res/lang/gui_lt-LT.ts \ - res/lang/gui_lv-LV.ts \ - res/lang/gui_mr-IN.ts \ - res/lang/gui_nl-NL.ts \ - res/lang/gui_no-NO.ts \ - res/lang/gui_pl-PL.ts \ - res/lang/gui_pt-BR.ts \ - res/lang/gui_pt-PT.ts \ - res/lang/gui_ro-RO.ts \ - res/lang/gui_ru-RU.ts \ - res/lang/gui_sk-SK.ts \ - res/lang/gui_sl-SI.ts \ - res/lang/gui_sq-AL.ts \ - res/lang/gui_sr-SP.ts \ - res/lang/gui_sv-SE.ts \ - res/lang/gui_th-TH.ts \ - res/lang/gui_tr-TR.ts \ - res/lang/gui_uk-UA.ts \ - res/lang/gui_ur-IN.ts \ - res/lang/gui_vi-VN.ts \ - res/lang/gui_zh-CN.ts \ - res/lang/gui_zh-TW.ts -RESOURCES += res/Synergy.qrc -RC_FILE = res/win/Synergy.rc -macx { - QMAKE_INFO_PLIST = res/mac/Info.plist - TARGET = Synergy - QSYNERGY_ICON.files = res/mac/Synergy.icns - QSYNERGY_ICON.path = Contents/Resources - QMAKE_BUNDLE_DATA += QSYNERGY_ICON - LIBS += $$MACX_LIBS - HEADERS += src/OSXHelpers.h - SOURCES += src/OSXHelpers.mm -} -unix:!macx:LIBS += -ldns_sd -debug { - OBJECTS_DIR = tmp/debug - MOC_DIR = tmp/debug - RCC_DIR = tmp/debug -} -release { - OBJECTS_DIR = tmp/release - MOC_DIR = tmp/release - RCC_DIR = tmp/release -} -win32-msvc2015 { - LIBS += -lAdvapi32 - QMAKE_LFLAGS += /NODEFAULTLIB:LIBCMT -} -win32-msvc* { - contains(QMAKE_HOST.arch, x86):{ - QMAKE_LFLAGS *= /MACHINE:X86 - LIBS += -L"$$(BONJOUR_SDK_HOME)/Lib/Win32" -ldnssd - } - - contains(QMAKE_HOST.arch, x86_64):{ - QMAKE_LFLAGS *= /MACHINE:X64 - LIBS += -L"$$(BONJOUR_SDK_HOME)/Lib/x64" -ldnssd - } -} -win32 { - Debug:DESTDIR = ../../bin/Debug - Release:DESTDIR = ../../bin/Release - INCLUDEPATH += "$$(BONJOUR_SDK_HOME)/Include" -} -else:DESTDIR = ../../bin diff --git a/src/gui/src/MainWindow.cpp b/src/gui/src/MainWindow.cpp index 28e804379..5af04a173 100644 --- a/src/gui/src/MainWindow.cpp +++ b/src/gui/src/MainWindow.cpp @@ -213,7 +213,13 @@ MainWindow::~MainWindow() { if (appConfig().processMode() == Desktop) { m_ExpectedRunningState = kStopped; - stopDesktop(); + try { + stopDesktop(); + } + catch (...) { + // do not throw, since throwing from a dtor can result in unreliable behaviour. + qCritical() << "error stopping desktop in main window destructor"; + } } #if !defined(SYNERGY_ENTERPRISE) && defined(SYNERGY_AUTOCONFIG) diff --git a/src/lib/arch/win32/ArchMiscWindows.cpp b/src/lib/arch/win32/ArchMiscWindows.cpp index 782d21e81..7a6b3d525 100644 --- a/src/lib/arch/win32/ArchMiscWindows.cpp +++ b/src/lib/arch/win32/ArchMiscWindows.cpp @@ -138,13 +138,13 @@ ArchMiscWindows::openKey(HKEY key, const TCHAR* keyName, bool create) // open next key HKEY newKey; - LONG result = RegOpenKeyEx(key, keyName, 0, + LSTATUS result = RegOpenKeyEx(key, keyName, 0, KEY_WRITE | KEY_QUERY_VALUE, &newKey); if (result != ERROR_SUCCESS && create) { DWORD disp; - result = RegCreateKeyEx(key, keyName, 0, TEXT(""), - 0, KEY_WRITE | KEY_QUERY_VALUE, - NULL, &newKey, &disp); + result = RegCreateKeyEx(key, keyName, 0, NULL, + 0, KEY_WRITE | KEY_QUERY_VALUE, + NULL, &newKey, &disp); } if (result != ERROR_SUCCESS) { RegCloseKey(key); diff --git a/src/lib/arch/win32/ArchTaskBarWindows.cpp b/src/lib/arch/win32/ArchTaskBarWindows.cpp index 613766748..ca2c4616e 100644 --- a/src/lib/arch/win32/ArchTaskBarWindows.cpp +++ b/src/lib/arch/win32/ArchTaskBarWindows.cpp @@ -336,8 +336,18 @@ ArchTaskBarWindows::processDialogs(MSG* msg) ARCH->lockMutex(m_mutex); - // remove removed dialogs - m_dialogs.erase(false); + // there was previously some code here, with the comment "remove removed dialogs": + // m_dialogs.erase(false); + // + // it's not entirely clear what this code was doing, but it was probably trying to + // erase dialogs that had been removed (i.e. the map value was `false`). + for (auto it = m_dialogs.begin(); it != m_dialogs.end(); ) { + if (it->second == false) { + it = m_dialogs.erase(it); + } else { + ++it; + } +} // merge added dialogs into the dialog list for (Dialogs::const_iterator index = m_addedDialogs.begin(); diff --git a/src/lib/platform/MSWindowsWatchdog.cpp b/src/lib/platform/MSWindowsWatchdog.cpp index 210b8dfe9..de1151eb0 100644 --- a/src/lib/platform/MSWindowsWatchdog.cpp +++ b/src/lib/platform/MSWindowsWatchdog.cpp @@ -398,9 +398,12 @@ MSWindowsWatchdog::startProcess() void MSWindowsWatchdog::setStartupInfo(STARTUPINFO& si) { + // TODO: maybe this should be \winlogon if we have logonui.exe? + char desktop[] = "winsta0\\Default"; + ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); - si.lpDesktop = "winsta0\\Default"; // TODO: maybe this should be \winlogon if we have logonui.exe? + si.lpDesktop = desktop; si.hStdError = m_stdOutWrite; si.hStdOutput = m_stdOutWrite; si.dwFlags |= STARTF_USESTDHANDLES;