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