diff --git a/src/ExportManager.h b/src/ExportManager.h --- a/src/ExportManager.h +++ b/src/ExportManager.h @@ -74,17 +74,17 @@ void errorMessage(const QString &str); void pixmapChanged(const QPixmap &pixmap); void imageSaved(const QUrl &savedAt); - void forceNotify(const QUrl &savedAt); + void imageCopied(); public Q_SLOTS: QUrl getAutosaveFilename(); QUrl tempSave(); void setWindowTitle(const QString &windowTitle); - void doSave(const QUrl &url = QUrl(), bool notify = false); - bool doSaveAs(QWidget *parentWindow = nullptr, bool notify = false); - void doCopyToClipboard(bool notify); + void doSave(const QUrl &url = QUrl()); + bool doSaveAs(QWidget *parentWindow = nullptr); + void doCopyToClipboard(); void doPrint(QPrinter *printer); private: diff --git a/src/ExportManager.cpp b/src/ExportManager.cpp --- a/src/ExportManager.cpp +++ b/src/ExportManager.cpp @@ -444,7 +444,7 @@ // save slots -void ExportManager::doSave(const QUrl &url, bool notify) +void ExportManager::doSave(const QUrl &url) { if (mSavePixmap.isNull()) { emit errorMessage(i18n("Cannot save an empty screenshot image.")); @@ -456,15 +456,11 @@ QDir dir(savePath.path()); dir.cdUp(); SpectacleConfig::instance()->setLastSaveFile(savePath); - emit imageSaved(savePath); - if (notify) { - emit forceNotify(savePath); - } } } -bool ExportManager::doSaveAs(QWidget *parentWindow, bool notify) +bool ExportManager::doSaveAs(QWidget *parentWindow) { QStringList supportedFilters; SpectacleConfig *config = SpectacleConfig::instance(); @@ -494,10 +490,6 @@ if (save(saveUrl)) { emit imageSaved(saveUrl); config->setLastSaveAsFile(saveUrl); - - if (notify) { - emit forceNotify(saveUrl); - } return true; } } @@ -507,16 +499,13 @@ // misc helpers -void ExportManager::doCopyToClipboard(bool notify) +void ExportManager::doCopyToClipboard() { auto data = new QMimeData(); data->setImageData(mSavePixmap.toImage()); data->setData(QStringLiteral("x-kde-force-image-copy"), QByteArray()); QApplication::clipboard()->setMimeData(data, QClipboard::Clipboard); - - if (notify) { - emit forceNotify(QUrl()); - } + emit imageCopied(); } void ExportManager::doPrint(QPrinter *printer) diff --git a/src/Gui/KSMainWindow.h b/src/Gui/KSMainWindow.h --- a/src/Gui/KSMainWindow.h +++ b/src/Gui/KSMainWindow.h @@ -49,12 +49,6 @@ private: - enum class QuitBehavior { - QuitImmediately, - QuitExternally - }; - void quit(const QuitBehavior quitBehavior = QuitBehavior::QuitImmediately); - enum class MessageDuration { AutoHide, Persistent diff --git a/src/Gui/KSMainWindow.cpp b/src/Gui/KSMainWindow.cpp --- a/src/Gui/KSMainWindow.cpp +++ b/src/Gui/KSMainWindow.cpp @@ -368,22 +368,6 @@ KIO::highlightInFileManager({location}); } -void KSMainWindow::quit(const QuitBehavior quitBehavior) -{ - qApp->setQuitOnLastWindowClosed(false); - hide(); - - if (quitBehavior == QuitBehavior::QuitImmediately) { - // Allow some time for clipboard content to transfer - // TODO: Find better solution - QTimer::singleShot(250, qApp, &QApplication::quit); - } - // TODO for else case: - // Currently it is expected that you emit forceNotify, and finally quit - // via a callback through KNotification::action1Activated. However, that - // is not working quite right, see Bug #389694 which needs fixing. -} - void KSMainWindow::showInlineMessage(const QString& message, const KMessageWidget::MessageType messageType, const MessageDuration messageDuration, const QList& actions) { @@ -442,13 +426,11 @@ void KSMainWindow::sendToClipboard() { - bool notify = false; - ExportManager::instance()->doCopyToClipboard(notify); - - SpectacleConfig::instance()->quitAfterSaveOrCopyChecked() - ? quit() - : showInlineMessage(i18n("The screenshot has been copied to the clipboard."), + ExportManager::instance()->doCopyToClipboard(); + if (!SpectacleConfig::instance()->quitAfterSaveOrCopyChecked()) { + showInlineMessage(i18n("The screenshot has been copied to the clipboard."), KMessageWidget::Information); + } } void KSMainWindow::showPreferencesDialog() @@ -472,21 +454,12 @@ { SpectacleConfig::instance()->setLastUsedSaveMode(SaveMode::Save); setDefaultSaveAction(); - - const bool quitChecked = SpectacleConfig::instance()->quitAfterSaveOrCopyChecked(); - ExportManager::instance()->doSave(QUrl(), /* notify */ quitChecked); - if (quitChecked) { - quit(QuitBehavior::QuitExternally); - } + ExportManager::instance()->doSave(QUrl()); } void KSMainWindow::saveAs() { SpectacleConfig::instance()->setLastUsedSaveMode(SaveMode::SaveAs); setDefaultSaveAction(); - - const bool quitChecked = SpectacleConfig::instance()->quitAfterSaveOrCopyChecked(); - if (ExportManager::instance()->doSaveAs(this, /* notify */ quitChecked) && quitChecked) { - quit(QuitBehavior::QuitExternally); - } + ExportManager::instance()->doSaveAs(this); } diff --git a/src/SpectacleCore.h b/src/SpectacleCore.h --- a/src/SpectacleCore.h +++ b/src/SpectacleCore.h @@ -77,6 +77,7 @@ private: + void imageExported(const QUrl &savedAt); void initGui(bool theIncludePointer, bool theIncludeDecorations); Platform::GrabMode toPlatformGrabMode(Spectacle::CaptureMode theCaptureMode); diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp --- a/src/SpectacleCore.cpp +++ b/src/SpectacleCore.cpp @@ -85,9 +85,7 @@ lExportManager->setCaptureMode(theCaptureMode); connect(lExportManager, &ExportManager::errorMessage, this, &SpectacleCore::showErrorMessage); connect(lExportManager, &ExportManager::imageSaved, this, &SpectacleCore::doCopyPath); - connect(lExportManager, &ExportManager::forceNotify, this, &SpectacleCore::doNotify); connect(mPlatform.get(), &Platform::windowTitleChanged, lExportManager, &ExportManager::setWindowTitle); - switch (theStartMode) { case StartMode::DBus: break; @@ -243,16 +241,16 @@ { if (mNotify) { connect(lExportManager, &ExportManager::imageSaved, this, &SpectacleCore::doNotify); + connect(lExportManager, &ExportManager::imageCopied, this, [this]{doNotify(QUrl());}); } if (mCopyToClipboard) { - lExportManager->doCopyToClipboard(mNotify); + lExportManager->doCopyToClipboard(); } else { QUrl lSavePath = (mStartMode == StartMode::Background && mFileNameUrl.isValid() && mFileNameUrl.isLocalFile()) ? mFileNameUrl : QUrl(); lExportManager->doSave(lSavePath); } - // if we notify, we emit allDone only if the user either dismissed the notification or pressed // the "Open" button, otherwise the app closes before it can react to it. if (!mNotify) { @@ -388,17 +386,30 @@ { if (!mIsGuiInited) { mMainWindow = std::make_unique(mPlatform->supportedGrabModes(), mPlatform->supportedShutterModes()); - connect(mMainWindow.get(), &KSMainWindow::newScreenshotRequest, this, &SpectacleCore::takeNewScreenshot); connect(mMainWindow.get(), &KSMainWindow::dragAndDropRequest, this, &SpectacleCore::doStartDragAndDrop); - + connect(ExportManager::instance(), &ExportManager::imageSaved, this, &SpectacleCore::imageExported); + connect(ExportManager::instance(), &ExportManager::imageCopied, this, [this] { + mCopyToClipboard = true; + imageExported(QUrl()); + }); mIsGuiInited = true; auto lShutterMode = mPlatform->supportedShutterModes().testFlag(Platform::ShutterMode::Immediate) ? Platform::ShutterMode::Immediate : Platform::ShutterMode::OnClick; auto lGrabMode = toPlatformGrabMode(ExportManager::instance()->captureMode()); QTimer::singleShot(0, this, [this, lShutterMode, lGrabMode, theIncludePointer, theIncludeDecorations]() { mPlatform->doGrab(lShutterMode, lGrabMode, theIncludePointer, theIncludeDecorations); }); + mMainWindow->hide(); + } +} + +void SpectacleCore::imageExported(const QUrl &savedAt) +{ + if (SpectacleConfig::instance()->quitAfterSaveOrCopyChecked()) { + qApp->setQuitOnLastWindowClosed(false); + mMainWindow->hide(); + doNotify(savedAt); } }