Package: release.debian.org
Severity: normal
X-Debbugs-Cc: krdc@packages.debian.org, Debian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:krdc
User: release.debian.org@packages.debian.org
Usertags: unblock
Dear Release Team,
please unblock package krdc.
[ Reason ]
It contains the following changes:
* New upstream release (25.04.3).
- Show system tray icon at startup if enabled in settings. (kde#505744)
- VncView: focus the view on successful connection. (kde#503115)
- Rdp: rework handling for some error messages.
- Let Mainwindow publish error messages from views.
- Rdp host preferences: correctly load sound preferences. (kde#493602)
- Avoid crash when the main window is outside of any screen.
* Backport upstream commits:
- Fix invisible mouse cursor after toggling off "view only". [8b8dce4c]
- Fix remote modifier keys state not synced with local state. [1b11b2e3]
(kde#349813)
The complete debdiff is absolutely huge with translation fixes so I’m
attaching a simple diff trimmed of these for your convenience :
diff -ur --exclude=po krdc-25.04.[23]
[ Tests ]
- Successfully tested remote connections with VNC and RDP protocols.
[ Risks ]
Only contains the latest upstream point release for the 25.04 Gear
branch and backported commits. Further fixes can easily be backported or
the changes reverted.
[ Checklist ]
[x] all changes are documented in the d/changelog
[x] I reviewed all changes and I approve them
[x] attach debdiff against the package in testing
Thanks !
unblock krdc/4:25.04.3-1
Attachment:
krdc_25.04.2-1.dsc_krdc_25.04.3-1.dsc.debdiff.gz
Description: application/gzip
diff -ur '--exclude=po' krdc-25.04.2/CMakeLists.txt krdc-25.04.3/CMakeLists.txt
--- krdc-25.04.2/CMakeLists.txt 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/CMakeLists.txt 2025-07-26 13:37:39.000000000 +0200
@@ -2,7 +2,7 @@
set (RELEASE_SERVICE_VERSION_MAJOR "25")
set (RELEASE_SERVICE_VERSION_MINOR "04")
-set (RELEASE_SERVICE_VERSION_MICRO "2")
+set (RELEASE_SERVICE_VERSION_MICRO "3")
set (RELEASE_SERVICE_VERSION "${RELEASE_SERVICE_VERSION_MAJOR}.${RELEASE_SERVICE_VERSION_MINOR}.${RELEASE_SERVICE_VERSION_MICRO}")
@@ -51,6 +51,7 @@
I18n
KIO
Crash
+ GuiAddons
)
find_package(KF6StatusNotifierItem ${KF_MIN_VERSION} REQUIRED)
@@ -221,7 +222,9 @@
endif()
install(TARGETS krdc ${KDE_INSTALL_TARGETS_DEFAULT_ARGS})
-install(PROGRAMS org.kde.krdc.desktop DESTINATION ${KDE_INSTALL_APPDIR})
+configure_file(org.kde.krdc.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/org.kde.krdc.desktop @ONLY)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.kde.krdc.desktop DESTINATION ${KDE_INSTALL_APPDIR})
install(FILES org.kde.krdc.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR})
ecm_install_icons(
diff -ur '--exclude=po' krdc-25.04.2/core/CMakeLists.txt krdc-25.04.3/core/CMakeLists.txt
--- krdc-25.04.2/core/CMakeLists.txt 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/core/CMakeLists.txt 2025-07-26 13:37:39.000000000 +0200
@@ -31,6 +31,7 @@
KF6::I18n
KF6::ConfigGui
KF6::Completion
+ KF6::GuiAddons
Qt::Gui
Qt::Widgets)
diff -ur '--exclude=po' krdc-25.04.2/core/remoteview.cpp krdc-25.04.3/core/remoteview.cpp
--- krdc-25.04.2/core/remoteview.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/core/remoteview.cpp 2025-07-26 13:37:39.000000000 +0200
@@ -9,6 +9,9 @@
#include "remoteview.h"
#include "krdc_debug.h"
+#ifndef QTONLY
+#include <KModifierKeyInfo>
+#endif
#include <QApplication>
#include <QBitmap>
#include <QEvent>
@@ -45,6 +48,10 @@
m_clipboard = QApplication::clipboard();
connect(m_clipboard, &QClipboard::dataChanged, this, &RemoteView::localClipboardChanged);
+#ifndef QTONLY
+ m_modifierKeyInfo = new KModifierKeyInfo(this);
+#endif
+
#ifdef HAVE_WAYLAND
if (qGuiApp->platformName() == QLatin1String("wayland")) {
m_inhibition.reset(new WaylandInhibition(window()->windowHandle()));
@@ -159,10 +166,11 @@
{
m_viewOnly = viewOnly;
- if (viewOnly)
- setCursor(Qt::ArrowCursor);
- else
- setCursor(m_localCursorState == CursorOn ? localDefaultCursor() : Qt::BlankCursor);
+ if (viewOnly) {
+ setCursor(localDefaultCursor());
+ } else {
+ showLocalCursor(m_localCursorState);
+ }
}
bool RemoteView::grabAllKeys()
@@ -450,4 +458,31 @@
QWidget::releaseKeyboard();
}
+bool RemoteView::isCapsLockEnabled()
+{
+#ifdef QTONLY
+ return false;
+#else
+ return m_modifierKeyInfo->isKeyLatched(Qt::Key_CapsLock) || m_modifierKeyInfo->isKeyLocked(Qt::Key_CapsLock);
+#endif
+}
+
+bool RemoteView::isNumLockEnabled()
+{
+#ifdef QTONLY
+ return false;
+#else
+ return m_modifierKeyInfo->isKeyLatched(Qt::Key_NumLock) || m_modifierKeyInfo->isKeyLocked(Qt::Key_NumLock);
+#endif
+}
+
+bool RemoteView::isScrollLockEnabled()
+{
+#ifdef QTONLY
+ return false;
+#else
+ return m_modifierKeyInfo->isKeyLatched(Qt::Key_ScrollLock) || m_modifierKeyInfo->isKeyLocked(Qt::Key_ScrollLock);
+#endif
+}
+
#include "moc_remoteview.cpp"
diff -ur '--exclude=po' krdc-25.04.2/core/remoteview.h krdc-25.04.3/core/remoteview.h
--- krdc-25.04.2/core/remoteview.h 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/core/remoteview.h 2025-07-26 13:37:39.000000000 +0200
@@ -31,6 +31,7 @@
};
class HostPreferences;
+class KModifierKeyInfo;
/**
* Generic widget that displays a remote framebuffer.
@@ -248,6 +249,19 @@
*/
virtual QPixmap takeScreenshot();
+ /**
+ * @return status of the caps lock key
+ */
+ bool isCapsLockEnabled();
+ /**
+ * @return status of the num lock key
+ */
+ bool isNumLockEnabled();
+ /**
+ * @return status of the scroll lock key
+ */
+ bool isScrollLockEnabled();
+
#ifndef QTONLY
/**
* Returns the current host preferences of this view.
@@ -438,6 +452,8 @@
qreal m_factor;
QClipboard *m_clipboard;
QMap<int, ModifierKey> m_modifiers;
+ KModifierKeyInfo *m_modifierKeyInfo;
+
#ifdef HAVE_WAYLAND
std::unique_ptr<ShortcutInhibition> m_inhibition;
#endif
diff -ur '--exclude=po' krdc-25.04.2/debian/changelog krdc-25.04.3/debian/changelog
--- krdc-25.04.2/debian/changelog 2025-06-09 22:43:43.000000000 +0200
+++ krdc-25.04.3/debian/changelog 2025-07-24 09:00:16.000000000 +0200
@@ -1,3 +1,20 @@
+krdc (4:25.04.3-1) unstable; urgency=medium
+
+ [ Aurélien COUDERC ]
+ * New upstream release (25.04.3).
+ - Show system tray icon at startup if enabled in settings. (kde#505744)
+ - VncView: focus the view on successful connection. (kde#503115)
+ - Rdp: rework handling for some error messages.
+ - Let Mainwindow publish error messages from views.
+ - Rdp host preferences: correctly load sound preferences. (kde#493602)
+ - Avoid crash when the main window is outside of any screen.
+ * Backport upstream commits:
+ - Fix invisible mouse cursor after toggling off "view only". [8b8dce4c]
+ - Fix remote modifier keys state not synced with local state. [1b11b2e3]
+ (kde#349813)
+
+ -- Aurélien COUDERC <coucouf@debian.org> Thu, 24 Jul 2025 09:00:16 +0200
+
krdc (4:25.04.2-1) unstable; urgency=medium
[ Aurélien COUDERC ]
Seulement dans krdc-25.04.3/debian: patches
diff -ur '--exclude=po' krdc-25.04.2/mainwindow.cpp krdc-25.04.3/mainwindow.cpp
--- krdc-25.04.2/mainwindow.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/mainwindow.cpp 2025-06-30 18:39:30.000000000 +0200
@@ -115,6 +115,10 @@
if (Settings::rememberSessions()) // give some time to create and show the window first
QTimer::singleShot(100, this, SLOT(restoreOpenSessions()));
+
+ if (Settings::systemTrayIcon()) {
+ m_systemTrayIcon = new SystemTrayIcon(this);
+ }
}
MainWindow::~MainWindow()
@@ -305,6 +309,7 @@
connect(view, SIGNAL(framebufferSizeChanged(int, int)), this, SLOT(resizeTabWidget(int, int)));
connect(view, SIGNAL(statusChanged(RemoteView::RemoteStatus)), this, SLOT(statusChanged(RemoteView::RemoteStatus)));
connect(view, SIGNAL(disconnected()), this, SLOT(disconnectHost()));
+ connect(view, SIGNAL(errorMessage(const QString &, const QString &)), this, SLOT(handleViewError(const QString &, const QString &)));
QScrollArea *scrollArea = createScrollArea(m_tabWidget, view);
@@ -372,6 +377,9 @@
const QSize viewSize = QSize(w, h);
QScreen *currentScreen = QGuiApplication::screenAt(geometry().center());
+ if (!currentScreen) {
+ return;
+ }
if (Settings::fullscreenOnConnect()) {
const QSize screenSize = currentScreen->availableGeometry().size();
@@ -1224,3 +1232,8 @@
m_remoteDesktopsDockWidget->setWidget(remoteDesktopsDockLayoutWidget);
addDockWidget(Qt::LeftDockWidgetArea, m_remoteDesktopsDockWidget);
}
+
+void MainWindow::handleViewError(const QString &title, const QString &message)
+{
+ KMessageBox::error(this, message, title);
+}
diff -ur '--exclude=po' krdc-25.04.2/mainwindow.h krdc-25.04.3/mainwindow.h
--- krdc-25.04.2/mainwindow.h 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/mainwindow.h 2025-06-30 18:39:30.000000000 +0200
@@ -82,6 +82,7 @@
void createDockWidget();
void showConnectionContextMenu(const QPoint &pos);
void saveConnectionListSort(const int logicalindex, const Qt::SortOrder order);
+ void handleViewError(const QString &title, const QString &message);
private:
void setupActions();
diff -ur '--exclude=po' krdc-25.04.2/org.kde.krdc.appdata.xml krdc-25.04.3/org.kde.krdc.appdata.xml
--- krdc-25.04.2/org.kde.krdc.appdata.xml 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/org.kde.krdc.appdata.xml 2025-06-30 18:39:30.000000000 +0200
@@ -149,6 +149,7 @@
<mediatype>application/x-krdc</mediatype>
</provides>
<releases>
+ <release version="25.04.3" date="2025-07-03"/>
<release version="25.04.2" date="2025-06-05"/>
<release version="25.04.1" date="2025-05-08"/>
<release version="25.04.0" date="2025-04-17"/>
Seulement dans krdc-25.04.2: org.kde.krdc.desktop
Seulement dans krdc-25.04.3: org.kde.krdc.desktop.cmake
diff -ur '--exclude=po' krdc-25.04.2/.pc/applied-patches krdc-25.04.3/.pc/applied-patches
--- krdc-25.04.2/.pc/applied-patches 2025-07-26 13:37:39.502144586 +0200
+++ krdc-25.04.3/.pc/applied-patches 2025-07-26 13:37:39.646141480 +0200
@@ -0,0 +1,2 @@
+upstream_8b8dce4c_Fix-invisible-mouse-cursor-after-toggling-off-view-only-.patch
+upstream_1b11b2e3_Use-KModifierKeyInfo-to-detect-lock-modifiers-status.patch
Seulement dans krdc-25.04.3/.pc: upstream_1b11b2e3_Use-KModifierKeyInfo-to-detect-lock-modifiers-status.patch
Seulement dans krdc-25.04.3/.pc: upstream_8b8dce4c_Fix-invisible-mouse-cursor-after-toggling-off-view-only-.patch
diff -ur '--exclude=po' krdc-25.04.2/rdp/rdphostpreferences.cpp krdc-25.04.3/rdp/rdphostpreferences.cpp
--- krdc-25.04.2/rdp/rdphostpreferences.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/rdp/rdphostpreferences.cpp 2025-06-30 18:39:30.000000000 +0200
@@ -137,6 +137,7 @@
rdpUi.kcfg_DesktopScaleFactorCustom->setValue(desktopScaleFactorCustom());
rdpUi.kcfg_DeviceScaleFactor->setCurrentIndex(int(deviceScaleFactor()));
rdpUi.kcfg_KeyboardLayout->setCurrentIndex(keymap2int(keyboardLayout()));
+ rdpUi.kcfg_Sound->setCurrentIndex(int(sound()));
rdpUi.kcfg_ShareMedia->setText(shareMedia());
rdpUi.kcfg_TlsSecLevel->setCurrentIndex(int(tlsSecLevel()));
rdpUi.kcfg_ProxyProtocol->setCurrentIndex(int(proxyProtocol()));
diff -ur '--exclude=po' krdc-25.04.2/rdp/rdpsession.cpp krdc-25.04.3/rdp/rdpsession.cpp
--- krdc-25.04.2/rdp/rdpsession.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/rdp/rdpsession.cpp 2025-07-26 13:37:39.000000000 +0200
@@ -984,6 +984,10 @@
switch (event->type()) {
case QEvent::KeyPress:
case QEvent::KeyRelease: {
+ if (m_needKeyStateSync) {
+ m_needKeyStateSync = false;
+ syncKeyState();
+ }
auto keyEvent = static_cast<QKeyEvent *>(event);
const DWORD vc = GetVirtualKeyCodeFromKeycode(keyEvent->nativeScanCode(), WINPR_KEYCODE_TYPE_XKB);
const DWORD code = GetVirtualScanCodeFromVirtualKeyCode(vc, WINPR_KBD_TYPE_IBM_ENHANCED);
@@ -1087,6 +1091,26 @@
return QObject::event(event);
}
+bool RdpSession::syncKeyState()
+{
+ auto input = m_context.rdp->input;
+ if (!input) {
+ return false;
+ }
+
+ UINT16 flags = 0;
+
+ if (m_view->isCapsLockEnabled())
+ flags |= KBD_SYNC_CAPS_LOCK;
+ if (m_view->isNumLockEnabled())
+ flags |= KBD_SYNC_NUM_LOCK;
+ if (m_view->isScrollLockEnabled())
+ flags |= KBD_SYNC_SCROLL_LOCK;
+
+ qCDebug(KRDC) << "Sync key state: " << flags;
+ return freerdp_input_send_synchronize_event(input, flags);
+}
+
void RdpSession::setState(RdpSession::State newState)
{
if (newState == m_state) {
diff -ur '--exclude=po' krdc-25.04.2/rdp/rdpsession.h krdc-25.04.3/rdp/rdpsession.h
--- krdc-25.04.2/rdp/rdpsession.h 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/rdp/rdpsession.h 2025-07-26 13:37:39.000000000 +0200
@@ -103,6 +103,7 @@
void stop();
bool sendEvent(QEvent *event, QWidget *source);
+ bool syncKeyState();
void initializeClipboard(RdpContext *krdp, CliprdrClientContext *cliprdr);
void initializeDisplay(RdpContext *krdp, DispClientContext *disp);
@@ -201,6 +202,7 @@
int m_port = -1;
QSize m_size;
bool m_firstPasswordTry;
+ bool m_needKeyStateSync = true;
std::thread m_thread;
diff -ur '--exclude=po' krdc-25.04.2/rdp/rdpview.cpp krdc-25.04.3/rdp/rdpview.cpp
--- krdc-25.04.2/rdp/rdpview.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/rdp/rdpview.cpp 2025-07-26 13:37:39.000000000 +0200
@@ -11,7 +11,6 @@
#include "krdc_debug.h"
#include "rdphostpreferences.h"
-#include <KMessageBox>
#include <KMessageDialog>
#include <KPasswordDialog>
#include <KShell>
@@ -289,10 +288,9 @@
QString title;
QString message;
- if (m_quitting)
- return;
-
switch (error) {
+ case FREERDP_ERROR_BASE:
+ return; // no error, no need to show an error message
case FREERDP_ERROR_CONNECT_CANCELLED:
return; // user canceled connection, no need to show an error message
case FREERDP_ERROR_AUTHENTICATION_FAILED:
@@ -318,8 +316,15 @@
message = i18nc("@label", "Unable to login with the provided password. Please contact your system administrator to change it.");
break;
case FREERDP_ERROR_CONNECT_FAILED:
- title = i18nc("@title:dialog", "Connection Lost");
- message = i18nc("@label", "Lost connection to the server.");
+ case FREERDP_ERROR_TLS_CONNECT_FAILED:
+ case FREERDP_ERROR_CONNECT_TRANSPORT_FAILED:
+ if (status() == Connected) {
+ title = i18nc("@title:dialog", "Connection Lost");
+ message = i18nc("@label", "Lost connection to the server.");
+ } else {
+ title = i18nc("@title:dialog", "Could not Connect");
+ message = i18nc("@label", "Could not connect to the server.");
+ }
break;
case FREERDP_ERROR_DNS_ERROR:
case FREERDP_ERROR_DNS_NAME_NOT_FOUND:
@@ -331,11 +336,6 @@
message = i18nc("@label", "The server refused the connection request.");
break;
- case FREERDP_ERROR_TLS_CONNECT_FAILED:
- case FREERDP_ERROR_CONNECT_TRANSPORT_FAILED:
- title = i18nc("@title:dialog", "Could not Connect");
- message = i18nc("@label", "Could not connect to the server.");
- break;
case FREERDP_ERROR_RPC_INITIATED_DISCONNECT:
case FREERDP_ERROR_RPC_INITIATED_LOGOFF:
case FREERDP_ERROR_RPC_INITIATED_DISCONNECT_BY_USER:
@@ -344,11 +344,7 @@
return;
case FREERDP_ERROR_DISCONNECTED_BY_OTHER_CONNECTION:
title = i18nc("@title:dialog", "Connection Closed");
- message = QStringLiteral("Diconnected by other sesion");
- break;
- case FREERDP_ERROR_BASE:
- title = i18nc("@title:dialog", "Connection Closed");
- message = i18nc("@label", "The connection to the server was closed.");
+ message = QStringLiteral("Disconnected by other session");
break;
default:
qCDebug(KRDC) << "Unhandled error" << error;
@@ -359,12 +355,12 @@
qCDebug(KRDC) << "error message" << title << message;
// TODO offer reconnect if approriate
- KMessageBox::error(this, message, title);
+ Q_EMIT errorMessage(title, message);
}
void RdpView::onLogonError(const QString &error)
{
- KMessageBox::error(this, error, i18nc("@title:dialog", "Logon Error"));
+ Q_EMIT errorMessage(i18nc("@title:dialog", "Logon Error"), error);
}
HostPreferences *RdpView::hostPreferences()
@@ -507,4 +503,13 @@
if (m_session) {
m_session->sendClipboard(data);
}
-}
\ Pas de fin de ligne à la fin du fichier
+}
+
+void RdpView::focusInEvent(QFocusEvent *event)
+{
+ if (m_session) {
+ m_session->syncKeyState();
+ }
+
+ RemoteView::focusInEvent(event);
+}
diff -ur '--exclude=po' krdc-25.04.2/rdp/rdpview.h krdc-25.04.3/rdp/rdpview.h
--- krdc-25.04.2/rdp/rdpview.h 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/rdp/rdpview.h 2025-07-26 13:37:39.000000000 +0200
@@ -74,6 +74,7 @@
void handleWheelEvent(QWheelEvent *event) override;
void handleMouseEvent(QMouseEvent *event) override;
void handleLocalClipboardChanged(const QMimeData *data) override;
+ void focusInEvent(QFocusEvent *event) override;
private:
void onRectangleUpdated(const QRect &rect);
diff -ur '--exclude=po' krdc-25.04.2/vnc/vncview.cpp krdc-25.04.3/vnc/vncview.cpp
--- krdc-25.04.2/vnc/vncview.cpp 2025-06-02 23:26:25.000000000 +0200
+++ krdc-25.04.3/vnc/vncview.cpp 2025-06-30 18:39:30.000000000 +0200
@@ -17,14 +17,11 @@
#ifdef QTONLY
#include <QInputDialog>
-#include <QMessageBox>
-#define KMessageBox QMessageBox
#define error(parent, message, caption) critical(parent, caption, message)
#else
#include "settings.h"
#include <KActionCollection>
#include <KMainWindow>
-#include <KMessageBox>
#include <KPasswordDialog>
#include <KXMLGUIClient>
#endif
@@ -380,8 +377,6 @@
startQuitting();
- KMessageBox::error(this, message, i18n("VNC failure"));
-
Q_EMIT errorMessage(i18n("VNC failure"), message);
}
@@ -391,8 +386,6 @@
startQuitting();
- KMessageBox::error(this, message, i18n("SSH Tunnel failure"));
-
Q_EMIT errorMessage(i18n("SSH Tunnel failure"), message);
}
@@ -419,6 +412,7 @@
setCursor(((m_localCursorState == CursorOn) || m_forceLocalCursor) ? localDefaultCursor() : Qt::BlankCursor);
setFocusPolicy(Qt::WheelFocus);
+ setFocus();
setStatus(Connected);
Q_EMIT connected();