Bug#1107722: unblock: kde-spectacle/4:6.3.5-2
Package: release.debian.org
Severity: normal
X-Debbugs-Cc: kde-spectacle@packages.debian.org, Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Control: affects -1 + src:kde-spectacle
User: release.debian.org@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 <coucouf@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 <coucouf@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-devel@kde.org
-Source: https://download.kde.org/
+Source: https://invent.kde.org/plasma/spectacle
Files: *
Copyright: 2021-2024, A S Alam <aalam@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 <noahadvs@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 <noahadvs@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 <noahadvs@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 <noahadvs@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 <noahadvs@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 <noahadvs@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 <noahadvs@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 <ahiemstra@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 <noahadvs@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 <noahadvs@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 <ahiemstra@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 <noahadvs@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 <ahiemstra@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 <ahiemstra@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.alsaidi@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 <schwarzer@kde.org>, 2015, 2016, 2018, 2020, 2022, 2023.
# Alois Spitzbart <spitz234@hotmail.com>, 2022.
# Frank Steinmetzger <dev-kde@felsenfleischer.de>, 2022.
-# SPDX-FileCopyrightText: 2024 Flori G <Renner03@protonmail.com>
+# SPDX-FileCopyrightText: 2024, 2025 Flori G <Renner03@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 <Renner03@protonmail.com>\n"
"Language-Team: German <kde-i18n-de@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 <kde@peremen.name>
+# SPDX-FileCopyrightText: 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Shinjo Park <kde@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 <kekcuha@gmail.com>
+# SPDX-FileCopyrightText: 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Yavorsky <kekcuha@gmail.com>
# Denis Pershin <dyp@perchine.com>, 1998, 1999.
# Andrey Cherepanov <sibskull@mail.ru>, 2001-2005.
# Nickolai Shaforostoff <shafff@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 <wizzardsk@gmail.com>
# SPDX-FileCopyrightText: 2019, 2020, 2021, 2023, 2024 Matej Mrenica <matejm98mthw@gmail.com>
# Dusan Kazik <prescott66@gmail.com>, 2020.
+# SPDX-FileCopyrightText: 2025 Lucia Mrenica <lucia.mrenica@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 <matejm98mthw@gmail.com>\n"
+"PO-Revision-Date: 2025-05-03 13:04+0200\n"
+"Last-Translator: Lucia Mrenica <lucia.mrenica@gmail.com>\n"
"Language-Team: Slovak <kde-i18n-doc@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 <s8321414@gmail.com>, 2016, 2017.
# pan93412 <pan93412@gmail.com>, 2018, 2019, 2020.
-# SPDX-FileCopyrightText: 2023, 2024 Kisaragi Hiu <mail@kisaragi-hiu.com>
+# SPDX-FileCopyrightText: 2023, 2024, 2025 Kisaragi Hiu <mail@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 <mail@kisaragi-hiu.com>\n"
"Language-Team: Traditional Chinese <zh-l10n@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 to: