From fad6912a9d034240b5ddf8748648e9f5b94c9b0a Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:33:05 +0200 Subject: [PATCH 01/25] NetworkObjectDirectory: move ComputerNameSource to Computer::NameSource (cherry picked from commit f75861b5bbadc224c8b1b7e6690b1595524d5870) --- core/src/Computer.h | 14 ++++++++++++++ core/src/NetworkObjectDirectory.h | 13 ------------- core/src/VeyonConfigurationProperties.h | 3 ++- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/core/src/Computer.h b/core/src/Computer.h index 2c3897493..3a1bbfa91 100644 --- a/core/src/Computer.h +++ b/core/src/Computer.h @@ -33,7 +33,21 @@ class VEYON_CORE_EXPORT Computer { + Q_GADGET public: + enum class NameSource + { + Default, + HostAddress, + SessionClientAddress, + SessionClientName, + SessionHostName, + SessionMetaData, + UserFullName, + UserLoginName, + }; + Q_ENUM(NameSource) + explicit Computer( NetworkObject::Uid networkObjectUid = NetworkObject::Uid(), const QString& displayName = {}, const QString& hostAddress = {}, diff --git a/core/src/NetworkObjectDirectory.h b/core/src/NetworkObjectDirectory.h index ef555fee6..80e927f6a 100644 --- a/core/src/NetworkObjectDirectory.h +++ b/core/src/NetworkObjectDirectory.h @@ -41,19 +41,6 @@ class VEYON_CORE_EXPORT NetworkObjectDirectory : public QObject MaximumUpdateInterval = 3600 }; - enum class ComputerNameSource - { - Default, - HostAddress, - SessionClientAddress, - SessionClientName, - SessionHostName, - SessionMetaData, - UserFullName, - UserLoginName, - }; - Q_ENUM(ComputerNameSource) - explicit NetworkObjectDirectory( QObject* parent ); void setUpdateInterval( int interval ); diff --git a/core/src/VeyonConfigurationProperties.h b/core/src/VeyonConfigurationProperties.h index 7bb4a6c9d..85ba6355d 100644 --- a/core/src/VeyonConfigurationProperties.h +++ b/core/src/VeyonConfigurationProperties.h @@ -31,6 +31,7 @@ #include #include "ComputerListModel.h" +#include "Computer.h" #include "Logger.h" #include "NetworkObjectDirectory.h" #include "PlatformSessionFunctions.h" @@ -138,7 +139,7 @@ OP( VeyonConfiguration, VeyonCore::config(), bool, autoOpenComputerSelectPanel, setAutoOpenComputerSelectPanel, "AutoOpenComputerSelectPanel", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, confirmUnsafeActions, setConfirmUnsafeActions, "ConfirmUnsafeActions", "Master", false, Configuration::Property::Flag::Standard ) \ OP( VeyonConfiguration, VeyonCore::config(), bool, showFeatureWindowsOnSameScreen, setShowFeatureWindowsOnSameScreen, "ShowFeatureWindowsOnSameScreen", "Master", false, Configuration::Property::Flag::Standard ) \ - OP( VeyonConfiguration, VeyonCore::config(), NetworkObjectDirectory::ComputerNameSource, computerNameSource, setComputerNameSource, "ComputerNameSource", "Master", QVariant::fromValue(NetworkObjectDirectory::ComputerNameSource::Default), Configuration::Property::Flag::Advanced ) \ + OP( VeyonConfiguration, VeyonCore::config(), Computer::NameSource, computerNameSource, setComputerNameSource, "ComputerNameSource", "Master", QVariant::fromValue(Computer::NameSource::Default), Configuration::Property::Flag::Advanced ) \ #define FOREACH_VEYON_AUTHENTICATION_CONFIG_PROPERTY(OP) \ OP( VeyonConfiguration, VeyonCore::config(), VeyonCore::AuthenticationMethod, authenticationMethod, setAuthenticationMethod, "Method", "Authentication", QVariant::fromValue(VeyonCore::AuthenticationMethod::LogonAuthentication), Configuration::Property::Flag::Standard ) \ From 9a8db5335605190ce40a21d79393b395a35b50ed Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:33:34 +0200 Subject: [PATCH 02/25] ComputerControlInterface: add computerName() and computerNameSource() (cherry picked from commit 1d128215de3242adf720dda58290f39747ea61cc) --- core/src/ComputerControlInterface.cpp | 31 ++++++++++++++++++++++++++- core/src/ComputerControlInterface.h | 8 +++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/core/src/ComputerControlInterface.cpp b/core/src/ComputerControlInterface.cpp index 36e778c17..00a470594 100644 --- a/core/src/ComputerControlInterface.cpp +++ b/core/src/ComputerControlInterface.cpp @@ -36,7 +36,8 @@ ComputerControlInterface::ComputerControlInterface( const Computer& computer, int port, QObject* parent ) : QObject( parent ), m_computer( computer ), - m_port( port ) + m_port(port), + m_computerNameSource(VeyonCore::config().computerNameSource()) { m_pingTimer.setInterval(ConnectionWatchdogPingDelay); m_pingTimer.setSingleShot(true); @@ -132,6 +133,34 @@ void ComputerControlInterface::stop() +QString ComputerControlInterface::computerName() const +{ + const auto propertyOrFallback = [this](const QString& value) + { + return value.isEmpty() ? + (computer().displayName().isEmpty() ? computer().hostName() : computer().displayName()) + : + value; + }; + + switch (computerNameSource()) + { + case Computer::NameSource::HostAddress: return propertyOrFallback(computer().hostName()); + case Computer::NameSource::SessionClientName: return propertyOrFallback(sessionInfo().clientName); + case Computer::NameSource::SessionClientAddress: return propertyOrFallback(sessionInfo().clientAddress); + case Computer::NameSource::SessionHostName: return propertyOrFallback(sessionInfo().hostName); + case Computer::NameSource::SessionMetaData: return propertyOrFallback(sessionInfo().metaData); + case Computer::NameSource::UserFullName: return propertyOrFallback(userFullName()); + case Computer::NameSource::UserLoginName: return propertyOrFallback(userLoginName()); + default: + break; + } + + return propertyOrFallback({}); +} + + + bool ComputerControlInterface::hasValidFramebuffer() const { return vncConnection() && vncConnection()->hasValidFramebuffer(); diff --git a/core/src/ComputerControlInterface.h b/core/src/ComputerControlInterface.h index 075e3463f..8d2e03e99 100644 --- a/core/src/ComputerControlInterface.h +++ b/core/src/ComputerControlInterface.h @@ -81,6 +81,13 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab return m_computer; } + QString computerName() const; + + Computer::NameSource computerNameSource() const + { + return m_computerNameSource; + } + State state() const { return m_state; @@ -209,6 +216,7 @@ class VEYON_CORE_EXPORT ComputerControlInterface : public QObject, public Lockab const int m_port; UpdateMode m_updateMode{UpdateMode::Disabled}; + Computer::NameSource m_computerNameSource{Computer::NameSource::Default}; State m_state{State::Disconnected}; QString m_userLoginName{}; From 828ff1ca67684879a7f2e0bd10c32237eff58abb Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:36:26 +0200 Subject: [PATCH 03/25] ComputerManager: use new CCI::computerName() method (cherry picked from commit 825417151b98f2834a87522bf3933739f33230f4) --- master/src/ComputerManager.cpp | 63 +++++++++++++--------------------- master/src/ComputerManager.h | 2 -- 2 files changed, 23 insertions(+), 42 deletions(-) diff --git a/master/src/ComputerManager.cpp b/master/src/ComputerManager.cpp index 9098302ba..2d13ac68e 100644 --- a/master/src/ComputerManager.cpp +++ b/master/src/ComputerManager.cpp @@ -50,8 +50,7 @@ ComputerManager::ComputerManager( UserConfig& config, QObject* parent ) : m_computerTreeModel( new CheckableItemProxyModel( NetworkObjectModel::UidRole, this ) ), m_networkObjectFilterProxyModel( new NetworkObjectFilterProxyModel( this ) ), m_localHostNames( QHostInfo::localHostName().toLower() ), - m_localHostAddresses(QHostInfo::fromName(QHostInfo::localHostName()).addresses()), - m_computerNameSource(VeyonCore::config().computerNameSource()) + m_localHostAddresses(QHostInfo::fromName(QHostInfo::localHostName()).addresses()) { if( m_networkObjectDirectory == nullptr ) { @@ -156,23 +155,15 @@ void ComputerManager::updateUser(const ComputerControlInterface::Pointer& contro } m_networkObjectOverlayDataModel->setData(mapToUserNameModelIndex(networkObjectIndex), user); - QString computerName; - switch (m_computerNameSource) + if (controlInterface->computerNameSource() == Computer::NameSource::UserFullName || + controlInterface->computerNameSource() == Computer::NameSource::UserLoginName) { - case NetworkObjectDirectory::ComputerNameSource::UserFullName: - computerName = controlInterface->userFullName(); - break; - case NetworkObjectDirectory::ComputerNameSource::UserLoginName: - computerName = controlInterface->userLoginName(); - break; - default: - break; - } - - if (computerName.isEmpty() == false) - { - m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), - computerName); + const auto computerName = controlInterface->computerName(); + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } } } } @@ -194,34 +185,26 @@ void ComputerManager::updateSessionInfo(const ComputerControlInterface::Pointer& m_networkObjectOverlayDataModel->setData(mapToSessionUptimeModelIndex(networkObjectIndex), uptimeString, Qt::DisplayRole); - QString computerName; - switch (m_computerNameSource) + switch (controlInterface->computerNameSource()) { - case NetworkObjectDirectory::ComputerNameSource::HostAddress: - computerName = controlInterface->computer().hostName(); - break; - case NetworkObjectDirectory::ComputerNameSource::SessionClientName: - computerName = controlInterface->sessionInfo().clientName; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionClientAddress: - computerName = controlInterface->sessionInfo().clientAddress; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionHostName: - computerName = controlInterface->sessionInfo().hostName; - break; - case NetworkObjectDirectory::ComputerNameSource::SessionMetaData: - computerName = controlInterface->sessionInfo().metaData; + case Computer::NameSource::HostAddress: + case Computer::NameSource::SessionClientName: + case Computer::NameSource::SessionClientAddress: + case Computer::NameSource::SessionHostName: + case Computer::NameSource::SessionMetaData: + { + const auto computerName = controlInterface->computerName(); + if (computerName.isEmpty() == false) + { + m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), + computerName); + } break; + } default: break; } - - if (computerName.isEmpty() == false) - { - m_networkObjectOverlayDataModel->setData(m_networkObjectOverlayDataModel->mapFromSource(networkObjectIndex), - computerName); - } } } diff --git a/master/src/ComputerManager.h b/master/src/ComputerManager.h index 4a290885d..64964a8fb 100644 --- a/master/src/ComputerManager.h +++ b/master/src/ComputerManager.h @@ -102,6 +102,4 @@ class ComputerManager : public QObject QStringList m_localHostNames; QList m_localHostAddresses; - NetworkObjectDirectory::ComputerNameSource m_computerNameSource; - }; From 31732232d479a435a5e23866b637521d442690c3 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:36:55 +0200 Subject: [PATCH 04/25] ComputerControlListModel: notify UidRole change if UID based on session meta data (cherry picked from commit d053954e5b68b72c0485810ef385b0a9382e3fef) --- master/src/ComputerControlListModel.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index f23e69e61..cf755f338 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -320,7 +320,15 @@ void ComputerControlListModel::updateUser( const QModelIndex& index ) void ComputerControlListModel::updateSessionInfo(const QModelIndex& index) { - Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); + if (uidRoleContent() == UidRoleContent::SessionMetaDataHash) + { + Q_EMIT dataChanged(index, index, {Qt::ToolTipRole, UidRole}); + } + else + { + Q_EMIT dataChanged(index, index, {Qt::ToolTipRole}); + + } auto controlInterface = computerControlInterface( index ); if (controlInterface.isNull() == false) From 826a05173bce9b37541e3c38cc60e2d646b78929 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:37:25 +0200 Subject: [PATCH 05/25] ComputerControlListModel: use new CCI::computerName() method (cherry picked from commit 6d7ff42adc3877c0c0ad935dbfedcdd59593d44a) --- master/src/ComputerControlListModel.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/master/src/ComputerControlListModel.cpp b/master/src/ComputerControlListModel.cpp index cf755f338..09d26d9ed 100644 --- a/master/src/ComputerControlListModel.cpp +++ b/master/src/ComputerControlListModel.cpp @@ -453,7 +453,7 @@ QImage ComputerControlListModel::computerDecorationRole( const ComputerControlIn QString ComputerControlListModel::computerToolTipRole( const ComputerControlInterface::Pointer& controlInterface ) const { const QString state( computerStateDescription( controlInterface ) ); - const QString displayName(tr("Name: %1").arg(controlInterface->computer().displayName())); + const QString name(tr("Name: %1").arg(controlInterface->computerName())); const QString location( tr( "Location: %1" ).arg( controlInterface->computer().location() ) ); const QString host = controlInterface->computer().hostAddress().isNull() ? @@ -468,10 +468,10 @@ QString ComputerControlListModel::computerToolTipRole( const ComputerControlInte if (controlInterface->state() != ComputerControlInterface::State::Connected) { - return QStringLiteral("%1
%2
%3
%4").arg(state, displayName, location, host); + return QStringLiteral("%1
%2
%3
%4").arg(state, name, location, host); } - return QStringLiteral("%1
%2
%3
%4
%5
%6").arg(state, displayName, location, host, features, user); + return QStringLiteral("%1
%2
%3
%4
%5
%6").arg(state, name, location, host, features, user); } @@ -493,12 +493,12 @@ QString ComputerControlListModel::computerDisplayRole( const ComputerControlInte return user; } - return QStringLiteral("%1 - %2").arg(user, controlInterface->computer().displayName()); + return QStringLiteral("%1 - %2").arg(user, controlInterface->computerName()); } if( displayRoleContent() != DisplayRoleContent::UserName ) { - return controlInterface->computer().displayName(); + return controlInterface->computerName(); } return tr("[no user]"); @@ -511,11 +511,11 @@ QString ComputerControlListModel::computerSortRole( const ComputerControlInterfa switch( sortOrder() ) { case SortOrder::ComputerAndUserName: - return controlInterface->computer().location() + controlInterface->computer().displayName() + + return controlInterface->computer().location() + controlInterface->computerName() + controlInterface->computer().hostName() + controlInterface->userLoginName(); case SortOrder::ComputerName: - return controlInterface->computer().location() + controlInterface->computer().displayName() + + return controlInterface->computer().location() + controlInterface->computerName() + controlInterface->computer().hostName(); case SortOrder::UserName: From af74cd88be43228196c43f3444578831a1d19262 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:37:54 +0200 Subject: [PATCH 06/25] ComputerZoomWidget: use new CCI::computerName() method (cherry picked from commit 7e772795cf5c3a452cf79451a0a1754f9bd06609) --- master/src/ComputerZoomWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/master/src/ComputerZoomWidget.cpp b/master/src/ComputerZoomWidget.cpp index 6c581bdb7..84fbf05c1 100644 --- a/master/src/ComputerZoomWidget.cpp +++ b/master/src/ComputerZoomWidget.cpp @@ -139,13 +139,13 @@ void ComputerZoomWidget::updateComputerZoomWidgetTitle() if (username.isEmpty()) { - setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computer().displayName(), + setWindowTitle( QStringLiteral( "%1 - %2" ).arg( m_vncView->computerControlInterface()->computerName(), VeyonCore::applicationName() ) ); } else { setWindowTitle( QStringLiteral( "%1 - %2 - %3" ).arg( username, - m_vncView->computerControlInterface()->computer().displayName(), + m_vncView->computerControlInterface()->computerName(), VeyonCore::applicationName() ) ); } } From 3de1c471baabe6d70d120686b43bbc3b412b535f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:38:29 +0200 Subject: [PATCH 07/25] RemoteAccessWidget: use new CCI::computerName() method (cherry picked from commit 8dfc6e6083ede3434f65d692083bfb2b844ed95f) --- plugins/remoteaccess/RemoteAccessWidget.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/remoteaccess/RemoteAccessWidget.cpp b/plugins/remoteaccess/RemoteAccessWidget.cpp index 8d418879a..2b678da0c 100644 --- a/plugins/remoteaccess/RemoteAccessWidget.cpp +++ b/plugins/remoteaccess/RemoteAccessWidget.cpp @@ -523,13 +523,13 @@ void RemoteAccessWidget::updateRemoteAccessTitle() if (username.isEmpty() ) { - setWindowTitle(tr("%1 - %2 Remote Access").arg(m_computerControlInterface->computer().displayName(), + setWindowTitle(tr("%1 - %2 Remote Access").arg(m_computerControlInterface->computerName(), VeyonCore::applicationName())); } else { setWindowTitle(tr("%1 - %2 - %3 Remote Access").arg(username, - m_computerControlInterface->computer().displayName(), + m_computerControlInterface->computerName(), VeyonCore::applicationName())); } } From 76e6a65c391fd2858a48daafc24de78f7263ee99 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 13:38:12 +0200 Subject: [PATCH 08/25] FlexibleListView: restore positions on UID changes (cherry picked from commit 82bc8b73b4289759f5aaa2b5350e16e818de4c4e) --- master/src/FlexibleListView.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/master/src/FlexibleListView.cpp b/master/src/FlexibleListView.cpp index 45b38c780..5d4f5de58 100644 --- a/master/src/FlexibleListView.cpp +++ b/master/src/FlexibleListView.cpp @@ -153,6 +153,11 @@ void FlexibleListView::dataChanged( const QModelIndex& topLeft, const QModelInde { QListView::dataChanged( topLeft, bottomRight, roles ); + if (roles.contains(m_uidRole)) + { + restorePositions(); + } + if( m_toolTipPos.isNull() == false && ( roles.isEmpty() || roles.contains(Qt::ToolTipRole) ) ) { if( viewport()->mapToGlobal(m_toolTipPos) != QCursor::pos() ) From ba1ecd4721feb2e4a0dfdffd883ccf9754b8d503 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:13:05 +0200 Subject: [PATCH 09/25] MonitoringMode: rename updateUserData() to updateUserInfo() (cherry picked from commit 52b0876e5627b428b72296b26963f814406eb374) --- core/src/MonitoringMode.cpp | 6 +++--- core/src/MonitoringMode.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index 4797501ef..ebe979315 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -76,7 +76,7 @@ MonitoringMode::MonitoringMode( QObject* parent ) : connect(&m_sessionInfoUpdateTimer, &QTimer::timeout, this, &MonitoringMode::updateSessionInfo); m_sessionInfoUpdateTimer.start(SessionInfoUpdateInterval); - updateUserData(); + updateUserInfo(); updateSessionInfo(); updateScreenInfoList(); @@ -328,7 +328,7 @@ bool MonitoringMode::sendUserInformation(VeyonServerInterface& server, const Mes m_userDataLock.lockForRead(); if (m_userLoginName.isEmpty()) { - updateUserData(); + updateUserInfo(); message.addArgument(Argument::UserLoginName, QString{}); message.addArgument(Argument::UserFullName, QString{}); } @@ -396,7 +396,7 @@ void MonitoringMode::updateActiveFeatures() -void MonitoringMode::updateUserData() +void MonitoringMode::updateUserInfo() { // asynchronously query information about logged on user (which might block // due to domain controller queries and timeouts etc.) diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 975726021..6378a6d6c 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -155,7 +155,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac } void updateActiveFeatures(); - void updateUserData(); + void updateUserInfo(); void updateSessionInfo(); void updateScreenInfoList(); From 9008005ddbb84e488195f428700793330c1aad9e Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:13:32 +0200 Subject: [PATCH 10/25] MonitoringMode: retry updating user info if empty (cherry picked from commit 8dd1a740ac1ec716b6e8bd7f49d89f08abff79ee) --- core/src/MonitoringMode.cpp | 7 +++++++ core/src/MonitoringMode.h | 1 + 2 files changed, 8 insertions(+) diff --git a/core/src/MonitoringMode.cpp b/core/src/MonitoringMode.cpp index ebe979315..0cb3056b3 100644 --- a/core/src/MonitoringMode.cpp +++ b/core/src/MonitoringMode.cpp @@ -415,6 +415,13 @@ void MonitoringMode::updateUserInfo() } m_userDataLock.unlock(); } + + m_userDataLock.lockForRead(); + if (m_userLoginName.isEmpty() && m_userFullName.isEmpty()) + { + QTimer::singleShot(UserInfoUpdateRetryInterval, this, &MonitoringMode::updateUserInfo); + } + m_userDataLock.unlock(); } ); } diff --git a/core/src/MonitoringMode.h b/core/src/MonitoringMode.h index 6378a6d6c..131d7a31b 100644 --- a/core/src/MonitoringMode.h +++ b/core/src/MonitoringMode.h @@ -167,6 +167,7 @@ class VEYON_CORE_EXPORT MonitoringMode : public QObject, FeatureProviderInterfac static constexpr int ActiveFeaturesUpdateInterval = 250; static constexpr int SessionInfoUpdateInterval = 1000; + static constexpr int UserInfoUpdateRetryInterval = 1000; const Feature m_monitoringModeFeature; const Feature m_queryApplicationVersionFeature; From c7093a6939ef859fe4ab8c5cbf343f2e4f8bd0a6 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:41:31 +0200 Subject: [PATCH 11/25] UserConfig: don't reload after loading template Make keys from template config take precedence over user config. (cherry picked from commit f426146b4f777d38b695fad7807714c5cf95e99c) --- master/src/UserConfig.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/master/src/UserConfig.cpp b/master/src/UserConfig.cpp index 774f96994..61dc9fb40 100644 --- a/master/src/UserConfig.cpp +++ b/master/src/UserConfig.cpp @@ -38,7 +38,6 @@ UserConfig::UserConfig(const QString& storeName) : { Configuration::JsonStore jsonStore(Configuration::Store::Scope::System, templateFileName); *this += UserConfig(&jsonStore); - reloadFromStore(); } } From 00d3451a9d237ac03a7e0f3da3756bf48fc6b228 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Tue, 8 Apr 2025 14:57:21 +0200 Subject: [PATCH 12/25] Master: fix filter controls initialization Connect filter buttons before initializing their states from configuration. (cherry picked from commit 762ac65c104c624aea1d0f095053f94605945513) --- master/src/MainWindow.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/master/src/MainWindow.cpp b/master/src/MainWindow.cpp index 3dda66b8c..beaa49420 100644 --- a/master/src/MainWindow.cpp +++ b/master/src/MainWindow.cpp @@ -198,15 +198,15 @@ MainWindow::MainWindow( VeyonMaster &masterCore, QWidget* parent ) : ui->computerSelectPanelButton->setChecked( true ); } - // initialize search filter - ui->filterPoweredOnComputersButton->setChecked( m_master.userConfig().filterPoweredOnComputers() ); - ui->filterComputersWithLoggedOnUsersButton->setChecked( m_master.userConfig().filterComputersWithLoggedOnUsers() ); + // initialize filter controls connect( ui->filterLineEdit, &QLineEdit::textChanged, this, [this]( const QString& filter ) { ui->computerMonitoringWidget->setSearchFilter( filter ); } ); connect( ui->filterPoweredOnComputersButton, &QToolButton::toggled, this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterPoweredOnComputers( enabled ); } ); connect( ui->filterComputersWithLoggedOnUsersButton, &QToolButton::toggled, this, [this]( bool enabled ) { ui->computerMonitoringWidget->setFilterComputersWithLoggedOnUsers( enabled ); } ); + ui->filterPoweredOnComputersButton->setChecked(m_master.userConfig().filterPoweredOnComputers()); + ui->filterComputersWithLoggedOnUsersButton->setChecked(m_master.userConfig().filterComputersWithLoggedOnUsers()); // initialize monitoring screen size slider ui->gridSizeSlider->setMinimum( ComputerMonitoringWidget::MinimumComputerScreenSize ); From 1aa438449640c56f05442b2de9ebf9e7d973a843 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Apr 2025 18:56:57 +0200 Subject: [PATCH 13/25] RemoteAccess: move view-fullscreen.png to Core (cherry picked from commit f5fc1f0681456c6fc442be3c8650860bfb1a43ad) --- core/resources/core.qrc | 2 ++ core/resources/view-fullscreen-dark.png | Bin 0 -> 471 bytes core/resources/view-fullscreen.png | Bin 0 -> 471 bytes plugins/remoteaccess/RemoteAccessWidget.cpp | 2 +- plugins/remoteaccess/remoteaccess.qrc | 1 - plugins/remoteaccess/view-fullscreen.png | Bin 486 -> 0 bytes 6 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 core/resources/view-fullscreen-dark.png create mode 100644 core/resources/view-fullscreen.png delete mode 100644 plugins/remoteaccess/view-fullscreen.png diff --git a/core/resources/core.qrc b/core/resources/core.qrc index 3c3a6106e..c1428e7de 100644 --- a/core/resources/core.qrc +++ b/core/resources/core.qrc @@ -44,5 +44,7 @@ toast-information.png toast-success.png toast-warning.png + view-fullscreen.png + view-fullscreen-dark.png diff --git a/core/resources/view-fullscreen-dark.png b/core/resources/view-fullscreen-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..c170702309de4edec3e88378738facc51b52761b GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdz6FpAgso|Ns95gWq8A=g*&b z?(ZOrSWANZf*H!|8#*?hQ(C~lz-a2};uw-~@9ho4ydw@AtN|D1G|p3AQg~icp!)yn zC0#-{5B#}VqFtB$`sL|wCzuwUOflN|^sDsxcN6W+OB=!%k{hm@vNCO9lVIFa9mK?N zi*XP8p8Cj5tXtSC*nhmMp2)kvx}o~O_xWqKG`wSc$KdYQYto>^aJ?a!J>1K|utEDk z{&B0b{;fO#A`fH=oERsG1jsz#DLBM9iRFTD!~BNJoDQED_MK~J{UdMH!1kl&!Q5(7j#m2wJtC) zioOuL+$Qp(!GUYb=}Kmzopr0Iqeo AiU0rr literal 0 HcmV?d00001 diff --git a/core/resources/view-fullscreen.png b/core/resources/view-fullscreen.png new file mode 100644 index 0000000000000000000000000000000000000000..a8679f9cba7ab28bcffea47ae73e4cc19cefe23c GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI&H|6fVg`mX84zY%eyHLVP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXpdz6FpAgso|NkqgYbvQ}sHkbF zsA(#zX)4Ox*8?M;tg<11`*IoTt2` z@Vulz_5amNx`b{X_;a&FyDt0n%hTUZFfBTnVzl$=SLyZdCfb{qHiR)GH(WPmW!l0f z!MLY7h>77A;~w@s^^u!cx3E{R|9DqDk#~W0L-m30^Ve)?c*ppT!QHRdq(O<{dP6dM zxR--rgZ6>^<5p+=TX_OR9>^3pF-{T*ka@sUaENgd%LUJaJJ- - view-fullscreen.png preferences-system-windows-effect-desktopgrid.png application-exit.png krdc.png diff --git a/plugins/remoteaccess/view-fullscreen.png b/plugins/remoteaccess/view-fullscreen.png deleted file mode 100644 index 6fc7cf047de20ecf422fc5c9b33d65712dbecdcc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?I3?vN&YJLDI=3*z$5DpHG+YkL80J)q69+AZi z40*dinDN@Zjp9H-$r9IylHmNblJdl&REF~Ma=pyF?Be9af>gcyqV(DCY@~pSgaUj* zT!HkbPoF-2{`~RdM<4?T?ibxL2a2+m1o;Isl-DGkg>+MAa) zgfS#HTsLK9+QKHmxTiXZiQyLG9`-%;k(*ezuvf7Ecvn4+Wp$P_p+P7(=_dB9U}h;b6j1>uJI4VO6` zJ~8Y&*UA| zFte|#`C%p!arBFvMnNby$6+yn)prtD*kZm49ecpUDp1gvC77Dg$i=b6VP}u=1_w@- zhy`&TQeg|&n6xkGr1ENAU|7+B*>X8NdYuVK~<)!4Xy TrmhPxL>W9?{an^LB{Ts5#7(;0 From ace589fdbc60a0bb4f639f3b16811523fbdc0ffd Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Wed, 9 Apr 2025 20:54:26 +0200 Subject: [PATCH 14/25] SlideshowPanel: add button to switch view mode This allows viewing the slideshow in a separate window. (cherry picked from commit 3312dc260de3b539b6a5068bdfe7e8b5a2b1689a) --- master/src/SlideshowPanel.cpp | 21 +++++++++++++++++++++ master/src/SlideshowPanel.h | 2 ++ master/src/SlideshowPanel.ui | 19 +++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/master/src/SlideshowPanel.cpp b/master/src/SlideshowPanel.cpp index 9048a2561..3114efe46 100644 --- a/master/src/SlideshowPanel.cpp +++ b/master/src/SlideshowPanel.cpp @@ -55,6 +55,7 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co ui->startStopButton->setIcon(startStopIcon); ui->showPreviousButton->setIcon(QIcon(QStringLiteral(":/core/go-previous-dark.png"))); ui->showNextButton->setIcon(QIcon(QStringLiteral(":/core/go-next-dark.png"))); + ui->viewInSeparateWindowButton->setIcon(QIcon(QStringLiteral(":/core/view-fullscreen-dark.png"))); } connect( ui->startStopButton, &QAbstractButton::toggled, this, &SlideshowPanel::updateDuration ); @@ -63,6 +64,8 @@ SlideshowPanel::SlideshowPanel( UserConfig& config, ComputerMonitoringWidget* co connect( ui->showPreviousButton, &QAbstractButton::clicked, m_model, &SlideshowModel::showPrevious ); connect( ui->showNextButton, &QAbstractButton::clicked, m_model, &SlideshowModel::showNext ); + connect(ui->viewInSeparateWindowButton, &QToolButton::toggled, this, &SlideshowPanel::switchViewMode); + ui->durationSlider->setValue( m_config.slideshowDuration() ); updateDuration(); @@ -103,3 +106,21 @@ void SlideshowPanel::updateDuration() ui->durationLabel->setText( QStringLiteral("%1 s").arg( duration / 1000 ) ); } + + + +void SlideshowPanel::switchViewMode() +{ + if (ui->viewInSeparateWindowButton->isChecked()) + { + m_originalParent = parentWidget(); + setParent(nullptr); + setWindowTitle(tr("%1 Master – Slideshow").arg(VeyonCore::applicationName())); + showMaximized(); + } + else + { + setParent(m_originalParent); + m_originalParent = nullptr; + } +} diff --git a/master/src/SlideshowPanel.h b/master/src/SlideshowPanel.h index 54a0d8bce..1e0e8170f 100644 --- a/master/src/SlideshowPanel.h +++ b/master/src/SlideshowPanel.h @@ -49,10 +49,12 @@ class SlideshowPanel : public QWidget private: void updateDuration(); + void switchViewMode(); Ui::SlideshowPanel* ui; UserConfig& m_config; SlideshowModel* m_model; + QWidget* m_originalParent = nullptr; } ; diff --git a/master/src/SlideshowPanel.ui b/master/src/SlideshowPanel.ui index 4b5ffd1e5..36b006bf1 100644 --- a/master/src/SlideshowPanel.ui +++ b/master/src/SlideshowPanel.ui @@ -2,6 +2,10 @@ SlideshowPanel + + + :/master/computer-slideshow.png:/master/computer-slideshow.png + 0 @@ -125,6 +129,20 @@ + + + + View in separate window + + + + :/core/view-fullscreen.png:/core/view-fullscreen.png + + + true + + + @@ -140,6 +158,7 @@ + From 83dc91040f2e6f96394a522fb3c83b3c2298b21f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:11:40 +0200 Subject: [PATCH 15/25] NetworkObject: add include for QJsonObject (cherry picked from commit c1e04afdcdfab1c179e66fa476e0fb3ad15a1da9) --- core/src/NetworkObject.h | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/NetworkObject.h b/core/src/NetworkObject.h index e68f63a25..58034e761 100644 --- a/core/src/NetworkObject.h +++ b/core/src/NetworkObject.h @@ -24,6 +24,7 @@ #pragma once +#include #include #include From f1b59cb6fad3986c254f02a9f138bb6ba5ea6283 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:17:27 +0200 Subject: [PATCH 16/25] AccessControlRulesTestDialog: improve result text for no action (cherry picked from commit bab65ea5b91b1a4a68183b53b1e9887ee9e2d43e) --- configurator/src/AccessControlRulesTestDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configurator/src/AccessControlRulesTestDialog.cpp b/configurator/src/AccessControlRulesTestDialog.cpp index e144af386..f1ab65376 100644 --- a/configurator/src/AccessControlRulesTestDialog.cpp +++ b/configurator/src/AccessControlRulesTestDialog.cpp @@ -85,7 +85,7 @@ void AccessControlRulesTestDialog::accept() resultText = tr( "The access in the given scenario needs permission of the logged on user." ); break; default: - resultText = tr( "ERROR: Unknown action" ); + resultText = tr("There is no matching rule with a valid action. The access is therefore denied."); break; } From cfdfad958c618ba5683376f8cdbb9f4f1a52cb79 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:21:52 +0200 Subject: [PATCH 17/25] AccessControlRulesTestDialog: improve dialog layout (cherry picked from commit 84d40359abbdf485c21228049b0c04a310bf8876) --- .../src/AccessControlRulesTestDialog.ui | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/configurator/src/AccessControlRulesTestDialog.ui b/configurator/src/AccessControlRulesTestDialog.ui index 2b72abff8..04e44df9f 100644 --- a/configurator/src/AccessControlRulesTestDialog.ui +++ b/configurator/src/AccessControlRulesTestDialog.ui @@ -9,10 +9,10 @@ - Qt::Horizontal + Qt::Orientation::Horizontal - QDialogButtonBox::Close|QDialogButtonBox::Ok + QDialogButtonBox::StandardButton::Close|QDialogButtonBox::StandardButton::Ok @@ -45,12 +45,6 @@ - - - 0 - 0 - - Please enter the following user and computer information in order to test the configured ruleset. @@ -70,7 +64,14 @@ - + + + + 300 + 0 + + + From 7d8d49011fe375a6867a0fa1e6abb74b55477eda Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 11:48:50 +0200 Subject: [PATCH 18/25] Configuration: Property: detach and delete if proxy is destroyed (cherry picked from commit 25e3a8067db394eb0a4d87d885b9008042f44a0d) --- core/src/Configuration/Property.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/Configuration/Property.cpp b/core/src/Configuration/Property.cpp index 801295df5..0fe568271 100644 --- a/core/src/Configuration/Property.cpp +++ b/core/src/Configuration/Property.cpp @@ -54,6 +54,10 @@ Configuration::Property::Property( Proxy* proxy, const QString& key, const QStri m_defaultValue( defaultValue ), m_flags( flags ) { + connect (proxy, &QObject::destroyed, this, [this]() { + setParent(nullptr); + deleteLater(); + }); } From d08d3b243ec9e38a941c3772626cb96ec548f9a7 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Mon, 20 Sep 2021 09:25:49 +0200 Subject: [PATCH 19/25] DesktopServicesFeaturePlugin: fix argument name Since multiple website URLs can be passed as string list, correctly identify the argument as WebsiteUrls. (cherry picked from commit 2937bb71408e19d8d7a1693c2c3f446218bcb619) --- .../desktopservices/DesktopServicesFeaturePlugin.cpp | 10 +++++----- plugins/desktopservices/DesktopServicesFeaturePlugin.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index fdcc81503..b3ebcfb4e 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -100,10 +100,10 @@ bool DesktopServicesFeaturePlugin::controlFeature( Feature::Uid featureUid, Oper if( featureUid == m_openWebsiteFeature.uid() ) { - const auto websites = arguments.value( argToString(Argument::WebsiteUrl) ).toStringList(); + const auto websites = arguments.value( argToString(Argument::WebsiteUrls) ).toStringList(); sendFeatureMessage( FeatureMessage{ featureUid, FeatureMessage::DefaultCommand } - .addArgument( Argument::WebsiteUrl, websites ), + .addArgument( Argument::WebsiteUrls, websites ), computerControlInterfaces ); return true; @@ -134,7 +134,7 @@ bool DesktopServicesFeaturePlugin::startFeature( VeyonMasterInterface& master, c else if( m_predefinedWebsitesFeatures.contains( feature ) ) { sendFeatureMessage( FeatureMessage( m_openWebsiteFeature.uid(), FeatureMessage::DefaultCommand ). - addArgument( Argument::WebsiteUrl, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); + addArgument( Argument::WebsiteUrls, predefinedServicePath( feature.uid() ) ), computerControlInterfaces ); } else @@ -182,7 +182,7 @@ bool DesktopServicesFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& w if( message.featureUid() == m_openWebsiteFeature.uid() ) { - openWebsite( message.argument( Argument::WebsiteUrl ).toString() ); + openWebsite( message.argument( Argument::WebsiteUrls ).toString() ); return true; } @@ -341,7 +341,7 @@ void DesktopServicesFeaturePlugin::openWebsite( const QString& website, const QS const ComputerControlInterfaceList& computerControlInterfaces ) { controlFeature( m_openWebsiteFeature.uid(), Operation::Start, - { { argToString(Argument::WebsiteUrl), website } }, + { { argToString(Argument::WebsiteUrls), website } }, computerControlInterfaces ); if( saveItemName.isEmpty() == false ) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.h b/plugins/desktopservices/DesktopServicesFeaturePlugin.h index e31adb3a9..05bdca85f 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.h +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.h @@ -42,7 +42,7 @@ class DesktopServicesFeaturePlugin : public QObject, PluginInterface, enum class Argument { Applications, - WebsiteUrl + WebsiteUrls }; Q_ENUM(Argument) From f6b0bf1b5314e611b5da4e9039566671425c974f Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 12:40:52 +0200 Subject: [PATCH 20/25] DesktopServicesFeaturePlugin: stop worker after opening website (cherry picked from commit d6fc9ef7c9b1bc0efd14c56f3406acd2abd1bdb0) --- plugins/desktopservices/DesktopServicesFeaturePlugin.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp index b3ebcfb4e..cb70741d1 100644 --- a/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp +++ b/plugins/desktopservices/DesktopServicesFeaturePlugin.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -183,6 +184,7 @@ bool DesktopServicesFeaturePlugin::handleFeatureMessage( VeyonWorkerInterface& w if( message.featureUid() == m_openWebsiteFeature.uid() ) { openWebsite( message.argument( Argument::WebsiteUrls ).toString() ); + QCoreApplication::quit(); return true; } From bdbe962a07d405378f2732aaa74234701931c3c0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 12:41:35 +0200 Subject: [PATCH 21/25] FileTransfer: stop worker after all files have been transferred (cherry picked from commit c34568efec24f114c9e85179659c15b6c726b910) --- plugins/filetransfer/FileTransferController.cpp | 2 ++ plugins/filetransfer/FileTransferPlugin.cpp | 12 ++++++++++++ plugins/filetransfer/FileTransferPlugin.h | 2 ++ 3 files changed, 16 insertions(+) diff --git a/plugins/filetransfer/FileTransferController.cpp b/plugins/filetransfer/FileTransferController.cpp index af722858d..bc76d9f59 100644 --- a/plugins/filetransfer/FileTransferController.cpp +++ b/plugins/filetransfer/FileTransferController.cpp @@ -167,6 +167,8 @@ void FileTransferController::process() m_plugin->sendOpenTransferFolderMessage( m_interfaces ); } + m_plugin->sendStopWorkerMessage(m_interfaces); + m_processTimer.stop(); Q_EMIT finished(); } diff --git a/plugins/filetransfer/FileTransferPlugin.cpp b/plugins/filetransfer/FileTransferPlugin.cpp index a90b48d16..836b6ae06 100644 --- a/plugins/filetransfer/FileTransferPlugin.cpp +++ b/plugins/filetransfer/FileTransferPlugin.cpp @@ -22,6 +22,7 @@ * */ +#include #include #include #include @@ -262,6 +263,10 @@ bool FileTransferPlugin::handleFeatureMessage( VeyonWorkerInterface& worker, con QDesktopServices::openUrl( QUrl::fromLocalFile( destinationDirectory() ) ); return true; + case StopWorker: + QCoreApplication::quit(); + return true; + default: break; } @@ -322,6 +327,13 @@ void FileTransferPlugin::sendOpenTransferFolderMessage( const ComputerControlInt +void FileTransferPlugin::sendStopWorkerMessage(const ComputerControlInterfaceList& interfaces) +{ + sendFeatureMessage(FeatureMessage(m_fileTransferFeature.uid(), Commands::StopWorker), interfaces); +} + + + QString FileTransferPlugin::destinationDirectory() const { auto dir = VeyonCore::filesystem().expandPath( m_configuration.fileTransferDestinationDirectory() ); diff --git a/plugins/filetransfer/FileTransferPlugin.h b/plugins/filetransfer/FileTransferPlugin.h index 5102c9624..7726e8c0b 100644 --- a/plugins/filetransfer/FileTransferPlugin.h +++ b/plugins/filetransfer/FileTransferPlugin.h @@ -108,6 +108,7 @@ class FileTransferPlugin : public QObject, FeatureProviderInterface, PluginInter void sendFinishMessage( QUuid transferId, const QString& fileName, bool openFileInApplication, const ComputerControlInterfaceList& interfaces ); void sendOpenTransferFolderMessage( const ComputerControlInterfaceList& interfaces ); + void sendStopWorkerMessage(const ComputerControlInterfaceList& interfaces); ConfigurationPage* createConfigurationPage() override; @@ -121,6 +122,7 @@ class FileTransferPlugin : public QObject, FeatureProviderInterface, PluginInter FileTransferCancelCommand, FileTransferFinishCommand, OpenTransferFolder, + StopWorker, CommandCount }; From 33fe1a0f8ff3d98e6591b80ab6902e49a723dfd0 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 13:17:15 +0200 Subject: [PATCH 22/25] WebApiController: control feature in worker thread Closes #1021. --- plugins/webapi/WebApiController.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/webapi/WebApiController.cpp b/plugins/webapi/WebApiController.cpp index 4d6b7db6f..9a095dbe9 100644 --- a/plugins/webapi/WebApiController.cpp +++ b/plugins/webapi/WebApiController.cpp @@ -386,7 +386,7 @@ WebApiController::Response WebApiController::setFeatureStatus( const Request& re : FeatureProviderInterface::Operation::Stop; const auto arguments = request.data[k2s(Key::Arguments)].toMap(); - runInMainThread([&] { + runInWorkerThread([&] { VeyonCore::featureManager().controlFeature(Feature::Uid{feature}, operation, arguments, {connection->controlInterface()}); }); From dc0495c9598db5f3aeb403c810583bae32658e9c Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 13:18:11 +0200 Subject: [PATCH 23/25] WebApiController: drop obsolete runInMainThread() --- plugins/webapi/WebApiController.cpp | 7 ------- plugins/webapi/WebApiController.h | 2 -- 2 files changed, 9 deletions(-) diff --git a/plugins/webapi/WebApiController.cpp b/plugins/webapi/WebApiController.cpp index 9a095dbe9..763d0600a 100644 --- a/plugins/webapi/WebApiController.cpp +++ b/plugins/webapi/WebApiController.cpp @@ -559,13 +559,6 @@ QString WebApiController::errorString( WebApiController::Error error ) -void WebApiController::runInMainThread(const std::function& functor) -{ - QMetaObject::invokeMethod(VeyonCore::instance(), functor, Qt::BlockingQueuedConnection); -} - - - void WebApiController::runInWorkerThread(const std::function& functor) const { QMetaObject::invokeMethod(m_workerObject, functor, Qt::BlockingQueuedConnection); diff --git a/plugins/webapi/WebApiController.h b/plugins/webapi/WebApiController.h index e0690beb4..aaede8b5c 100644 --- a/plugins/webapi/WebApiController.h +++ b/plugins/webapi/WebApiController.h @@ -135,8 +135,6 @@ class WebApiController : public QObject static QString errorString( Error error ); private: - static void runInMainThread(const std::function& functor); - void runInWorkerThread(const std::function& functor) const; void runInWorkerThreadNonBlocking(const std::function& functor) const; From 72e3937dab363292a340bd3f56277376e6911877 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 12:44:30 +0200 Subject: [PATCH 24/25] Update translations --- translations/veyon.ts | 8 +++ translations/veyon_ar.ts | 12 +++- translations/veyon_bg.ts | 16 +++-- translations/veyon_ca_ES.ts | 16 +++-- translations/veyon_cs.ts | 16 +++-- translations/veyon_de.ts | 16 +++-- translations/veyon_el.ts | 16 +++-- translations/veyon_es_ES.ts | 16 +++-- translations/veyon_et.ts | 16 +++-- translations/veyon_eu.ts | 16 +++-- translations/veyon_fa.ts | 16 +++-- translations/veyon_fr.ts | 16 +++-- translations/veyon_he.ts | 16 +++-- translations/veyon_hu.ts | 16 +++-- translations/veyon_id.ts | 16 +++-- translations/veyon_it.ts | 22 ++++--- translations/veyon_ja.ts | 16 +++-- translations/veyon_ko.ts | 16 +++-- translations/veyon_lt.ts | 16 +++-- translations/veyon_lv.ts | 16 +++-- translations/veyon_mn.ts | 12 +++- translations/veyon_nl.ts | 16 +++-- translations/veyon_no_NO.ts | 12 +++- translations/veyon_pl.ts | 16 +++-- translations/veyon_pt_BR.ts | 108 +++++++++++++++++---------------- translations/veyon_pt_PT.ts | 16 +++-- translations/veyon_ru.ts | 66 +++++++++++--------- translations/veyon_sl.ts | 16 +++-- translations/veyon_sr.ts | 16 +++-- translations/veyon_sv.ts | 16 +++-- translations/veyon_th.ts | 16 +++-- translations/veyon_tr.ts | 36 ++++++----- translations/veyon_uk.ts | 16 +++-- translations/veyon_vi.ts | 16 +++-- translations/veyon_zh_CN.ts | 16 +++-- translations/veyon_zh_TW.ts | 116 ++++++++++++++++++++---------------- 36 files changed, 557 insertions(+), 267 deletions(-) diff --git a/translations/veyon.ts b/translations/veyon.ts index 415e24c4a..7a02a66dd 100644 --- a/translations/veyon.ts +++ b/translations/veyon.ts @@ -4036,6 +4036,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_ar.ts b/translations/veyon_ar.ts index 777124373..1fba0043f 100644 --- a/translations/veyon_ar.ts +++ b/translations/veyon_ar.ts @@ -296,11 +296,11 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + There is no matching rule with a valid action. The access is therefore denied. @@ -4034,6 +4034,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_bg.ts b/translations/veyon_bg.ts index 447836409..7e3c24cc4 100644 --- a/translations/veyon_bg.ts +++ b/translations/veyon_bg.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. The access in the given scenario needs permission of the logged on user. - - ERROR: Unknown action - ERROR: Unknown action - Test result Test result + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4061,6 +4061,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_ca_ES.ts b/translations/veyon_ca_ES.ts index 4f9fc68ea..99f5731bd 100644 --- a/translations/veyon_ca_ES.ts +++ b/translations/veyon_ca_ES.ts @@ -297,14 +297,14 @@ Si esteu interessat a traduir el Veyon al vostre idioma local o a un altre o vol The access in the given scenario needs permission of the logged on user. L'accés a l'escenari indicat necessita el permís de l'usuari connectat. - - ERROR: Unknown action - ERROR: acció desconeguda - Test result Resultat de la prova + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4061,6 +4061,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Duració: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_cs.ts b/translations/veyon_cs.ts index 19a53ebd5..8451f96d3 100644 --- a/translations/veyon_cs.ts +++ b/translations/veyon_cs.ts @@ -297,14 +297,14 @@ Pokud ale překlad není kompletní a nebo by potřeboval vylepšit, případně The access in the given scenario needs permission of the logged on user. Přístup v zadaném scénáři vyžaduje svolení od přihlášeného uživatele. - - ERROR: Unknown action - CHYBA: neznámá akce - Test result Výsledek zkoušky fungování + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4057,6 +4057,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_de.ts b/translations/veyon_de.ts index e12017622..0e42c9a08 100644 --- a/translations/veyon_de.ts +++ b/translations/veyon_de.ts @@ -295,14 +295,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Der Zugriff benötigt im angegebenen Szenario die Erlaubnis des angemeldeten Benutzers. - - ERROR: Unknown action - FEHLER: Unbekannte Aktion - Test result Testergebnis + + There is no matching rule with a valid action. The access is therefore denied. + Es gibt keine zutreffende Regel mit einer gültigen Aktion. Der Zugriff wird daher verweigert. + AuthKeysConfigurationPage @@ -4064,6 +4064,14 @@ Beispiel: [^-]*-(PC[0-9]*) Duration: Dauer: + + View in separate window + Ansicht in separatem Fenster + + + %1 Master – Slideshow + %1 Master – Diashow + SpotlightPanel diff --git a/translations/veyon_el.ts b/translations/veyon_el.ts index ae5ef75e0..c19f5ab63 100644 --- a/translations/veyon_el.ts +++ b/translations/veyon_el.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Η πρόσβαση στο δεδομένο σενάριο χρειάζεται άδεια από τον συνδεδεμένο χρήστη. - - ERROR: Unknown action - ΣΦΑΛΜΑ: Άγνωστη ενέργεια - Test result Αποτέλεσμα δοκιμής + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4036,6 +4036,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Διάρκεια: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_es_ES.ts b/translations/veyon_es_ES.ts index e6369df5c..6c51d988f 100644 --- a/translations/veyon_es_ES.ts +++ b/translations/veyon_es_ES.ts @@ -299,14 +299,14 @@ Si deseas mejorar la traducción actual, por favor, ¡contacta con un desarrolla The access in the given scenario needs permission of the logged on user. El acceso en el escenario dado necesita permiso del usuario conectado. - - ERROR: Unknown action - ERROR: Acción desconocida - Test result Resultado de la prueba + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4063,6 +4063,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Duración: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_et.ts b/translations/veyon_et.ts index ad7a16ca7..293d3c4b7 100644 --- a/translations/veyon_et.ts +++ b/translations/veyon_et.ts @@ -297,14 +297,14 @@ Kui olete huvitatud Veyoni tõlkimisest oma kohalikku või mõnda muusse keelde The access in the given scenario needs permission of the logged on user. Antud stsenaariumi korral vajab juurdepääs sisseloginud kasutaja luba. - - ERROR: Unknown action - Viga: Tundmatu tegevus - Test result Testi tulemus + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4065,6 +4065,14 @@ Näide: [^-]*-(PC[0-9]*) Duration: Kestus: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_eu.ts b/translations/veyon_eu.ts index 658adf335..6a4f07011 100644 --- a/translations/veyon_eu.ts +++ b/translations/veyon_eu.ts @@ -297,14 +297,14 @@ Veyon zure tokiko hizkuntzara edo beste hizkuntza batera itzultzeko interesa bad The access in the given scenario needs permission of the logged on user. Zehaztutako egoeran sartzeak saioa hasita duen erabiltzailearen baimena behar du. - - ERROR: Unknown action - ERROREA: ekintza ezezaguna - Test result Probaren emaitza + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4065,6 +4065,14 @@ Adibidea: [^ -] * - (PC [0-9] *) Duration: Iraupena: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_fa.ts b/translations/veyon_fa.ts index 711d05f86..8160ea109 100644 --- a/translations/veyon_fa.ts +++ b/translations/veyon_fa.ts @@ -296,14 +296,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. دسترسی به سناریو داده شده نیاز به اجازه ورود کاربر دارد. - - ERROR: Unknown action - خطا: اقدام ناشناخته - Test result نتیجه تست + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4035,6 +4035,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_fr.ts b/translations/veyon_fr.ts index 9ba7908a7..062fedf05 100644 --- a/translations/veyon_fr.ts +++ b/translations/veyon_fr.ts @@ -297,14 +297,14 @@ Cependant, si vous êtes intéressé pour traduire Veyon dans une autre langue, The access in the given scenario needs permission of the logged on user. L'accès dans le scénario donné demande la permission à l'utilisateur connecté. - - ERROR: Unknown action - ERREUR : Action inconnue - Test result Résultat du test + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4061,6 +4061,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Durée : + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_he.ts b/translations/veyon_he.ts index 27edfb7b5..4446e2d6c 100644 --- a/translations/veyon_he.ts +++ b/translations/veyon_he.ts @@ -295,14 +295,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. הגישה במקרה הניתן דורשת הרשאה מצד המשתמש המחובר. - - ERROR: Unknown action - שגיאה: פעולה לא ידועה - Test result תוצאות בדיקה + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4037,6 +4037,14 @@ Example: [^-]*-(PC[0-9]*) Duration: משך זמן: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_hu.ts b/translations/veyon_hu.ts index c108801d1..1b26b2a56 100644 --- a/translations/veyon_hu.ts +++ b/translations/veyon_hu.ts @@ -297,14 +297,14 @@ Ha érdekel a Veyon fordítása (saját vagy egyéb nyelvre), esetleg meglévő The access in the given scenario needs permission of the logged on user. Az adott esetben a hozzáféréshez a bejelentkezett felhasználó jogosultságára van szükség. - - ERROR: Unknown action - HIBA: Ismeretlen művelet - Test result Teszt eredménye: + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4060,6 +4060,14 @@ Példa: [^-]*-(PC[0-9]*) Duration: Időtartam: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_id.ts b/translations/veyon_id.ts index 2a3f9f94d..9d928e98d 100644 --- a/translations/veyon_id.ts +++ b/translations/veyon_id.ts @@ -297,14 +297,14 @@ Jika anda tertarik menerjemahkan Veyon pada bahasa lokal Anda atau bahasa lain a The access in the given scenario needs permission of the logged on user. Akses dalam skenario yang diberikan membutuhkan izin dari pengguna yang masuk. - - ERROR: Unknown action - GALAT: Aksi tidak diketahui - Test result Hasil test + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4039,6 +4039,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_it.ts b/translations/veyon_it.ts index 57f8634e8..7acaf8110 100644 --- a/translations/veyon_it.ts +++ b/translations/veyon_it.ts @@ -130,7 +130,7 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche The specified user is not allowed to access computers with this configuration. - L'utente indicato non è abilitato ad accedere a computer con questa confiugurazione. + L'utente indicato non è abilitato ad accedere a computer con questa configurazione. @@ -297,14 +297,14 @@ Se sei interessato alla traduzione di Veyon nella tua lingua locale o in qualche The access in the given scenario needs permission of the logged on user. L'accesso allo scenario fornito richiede l'autorizzazione dell'utente connesso. - - ERROR: Unknown action - ERRORE: azione sconosciuta - Test result Risultati del test + + There is no matching rule with a valid action. The access is therefore denied. + Non esiste una regola corrispondente con un'azione valida. L'accesso è quindi negato. + AuthKeysConfigurationPage @@ -2001,7 +2001,7 @@ Assicurati che i nomi delle chiavi che appartengono l'una all'altra si Light - + Leggero Dark @@ -3651,7 +3651,7 @@ Si prega di salvare il lavoro e chiudere tutti i programmi. Unlock - Sbloccca + Sblocca To reclaim all user's full attention you can lock their computers using this button. In this mode all input devices are locked and the screens are blacked. @@ -4053,6 +4053,14 @@ Esempio: [^-]*-(PC[0-9]*) Duration: Durata: + + View in separate window + Visualizzazione in finestra separata + + + %1 Master – Slideshow + %1 Master – Presentazione + SpotlightPanel diff --git a/translations/veyon_ja.ts b/translations/veyon_ja.ts index 1c930d50b..4edbafc69 100644 --- a/translations/veyon_ja.ts +++ b/translations/veyon_ja.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. このシナリオでのアクセスにはログインしているユーザーの許可が必要です。 - - ERROR: Unknown action - エラー:不明のアクション - Test result テスト結果 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4042,6 +4042,14 @@ Example: [^-]*-(PC[0-9]*) Duration: 期限: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_ko.ts b/translations/veyon_ko.ts index e63038c4f..ad1ebcb45 100644 --- a/translations/veyon_ko.ts +++ b/translations/veyon_ko.ts @@ -297,14 +297,14 @@ Veyon 번역에 관심이 있거나 번역을 개선하실 의향이 있으신 The access in the given scenario needs permission of the logged on user. 주어진 상황에 대한 접근은 로그온된 사용자의 허가가 필요함. - - ERROR: Unknown action - ERROR: 정의되지 않은 작업 - Test result 시험 결과 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4059,6 +4059,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_lt.ts b/translations/veyon_lt.ts index 83344f9dd..ed885f5a8 100644 --- a/translations/veyon_lt.ts +++ b/translations/veyon_lt.ts @@ -296,14 +296,14 @@ Jeigu domina Veyon programos vertimas į vietinę ar kitą kalbą, arba norite p The access in the given scenario needs permission of the logged on user. Prieiga šiomis sąlygomis reikalauja patvirtinimo iš prisijungusio naudotojo - - ERROR: Unknown action - KLAIDA: Nežinomas veiksmas - Test result Testo rezultatai + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4039,6 +4039,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_lv.ts b/translations/veyon_lv.ts index 32fe665a3..1af5d0539 100644 --- a/translations/veyon_lv.ts +++ b/translations/veyon_lv.ts @@ -297,14 +297,14 @@ Ja esat ieinteresēti tulkot Veyon citā valodā vai uzlabot esošo tulkojumu, l The access in the given scenario needs permission of the logged on user. Piekļuvei dotajā scenārijā ir nepieciešama no lietotāja, kurš šobrīd ir pierakstījies. - - ERROR: Unknown action - Errors: Nezināma darbība - Test result Testa rezultāti + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4041,6 +4041,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Ilgums: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_mn.ts b/translations/veyon_mn.ts index b366eaa5b..8f8232619 100644 --- a/translations/veyon_mn.ts +++ b/translations/veyon_mn.ts @@ -296,11 +296,11 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + There is no matching rule with a valid action. The access is therefore denied. @@ -4034,6 +4034,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_nl.ts b/translations/veyon_nl.ts index 777a1967f..379bea3ee 100644 --- a/translations/veyon_nl.ts +++ b/translations/veyon_nl.ts @@ -297,14 +297,14 @@ Als je geïnteresseerd bent in het vertalen van Veyon in je eigen taal of een an The access in the given scenario needs permission of the logged on user. De toegang in het gegeven scenario heeft toestemming van de ingelogde gebruiker nodig. - - ERROR: Unknown action - FOUT: Onbekende actie - Test result Testresultaat + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4067,6 +4067,14 @@ Voorbeeld: [^-]*-(PC[0-9]*) Duration: Duur: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_no_NO.ts b/translations/veyon_no_NO.ts index 4f0f67122..a8d86fe31 100644 --- a/translations/veyon_no_NO.ts +++ b/translations/veyon_no_NO.ts @@ -296,11 +296,11 @@ If you're interested in translating Veyon into your local or another langua - ERROR: Unknown action + Test result - Test result + There is no matching rule with a valid action. The access is therefore denied. @@ -4034,6 +4034,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_pl.ts b/translations/veyon_pl.ts index 5d726ccc5..8638a0bb5 100644 --- a/translations/veyon_pl.ts +++ b/translations/veyon_pl.ts @@ -297,14 +297,14 @@ Jeśli chcesz przetłumaczyć Veyon na swój język lub chcesz poprawić obecne The access in the given scenario needs permission of the logged on user. Dostęp w danym scenariuszu wymaga zgody zalogowanego użytkownika. - - ERROR: Unknown action - Błąd: nieznana akcja. - Test result Wynik testu + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4056,6 +4056,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Czas trwania: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_pt_BR.ts b/translations/veyon_pt_BR.ts index 6d4a776d5..4dafcf381 100644 --- a/translations/veyon_pt_BR.ts +++ b/translations/veyon_pt_BR.ts @@ -252,7 +252,7 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi Local computer is already being accessed - + Computador local já está sendo acessado @@ -297,14 +297,14 @@ Se você tem interesse em traduzir o Veyon para o seu idioma local, ou outro idi The access in the given scenario needs permission of the logged on user. O acesso na configuração atual requer a permissão de um usuário logado. - - ERROR: Unknown action - ERRO: Ação desconhecida - Test result Resultado do teste + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -745,11 +745,11 @@ Make sure that the names of the keys belonging to each other are identical on al Add a location or computer - + Adicione um local ou um computador Clear all locations and computers - + Remova todas as localizações e computadores Dump all or individual locations and computers @@ -777,7 +777,7 @@ Make sure that the names of the keys belonging to each other are identical on al LOCATION - + LOCAL FORMAT-STRING-WITH-PLACEHOLDERS @@ -1034,7 +1034,7 @@ Make sure that the names of the keys belonging to each other are identical on al Veyon Server unreachable or not running - + Servidor Veyon inacessível ou não está sendo executado Authentication failed or access denied @@ -1054,7 +1054,7 @@ Make sure that the names of the keys belonging to each other are identical on al Hostname: %1 - + Nome do host: %1 unknown @@ -1062,7 +1062,7 @@ Make sure that the names of the keys belonging to each other are identical on al IP address: %1 - + Endereço IP: %1 Hostname could not be resolved @@ -1070,7 +1070,7 @@ Make sure that the names of the keys belonging to each other are identical on al No features active - + Nenhum recurso ativado @@ -1105,7 +1105,7 @@ Make sure that the names of the keys belonging to each other are identical on al Active connections: - + Conecções ativas: @@ -1116,7 +1116,7 @@ Make sure that the names of the keys belonging to each other are identical on al Logged in since - + Conectado desde Missing network object directory plugin @@ -1132,15 +1132,15 @@ Make sure that the names of the keys belonging to each other are identical on al %1 days - + 1% dias 1 day - + 1 dia Location detection failed - + Falha na detecção do local Could not determine the location of this computer. This indicates a problem with the system configuration. All locations will be shown in the computer select panel instead. @@ -1151,7 +1151,7 @@ Make sure that the names of the keys belonging to each other are identical on al ComputerSelectPanel Search computers - + Procurar computadores Add location @@ -1323,11 +1323,11 @@ Make sure that the names of the keys belonging to each other are identical on al Bandwidth limit - + Limite de rede MB/s - + MB/s @@ -1428,11 +1428,11 @@ Make sure that the names of the keys belonging to each other are identical on al DesktopServicesConfigurationPage Applications & websites - + Aplicativos & websites Predefined applications - + Aplicativos pré-definidos Name @@ -1444,11 +1444,11 @@ Make sure that the names of the keys belonging to each other are identical on al Add new application - + Adicionar novo aplicativo Remove selected application - + Remover aplicativo selecionado Predefined websites @@ -1456,7 +1456,7 @@ Make sure that the names of the keys belonging to each other are identical on al Add new website - + Adicionar novo website Remove selected website @@ -1468,7 +1468,7 @@ Make sure that the names of the keys belonging to each other are identical on al New application - + Novo aplicativo New website @@ -1479,11 +1479,11 @@ Make sure that the names of the keys belonging to each other are identical on al DesktopServicesFeaturePlugin Start application - + Iniciar aplicativo Click this button to start an application on all computers. - + Clique nesse botão para iniciar um aplicativo em todos os computadores Open website @@ -1495,11 +1495,11 @@ Make sure that the names of the keys belonging to each other are identical on al Start application "%1" - + Iniciar aplicativo "%1" Custom application - + Aplicativo customizado Open website "%1" @@ -1550,7 +1550,7 @@ Make sure that the names of the keys belonging to each other are identical on al Custom application - + Aplicativo customizado Handout @@ -1615,15 +1615,15 @@ Make sure that the names of the keys belonging to each other are identical on al HOST ADDRESS - Endereço host + ENDEREÇO HOST FEATURE - + RECURSO ARGUMENTS - + ARGUMENTOS Starts the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. Depending on the feature, additional arguments (such as the text message to display) encoded as a single JSON string have to be specified. Please refer to the developer documentation for more information @@ -1631,19 +1631,19 @@ Make sure that the names of the keys belonging to each other are identical on al Lock the screen - + Bloquear a tela Display a text message - + Mostrar uma mensagem de texto Test message - + Mensagem de teste Start an application - + Iniciar um aplicativo Stops the specified feature on the specified host by connecting to the Veyon Server running remotely. The feature can be specified by name or UID. Use the ``show`` command to see all available features. @@ -1651,7 +1651,7 @@ Make sure that the names of the keys belonging to each other are identical on al Unlock the screen - + Desbloquear a tela The specified command does not exist or no help is available for it. @@ -1663,7 +1663,7 @@ Make sure that the names of the keys belonging to each other are identical on al Description - + Descrição Master @@ -1683,7 +1683,7 @@ Make sure that the names of the keys belonging to each other are identical on al Plugin - + Plugin Invalid feature name or UID specified @@ -1838,11 +1838,11 @@ Make sure that the names of the keys belonging to each other are identical on al Style: - + Estilo: Native - + Nativo Authentication @@ -1982,7 +1982,7 @@ Make sure that the names of the keys belonging to each other are identical on al User groups - + Grupo de usuários Include user groups from domain @@ -2002,11 +2002,11 @@ Make sure that the names of the keys belonging to each other are identical on al Light - + Claro Dark - + Escuro @@ -2728,7 +2728,7 @@ Make sure that the names of the keys belonging to each other are identical on al LinuxPlatformConfigurationPage Linux - + Linux User authentication @@ -3045,7 +3045,7 @@ Press and hold to load arrangement from a file or save current arrangement to a px - + px Auto @@ -3364,7 +3364,7 @@ Press and hold to load arrangement from a file or save current arrangement to a Description - + Descrição Version @@ -4046,6 +4046,14 @@ Exemplo: [^-]*-(PC[0-9]*) Duration: Duração: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4082,7 +4090,7 @@ Exemplo: [^-]*-(PC[0-9]*) StartAppDialog Start application - + Iniciar aplicativo Name: diff --git a/translations/veyon_pt_PT.ts b/translations/veyon_pt_PT.ts index a84bc0a2e..04e433865 100644 --- a/translations/veyon_pt_PT.ts +++ b/translations/veyon_pt_PT.ts @@ -297,14 +297,14 @@ Se está interessado em traduzir o Veyon para o seu idioma ou quer melhorar uma The access in the given scenario needs permission of the logged on user. O acesso no cenário determinado necessita permissão do utilizador ligado. - - ERROR: Unknown action - ERRO: Ação desconhecida - Test result Resultado do teste + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4039,6 +4039,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_ru.ts b/translations/veyon_ru.ts index 6a69da050..a21614837 100644 --- a/translations/veyon_ru.ts +++ b/translations/veyon_ru.ts @@ -137,7 +137,7 @@ If you're interested in translating Veyon into your local or another langua AccessControlProvider Provider for access control features - + Поставщик функций контроля доступа @@ -252,7 +252,7 @@ If you're interested in translating Veyon into your local or another langua Local computer is already being accessed - + К локальному компьютеру уже осуществляется доступ @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Доступ в данном сценарии требует разрешения зарегистрированного пользователя. - - ERROR: Unknown action - ОШИБКА: Неизвестное действие - Test result Результат испытаний + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -1056,7 +1056,7 @@ Make sure that the names of the keys belonging to each other are identical on al Hostname: %1 - + Имя хоста: %1 unknown @@ -1064,15 +1064,15 @@ Make sure that the names of the keys belonging to each other are identical on al IP address: %1 - + IP-адрес: %1 Hostname could not be resolved - + Имя хоста не может быть разрешено No features active - + Нет активных функций @@ -2000,15 +2000,15 @@ Make sure that the names of the keys belonging to each other are identical on al Color scheme: - + Цветовая схема: Light - + Светлая Dark - + Тёмная @@ -2092,7 +2092,7 @@ Make sure that the names of the keys belonging to each other are identical on al Custom CA certificate file - Необычный файл службы сертификации (CA) + Пользовательский файл сертификата CA None @@ -3772,31 +3772,31 @@ Please save your work and close all programs. ServerAccessControlManager Requested authentication method not available - + Запрошенный метод аутентификации недоступен Access allowed by rule "%1" - + Доступ разрешен правилом "%1" Access denied by rule "%1" - + Доступ запрещён правилом "%1" No rule allowed access - + Ни одно правило не разрешает доступ Accessing user not member of an authorized user group - + Доступ пользователя, не являющегося членом авторизованной группы пользователей User has denied access - + Пользователю отказано в доступе User confirmed access - + Пользователь подтвердил доступ @@ -3957,7 +3957,7 @@ Example: [^-]*-(PC[0-9]*) Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. - + Включите этот параметр, если необходимо запустить один экземпляр сервера Veyon для текущего активного сеанса, независимо от того, локальный он или удаленный. @@ -3968,23 +3968,23 @@ Example: [^-]*-(PC[0-9]*) Starting %1 - + Запуск %1 Stopping %1 - + Остановка %1 Restarting %1 - + Перезапуск %1 Registering %1 - + Регистрация %1 Unregistering %1 - + Отмена регистрации %1 @@ -3995,7 +3995,7 @@ Example: [^-]*-(PC[0-9]*) Unregister Veyon Service - Отмена регистрация сервиса Veyon + Отмена регистрации сервиса Veyon Start Veyon Service @@ -4067,6 +4067,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Продолжительность: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4573,7 +4581,7 @@ Example: [^-]*-(PC[0-9]*) Custom x11vnc parameters: - Нетипичные параметры x11vnc: + Пользовательские параметры x11vnc: Do not use X Damage extension diff --git a/translations/veyon_sl.ts b/translations/veyon_sl.ts index e8638c94c..7108d0479 100644 --- a/translations/veyon_sl.ts +++ b/translations/veyon_sl.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Dostop v danem scenariju potrebuje dovoljenje prijavljenega uporabnika - - ERROR: Unknown action - NAPAKA: neznano dejanje - Test result Rezultati testa + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4059,6 +4059,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_sr.ts b/translations/veyon_sr.ts index 99f8fb96a..f49a4d251 100644 --- a/translations/veyon_sr.ts +++ b/translations/veyon_sr.ts @@ -297,14 +297,14 @@ Ako ste zainteresovani za prevodjenje Veyon na vaš lokalni ili drugi jezik ili The access in the given scenario needs permission of the logged on user. Za pristup datom scenariju potrebne su dozvole prijavljenog korisnika. - - ERROR: Unknown action - GREŠKA: Nepoznata akcija - Test result Rezultati testa + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4061,6 +4061,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_sv.ts b/translations/veyon_sv.ts index fac8319bb..a3604710f 100644 --- a/translations/veyon_sv.ts +++ b/translations/veyon_sv.ts @@ -297,14 +297,14 @@ Om du är intresserad av att översätta Veyon till ditt lokala eller ett ett an The access in the given scenario needs permission of the logged on user. Åtkomsten i det givna scenariot kräver tillstånd från den inloggade användaren. - - ERROR: Unknown action - ERROR: Okänd åtgärd - Test result Testresultat + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4067,6 +4067,14 @@ Exempel: [^-]*-(pc[0-9]*) [^-]*-(PC[0-9]*) Duration: Varaktighet: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_th.ts b/translations/veyon_th.ts index 97d46b50a..da6ee45cf 100644 --- a/translations/veyon_th.ts +++ b/translations/veyon_th.ts @@ -295,14 +295,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. - - ERROR: Unknown action - ข้อผิดพลาด: การกระทำที่ไม่รู้จัก - Test result ผลการทดสอบ + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4038,6 +4038,14 @@ Example: [^-]*-(PC[0-9]*) Duration: ระยะเวลา: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_tr.ts b/translations/veyon_tr.ts index cac25dfb0..0bd5d59ee 100644 --- a/translations/veyon_tr.ts +++ b/translations/veyon_tr.ts @@ -297,14 +297,14 @@ Veyon'u kendi dilinizde veya başka bir dile çevirmek istiyorsanız veya v The access in the given scenario needs permission of the logged on user. Verilen senaryodaki erişim, oturum açmış kullanıcının iznini gerektiriyor. - - ERROR: Unknown action - HATA: Bilinmeyen eylem - Test result Sınama sonuçları + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -1072,7 +1072,7 @@ Birbirine ait anahtarların isimlerinin tüm bilgisayarlarda aynı olduğundan e No features active - + Hiçbir özellik etkin değil @@ -2000,15 +2000,15 @@ Birbirine ait anahtarların isimlerinin tüm bilgisayarlarda aynı olduğundan e Color scheme: - + Renk şeması: Light - + Aydınlık Dark - + Karanlık @@ -3792,7 +3792,7 @@ Lütfen çalışmalarınızı kaydedip tüm açık pencereleri kapatın. User has denied access - + Kullanıcının erişimi engellendi User confirmed access @@ -3968,23 +3968,23 @@ Example: [^-]*-(PC[0-9]*) Starting %1 - + %1 başlatılıyor Stopping %1 - + %1 durduruluyor Restarting %1 - + %1 tekrar başlatılıyor Registering %1 - + %1 kayıt oluyor Unregistering %1 - + %1 kaydı siliniyor @@ -4067,6 +4067,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Süre: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_uk.ts b/translations/veyon_uk.ts index d905cd8eb..c1d20dcc9 100644 --- a/translations/veyon_uk.ts +++ b/translations/veyon_uk.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. Доступ за вказаним сценарієм потребує дозволу від користувача, який увійшов до системи. - - ERROR: Unknown action - ПОМИЛКА: невідома дія - Test result Результат тестування + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4066,6 +4066,14 @@ Example: [^-]*-(PC[0-9]*) Duration: Тривалість: + + View in separate window + Переглянути в окремому вікні + + + %1 Master – Slideshow + Основне керування %1 – Показ слайдів + SpotlightPanel diff --git a/translations/veyon_vi.ts b/translations/veyon_vi.ts index 0a3b27747..4e109df02 100644 --- a/translations/veyon_vi.ts +++ b/translations/veyon_vi.ts @@ -297,14 +297,14 @@ Nếu bạn quan tâm đến việc dịch Veyon thành ngôn ngữ bản địa The access in the given scenario needs permission of the logged on user. Truy cập trong tình huống đã cho cần quyền của người dùng đã đăng nhập. - - ERROR: Unknown action - LỖI: Hành động không xác định - Test result Kết quả kiểm tra + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4039,6 +4039,14 @@ Example: [^-]*-(PC[0-9]*) Duration: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_zh_CN.ts b/translations/veyon_zh_CN.ts index 92808fe56..d7fac85a6 100644 --- a/translations/veyon_zh_CN.ts +++ b/translations/veyon_zh_CN.ts @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. 指定场景中的访问需要登录用户的权限。 - - ERROR: Unknown action - 错误:未知的操作 - Test result 测试规则 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -4062,6 +4062,14 @@ Example: [^-]*-(PC[0-9]*) Duration: 持续时间: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel diff --git a/translations/veyon_zh_TW.ts b/translations/veyon_zh_TW.ts index 398e42dbb..20a2d5325 100644 --- a/translations/veyon_zh_TW.ts +++ b/translations/veyon_zh_TW.ts @@ -137,7 +137,7 @@ If you're interested in translating Veyon into your local or another langua AccessControlProvider Provider for access control features - + 存取控制功能的提供者 @@ -252,7 +252,7 @@ If you're interested in translating Veyon into your local or another langua Local computer is already being accessed - + 已經存取本機電腦 @@ -297,14 +297,14 @@ If you're interested in translating Veyon into your local or another langua The access in the given scenario needs permission of the logged on user. 在給予情境中存取。需要登入使用者的權限。 - - ERROR: Unknown action - 錯誤: 未知的動作 - Test result 測試結果 + + There is no matching rule with a valid action. The access is therefore denied. + + AuthKeysConfigurationPage @@ -420,7 +420,7 @@ The public key is used on client computers to authenticate incoming connection r Make sure that the names of the keys belonging to each other are identical on all computers. 請輸入要為其匯入身份驗證金鑰的使用者群組或角色的名稱。 -確保所有電腦上彼此所屬的金鑰名稱相同。 +確認所有電腦上彼此所屬的金鑰名稱相同。 @@ -1056,7 +1056,7 @@ Make sure that the names of the keys belonging to each other are identical on al Hostname: %1 - + 主機名稱: %1 unknown @@ -1064,15 +1064,15 @@ Make sure that the names of the keys belonging to each other are identical on al IP address: %1 - + IP 位址: %1 Hostname could not be resolved - + 無法解析主機名稱 No features active - + 沒有功能啟用 @@ -1282,7 +1282,7 @@ Make sure that the names of the keys belonging to each other are identical on al DemoClient %1 Demo - %1 示範 + %1 演示 @@ -1313,7 +1313,7 @@ Make sure that the names of the keys belonging to each other are identical on al Slow down thumbnail updates while demo is running - 示範執行時,縮圖更新速度變慢 + 演示執行時,縮圖更新速度變慢 Memory limit @@ -1336,11 +1336,11 @@ Make sure that the names of the keys belonging to each other are identical on al DemoFeaturePlugin Demo - 示範 + 演示 Stop demo - 停止示範 + 停止演示 Share your screen or allow a user to share his screen with other users. @@ -1348,11 +1348,11 @@ Make sure that the names of the keys belonging to each other are identical on al Full screen demo - 全螢幕示範 + 全螢幕演示 Window demo - 視窗示範 + 視窗演示 Share your own screen in fullscreen mode @@ -1400,7 +1400,7 @@ Make sure that the names of the keys belonging to each other are identical on al Give a demonstration by screen broadcasting - 透過螢幕廣播給予示範 + 透過螢幕廣播給予演示 @@ -1988,7 +1988,7 @@ Make sure that the names of the keys belonging to each other are identical on al Include user groups from domain - 包含網域的使用者群組 + 包含網域中的使用者群組 Missing user groups backend @@ -2000,15 +2000,15 @@ Make sure that the names of the keys belonging to each other are identical on al Color scheme: - + 色彩架構: Light - + 淺色 Dark - + 深色 @@ -2916,7 +2916,7 @@ Make sure that the names of the keys belonging to each other are identical on al Locations && computers - 地點 &&& 電腦 + 位置 && 電腦 Screenshots @@ -3010,15 +3010,17 @@ Make sure that the names of the keys belonging to each other are identical on al Use custom computer arrangement. Press and hold to load arrangement from a file or save current arrangement to a file. - + 使用自訂電腦安排。 + +按住不放以從檔案載入安排或將目前安排儲存到檔案。 Load computer positions - + 載入電腦位置 Save computer positions - + 儲存電腦位置 @@ -3121,7 +3123,7 @@ Press and hold to load arrangement from a file or save current arrangement to a Image quality in monitoring mode - 圖片品質在監控模式 + 監控模式中圖片品質 Remote access image quality @@ -3221,19 +3223,19 @@ Press and hold to load arrangement from a file or save current arrangement to a Always expand all locations - + 始終展開所有位置 Configuration templates - + 組態範本 Advanced - + 進階 Computer name source - + 電腦名稱來源 Default @@ -3253,11 +3255,11 @@ Press and hold to load arrangement from a file or save current arrangement to a Session host name - + 工作階段主機名稱 Session metadata - + 工作階段中繼資料 Full name of user @@ -3269,11 +3271,11 @@ Press and hold to load arrangement from a file or save current arrangement to a Computer UID role - + 電腦 UID 角色 Session meta data hash - + 工作階段中繼資料雜湊 @@ -3770,31 +3772,31 @@ Please save your work and close all programs. ServerAccessControlManager Requested authentication method not available - + 請求的身份驗證方法不可用 Access allowed by rule "%1" - + 規則「%1」允許存取 Access denied by rule "%1" - + 規則「%1」拒絕存取 No rule allowed access - + 無規則允許存取 Accessing user not member of an authorized user group - + 存取使用者不是授權使用者群組的成員 User has denied access - + 使用者拒絕存取 User confirmed access - + 使用者確認存取 @@ -3919,11 +3921,11 @@ Typically this is required to support terminal servers. Session metadata - + 工作階段中繼資料 Content - + 內文 None @@ -3931,11 +3933,11 @@ Typically this is required to support terminal servers. Value of an environment variable - + 環境變數的值 Value of a registry key - + 登錄檔機碼的值 Environment variable name: @@ -3955,7 +3957,7 @@ Example: [^-]*-(PC[0-9]*) Enable if a single Veyon Server instance should be launched for the currently active session, no matter if local or remote. - + 如果應該為目前活動會話啟動單一 Veyon Server 實例 (無論是本機還是遠端),則啟用。 @@ -3966,23 +3968,23 @@ Example: [^-]*-(PC[0-9]*) Starting %1 - + 正在啟動 %1 Stopping %1 - + 正在停止 %1 Restarting %1 - + 正在重新啟動 %1 Registering %1 - + 正在註冊 %1 Unregistering %1 - + 正在取消註冊 %1 @@ -4065,6 +4067,14 @@ Example: [^-]*-(PC[0-9]*) Duration: 持續時間: + + View in separate window + + + + %1 Master – Slideshow + + SpotlightPanel @@ -4421,7 +4431,7 @@ Example: [^-]*-(PC[0-9]*) Use HTTPS with TLS 1.3 instead of HTTP - 將 HTTPS 與 TLS 1.3 而不是 HTTP 一起使用 + 使用含 TLS 1.3 的 HTTPS 而不是 HTTP From 36361638003da7fbec2dddaa93578b065f879513 Mon Sep 17 00:00:00 2001 From: Tobias Junghans Date: Fri, 11 Apr 2025 13:19:35 +0200 Subject: [PATCH 25/25] Prepare 4.9.5 release --- CMakeLists.txt | 2 +- project.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8f4b9dd09..13d8d96d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,7 +107,7 @@ endif() if(NOT VERSION_STRING) set(VERSION_MAJOR 4) set(VERSION_MINOR 9) - set(VERSION_PATCH 4) + set(VERSION_PATCH 5) set(VERSION_BUILD 0) set(VERSION_STRING "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") else() diff --git a/project.yml b/project.yml index 20dd0835e..e868cea0b 100644 --- a/project.yml +++ b/project.yml @@ -1,6 +1,6 @@ project: name: Veyon - version: 4.9.4 + version: 4.9.5 copyright: 2004-2025 author: Tobias Junghans contact: Tobias Junghans