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();