13 Commits

Author SHA1 Message Date
5355e84b63 Release 1.21.1
Some checks are pending
Continuous Integration / pr-comment-flags (push) Blocked by required conditions
Continuous Integration / ci-passed (push) Blocked by required conditions
Continuous Integration / test-results (push) Blocked by required conditions
Continuous Integration / reuse-lint (push) Waiting to run
Continuous Integration / lint-check (push) Blocked by required conditions
Continuous Integration / analyse-valgrind (push) Blocked by required conditions
Continuous Integration / analyse-sonarcloud (push) Blocked by required conditions
Continuous Integration / macos-14-arm64 (push) Blocked by required conditions
Continuous Integration / macos-13-x64 (push) Blocked by required conditions
Continuous Integration / archlinux-x86_84 (push) Blocked by required conditions
Continuous Integration / debian-13-arm64 (push) Blocked by required conditions
Continuous Integration / debian-13-x86_64 (push) Blocked by required conditions
Continuous Integration / fedora-40-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-40-x86_84 (push) Blocked by required conditions
Continuous Integration / fedora-41-arm64 (push) Blocked by required conditions
Continuous Integration / fedora-41-x86_64 (push) Blocked by required conditions
Continuous Integration / opensuse-arm64 (push) Blocked by required conditions
Continuous Integration / opensuse-x86_84 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-arm64 (push) Blocked by required conditions
Continuous Integration / ubuntu-25.04-x86_64 (push) Blocked by required conditions
Continuous Integration / windows-2022-x64 (push) Blocked by required conditions
Continuous Integration / unix-freebsd (push) Blocked by required conditions
Continuous Integration / flatpak-aarch64 (push) Blocked by required conditions
Continuous Integration / flatpak-x86_64 (push) Blocked by required conditions
Continuous Integration / release (push) Blocked by required conditions
Continuous Integration / winget-publish (push) Blocked by required conditions
2025-03-31 07:53:29 -07:00
8fbcf907b2 build: windows Installer runs Deskflow as a user not admin post install, after Finish 2025-03-31 06:12:46 -07:00
d2bf5e63e4 refactor: allow settings to use XDG_CONFIG_DIR if defined
fixes: #8421
2025-03-31 06:12:46 -07:00
3ed0915b57 refactor: settings for windows use Appdata/local, always save daemon log to app install path 2025-03-31 06:12:46 -07:00
01878b0522 refactor: settings, prefix portableSettingsFile with app dir at runtime 2025-03-31 06:12:46 -07:00
af6b42fe9e newMethod Settings::validKeys to return the known Settings keys 2025-03-31 06:12:46 -07:00
a0051ea0bc chore: lib/common/settings remove unused signal writableChanged 2025-03-31 06:12:46 -07:00
40c915f6bd chore: lib/common/settings remove unused signal scopeChanged 2025-03-31 06:12:46 -07:00
1cee520e2b chore: lib/common/settings remove unused private isPortableSettings 2025-03-31 06:12:46 -07:00
1dd5654af6 fix: Settings update checkbox was initilzed to autohide value
fixes #8418
2025-03-31 06:12:46 -07:00
2708fc96fe chore: use Type for templates 2025-03-30 21:14:57 +01:00
5cfaa4a4e0 refactor: move ALL gui parts to lib 2025-03-29 18:18:12 +00:00
a6453a6819 fix: local-fingerprint generation 2025-03-28 11:49:08 +00:00
84 changed files with 144 additions and 104 deletions

View File

@ -1,6 +1,6 @@
name: Bug report
description: If you find a bug in Deskflow, please let us know so we can fix it.
labels: ["bug", "triage", "unanswered"]
type: "Triage [bug]"
body:
- type: markdown
attributes:

View File

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

View File

@ -19,7 +19,7 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Fallback for when git can not be found
set(DESKFLOW_VERSION_MAJOR 1)
set(DESKFLOW_VERSION_MINOR 21)
set(DESKFLOW_VERSION_PATCH 0)
set(DESKFLOW_VERSION_PATCH 1)
set(DESKFLOW_VERSION_TWEAK 0)
# Get the version from git if it's a git repository

View File

@ -194,13 +194,13 @@ SPDX-FileCopyrightText = "Chris Rizzitello <sithlord48@gmail.com>"
SPDX-License-Identifier = "LGPL-2.1-only"
[[annotations]]
path = "src/apps/deskflow-gui/MainWindow.ui"
path = "src/lib/gui/MainWindow.ui"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only WITH LicenseRef-OpenSSL-Exception"
[[annotations]]
path = "src/apps/deskflow-gui/dialogs/*.ui"
path = "src/lib/gui/dialogs/*.ui"
precedence = "override"
SPDX-FileCopyrightText = "Deskflow Developers"
SPDX-License-Identifier = "GPL-2.0-only WITH LicenseRef-OpenSSL-Exception"

View File

@ -42,6 +42,18 @@
</branding>
<content_rating type="oars-1.0" />
<releases>
<release version="1.21.1" date="2025-03-31" urgency="high">
<description>
<p>This stable release fixes a few critical bugs in 1.21.0. For the full changelog see the release page.</p>
<ul>
<li>Fix: Flatpak can't save settings'</li>
<li>Fix: Crash on localfingerprint dialog</li>
<li>Fix: Check for updates settings reading from wrong value</li>
<li>Fix: Windows settings saving blocked for non admin users </li>
</ul>
</description>
<url>https://github.com/deskflow/deskflow/releases/tag/v1.21.1</url>
</release>
<release version="1.21.0" date="2025-03-27" urgency="high">
<description>
<p>This stable release removes some dependencies, additionally fixes several bugs. For the full changelog see the release page.</p>

View File

@ -39,6 +39,13 @@
<Binary Id="CustomDLL" SourceFile="@CMAKE_CURRENT_BINARY_DIR@/wix-custom.dll" />
<UI>
<Publish Dialog="ExitDialog"
Control="Finish"
Event="DoAction"
Value="RunDeskflow"
Condition= "NOT Installed" />
</UI>
<CustomAction
Id="CheckVCRedist"
BinaryRef="CustomDLL"
@ -51,8 +58,10 @@
<CustomAction
Id="RunDeskflow"
ExeCommand="Deskflow"
FileRef="CM_FP_deskflow.exe"
ExeCommand="[INSTALL_ROOT]deskflow.exe"
Directory="INSTALL_ROOT"
Execute="immediate"
Impersonate="yes"
Return="asyncNoWait" />
<InstallExecuteSequence>
@ -64,10 +73,6 @@
Action="ShowVCRedistError"
Before="InstallInitialize"
Condition="NOT Installed AND (NOT VC_REDIST_INSTALLED OR NOT VC_REDIST_VERSION_OK)" />
<Custom
Action="RunDeskflow"
OnExit="success"
Condition="NOT Installed" />
</InstallExecuteSequence>
</CPackWiXFragment>
</CPackWiXPatch>

View File

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

View File

@ -44,78 +44,7 @@ endif()
add_executable(${target} WIN32 MACOSX_BUNDLE
${platform_extra}
../res/deskflow.qrc
Action.cpp
Action.h
DataDownloader.cpp
DataDownloader.h
Diagnostic.cpp
Diagnostic.h
Hotkey.cpp
Hotkey.h
KeySequence.cpp
KeySequence.h
main.cpp
MainWindow.cpp
MainWindow.h
MainWindow.ui
ScreenSetupModel.cpp
ScreenSetupModel.h
ServerConfig.cpp
ServerConfig.h
StyleUtils.h
VersionChecker.cpp
VersionChecker.h
dialogs/AboutDialog.cpp
dialogs/AboutDialog.h
dialogs/AboutDialog.ui
dialogs/ActionDialog.cpp
dialogs/ActionDialog.h
dialogs/ActionDialog.ui
dialogs/AddClientDialog.cpp
dialogs/AddClientDialog.h
dialogs/AddClientDialog.ui
dialogs/FingerprintDialog.h
dialogs/FingerprintDialog.cpp
dialogs/HotkeyDialog.cpp
dialogs/HotkeyDialog.h
dialogs/HotkeyDialog.ui
dialogs/ScreenSettingsDialog.cpp
dialogs/ScreenSettingsDialog.h
dialogs/ScreenSettingsDialog.ui
dialogs/ServerConfigDialog.cpp
dialogs/ServerConfigDialog.h
dialogs/ServerConfigDialog.ui
dialogs/SettingsDialog.cpp
dialogs/SettingsDialog.h
dialogs/SettingsDialog.ui
validators/AliasValidator.cpp
validators/AliasValidator.h
validators/ComputerNameValidator.cpp
validators/ComputerNameValidator.h
validators/EmptyStringValidator.cpp
validators/EmptyStringValidator.h
validators/IStringValidator.cpp
validators/IStringValidator.h
validators/LineEditValidator.cpp
validators/LineEditValidator.h
validators/ScreenDuplicationsValidator.cpp
validators/ScreenDuplicationsValidator.h
validators/ScreenNameValidator.cpp
validators/ScreenNameValidator.h
validators/SpacesValidator.cpp
validators/SpacesValidator.h
validators/ValidationError.cpp
validators/ValidationError.h
widgets/FingerprintPreview.h
widgets/FingerprintPreview.cpp
widgets/KeySequenceWidget.cpp
widgets/KeySequenceWidget.h
widgets/NewScreenWidget.h
widgets/NewScreenWidget.cpp
widgets/ScreenSetupView.cpp
widgets/ScreenSetupView.h
widgets/TrashScreenWidget.cpp
widgets/TrashScreenWidget.h
deskflow-gui.cpp
)
target_link_libraries(

View File

@ -6,15 +6,14 @@
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
*/
#include "Diagnostic.h"
#include "MainWindow.h"
#include "StyleUtils.h"
#include "common/Constants.h"
#include "common/UrlConstants.h"
#include "gui/Diagnostic.h"
#include "gui/DotEnv.h"
#include "gui/Logger.h"
#include "gui/MainWindow.h"
#include "gui/Messages.h"
#include "gui/StyleUtils.h"
#include <QApplication>
#include <QDebug>

View File

@ -8,6 +8,7 @@
#include "UrlConstants.h"
#include <QCoreApplication>
#include <QFile>
#include <QRect>
@ -34,20 +35,19 @@ void Settings::setSettingFile(const QString &settingsFile)
Settings::Settings(QObject *parent) : QObject(parent)
{
m_portableSettingsFile = m_portableSettingsFile.arg(QCoreApplication::applicationDirPath(), kAppName);
QString fileToLoad;
if (QFile(m_portableSettingsFile).exists()) {
fileToLoad = m_portableSettingsFile;
} else {
#ifdef Q_OS_WIN
fileToLoad = SystemSettingFile;
#else
if (QFile(UserSettingFile).exists())
if (!qEnvironmentVariable("XDG_CONFIG_HOME").isEmpty())
fileToLoad = QStringLiteral("%1/%2/%2.conf").arg(qEnvironmentVariable("XDG_CONFIG_HOME"), kAppName);
else if (QFile(UserSettingFile).exists())
fileToLoad = UserSettingFile;
else if (QFile(SystemSettingFile).exists())
fileToLoad = SystemSettingFile;
else
fileToLoad = UserSettingFile;
#endif
}
m_settings = new QSettings(fileToLoad, QSettings::IniFormat);
@ -56,11 +56,6 @@ Settings::Settings(QObject *parent) : QObject(parent)
qInfo().noquote() << "settings file:" << m_settings->fileName();
}
bool Settings::isPortableSettings()
{
return (QFile(instance()->m_portableSettingsFile).exists());
}
void Settings::cleanSettings()
{
const QStringList keys = m_settings->allKeys();
@ -125,7 +120,11 @@ QVariant Settings::defaultValue(const QString &key)
return defaultProcessMode;
if (key == Daemon::LogFile) {
#ifdef Q_OS_WIN
return QStringLiteral("%1/%2").arg(QCoreApplication::applicationDirPath(), kDaemonLogFilename);
#else
return QStringLiteral("%1/%2").arg(instance()->settingsPath(), kDaemonLogFilename);
#endif
}
if (key == Daemon::Elevate)
@ -151,6 +150,11 @@ void Settings::save(bool emitSaving)
instance()->m_settings->sync();
}
const QStringList Settings::validKeys()
{
return instance()->m_validKeys;
}
bool Settings::isWritable()
{
return instance()->m_settings->isWritable();

View File

@ -149,10 +149,9 @@ public:
static const QString logLevelText();
static QSettingsProxy &proxy();
static void save(bool emitSaving = true);
static const QStringList validKeys();
signals:
void scopeChanged(bool isSystemScope);
void writableChanged(bool canWrite);
void settingsChanged(const QString key);
void serverSettingsChanged();
@ -161,11 +160,10 @@ private:
Settings *operator=(Settings &other) = delete;
Settings(const Settings &other) = delete;
~Settings() = default;
static bool isPortableSettings();
void cleanSettings();
QSettings *m_settings = nullptr;
QString m_portableSettingsFile = QStringLiteral("settings/%1.conf").arg(kAppName);
QString m_portableSettingsFile = QStringLiteral("%1/settings/%2.conf");
std::shared_ptr<QSettingsProxy> m_settingsProxy;
// clang-format off

View File

@ -15,15 +15,35 @@ endif()
add_library(${target} STATIC
${platform_sources}
Action.cpp
Action.h
DataDownloader.cpp
DataDownloader.h
Diagnostic.cpp
Diagnostic.h
DotEnv.cpp
DotEnv.h
FileTail.cpp
FileTail.h
Hotkey.cpp
Hotkey.h
KeySequence.cpp
KeySequence.h
Logger.cpp
Logger.h
MainWindow.cpp
MainWindow.h
MainWindow.ui
Messages.cpp
Messages.h
ScreenSetupModel.cpp
ScreenSetupModel.h
ServerConfig.cpp
ServerConfig.h
Styles.h
StyleUtils.h
VersionChecker.cpp
VersionChecker.h
config/IServerConfig.h
config/Screen.cpp
config/Screen.h
@ -43,6 +63,29 @@ add_library(${target} STATIC
core/ServerMessage.h
core/WaylandWarnings.cpp
core/WaylandWarnings.h
dialogs/AboutDialog.cpp
dialogs/AboutDialog.h
dialogs/AboutDialog.ui
dialogs/ActionDialog.cpp
dialogs/ActionDialog.h
dialogs/ActionDialog.ui
dialogs/AddClientDialog.cpp
dialogs/AddClientDialog.h
dialogs/AddClientDialog.ui
dialogs/FingerprintDialog.cpp
dialogs/FingerprintDialog.h
dialogs/HotkeyDialog.cpp
dialogs/HotkeyDialog.h
dialogs/HotkeyDialog.ui
dialogs/ScreenSettingsDialog.cpp
dialogs/ScreenSettingsDialog.h
dialogs/ScreenSettingsDialog.ui
dialogs/ServerConfigDialog.cpp
dialogs/ServerConfigDialog.h
dialogs/ServerConfigDialog.ui
dialogs/SettingsDialog.cpp
dialogs/SettingsDialog.h
dialogs/SettingsDialog.ui
ipc/DaemonIpcClient.cpp
ipc/DaemonIpcClient.h
proxy/QProcessProxy.cpp
@ -51,6 +94,34 @@ add_library(${target} STATIC
tls/TlsCertificate.h
tls/TlsUtility.cpp
tls/TlsUtility.h
validators/AliasValidator.cpp
validators/AliasValidator.h
validators/ComputerNameValidator.cpp
validators/ComputerNameValidator.h
validators/EmptyStringValidator.cpp
validators/EmptyStringValidator.h
validators/IStringValidator.cpp
validators/IStringValidator.h
validators/LineEditValidator.cpp
validators/LineEditValidator.h
validators/ScreenDuplicationsValidator.cpp
validators/ScreenDuplicationsValidator.h
validators/ScreenNameValidator.cpp
validators/ScreenNameValidator.h
validators/SpacesValidator.cpp
validators/SpacesValidator.h
validators/ValidationError.cpp
validators/ValidationError.h
widgets/FingerprintPreview.cpp
widgets/FingerprintPreview.h
widgets/KeySequenceWidget.cpp
widgets/KeySequenceWidget.h
widgets/NewScreenWidget.cpp
widgets/NewScreenWidget.h
widgets/ScreenSetupView.cpp
widgets/ScreenSetupView.h
widgets/TrashScreenWidget.cpp
widgets/TrashScreenWidget.h
)
target_link_libraries(

View File

@ -57,7 +57,6 @@ SettingsDialog::SettingsDialog(QWidget *parent, const IServerConfig &serverConfi
void SettingsDialog::initConnections()
{
connect(this, &SettingsDialog::shown, this, &SettingsDialog::showReadOnlyMessage, Qt::QueuedConnection);
connect(Settings::instance(), &Settings::writableChanged, this, &SettingsDialog::showReadOnlyMessage);
connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &SettingsDialog::accept);
connect(ui->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
@ -169,7 +168,7 @@ void SettingsDialog::loadFromConfig()
ui->cbScrollDirection->setChecked(Settings::value(Settings::Client::InvertScrollDirection).toBool());
ui->cbCloseToTray->setChecked(Settings::value(Settings::Gui::CloseToTray).toBool());
ui->comboElevate->setCurrentIndex(Settings::value(Settings::Core::ElevateMode).toInt());
ui->cbAutoUpdate->setChecked(Settings::value(Settings::Gui::Autohide).toBool());
ui->cbAutoUpdate->setChecked(Settings::value(Settings::Gui::AutoUpdateCheck).toBool());
const auto processMode = Settings::value(Settings::Core::ProcessMode).value<Settings::ProcessMode>();
ui->cbServiceEnabled->setChecked(processMode == Settings::ProcessMode::Service);

View File

@ -55,7 +55,7 @@ bool TlsCertificate::generateFingerprint(const QString &certificateFilename)
deskflow::FingerprintDatabase db;
db.addTrusted(deskflow::pemFileCertFingerprint(certPath, deskflow::FingerprintType::SHA1));
db.addTrusted(deskflow::pemFileCertFingerprint(certPath, deskflow::FingerprintType::SHA256));
db.write(QStringLiteral("%1/%2").arg(Settings::tlsLocalDb()).toStdString());
db.write(Settings::tlsLocalDb().toStdString());
qDebug("tls fingerprint generated");
return true;