[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1109928: unblock: krdc/4:25.04.3-1



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

Reply to: