diff --git a/desktop/org.kde.spectacle.desktop.cmake b/desktop/org.kde.spectacle.desktop.cmake --- a/desktop/org.kde.spectacle.desktop.cmake +++ b/desktop/org.kde.spectacle.desktop.cmake @@ -141,14 +141,16 @@ Keywords[zh_CN]=snapshot;capture;print;screenshot;snipping;snip;快照;截图;抓取;屏幕截图;截屏;抓屏;截取; Keywords[zh_TW]=snapshot;capture;print;screenshot;snipping;snip;截圖;擷取;截圖程式 Exec=@QtBinariesDir@/qdbus org.kde.Spectacle / StartAgent +X-KDE-Original-Executable=${CMAKE_INSTALL_PREFIX}/bin/spectacle Icon=spectacle Type=Application Terminal=false StartupNotify=false Actions=FullScreenScreenShot;CurrentMonitorScreenShot;ActiveWindowScreenShot;RectangularRegionScreenShot; X-DBUS-StartupType=Multi X-DBUS-ServiceName=org.kde.Spectacle X-KDE-Shortcuts=Print +X-KDE-Wayland-Interfaces=org_kde_kwin_effect-screenshot [Desktop Action FullScreenScreenShot] Name=Capture Entire Desktop diff --git a/src/Gui/KSMainWindow.cpp b/src/Gui/KSMainWindow.cpp --- a/src/Gui/KSMainWindow.cpp +++ b/src/Gui/KSMainWindow.cpp @@ -226,6 +226,9 @@ } else if (!mShutterModes.testFlag(Platform::ShutterMode::Immediate)) { mKSWidget->lockOnClickEnabled(); } + if (!mShutterModes.testFlag(Platform::ShutterMode::Delayed)) { + mKSWidget->delayDisabled(); + } resize(QSize(DEFAULT_WINDOW_WIDTH, DEFAULT_WINDOW_HEIGHT).expandedTo(minimumSize())); // Allow Ctrl+Q to quit the app diff --git a/src/Gui/KSWidget.h b/src/Gui/KSWidget.h --- a/src/Gui/KSWidget.h +++ b/src/Gui/KSWidget.h @@ -70,6 +70,7 @@ void setScreenshotPixmap(const QPixmap &thePixmap); void lockOnClickDisabled(); void lockOnClickEnabled(); + void delayDisabled(); void setButtonState(State state); void setProgress(double progress); diff --git a/src/Gui/KSWidget.cpp b/src/Gui/KSWidget.cpp --- a/src/Gui/KSWidget.cpp +++ b/src/Gui/KSWidget.cpp @@ -197,14 +197,17 @@ { mCaptureOnClick->setCheckState(Qt::Checked); mCaptureOnClick->setEnabled(false); - mDelayMsec->setEnabled(false); } void KSWidget::lockOnClickDisabled() { mCaptureOnClick->setCheckState(Qt::Unchecked); mCaptureOnClick->setEnabled(false); - mDelayMsec->setEnabled(true); +} + +void KSWidget::delayDisabled() +{ + mDelayMsec->setEnabled(false); } // private slots diff --git a/src/Platforms/Platform.h b/src/Platforms/Platform.h --- a/src/Platforms/Platform.h +++ b/src/Platforms/Platform.h @@ -43,7 +43,8 @@ enum class ShutterMode { Immediate = 0x01, - OnClick = 0x02 + OnClick = 0x02, + Delayed = 0x03 }; using ShutterModes = QFlags; Q_FLAG(ShutterModes) diff --git a/src/Platforms/PlatformKWinWayland.cpp b/src/Platforms/PlatformKWinWayland.cpp --- a/src/Platforms/PlatformKWinWayland.cpp +++ b/src/Platforms/PlatformKWinWayland.cpp @@ -93,16 +93,11 @@ Platform::ShutterModes PlatformKWinWayland::supportedShutterModes() const { - return { ShutterMode::OnClick }; + return { ShutterMode::Immediate | ShutterMode::OnClick | ShutterMode::Delayed }; } void PlatformKWinWayland::doGrab(ShutterMode theShutterMode, GrabMode theGrabMode, bool theIncludePointer, bool theIncludeDecorations) { - if (theShutterMode != ShutterMode::OnClick) { - emit newScreenshotFailed(); - return; - } - switch(theGrabMode) { case GrabMode::AllScreens: return doGrabHelper(QStringLiteral("screenshotFullscreen"), theIncludePointer); diff --git a/src/Platforms/PlatformNull.cpp b/src/Platforms/PlatformNull.cpp --- a/src/Platforms/PlatformNull.cpp +++ b/src/Platforms/PlatformNull.cpp @@ -41,7 +41,7 @@ Platform::ShutterModes PlatformNull::supportedShutterModes() const { - return { ShutterMode::Immediate | ShutterMode::OnClick }; + return { ShutterMode::Immediate | ShutterMode::OnClick | ShutterMode::Delayed }; } void PlatformNull::doGrab(ShutterMode theShutterMode, GrabMode theGrabMode, bool theIncludePointer, bool theIncludeDecorations) diff --git a/src/Platforms/PlatformXcb.cpp b/src/Platforms/PlatformXcb.cpp --- a/src/Platforms/PlatformXcb.cpp +++ b/src/Platforms/PlatformXcb.cpp @@ -160,7 +160,7 @@ Platform::ShutterModes PlatformXcb::supportedShutterModes() const { - return { ShutterMode::Immediate | ShutterMode::OnClick }; + return { ShutterMode::Immediate | ShutterMode::OnClick | ShutterMode::Delayed }; } void PlatformXcb::doGrab(ShutterMode theShutterMode, GrabMode theGrabMode, bool theIncludePointer, bool theIncludeDecorations) diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp --- a/src/SpectacleCore.cpp +++ b/src/SpectacleCore.cpp @@ -73,8 +73,8 @@ connect(mPlatform.get(), &Platform::newScreenshotFailed, this, &SpectacleCore::screenshotFailed); auto lImmediateAvailable = mPlatform->supportedShutterModes().testFlag(Platform::ShutterMode::Immediate); - auto lOnClickAvailable = mPlatform->supportedShutterModes().testFlag(Platform::ShutterMode::OnClick); - if ((!lOnClickAvailable) && (theDelayMsec < 0)) { + auto lDelayedAvailable = mPlatform->supportedShutterModes().testFlag(Platform::ShutterMode::Delayed); + if (!lDelayedAvailable || (theDelayMsec < 0)) { theDelayMsec = 0; }