Package: release.debian.org
Severity: normal
X-Debbugs-Cc: kde-specta...@packages.debian.org, Qt/KDE Maintainers 
<debian-qt-kde@lists.debian.org>
Control: affects -1 + src:kde-spectacle
User: release.debian....@packages.debian.org
Usertags: unblock

Dear Release Team,

please unblock package kde-spectacle.

[ Reason ]
It contains the following changes:
* New upstream release (6.3.5).
  - Translation fixes.
* Relax inter-plasma versioned dependency constraint so we can upload
  only 6.3.5 packages that have actual code changes.
* Backport upstream commits:
  - Fix spectacle freezing when finishing the rendering after the end of
  video capture sessions.
  - Set rendering message for system tray icon tooltip.
  - Fix export notifications keeping spectacle from closing. (kde#503838)
  - Fix crash related to setups with multiple displays. (kde#503682)
  - Fix rectangular region selecting on wrong screen with certain screen
  setups. (kde#502047)
* Point upstream source to invent git repo.

The fix for the freeze while finishing encoding is the second part of
the kpipewire fix and is a major usability improvment so I hope we can
get it into Trixie.

[ Tests ]
- Screenshots, screen recording, using fullscreen and rectangle areas.

[ Risks ]
Only backport of upstream commits that apply cleanly. 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 kde-spectacle/4:6.3.5-2
diff -Nru kde-spectacle-6.3.4/CMakeLists.txt kde-spectacle-6.3.5/CMakeLists.txt
--- kde-spectacle-6.3.4/CMakeLists.txt  2025-04-02 05:40:28.000000000 +0200
+++ kde-spectacle-6.3.5/CMakeLists.txt  2025-05-06 20:01:30.000000000 +0200
@@ -1,13 +1,13 @@
 cmake_minimum_required (VERSION 3.16 FATAL_ERROR)
 # Managed by release script
-set(PROJECT_VERSION "6.3.4")
+set(PROJECT_VERSION "6.3.5")
 set(SPECTACLE_VERSION ${PROJECT_VERSION})
 
 # Spectacle project
 project(Spectacle VERSION ${SPECTACLE_VERSION})
 
 # minimum requirements
-set(PROJECT_DEP_VERSION "6.3.4")
+set(PROJECT_DEP_VERSION "6.3.5")
 set(QT_MIN_VERSION "6.7.0")
 set(KF6_MIN_VERSION "6.10.0")
 
diff -Nru kde-spectacle-6.3.4/debian/changelog 
kde-spectacle-6.3.5/debian/changelog
--- kde-spectacle-6.3.4/debian/changelog        2025-04-03 01:01:17.000000000 
+0200
+++ kde-spectacle-6.3.5/debian/changelog        2025-06-11 22:14:09.000000000 
+0200
@@ -1,3 +1,28 @@
+kde-spectacle (4:6.3.5-2) unstable; urgency=medium
+
+  [ Aurélien COUDERC ]
+  * Backport upstream commits:
+    - Fix export notifications keeping spectacle from closing. (kde#503838)
+    - Fix crash related to setups with multiple displays. (kde#503682)
+    - Fix rectangular region selecting on wrong screen with certain screen
+    setups. (kde#502047)
+  * Point upstream source to invent git repo.
+
+ -- Aurélien COUDERC <couc...@debian.org>  Wed, 11 Jun 2025 22:14:09 +0200
+
+kde-spectacle (4:6.3.5-1) unstable; urgency=medium
+
+  [ Aurélien COUDERC ]
+  * New upstream release (6.3.5).
+  * Relax inter-plasma versioned dependency constraint so we can upload
+    only 6.3.5 packages that have actual code changes.
+  * Backport upstream commits:
+    - Fix spectacle freezing when finishing the rendering after the end of
+    video capture sessions.
+    - Set rendering message for system tray icon tooltip.
+
+ -- Aurélien COUDERC <couc...@debian.org>  Mon, 19 May 2025 00:58:40 +0200
+
 kde-spectacle (4:6.3.4-1) unstable; urgency=medium
 
   * Team upload.
diff -Nru kde-spectacle-6.3.4/debian/copyright 
kde-spectacle-6.3.5/debian/copyright
--- kde-spectacle-6.3.4/debian/copyright        2025-02-12 01:42:50.000000000 
+0100
+++ kde-spectacle-6.3.5/debian/copyright        2025-06-11 22:13:31.000000000 
+0200
@@ -1,7 +1,7 @@
 Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
 Upstream-Name: spectacle
 Upstream-Contact: kde-de...@kde.org
-Source: https://download.kde.org/
+Source: https://invent.kde.org/plasma/spectacle
 
 Files: *
 Copyright: 2021-2024, A S Alam <aa...@satluj.org>
diff -Nru 
kde-spectacle-6.3.4/debian/patches/relax-interplasma-versioned-deps.patch 
kde-spectacle-6.3.5/debian/patches/relax-interplasma-versioned-deps.patch
--- kde-spectacle-6.3.4/debian/patches/relax-interplasma-versioned-deps.patch   
1970-01-01 01:00:00.000000000 +0100
+++ kde-spectacle-6.3.5/debian/patches/relax-interplasma-versioned-deps.patch   
2025-05-08 00:28:01.000000000 +0200
@@ -0,0 +1,11 @@
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -7,7 +7,7 @@
+ project(Spectacle VERSION ${SPECTACLE_VERSION})
+ 
+ # minimum requirements
+-set(PROJECT_DEP_VERSION "6.3.5")
++set(PROJECT_DEP_VERSION "6.3.4")
+ set(QT_MIN_VERSION "6.7.0")
+ set(KF6_MIN_VERSION "6.10.0")
+ 
diff -Nru kde-spectacle-6.3.4/debian/patches/series 
kde-spectacle-6.3.5/debian/patches/series
--- kde-spectacle-6.3.4/debian/patches/series   1970-01-01 01:00:00.000000000 
+0100
+++ kde-spectacle-6.3.5/debian/patches/series   2025-06-11 22:12:06.000000000 
+0200
@@ -0,0 +1,15 @@
+relax-interplasma-versioned-deps.patch
+# Fix spectacle freezing when finishing the rendering after the end of video 
capture sessions.
+upstream_b63c01d0_videoplatform-Add-RecordingState-property.patch
+upstream_dd1892d8_VideoPlatformWayland-Don-t-use-QtConcurrent-for-creating-KPipeWire-stream.patch
+upstream_f7e5e541_VideoPlatformWayland-Update-to-changed-KPipeWire-API.patch
+upstream_805ae503_SpectacleCore-Update-system-tray-based-on-VideoPlatform-recordingState.patch
+upstream_007c3bc8_VideoPlatformWayland-Clear-node-when-starting-a-new-recording.patch
+upstream_6d6d5875_Set-rendering-message-for-system-tray-icon-tooltip.patch
+upstream_1572f19b_Change-rendering-notification-icon-to-process-working-symbolic.patch
+upstream_7b731475_VideoPlatform-Remove-setRecording-store-recorded-time.patch
+upstream_29d52422_Fix-export-notifications-keeping-spectacle-from-closing.patch
+upstream_98eb3ba7_Use-transient-notifications-for-recording-rendering-notifications.patch
+upstream_d5541b1e_Close-recording-rendering-notifications-when-changing-recording-states.patch
+upstream_b437ca39_ImagePlatformKWin-Clip-sub-image-ROI-for-combined-image-to-prevent-OpenCV-assert-crash.patch
+upstream_64e46b80_Workaround-QWindow-screen-being-wrong-with-some-fractional-DPR-screen-layout-combinations.patch
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_007c3bc8_VideoPlatformWayland-Clear-node-when-starting-a-new-recording.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_007c3bc8_VideoPlatformWayland-Clear-node-when-starting-a-new-recording.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_007c3bc8_VideoPlatformWayland-Clear-node-when-starting-a-new-recording.patch
    1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_007c3bc8_VideoPlatformWayland-Clear-node-when-starting-a-new-recording.patch
    2025-05-16 17:13:47.000000000 +0200
@@ -0,0 +1,25 @@
+From 007c3bc87605e86e65714406c2696c5689be0134 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Fri, 18 Apr 2025 22:38:43 +0000
+Subject: [PATCH] VideoPlatformWayland: Clear node when starting a new
+ recording
+
+---
+ src/Platforms/VideoPlatformWayland.cpp | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/Platforms/VideoPlatformWayland.cpp 
b/src/Platforms/VideoPlatformWayland.cpp
+index 6b60fe24..c84547db 100644
+--- a/src/Platforms/VideoPlatformWayland.cpp
++++ b/src/Platforms/VideoPlatformWayland.cpp
+@@ -238,6 +238,7 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+     default: break; // This shouldn't happen
+     }
+     m_recorder->setMaxPendingFrames(availableFrames(m_frameBytes));
++    m_recorder->setNodeId(0);
+ 
+     Q_ASSERT(stream);
+     connect(stream, &ScreencastingStream::created, this, [this, stream] {
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_1572f19b_Change-rendering-notification-icon-to-process-working-symbolic.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_1572f19b_Change-rendering-notification-icon-to-process-working-symbolic.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_1572f19b_Change-rendering-notification-icon-to-process-working-symbolic.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_1572f19b_Change-rendering-notification-icon-to-process-working-symbolic.patch
   2025-05-19 23:51:23.000000000 +0200
@@ -0,0 +1,33 @@
+From 1572f19b25b44b77e66d38ecf45f5dd75c1a4db3 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 22 Apr 2025 10:56:07 +0200
+Subject: [PATCH] Change rendering notification icon to
+ process-working-symbolic
+
+---
+ src/SpectacleCore.cpp | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index f8723eea..56b42c19 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -317,7 +317,6 @@ SpectacleCore::SpectacleCore(QObject *parent)
+         } else if (state == VideoPlatform::RecordingState::Rendering && 
s_systemTrayIcon) {
+             const auto messageTitle = i18nc("recording notification title", 
"Spectacle is Finishing the Recording");
+             const auto messageBody = i18nc("recording notification message", 
"Please wait");
+-            s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"media_record"_s);
+             s_systemTrayIcon->setToolTipTitle(i18nc("@info:tooltip title for 
rendering tray icon", //
+                                                     "Spectacle is Finishing 
the Recording"));
+             auto subtitle = i18nc("@info:tooltip subtitle for rendering tray 
icon", //
+@@ -325,6 +324,7 @@ SpectacleCore::SpectacleCore(QObject *parent)
+                                   "Click to stop rendering early (this will 
lose data)",
+                                   recordedTime());
+             s_systemTrayIcon->setToolTipSubTitle(subtitle);
++            s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"process-working-symbolic"_s);
+         } else {
+             s_systemTrayIcon.reset();
+             m_captureWindows.clear();
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_29d52422_Fix-export-notifications-keeping-spectacle-from-closing.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_29d52422_Fix-export-notifications-keeping-spectacle-from-closing.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_29d52422_Fix-export-notifications-keeping-spectacle-from-closing.patch
  1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_29d52422_Fix-export-notifications-keeping-spectacle-from-closing.patch
  2025-06-11 22:09:36.000000000 +0200
@@ -0,0 +1,42 @@
+From 29d52422bd8153be721b08b83cbcb48e382a88ca Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 6 May 2025 08:58:14 -0400
+Subject: [PATCH] Fix export notifications keeping spectacle from closing
+
+They won't emit KNotification::closed to let spectacle exit if they just 
expire, but calling KNotification::close removes them from history.
+Neither are desirable. I found out that letting spectacle close anyway when 
the last notification should have expired keeps the notifications in history. 
We use a QTimer as an additional way to let spectacle exit now.
+---
+ src/SpectacleCore.cpp | 11 ++++++++---
+ 1 file changed, 8 insertions(+), 3 deletions(-)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index 56b42c193..f9370cce8 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -1038,15 +1038,20 @@ void SpectacleCore::doNotify(ScreenCapture type, const 
ExportManager::Actions &a
+         }
+     }
+ 
+-    connect(notification, &QObject::destroyed, this, [this](QObject 
*notification) {
++    auto onExpired = [this, notification] {
+         notifications.removeOne(static_cast<KNotification *>(notification));
+         // When there are no more notifications running, we can remove the 
loop locker.
+-        if (notifications.empty()) {
++        if (notifications.empty() && m_eventLoopLocker) {
+             QTimer::singleShot(250, this, [this] {
+                 m_eventLoopLocker.reset();
+             });
+         }
+-    });
++    };
++    connect(notification, &QObject::destroyed, this, onExpired);
++    // BUG: https://bugs.kde.org/show_bug.cgi?id=503838
++    // We can't call KNotification::close or else the notifications will be 
removed from history.
++    // 10 seconds is roughly the expected default duration.
++    QTimer::singleShot(10000, notification, onExpired);
+ 
+     notification->sendEvent();
+ }
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_64e46b80_Workaround-QWindow-screen-being-wrong-with-some-fractional-DPR-screen-layout-combinations.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_64e46b80_Workaround-QWindow-screen-being-wrong-with-some-fractional-DPR-screen-layout-combinations.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_64e46b80_Workaround-QWindow-screen-being-wrong-with-some-fractional-DPR-screen-layout-combinations.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_64e46b80_Workaround-QWindow-screen-being-wrong-with-some-fractional-DPR-screen-layout-combinations.patch
        2025-06-11 22:12:06.000000000 +0200
@@ -0,0 +1,37 @@
+From 64e46b80e621e48f6e7fc9eff555c320d327457b Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Fri, 30 May 2025 15:13:57 -0400
+Subject: [PATCH] Workaround QWindow::screen being wrong with some fractional
+ DPR screen layout combinations
+
+Caused the selection editor to select on the wrong screen.
+
+BUG: 502047
+
+
+(cherry picked from commit f407154111eb6fd3f8c0cc3d80eb3e6c0a241be7)
+
+Co-authored-by: Noah Davis <noaha...@gmail.com>
+---
+ src/Gui/CaptureWindow.cpp | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/Gui/CaptureWindow.cpp b/src/Gui/CaptureWindow.cpp
+index f5178ca55..fc4509cf3 100644
+--- a/src/Gui/CaptureWindow.cpp
++++ b/src/Gui/CaptureWindow.cpp
+@@ -50,6 +50,11 @@ CaptureWindow::CaptureWindow(Mode mode, QScreen *screen, 
QQmlEngine *engine, QWi
+             this, &CaptureWindow::syncGeometryWithScreen);
+     syncGeometryWithScreen();
+     Q_EMIT screenToFollowChanged();
++    // BUG: https://bugs.kde.org/show_bug.cgi?id=502047
++    // Workaround window choosing wrong screen with some fractional DPR 
screen layout combinations.
++    connect(this, &QWindow::screenChanged, this, [this] {
++        syncGeometryWithScreen();
++    });
+ 
+     // sync visibility
+     connect(this, &QWindow::visibilityChanged, this, 
[this](QWindow::Visibility visibility){
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_6d6d5875_Set-rendering-message-for-system-tray-icon-tooltip.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_6d6d5875_Set-rendering-message-for-system-tray-icon-tooltip.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_6d6d5875_Set-rendering-message-for-system-tray-icon-tooltip.patch
       1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_6d6d5875_Set-rendering-message-for-system-tray-icon-tooltip.patch
       2025-05-19 23:51:07.000000000 +0200
@@ -0,0 +1,45 @@
+From 6d6d58755af622d8b1dcbd522702e93c0405c748 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 22 Apr 2025 10:55:36 +0200
+Subject: [PATCH] Set rendering message for system tray icon tooltip
+
+---
+ src/SpectacleCore.cpp | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index 76491af9..f8723eea 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -314,18 +314,25 @@ SpectacleCore::SpectacleCore(QObject *parent)
+                 initPulseAnimation();
+             });
+             startedAnimation->start();
+-        } else if (state == VideoPlatform::RecordingState::Rendering) {
++        } else if (state == VideoPlatform::RecordingState::Rendering && 
s_systemTrayIcon) {
+             const auto messageTitle = i18nc("recording notification title", 
"Spectacle is Finishing the Recording");
+             const auto messageBody = i18nc("recording notification message", 
"Please wait");
+             s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"media_record"_s);
++            s_systemTrayIcon->setToolTipTitle(i18nc("@info:tooltip title for 
rendering tray icon", //
++                                                    "Spectacle is Finishing 
the Recording"));
++            auto subtitle = i18nc("@info:tooltip subtitle for rendering tray 
icon", //
++                                  "Time recorded: %1\n" //
++                                  "Click to stop rendering early (this will 
lose data)",
++                                  recordedTime());
++            s_systemTrayIcon->setToolTipSubTitle(subtitle);
+         } else {
+             s_systemTrayIcon.reset();
+             m_captureWindows.clear();
+         }
+     });
+-    connect(videoPlatform, &VideoPlatform::recordedTimeChanged, this, [this] {
++    connect(videoPlatform, &VideoPlatform::recordedTimeChanged, this, [this, 
videoPlatform] {
+         Q_EMIT recordedTimeChanged();
+-        if (!s_systemTrayIcon) {
++        if (!s_systemTrayIcon || videoPlatform->recordingState() != 
VideoPlatform::RecordingState::Recording) {
+             return;
+         }
+         auto subtitle = i18nc("@info:tooltip subtitle for recording tray 
icon", //
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_7b731475_VideoPlatform-Remove-setRecording-store-recorded-time.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_7b731475_VideoPlatform-Remove-setRecording-store-recorded-time.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_7b731475_VideoPlatform-Remove-setRecording-store-recorded-time.patch
    1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_7b731475_VideoPlatform-Remove-setRecording-store-recorded-time.patch
    2025-05-19 23:51:36.000000000 +0200
@@ -0,0 +1,198 @@
+From 7b7314751cb467e5fb8cf124b8bad69409f66006 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 22 Apr 2025 10:59:04 +0200
+Subject: [PATCH] VideoPlatform: Remove setRecording, store recorded time
+
+setRecording is obsolete now that we have setRecordingState.
+
+We store the recorded time now since we may want to access the recorded time 
while rendering or finished.
+---
+ src/Platforms/PlatformNull.cpp         |  1 -
+ src/Platforms/VideoPlatform.cpp        | 41 +++++++++++++-------------
+ src/Platforms/VideoPlatform.h          |  5 ++--
+ src/Platforms/VideoPlatformWayland.cpp | 22 +++++++++-----
+ 4 files changed, 36 insertions(+), 33 deletions(-)
+
+diff --git a/src/Platforms/PlatformNull.cpp b/src/Platforms/PlatformNull.cpp
+index 86a003cb..0bad71ad 100644
+--- a/src/Platforms/PlatformNull.cpp
++++ b/src/Platforms/PlatformNull.cpp
+@@ -64,7 +64,6 @@ void VideoPlatformNull::startRecording(const QUrl &fileUrl, 
RecordingMode mode,
+ 
+ void VideoPlatformNull::finishRecording()
+ {
+-    setRecording(false);
+ }
+ 
+ #include "moc_PlatformNull.cpp"
+diff --git a/src/Platforms/VideoPlatform.cpp b/src/Platforms/VideoPlatform.cpp
+index 0d3b9e81..59253904 100644
+--- a/src/Platforms/VideoPlatform.cpp
++++ b/src/Platforms/VideoPlatform.cpp
+@@ -16,36 +16,18 @@ VideoPlatform::VideoPlatform(QObject *parent)
+ 
+ bool VideoPlatform::isRecording() const
+ {
+-    return m_basicTimer.isActive();
+-}
+-
+-void VideoPlatform::setRecording(bool recording)
+-{
+-    if (m_basicTimer.isActive() == recording) {
+-        return;
+-    }
+-
+-    if (recording) {
+-        setRecordingState(RecordingState::Recording);
+-        m_elapsedTimer.start();
+-        m_basicTimer.start(1000, Qt::PreciseTimer, this);
+-    } else {
+-        setRecordingState(RecordingState::Finished);
+-        m_elapsedTimer.invalidate();
+-        m_basicTimer.stop();
+-    }
+-    Q_EMIT recordingChanged(recording);
+-    Q_EMIT recordedTimeChanged();
++    return m_recordingState == RecordingState::Recording;
+ }
+ 
+ qint64 VideoPlatform::recordedTime() const
+ {
+-    return m_elapsedTimer.isValid() ? m_elapsedTimer.elapsed() : 0;
++    return m_recordedTime;
+ }
+ 
+ void VideoPlatform::timerEvent(QTimerEvent *event)
+ {
+     if (event->timerId() == m_basicTimer.timerId()) {
++        m_recordedTime = m_elapsedTimer.isValid() ? m_elapsedTimer.elapsed() 
: 0;
+         Q_EMIT recordedTimeChanged();
+     }
+ }
+@@ -93,8 +75,25 @@ void VideoPlatform::setRecordingState(RecordingState state)
+         return;
+     }
+ 
++    m_recordingState = state;
++    if (state == RecordingState::NotRecording) {
++        m_recordedTime = 0;
++        m_elapsedTimer.invalidate();
++        m_basicTimer.stop();
++    } else if (state == RecordingState::Recording) {
++        m_recordedTime = 0;
++        m_elapsedTimer.start();
++        m_basicTimer.start(1000, Qt::PreciseTimer, this);
++    } else {
++        if (m_elapsedTimer.isValid()) {
++            m_recordedTime = m_elapsedTimer.elapsed();
++        }
++        m_elapsedTimer.invalidate();
++        m_basicTimer.stop();
++    }
+     m_recordingState = state;
+     Q_EMIT recordingStateChanged(state);
++    Q_EMIT recordedTimeChanged();
+ }
+ 
+ #include "moc_VideoPlatform.cpp"
+diff --git a/src/Platforms/VideoPlatform.h b/src/Platforms/VideoPlatform.h
+index 533e52ad..1abac3f4 100644
+--- a/src/Platforms/VideoPlatform.h
++++ b/src/Platforms/VideoPlatform.h
+@@ -25,8 +25,8 @@ class VideoPlatform : public QObject
+ 
+     Q_PROPERTY(RecordingModes supportedRecordingModes READ 
supportedRecordingModes NOTIFY supportedRecordingModesChanged)
+     Q_PROPERTY(Formats supportedFormats READ supportedFormats NOTIFY 
supportedFormatsChanged)
+-    Q_PROPERTY(bool isRecording READ isRecording NOTIFY recordingChanged)
+     Q_PROPERTY(qint64 recordedTime READ recordedTime NOTIFY 
recordedTimeChanged)
++    Q_PROPERTY(bool isRecording READ isRecording NOTIFY recordingStateChanged)
+     Q_PROPERTY(RecordingState recordingState READ recordingState NOTIFY 
recordingStateChanged)
+ 
+ public:
+@@ -130,7 +130,6 @@ public:
+     RecordingState recordingState() const;
+ 
+ protected:
+-    void setRecording(bool recording);
+     void setRecordingState(RecordingState state);
+     void timerEvent(QTimerEvent *event) override;
+ 
+@@ -144,7 +143,6 @@ public Q_SLOTS:
+ Q_SIGNALS:
+     void supportedRecordingModesChanged();
+     void supportedFormatsChanged();
+-    void recordingChanged(bool isRecording);
+     void recordingSaved(const QUrl &fileUrl);
+     void recordingFailed(const QString &message);
+     void recordingCanceled(const QString &message);
+@@ -157,6 +155,7 @@ Q_SIGNALS:
+ private:
+     QElapsedTimer m_elapsedTimer;
+     QBasicTimer m_basicTimer;
++    qint64 m_recordedTime = 0;
+     RecordingState m_recordingState = RecordingState::NotRecording;
+ };
+ 
+diff --git a/src/Platforms/VideoPlatformWayland.cpp 
b/src/Platforms/VideoPlatformWayland.cpp
+index c84547db..99ee04fa 100644
+--- a/src/Platforms/VideoPlatformWayland.cpp
++++ b/src/Platforms/VideoPlatformWayland.cpp
+@@ -161,10 +161,14 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+         return;
+     }
+     m_recorderFuture.waitForFinished();
+-    if (isRecording()) {
++    if (recordingState() == RecordingState::Recording) {
+         qWarning() << "Warning: Tried to start recording while already 
recording.";
+         return;
+     }
++    if (recordingState() == RecordingState::Rendering) {
++        qWarning() << "Warning: Tried to start recording while already 
rendering.";
++        return;
++    }
+     if (!fileUrl.isEmpty() && !fileUrl.isLocalFile()) {
+         Q_EMIT recordingFailed(i18nc("@info:shell", "Failed to record: File 
URL is not a local file"));
+         return;
+@@ -246,15 +250,15 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+         if (!m_recorder->output().isEmpty()) {
+             m_recorder->start();
+         }
+-        setRecording(true);
++        setRecordingState(VideoPlatform::RecordingState::Recording);
+     });
+     connect(stream, &ScreencastingStream::failed, this, [this](const QString 
&error) {
+-        setRecording(false);
++        setRecordingState(VideoPlatform::RecordingState::NotRecording);
+         Q_EMIT recordingFailed(error);
+     });
+     connect(stream, &ScreencastingStream::closed, this, [this, 
recordingMode]() {
+         finishRecording();
+-        setRecording(false);
++        setRecordingState(VideoPlatform::RecordingState::Finished);
+         if (recordingMode == Screen) {
+             Q_EMIT recordingFailed(i18nc("@info", "The stream closed because 
the target screen changed in a way that disrupted the recording."));
+         } else if (recordingMode == Window) {
+@@ -301,14 +305,16 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+     connect(m_recorder.get(), &PipeWireRecord::stateChanged, this, [this] {
+         if (m_recorder->state() == PipeWireRecord::Idle) {
+             m_memoryTimer.stop();
+-            if (isRecording()) {
+-                setRecording(false);
++            if (recordingState() != RecordingState::NotRecording) {
++                setRecordingState(VideoPlatform::RecordingState::Finished);
+                 Q_EMIT 
recordingSaved(QUrl::fromLocalFile(m_recorder->output()));
+             }
++        } else if (m_recorder->state() == PipeWireRecord::Recording) {
++            m_memoryTimer.start(5000, Qt::CoarseTimer, this);
++            setRecordingState(VideoPlatform::RecordingState::Recording);
+         } else if (m_recorder->state() == PipeWireRecord::Rendering) {
++            m_memoryTimer.stop();
+             setRecordingState(VideoPlatform::RecordingState::Rendering);
+-        } else {
+-            m_memoryTimer.start(5000, Qt::CoarseTimer, this);
+         }
+     });
+ }
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_805ae503_SpectacleCore-Update-system-tray-based-on-VideoPlatform-recordingState.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_805ae503_SpectacleCore-Update-system-tray-based-on-VideoPlatform-recordingState.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_805ae503_SpectacleCore-Update-system-tray-based-on-VideoPlatform-recordingState.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_805ae503_SpectacleCore-Update-system-tray-based-on-VideoPlatform-recordingState.patch
   2025-05-16 17:13:47.000000000 +0200
@@ -0,0 +1,41 @@
+From 805ae503ae3deb3a6a827deece6da936eeade49b Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiems...@heimr.nl>
+Date: Tue, 8 Oct 2024 14:59:53 +0200
+Subject: [PATCH] SpectacleCore: Update system tray based on
+ VideoPlatform::recordingState
+
+Rather than the binary "recording", use the new recordingState property
+and also handle the "rendering" state.
+---
+ src/SpectacleCore.cpp | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index 55986d95..76491af9 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -260,8 +260,8 @@ SpectacleCore::SpectacleCore(QObject *parent)
+     });
+ 
+     auto videoPlatform = m_videoPlatform.get();
+-    connect(videoPlatform, &VideoPlatform::recordingChanged, this, 
[this](bool isRecording) {
+-        if (isRecording) {
++    connect(videoPlatform, &VideoPlatform::recordingStateChanged, this, 
[this](VideoPlatform::RecordingState state) {
++        if (state == VideoPlatform::RecordingState::Recording) {
+             static const auto recordingIcon = 
u":/icons/256-status-media-recording.webp"_s;
+             static const auto recordingStartedIcon = 
u":/icons/256-status-media-recording-started.webp"_s;
+             static const auto recordingPulseIcon = 
u":/icons/256-status-media-recording-pulse.webp"_s;
+@@ -314,6 +314,10 @@ SpectacleCore::SpectacleCore(QObject *parent)
+                 initPulseAnimation();
+             });
+             startedAnimation->start();
++        } else if (state == VideoPlatform::RecordingState::Rendering) {
++            const auto messageTitle = i18nc("recording notification title", 
"Spectacle is Finishing the Recording");
++            const auto messageBody = i18nc("recording notification message", 
"Please wait");
++            s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"media_record"_s);
+         } else {
+             s_systemTrayIcon.reset();
+             m_captureWindows.clear();
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_98eb3ba7_Use-transient-notifications-for-recording-rendering-notifications.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_98eb3ba7_Use-transient-notifications-for-recording-rendering-notifications.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_98eb3ba7_Use-transient-notifications-for-recording-rendering-notifications.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_98eb3ba7_Use-transient-notifications-for-recording-rendering-notifications.patch
        2025-06-11 22:11:10.000000000 +0200
@@ -0,0 +1,51 @@
+From 98eb3ba73783cb270b17d532e3452e71e50fd29f Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 6 May 2025 09:01:39 -0400
+Subject: [PATCH] Use transient notifications for recording/rendering
+ notifications
+
+Transient notifications are supposed to be kept out of history.
+---
+ src/SpectacleCore.cpp | 18 ++++++++++++++++--
+ 1 file changed, 16 insertions(+), 2 deletions(-)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index f9370cce8..850d1045f 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -276,7 +276,16 @@ SpectacleCore::SpectacleCore(QObject *parent)
+             });
+             const auto messageTitle = i18nc("recording notification title", 
"Spectacle is Recording");
+             const auto messageBody = i18nc("recording notification message", 
"Click the system tray icon to finish recording");
+-            s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"media-record"_s, 4000);
++            auto notification = new KNotification(u"notification"_s, 
KNotification::CloseOnTimeout | KNotification::DefaultEvent, this);
++            notification->setTitle(messageTitle);
++            notification->setText(messageBody);
++            notification->setIconName(u"media-record"_s);
++            // Whether the notification is transient and should not be kept 
in history.
++            notification->setHint(u"transient"_s, true);
++            // Can't set notification duration with KNotification directly.
++            // Also see https://bugs.kde.org/show_bug.cgi?id=503838
++            QTimer::singleShot(4000, notification, &KNotification::close);
++            notification->sendEvent();
+             if (!QMovie::supportedFormats().contains("webp"_ba)) {
+                 const auto messageTitle = i18nc("missing webp support 
notification title", "WebP support is missing.");
+                 const auto messageBody = i18nc("missing webp support 
notification message", "Please install Qt Image Formats to get animated system 
tray icons for Spectacle, and then report this packaging issue to your 
distributor.");
+@@ -323,8 +332,13 @@ SpectacleCore::SpectacleCore(QObject *parent)
+                                   "Time recorded: %1\n" //
+                                   "Click to stop rendering early (this will 
lose data)",
+                                   recordedTime());
++            auto notification = new KNotification(u"notification"_s, 
KNotification::CloseOnTimeout | KNotification::DefaultEvent, this);
++            notification->setTitle(messageTitle);
++            notification->setText(messageBody);
++            notification->setIconName(u"process-working-symbolic"_s);
++            notification->setHint(u"transient"_s, true);
++            notification->sendEvent();
+             s_systemTrayIcon->setToolTipSubTitle(subtitle);
+-            s_systemTrayIcon->showMessage(messageTitle, messageBody, 
u"process-working-symbolic"_s);
+         } else {
+             s_systemTrayIcon.reset();
+             m_captureWindows.clear();
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_b437ca39_ImagePlatformKWin-Clip-sub-image-ROI-for-combined-image-to-prevent-OpenCV-assert-crash.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_b437ca39_ImagePlatformKWin-Clip-sub-image-ROI-for-combined-image-to-prevent-OpenCV-assert-crash.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_b437ca39_ImagePlatformKWin-Clip-sub-image-ROI-for-combined-image-to-prevent-OpenCV-assert-crash.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_b437ca39_ImagePlatformKWin-Clip-sub-image-ROI-for-combined-image-to-prevent-OpenCV-assert-crash.patch
   2025-06-11 22:11:31.000000000 +0200
@@ -0,0 +1,47 @@
+From b437ca399a7a8df92fa8829b114732dc2ddf4b34 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Fri, 9 May 2025 18:09:36 -0400
+Subject: [PATCH] ImagePlatformKWin: Clip sub image ROI for combined image to
+ prevent OpenCV assert crash
+
+The possibility should be completely prevented now.
+
+BUG: 503682
+---
+ src/Platforms/ImagePlatformKWin.cpp | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+diff --git a/src/Platforms/ImagePlatformKWin.cpp 
b/src/Platforms/ImagePlatformKWin.cpp
+index 67fc7375a..4105aaef0 100644
+--- a/src/Platforms/ImagePlatformKWin.cpp
++++ b/src/Platforms/ImagePlatformKWin.cpp
+@@ -109,16 +109,20 @@ QImage combinedImage(const QList<QImage> &images)
+     finalImage.fill(Qt::transparent);
+     auto mainMat = QtCV::qImageToMat(finalImage);
+     for (auto &image : images) {
+-        auto rgbaImage = image.format() == finalImage.format() ? image : 
image.convertedTo(finalFormat);
+-        const auto mat = QtCV::qImageToMat(rgbaImage);
+         // Region Of Interest to put the image in the main image.
+-        const auto pos = ImageMetaData::logicalXY(rgbaImage) * finalDpr;
+-        const auto size = rgbaImage.deviceIndependentSize() * finalDpr;
+-        // Truncate to ints instead of rounding to prevent ROI from going out 
of bounds.
+-        const cv::Rect rect(pos.x(), pos.y(), size.width(), size.height());
++        // Prevent ROI from going out of bounds or having negative size.
++        const auto rect = [finalDpr, &image, &finalImage] {
++            auto pos = ImageMetaData::logicalXY(image) * finalDpr;
++            auto size = image.deviceIndependentSize() * finalDpr;
++            auto rect = Geometry::rectClipped(QRectF(pos, size).toRect(), //
++                                              finalImage.rect());
++            return cv::Rect(rect.x(), rect.y(), rect.width(), rect.height());
++        }();
+         const auto imageDpr = image.devicePixelRatio();
+         const bool hasIntDpr = static_cast<int>(imageDpr) == imageDpr;
+         const auto interpolation = hasIntDpr ? cv::INTER_AREA : 
cv::INTER_LANCZOS4;
++        auto rgbaImage = image.format() == finalImage.format() ? image : 
image.convertedTo(finalFormat);
++        const auto mat = QtCV::qImageToMat(rgbaImage);
+         // Will just copy if there's no difference in size
+         cv::resize(mat, mainMat(rect), rect.size(), 0, 0, interpolation);
+     }
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_b63c01d0_videoplatform-Add-RecordingState-property.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_b63c01d0_videoplatform-Add-RecordingState-property.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_b63c01d0_videoplatform-Add-RecordingState-property.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_b63c01d0_videoplatform-Add-RecordingState-property.patch
        2025-05-16 17:10:02.000000000 +0200
@@ -0,0 +1,122 @@
+From b63c01d08fe870e876ac9425083093bcc6d78ff1 Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiems...@heimr.nl>
+Date: Tue, 8 Oct 2024 14:53:51 +0200
+Subject: [PATCH] videoplatform: Add RecordingState property
+
+This indicates what state the video platform is in currently and allows
+other bits of the UI to react accordingly.
+
+Most importantly this adds a "Rendering" state that corresponds to
+KPipeWire's Rendering state, which indicates we're finishing the
+recording process but haven't fully finished yet.
+---
+ src/Platforms/VideoPlatform.cpp | 17 +++++++++++++++++
+ src/Platforms/VideoPlatform.h   | 14 ++++++++++++++
+ 2 files changed, 31 insertions(+)
+
+--- a/src/Platforms/VideoPlatform.cpp
++++ b/src/Platforms/VideoPlatform.cpp
+@@ -26,9 +26,11 @@
+     }
+ 
+     if (recording) {
++        setRecordingState(RecordingState::Recording);
+         m_elapsedTimer.start();
+         m_basicTimer.start(1000, Qt::PreciseTimer, this);
+     } else {
++        setRecordingState(RecordingState::Finished);
+         m_elapsedTimer.invalidate();
+         m_basicTimer.stop();
+     }
+@@ -80,4 +82,19 @@
+     return formatForExtension(path.mid(path.lastIndexOf(u'.') + 1));
+ }
+ 
++VideoPlatform::RecordingState VideoPlatform::recordingState() const
++{
++    return m_recordingState;
++}
++
++void VideoPlatform::setRecordingState(RecordingState state)
++{
++    if (state == m_recordingState) {
++        return;
++    }
++
++    m_recordingState = state;
++    Q_EMIT recordingStateChanged(state);
++}
++
+ #include "moc_VideoPlatform.cpp"
+--- a/src/Platforms/VideoPlatform.h
++++ b/src/Platforms/VideoPlatform.h
+@@ -27,6 +27,7 @@
+     Q_PROPERTY(Formats supportedFormats READ supportedFormats NOTIFY 
supportedFormatsChanged)
+     Q_PROPERTY(bool isRecording READ isRecording NOTIFY recordingChanged)
+     Q_PROPERTY(qint64 recordedTime READ recordedTime NOTIFY 
recordedTimeChanged)
++    Q_PROPERTY(RecordingState recordingState READ recordingState NOTIFY 
recordingStateChanged)
+ 
+ public:
+     explicit VideoPlatform(QObject *parent = nullptr);
+@@ -41,6 +42,14 @@
+     Q_FLAG(RecordingMode)
+     Q_DECLARE_FLAGS(RecordingModes, RecordingMode)
+ 
++    enum class RecordingState : char {
++        NotRecording, //< Not recording anything
++        Recording, //< Actively recording
++        Rendering, //< Finishing the recording, no longer actively receiving 
frames but still processing to do.
++        Finished //< Recording finished completely.
++    };
++    Q_ENUM(RecordingState)
++
+     /**
+      * Video formats supported by this class's APIs.
+      *
+@@ -118,8 +127,11 @@
+     bool isRecording() const;
+     qint64 recordedTime() const;
+ 
++    RecordingState recordingState() const;
++
+ protected:
+     void setRecording(bool recording);
++    void setRecordingState(RecordingState state);
+     void timerEvent(QTimerEvent *event) override;
+ 
+ public Q_SLOTS:
+@@ -137,6 +149,7 @@
+     void recordingFailed(const QString &message);
+     void recordingCanceled(const QString &message);
+     void recordedTimeChanged();
++    void recordingStateChanged(RecordingState state);
+ 
+     /// Request a region from the platform agnostic selection editor
+     void regionRequested();
+@@ -144,6 +157,7 @@
+ private:
+     QElapsedTimer m_elapsedTimer;
+     QBasicTimer m_basicTimer;
++    RecordingState m_recordingState = RecordingState::NotRecording;
+ };
+ 
+ Q_DECLARE_OPERATORS_FOR_FLAGS(VideoPlatform::RecordingModes)
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -8,6 +8,7 @@
+ 
+ # minimum requirements
+ set(PROJECT_DEP_VERSION "6.3.4")
++set(KPIPEWIRE_DEP_VERSION "6.3.5")
+ set(QT_MIN_VERSION "6.7.0")
+ set(KF6_MIN_VERSION "6.10.0")
+ 
+@@ -83,7 +84,7 @@
+ find_package(Wayland REQUIRED COMPONENTS Client)
+ find_package(PlasmaWaylandProtocols REQUIRED)
+ find_package(LayerShellQt REQUIRED)
+-find_package(KPipeWire)
++find_package(KPipeWire ${KPIPEWIRE_DEP_VERSION})
+ find_package(OpenCV REQUIRED core imgproc)
+ 
+ set_package_properties(KPipeWire PROPERTIES DESCRIPTION
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_d5541b1e_Close-recording-rendering-notifications-when-changing-recording-states.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_d5541b1e_Close-recording-rendering-notifications-when-changing-recording-states.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_d5541b1e_Close-recording-rendering-notifications-when-changing-recording-states.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_d5541b1e_Close-recording-rendering-notifications-when-changing-recording-states.patch
   2025-06-11 22:11:23.000000000 +0200
@@ -0,0 +1,41 @@
+From d5541b1e2959bd20d0178b6cf0c8b21e87328691 Mon Sep 17 00:00:00 2001
+From: Noah Davis <noaha...@gmail.com>
+Date: Tue, 6 May 2025 09:02:17 -0400
+Subject: [PATCH] Close recording/rendering notifications when changing
+ recording states
+
+---
+ src/SpectacleCore.cpp | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp
+index 850d1045f..efa37029b 100644
+--- a/src/SpectacleCore.cpp
++++ b/src/SpectacleCore.cpp
+@@ -285,6 +285,11 @@ SpectacleCore::SpectacleCore(QObject *parent)
+             // Can't set notification duration with KNotification directly.
+             // Also see https://bugs.kde.org/show_bug.cgi?id=503838
+             QTimer::singleShot(4000, notification, &KNotification::close);
++            connect(m_videoPlatform.get(), 
&VideoPlatform::recordingStateChanged, notification, 
[notification](VideoPlatform::RecordingState state) {
++                if (state != VideoPlatform::RecordingState::Recording) {
++                    notification->close();
++                }
++            });
+             notification->sendEvent();
+             if (!QMovie::supportedFormats().contains("webp"_ba)) {
+                 const auto messageTitle = i18nc("missing webp support 
notification title", "WebP support is missing.");
+@@ -337,6 +342,11 @@ SpectacleCore::SpectacleCore(QObject *parent)
+             notification->setText(messageBody);
+             notification->setIconName(u"process-working-symbolic"_s);
+             notification->setHint(u"transient"_s, true);
++            connect(m_videoPlatform.get(), 
&VideoPlatform::recordingStateChanged, notification, 
[notification](VideoPlatform::RecordingState state) {
++                if (state != VideoPlatform::RecordingState::Rendering) {
++                    notification->close();
++                }
++            });
+             notification->sendEvent();
+             s_systemTrayIcon->setToolTipSubTitle(subtitle);
+         } else {
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_dd1892d8_VideoPlatformWayland-Don-t-use-QtConcurrent-for-creating-KPipeWire-stream.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_dd1892d8_VideoPlatformWayland-Don-t-use-QtConcurrent-for-creating-KPipeWire-stream.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_dd1892d8_VideoPlatformWayland-Don-t-use-QtConcurrent-for-creating-KPipeWire-stream.patch
        1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_dd1892d8_VideoPlatformWayland-Don-t-use-QtConcurrent-for-creating-KPipeWire-stream.patch
        2025-05-16 17:13:47.000000000 +0200
@@ -0,0 +1,59 @@
+From dd1892d8325217269647fb463307ad4a8379704a Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiems...@heimr.nl>
+Date: Tue, 8 Oct 2024 14:55:59 +0200
+Subject: [PATCH] VideoPlatformWayland: Don't use QtConcurrent for creating
+ KPipeWire stream
+
+This was done to hide the latency of querying VAAPI, but means that the
+KPipeWire stream lives in the QtConcurrent thread which lacks an event
+loop, meaning any event processing the KPipeWire stream does breaks.
+
+Since the KPipeWire stream no longer queries VAAPI on creation, we can
+now safely do this on the same thread as the VideoPlatform.
+---
+ src/Platforms/VideoPlatformWayland.cpp | 16 ++++++++--------
+ src/Platforms/VideoPlatformWayland.h   |  1 +
+ 2 files changed, 9 insertions(+), 8 deletions(-)
+
+diff --git a/src/Platforms/VideoPlatformWayland.cpp 
b/src/Platforms/VideoPlatformWayland.cpp
+index d2a53475..62375c93 100644
+--- a/src/Platforms/VideoPlatformWayland.cpp
++++ b/src/Platforms/VideoPlatformWayland.cpp
+@@ -118,14 +118,14 @@ VideoPlatformWayland::VideoPlatformWayland(QObject 
*parent)
+     : VideoPlatform(parent)
+     , m_screencasting(new Screencasting(this))
+ {
+-    m_recorderFuture = QtConcurrent::run([] {
+-        return new PipeWireRecord();
+-    }).then([this](PipeWireRecord *result) {
+-        m_recorder.reset(result);
+-        m_recorder->setActive(false);
+-        Q_EMIT supportedRecordingModesChanged();
+-        Q_EMIT supportedFormatsChanged();
+-    });
++    QMetaObject::invokeMethod(this, &VideoPlatformWayland::initialize, 
Qt::QueuedConnection);
++}
++
++void VideoPlatformWayland::initialize()
++{
++    m_recorder = std::make_unique<PipeWireRecord>();
++    Q_EMIT supportedRecordingModesChanged();
++    Q_EMIT supportedFormatsChanged();
+ }
+ 
+ VideoPlatform::RecordingModes VideoPlatformWayland::supportedRecordingModes() 
const
+diff --git a/src/Platforms/VideoPlatformWayland.h 
b/src/Platforms/VideoPlatformWayland.h
+index 0f2e4b8e..e12f1f5c 100644
+--- a/src/Platforms/VideoPlatformWayland.h
++++ b/src/Platforms/VideoPlatformWayland.h
+@@ -36,6 +36,7 @@ protected:
+     void timerEvent(QTimerEvent *event) override;
+ 
+ private:
++    void initialize();
+     bool mkDirPath(const QUrl &fileUrl);
+     void selectAndRecord(const QUrl &fileUrl, RecordingMode recordingMode, 
bool includePointer);
+ 
+-- 
+GitLab
+
diff -Nru 
kde-spectacle-6.3.4/debian/patches/upstream_f7e5e541_VideoPlatformWayland-Update-to-changed-KPipeWire-API.patch
 
kde-spectacle-6.3.5/debian/patches/upstream_f7e5e541_VideoPlatformWayland-Update-to-changed-KPipeWire-API.patch
--- 
kde-spectacle-6.3.4/debian/patches/upstream_f7e5e541_VideoPlatformWayland-Update-to-changed-KPipeWire-API.patch
     1970-01-01 01:00:00.000000000 +0100
+++ 
kde-spectacle-6.3.5/debian/patches/upstream_f7e5e541_VideoPlatformWayland-Update-to-changed-KPipeWire-API.patch
     2025-05-16 17:13:47.000000000 +0200
@@ -0,0 +1,72 @@
+From f7e5e541fb4229a2b34e0b4c936d569e907977dd Mon Sep 17 00:00:00 2001
+From: Arjen Hiemstra <ahiems...@heimr.nl>
+Date: Tue, 8 Oct 2024 14:58:53 +0200
+Subject: [PATCH] VideoPlatformWayland: Update to changed KPipeWire API
+
+setActive() has been replaced with a more explicit start()/stop() API,
+so use that. In addition, forward the Rendering state to VideoPlatform.
+---
+ src/Platforms/VideoPlatformWayland.cpp | 12 +++++++-----
+ 1 file changed, 7 insertions(+), 5 deletions(-)
+
+diff --git a/src/Platforms/VideoPlatformWayland.cpp 
b/src/Platforms/VideoPlatformWayland.cpp
+index 62375c93..6b60fe24 100644
+--- a/src/Platforms/VideoPlatformWayland.cpp
++++ b/src/Platforms/VideoPlatformWayland.cpp
+@@ -170,7 +170,6 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+         return;
+     }
+ 
+-    m_recorder->setActive(false);
+     Screencasting::CursorMode mode = includePointer ? 
Screencasting::CursorMode::Embedded : Screencasting::Hidden;
+     ScreencastingStream *stream = nullptr;
+     switch (recordingMode) {
+@@ -244,7 +243,7 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+     connect(stream, &ScreencastingStream::created, this, [this, stream] {
+         m_recorder->setNodeId(stream->nodeId());
+         if (!m_recorder->output().isEmpty()) {
+-            m_recorder->setActive(true);
++            m_recorder->start();
+         }
+         setRecording(true);
+     });
+@@ -282,7 +281,6 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+         }
+         m_recorder->setEncoder(encoderForFormat(format));
+         m_recorder->setOutput(tempUrl.toLocalFile());
+-        m_recorder->setActive(m_recorder->nodeId() != 0);
+     } else {
+         if (!fileUrl.isLocalFile()) {
+             Q_EMIT recordingFailed(i18nc("@info:shell", "Failed to record: 
Output file URL is not a local file (%1)", fileUrl.toString()));
+@@ -295,6 +293,9 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+         m_recorder->setEncoder(encoderForFormat(formatForPath(localFile)));
+         m_recorder->setOutput(localFile);
+     }
++    if (m_recorder->nodeId() != 0) {
++        m_recorder->start();
++    }
+ 
+     connect(m_recorder.get(), &PipeWireRecord::stateChanged, this, [this] {
+         if (m_recorder->state() == PipeWireRecord::Idle) {
+@@ -303,6 +304,8 @@ void VideoPlatformWayland::startRecording(const QUrl 
&fileUrl, RecordingMode rec
+                 setRecording(false);
+                 Q_EMIT 
recordingSaved(QUrl::fromLocalFile(m_recorder->output()));
+             }
++        } else if (m_recorder->state() == PipeWireRecord::Rendering) {
++            setRecordingState(VideoPlatform::RecordingState::Rendering);
+         } else {
+             m_memoryTimer.start(5000, Qt::CoarseTimer, this);
+         }
+@@ -314,8 +317,7 @@ void VideoPlatformWayland::finishRecording()
+     if (!m_recorder) {
+         return;
+     }
+-    m_recorder->setActive(false);
+-    m_recorder->setNodeId(0);
++    m_recorder->stop();
+ }
+ 
+ void VideoPlatformWayland::timerEvent(QTimerEvent *event)
+-- 
+GitLab
+
diff -Nru kde-spectacle-6.3.4/desktop/org.kde.spectacle.appdata.xml 
kde-spectacle-6.3.5/desktop/org.kde.spectacle.appdata.xml
--- kde-spectacle-6.3.4/desktop/org.kde.spectacle.appdata.xml   2025-04-02 
05:40:28.000000000 +0200
+++ kde-spectacle-6.3.5/desktop/org.kde.spectacle.appdata.xml   2025-05-06 
20:01:30.000000000 +0200
@@ -530,10 +530,10 @@
   </provides>
   <launchable type="desktop-id">org.kde.spectacle.desktop</launchable>
   <releases>
+    <release version="6.3.5" date="2025-05-06"/>
     <release version="6.3.4" date="2025-04-01"/>
     <release version="6.3.3" date="2025-03-11"/>
     <release version="6.3.2" date="2025-02-25"/>
-    <release version="6.3.1" date="2025-02-18"/>
   </releases>
   <custom>
     <value 
key="KDE::supporters">[DomiStyle](https://github.com/DomiStyle);Nithanim;JB;Thibault
 Molleman;Daniel Schulte</value>
diff -Nru kde-spectacle-6.3.4/po/ar/spectacle.po 
kde-spectacle-6.3.5/po/ar/spectacle.po
--- kde-spectacle-6.3.4/po/ar/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/ar/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -9,7 +9,7 @@
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2025-03-22 02:30+0000\n"
-"PO-Revision-Date: 2024-12-12 08:24+0400\n"
+"PO-Revision-Date: 2025-04-23 21:22+0400\n"
 "Last-Translator: Zayed Al-Saidi <zayed.alsa...@gmail.com>\n"
 "Language-Team: ar\n"
 "Language: ar\n"
@@ -751,7 +751,7 @@
 #: src/Gui/QRCodeScannedMessage.qml:30
 #, kde-format
 msgid "Found QR code with binary content."
-msgstr "عثر على رمز QR بمحتوى ثنائي."
+msgstr "عثر على رمز استجابة سريعة QR بمحتوى ثنائي."
 
 #: src/Gui/RecordingSettingsColumn.qml:17
 #, kde-format
diff -Nru kde-spectacle-6.3.4/po/de/spectacle.po 
kde-spectacle-6.3.5/po/de/spectacle.po
--- kde-spectacle-6.3.4/po/de/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/de/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -3,13 +3,13 @@
 # Frederik Schwarzer <schwar...@kde.org>, 2015, 2016, 2018, 2020, 2022, 2023.
 # Alois Spitzbart <spitz...@hotmail.com>, 2022.
 # Frank Steinmetzger <dev-...@felsenfleischer.de>, 2022.
-# SPDX-FileCopyrightText: 2024 Flori G <renne...@protonmail.com>
+# SPDX-FileCopyrightText: 2024, 2025 Flori G <renne...@protonmail.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: spectacle\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2025-03-22 02:30+0000\n"
-"PO-Revision-Date: 2024-10-09 20:36+0200\n"
+"PO-Revision-Date: 2025-03-26 16:39+0100\n"
 "Last-Translator: Flori G <renne...@protonmail.com>\n"
 "Language-Team: German <kde-i18n...@kde.org>\n"
 "Language: de\n"
@@ -17,60 +17,52 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 24.08.1\n"
+"X-Generator: Lokalize 24.12.3\n"
 
 #: src/CaptureModeModel.cpp:152
-#, fuzzy, kde-format
-#| msgid "Rectangular Region"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Rectangular Region"
 msgstr "Rechteckiger Bereich"
 
 #: src/CaptureModeModel.cpp:154
-#, fuzzy, kde-format
-#| msgid "All Screens (Scaled to same size)"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "All Screens (Scaled to same size)"
 msgstr "Alle Bildschirme (auf dieselbe Größe skaliert)"
 
 #: src/CaptureModeModel.cpp:156
-#, fuzzy, kde-format
-#| msgid "Current Screen"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Current Screen"
 msgstr "Aktueller Bildschirm"
 
 #: src/CaptureModeModel.cpp:158
-#, fuzzy, kde-format
-#| msgid "Active Window"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Active Window"
 msgstr "Aktives Fenster"
 
 #: src/CaptureModeModel.cpp:161
-#, fuzzy, kde-format
-#| msgid "Selected Window"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Select Window"
-msgstr "Ausgewähltes Fenster"
+msgstr "Fenster auswählen"
 
 #: src/CaptureModeModel.cpp:161
-#, fuzzy, kde-format
-#| msgid "Window Under Cursor"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Window Under Cursor"
 msgstr "Fenster unter dem Mauszeiger"
 
 #: src/CaptureModeModel.cpp:164
-#, fuzzy, kde-format
-#| msgid "All Screens"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "All Screens"
 msgstr "Alle Bildschirme"
 
 #: src/CaptureModeModel.cpp:166
-#, fuzzy, kde-format
-#| msgid "Full Screen"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Full Screen"
 msgstr "Vollbild"
@@ -1917,78 +1909,67 @@
 msgstr "Vollbild"
 
 #: src/ShortcutActions.cpp:38
-#, fuzzy, kde-format
-#| msgid "Launch Spectacle"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Launch Spectacle"
 msgstr "Spectacle starten"
 
 #: src/ShortcutActions.cpp:44
-#, fuzzy, kde-format
-#| msgid "Capture Entire Desktop"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Entire Desktop"
 msgstr "Gesamte Arbeitsfläche aufnehmen"
 
 #: src/ShortcutActions.cpp:50
-#, fuzzy, kde-format
-#| msgid "Capture Current Monitor"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Current Monitor"
 msgstr "Aktuellen Bildschirm aufnehmen"
 
 #: src/ShortcutActions.cpp:56
-#, fuzzy, kde-format
-#| msgid "Capture Active Window"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Active Window"
 msgstr "Aktives Fenster aufnehmen"
 
 #: src/ShortcutActions.cpp:62
-#, fuzzy, kde-format
-#| msgid "Capture Rectangular Region"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Rectangular Region"
 msgstr "Rechteckigen Bereich aufnehmen"
 
 #: src/ShortcutActions.cpp:69
-#, fuzzy, kde-format
-#| msgid "Capture Active Window"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Selected Window"
-msgstr "Aktives Fenster aufnehmen"
+msgstr "Ausgewähltes Fenster aufnehmen"
 
 #: src/ShortcutActions.cpp:69
-#, fuzzy, kde-format
-#| msgid "Capture Window Under Cursor"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Window Under Cursor"
 msgstr "Fenster unter dem Mauszeiger aufnehmen"
 
 #: src/ShortcutActions.cpp:76
-#, fuzzy, kde-format
-#| msgid "Record Screen"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Screen"
 msgstr "Bildschirm aufnehmen"
 
 #: src/ShortcutActions.cpp:82
-#, fuzzy, kde-format
-#| msgid "Record Window"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Window"
 msgstr "Fenster aufnehmen"
 
 #: src/ShortcutActions.cpp:88
-#, fuzzy, kde-format
-#| msgid "Record Rectangular Region"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Rectangular Region"
 msgstr "Rechteckigen Bereich aufnehmen"
 
 #: src/ShortcutActions.cpp:94
-#, fuzzy, kde-format
-#| msgid "Launch Spectacle without capturing"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Launch Spectacle without capturing"
 msgstr "Spectacle ohne Aufnahme starten"
@@ -2023,7 +2004,7 @@
 #, kde-format
 msgctxt "missing webp support notification title"
 msgid "WebP support is missing."
-msgstr ""
+msgstr "WebP-Unterstützung fehlt."
 
 #: src/SpectacleCore.cpp:261
 #, kde-format
@@ -2032,6 +2013,9 @@
 "Please install Qt Image Formats to get animated system tray icons for "
 "Spectacle, and then report this packaging issue to your distributor."
 msgstr ""
+"Bitte installieren Sie „Qt Image Formats“, um animierte Symbole im "
+"Systemabschnitt der Konstrollleiste zu bekommen und melden Sie dieses "
+"Paketierungsproblem Ihrer Distribution."
 
 #: src/SpectacleCore.cpp:307
 #, kde-format
@@ -2127,13 +2111,13 @@
 #, kde-format
 msgctxt "@item:inlistbox Container/encoder"
 msgid "Animated WebP (better than GIF)"
-msgstr ""
+msgstr "Animiertes WebP (besser als GIF)"
 
 #: src/VideoFormatModel.cpp:52
 #, kde-format
 msgctxt "@item:inlistbox Container/encoder"
 msgid "GIF (compatible, but inefficient)"
-msgstr ""
+msgstr "GIF (kompatibel, aber ineffizient)"
 
 #, fuzzy
 #~| msgid "Screenshot"
diff -Nru kde-spectacle-6.3.4/po/gl/spectacle.po 
kde-spectacle-6.3.5/po/gl/spectacle.po
--- kde-spectacle-6.3.4/po/gl/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/gl/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -1685,7 +1685,7 @@
 #, kde-format
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
-msgstr "Adrián Chaves Fernández"
+msgstr "Adrián Chaves"
 
 #: src/Main.cpp:52
 #, kde-format
diff -Nru kde-spectacle-6.3.4/po/it/spectacle.po 
kde-spectacle-6.3.5/po/it/spectacle.po
--- kde-spectacle-6.3.4/po/it/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/it/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 25.03.70\n"
+"X-Generator: Lokalize 24.12.0\n"
 
 #: src/CaptureModeModel.cpp:152
 #, kde-format
diff -Nru kde-spectacle-6.3.4/po/ko/spectacle.po 
kde-spectacle-6.3.5/po/ko/spectacle.po
--- kde-spectacle-6.3.4/po/ko/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/ko/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -1,6 +1,6 @@
 # Copyright (C) YEAR This_file_is_part_of_KDE
 # This file is distributed under the same license as the PACKAGE package.
-# SPDX-FileCopyrightText: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 
2023, 2024 Shinjo Park <k...@peremen.name>
+# SPDX-FileCopyrightText: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 
2023, 2024, 2025 Shinjo Park <k...@peremen.name>
 #
 msgid ""
 msgstr ""
@@ -15,7 +15,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 23.08.5\n"
+"X-Generator: Lokalize 24.12.3\n"
 
 #: src/CaptureModeModel.cpp:152
 #, kde-format
diff -Nru kde-spectacle-6.3.4/po/ru/spectacle.po 
kde-spectacle-6.3.5/po/ru/spectacle.po
--- kde-spectacle-6.3.4/po/ru/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/ru/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -6,7 +6,7 @@
 # Translators listed below for year 2013 and earlier worked on translation of
 # KSnapshot.
 #
-# SPDX-FileCopyrightText: 2018, 2019, 2020, 2021, 2022, 2023, 2024 Alexander 
Yavorsky <kekc...@gmail.com>
+# SPDX-FileCopyrightText: 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 
Alexander Yavorsky <kekc...@gmail.com>
 # Denis Pershin <d...@perchine.com>, 1998, 1999.
 # Andrey Cherepanov <sibsk...@mail.ru>, 2001-2005.
 # Nickolai Shaforostoff <sha...@ukr.net>, 2004.
@@ -32,7 +32,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 23.08.5\n"
+"X-Generator: Lokalize 24.12.3\n"
 "Plural-Forms: nplurals=4; plural=n==1 ? 3 : n%10==1 && n%100!=11 ? 0 : n"
 "%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Environment: kde\n"
@@ -1681,7 +1681,7 @@
 #, kde-format
 msgctxt "@title:window Unsaved Screenshot"
 msgid "Unsaved"
-msgstr "Несохраненный снимок экрана"
+msgstr "Несохранённый снимок экрана"
 
 #: src/Gui/UndoRedoGroup.qml:31
 #, kde-format
diff -Nru kde-spectacle-6.3.4/po/sk/spectacle.po 
kde-spectacle-6.3.5/po/sk/spectacle.po
--- kde-spectacle-6.3.4/po/sk/spectacle.po      2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/sk/spectacle.po      2025-05-06 20:01:30.000000000 
+0200
@@ -2,45 +2,42 @@
 # SPDX-FileCopyrightText: 2015, 2016, 2017, 2022, 2023 Roman Paholik 
<wizzar...@gmail.com>
 # SPDX-FileCopyrightText: 2019, 2020, 2021, 2023, 2024 Matej Mrenica 
<matejm98m...@gmail.com>
 # Dusan Kazik <prescot...@gmail.com>, 2020.
+# SPDX-FileCopyrightText: 2025 Lucia Mrenica <lucia.mren...@gmail.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: kscreengenie\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2025-03-22 02:30+0000\n"
-"PO-Revision-Date: 2024-03-24 11:39+0100\n"
-"Last-Translator: Matej Mrenica <matejm98m...@gmail.com>\n"
+"PO-Revision-Date: 2025-05-03 13:04+0200\n"
+"Last-Translator: Lucia Mrenica <lucia.mren...@gmail.com>\n"
 "Language-Team: Slovak <kde-i18n-...@kde.org>\n"
 "Language: sk\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Lokalize 24.02.1\n"
+"X-Generator: Lokalize 25.04.0\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
 #: src/CaptureModeModel.cpp:152
-#, fuzzy, kde-format
-#| msgid "Rectangular Region"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Rectangular Region"
 msgstr "Pravouhlá oblasť"
 
 #: src/CaptureModeModel.cpp:154
-#, fuzzy, kde-format
-#| msgid "All Screens (Scaled to same size)"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "All Screens (Scaled to same size)"
 msgstr "Všetky obrazovky (zmenšené na rovnakú veľkosť)"
 
 #: src/CaptureModeModel.cpp:156
-#, fuzzy, kde-format
-#| msgid "Current Screen"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Current Screen"
 msgstr "Aktuálna obrazovka"
 
 #: src/CaptureModeModel.cpp:158
-#, fuzzy, kde-format
-#| msgid "Active Window"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Active Window"
 msgstr "Aktívne okno"
@@ -53,22 +50,19 @@
 msgstr "Aktívne okno"
 
 #: src/CaptureModeModel.cpp:161
-#, fuzzy, kde-format
-#| msgid "Window Under Cursor"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Window Under Cursor"
 msgstr "Okno pod kurzorom"
 
 #: src/CaptureModeModel.cpp:164
-#, fuzzy, kde-format
-#| msgid "All Screens"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "All Screens"
 msgstr "Všetky obrazovky"
 
 #: src/CaptureModeModel.cpp:166
-#, fuzzy, kde-format
-#| msgid "Full Screen"
+#, kde-format
 msgctxt "@action in capture mode section"
 msgid "Full Screen"
 msgstr "Celá obrazovka"
@@ -302,9 +296,9 @@
 msgctxt "px: pixels"
 msgid "%1px"
 msgid_plural "%1px"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%1px"
+msgstr[1] "%1px"
+msgstr[2] "%1px"
 
 #: src/Gui/AnnotationOptionsToolBarContents.qml:98
 #, kde-format
@@ -330,13 +324,13 @@
 #, kde-format
 msgctxt "@label:slider strength of effect"
 msgid "Strength:"
-msgstr ""
+msgstr "Sila:"
 
 #: src/Gui/AnnotationOptionsToolBarContents.qml:234
 #, kde-format
 msgctxt "@info:tooltip"
 msgid "The strength of the effect."
-msgstr ""
+msgstr "Sila efektu."
 
 #: src/Gui/AnnotationOptionsToolBarContents.qml:261
 #, kde-format
@@ -348,18 +342,18 @@
 msgctxt "%2 font family, %3 font style name, %1 font point size"
 msgid "%2 %3 %1pt"
 msgid_plural "%2 %3 %1pts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%2 %3 %1bod"
+msgstr[1] "%2 %3 %1body"
+msgstr[2] "%2 %3 %1bodov"
 
 #: src/Gui/AnnotationOptionsToolBarContents.qml:276
 #, kde-format
 msgctxt "%2 font family %1 font point size"
 msgid "%2 %1pt"
 msgid_plural "%2 %1pts"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+msgstr[0] "%2 %1bod"
+msgstr[1] "%2 %1body"
+msgstr[2] "%2 %1bodov"
 
 #: src/Gui/AnnotationOptionsToolBarContents.qml:288
 #, kde-format
@@ -389,7 +383,7 @@
 #: src/Gui/AnnotationsToolBarContents.qml:110
 #, kde-format
 msgid "Crop"
-msgstr ""
+msgstr "Orezať"
 
 #: src/Gui/AnnotationsToolBarContents.qml:120
 #, kde-format
@@ -460,12 +454,10 @@
 msgstr "Zachytiť novú snímku obrazovky"
 
 #: src/Gui/CaptureOptions.qml:39
-#, fuzzy, kde-format
-#| msgctxt "translatable folder name"
-#| msgid "Screenshots"
+#, kde-format
 msgctxt "@title:group"
 msgid "Screenshot Settings"
-msgstr "Snímky obrazovky"
+msgstr "Nastavenia snímky obrazovky"
 
 #: src/Gui/CaptureSettingsColumn.qml:16 src/Gui/OptionsMenu.cpp:72
 #: src/Gui/RecordingSettingsColumn.qml:16
@@ -553,16 +545,13 @@
 msgstr "Bez oneskorenia"
 
 #: src/Gui/DelaySpinBox.qml:24
-#, fuzzy, kde-format
-#| msgctxt "@title:window"
-#| msgid "%1 second"
-#| msgid_plural "%1 seconds"
+#, kde-format
 msgctxt "Integer number of seconds"
 msgid "%2 second"
 msgid_plural "%2 seconds"
-msgstr[0] "%1 sekunda"
-msgstr[1] "%1 sekundy"
-msgstr[2] "%1 sekúnd"
+msgstr[0] "%2 sekunda"
+msgstr[1] "%2 sekundy"
+msgstr[2] "%2 sekúnd"
 
 #: src/Gui/DelaySpinBox.qml:26
 #, kde-format
@@ -581,25 +570,22 @@
 msgstr "Pomocník"
 
 #: src/Gui/DialogPage.qml:87
-#, fuzzy, kde-format
-#| msgid "Take Screenshot:"
+#, kde-format
 msgctxt "@title:group"
 msgid "Take a Screenshot:"
-msgstr "Zachytenie snímky obrazovky:"
+msgstr "Zachytiť novú snímku obrazovky:"
 
 #: src/Gui/DialogPage.qml:102 src/Gui/DialogPage.qml:143
-#, fuzzy, kde-format
-#| msgid "Options"
+#, kde-format
 msgctxt "@title:group"
 msgid "Options"
 msgstr "Možnosti"
 
 #: src/Gui/DialogPage.qml:128
-#, fuzzy, kde-format
-#| msgid "Recording"
+#, kde-format
 msgctxt "@title:group"
 msgid "Make a Recording:"
-msgstr "Nahrávka"
+msgstr "Nahrať obrazovku:"
 
 #: src/Gui/DialogPage.qml:170
 #, kde-format
@@ -663,7 +649,7 @@
 #: src/Gui/MainToolBarContents.qml:56
 #, kde-format
 msgid "Save"
-msgstr "Uloženie"
+msgstr "Uložiť"
 
 #: src/Gui/MainToolBarContents.qml:62
 #, kde-format
@@ -689,7 +675,7 @@
 #, kde-format
 msgctxt "@action:button edit screenshot"
 msgid "Edit…"
-msgstr ""
+msgstr "Upraviť..."
 
 #: src/Gui/MainToolBarContents.qml:122
 #, kde-format
@@ -764,7 +750,7 @@
 #: src/Gui/QRCodeScannedMessage.qml:30
 #, kde-format
 msgid "QR Code found: %1"
-msgstr ""
+msgstr "QR kód nájdený: %1"
 
 #: src/Gui/QRCodeScannedMessage.qml:30
 #, kde-format
@@ -971,10 +957,9 @@
 
 #. i18n: ectx: property (text), widget (QLabel, label)
 #: src/Gui/SettingsDialog/GeneralOptions.ui:195
-#, fuzzy, kde-format
-#| msgid "Show magnifier"
+#, kde-format
 msgid "Show magnifier:"
-msgstr "Zobraziť lupu"
+msgstr "Zobraziť lupu:"
 
 #. i18n: ectx: property (text), item, widget (QComboBox, kcfg_showMagnifier)
 #. i18n: ectx: property (text), item, widget (QComboBox, 
kcfg_rememberSelectionRect)
@@ -1879,36 +1864,31 @@
 msgstr "Celá obrazovka"
 
 #: src/ShortcutActions.cpp:38
-#, fuzzy, kde-format
-#| msgid "Launch Spectacle"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Launch Spectacle"
 msgstr "Spustiť aplikáciu Spectacle"
 
 #: src/ShortcutActions.cpp:44
-#, fuzzy, kde-format
-#| msgid "Capture Entire Desktop"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Entire Desktop"
 msgstr "Zachytiť celú plochu"
 
 #: src/ShortcutActions.cpp:50
-#, fuzzy, kde-format
-#| msgid "Capture Current Monitor"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Current Monitor"
 msgstr "Zachytiť aktuálny monitor"
 
 #: src/ShortcutActions.cpp:56
-#, fuzzy, kde-format
-#| msgid "Capture Active Window"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Active Window"
 msgstr "Zachytiť aktívne okno"
 
 #: src/ShortcutActions.cpp:62
-#, fuzzy, kde-format
-#| msgid "Capture Rectangular Region"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Rectangular Region"
 msgstr "Zachytiť pravouhlú oblasť"
@@ -1921,36 +1901,31 @@
 msgstr "Zachytiť aktívne okno"
 
 #: src/ShortcutActions.cpp:69
-#, fuzzy, kde-format
-#| msgid "Capture Window Under Cursor"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Capture Window Under Cursor"
 msgstr "Zaznamenať okno pod kurzorom"
 
 #: src/ShortcutActions.cpp:76
-#, fuzzy, kde-format
-#| msgid "Record Screen"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Screen"
-msgstr "Nahrať obrazovku"
+msgstr "Nahrávať obrazovku"
 
 #: src/ShortcutActions.cpp:82
-#, fuzzy, kde-format
-#| msgid "Record Window"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Window"
-msgstr "Nahrať obrazovku"
+msgstr "Nahrávať okno"
 
 #: src/ShortcutActions.cpp:88
-#, fuzzy, kde-format
-#| msgid "Record Rectangular Region"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Record Rectangular Region"
 msgstr "Nahrať pravouhlú oblasť"
 
 #: src/ShortcutActions.cpp:94
-#, fuzzy, kde-format
-#| msgid "Launch Spectacle without capturing"
+#, kde-format
 msgctxt "@action global shortcut"
 msgid "Launch Spectacle without capturing"
 msgstr "Spustiť aplikáciu Spectacle bez zachytenia"
diff -Nru kde-spectacle-6.3.4/po/zh_TW/spectacle.po 
kde-spectacle-6.3.5/po/zh_TW/spectacle.po
--- kde-spectacle-6.3.4/po/zh_TW/spectacle.po   2025-04-02 05:40:28.000000000 
+0200
+++ kde-spectacle-6.3.5/po/zh_TW/spectacle.po   2025-05-06 20:01:30.000000000 
+0200
@@ -3,13 +3,13 @@
 #
 # Jeff Huang <s8321...@gmail.com>, 2016, 2017.
 # pan93412 <pan93...@gmail.com>, 2018, 2019, 2020.
-# SPDX-FileCopyrightText: 2023, 2024 Kisaragi Hiu <m...@kisaragi-hiu.com>
+# SPDX-FileCopyrightText: 2023, 2024, 2025 Kisaragi Hiu <m...@kisaragi-hiu.com>
 msgid ""
 msgstr ""
 "Project-Id-Version: spectacle\n"
 "Report-Msgid-Bugs-To: https://bugs.kde.org\n";
 "POT-Creation-Date: 2025-03-22 02:30+0000\n"
-"PO-Revision-Date: 2024-12-19 17:41+0900\n"
+"PO-Revision-Date: 2025-04-07 13:25+0900\n"
 "Last-Translator: Kisaragi Hiu <m...@kisaragi-hiu.com>\n"
 "Language-Team: Traditional Chinese <zh-l...@lists.slat.org>\n"
 "Language: zh_TW\n"
@@ -17,7 +17,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Lokalize 24.12.0\n"
+"X-Generator: Lokalize 24.12.3\n"
 
 #: src/CaptureModeModel.cpp:152
 #, kde-format
@@ -648,7 +648,7 @@
 #: src/Gui/MainToolBarContents.qml:122
 #, kde-format
 msgid "New Screenshot"
-msgstr "新的螢幕擷取"
+msgstr "新的螢幕截圖"
 
 #: src/Gui/MainToolBarContents.qml:133
 #, kde-format
@@ -1013,7 +1013,7 @@
 #: src/Gui/SettingsDialog/SaveOptionsUtils.h:87
 #, kde-format
 msgid "To save to a sub-folder"
-msgstr "若要儲存到子資料夾"
+msgstr "來儲存到子資料夾"
 
 #: src/Gui/SettingsDialog/SaveOptionsUtils.h:90
 #, kde-format

Reply via email to