diff --git a/src/Gui/SettingsDialog/GeneralOptionsPage.h b/src/Gui/SettingsDialog/GeneralOptionsPage.h --- a/src/Gui/SettingsDialog/GeneralOptionsPage.h +++ b/src/Gui/SettingsDialog/GeneralOptionsPage.h @@ -22,6 +22,7 @@ #include "SettingsPage.h" +class QButtonGroup; class QCheckBox; class QRadioButton; @@ -44,6 +45,7 @@ private: + QButtonGroup* mPrintKeyActionGroup; QRadioButton* mRememberAlways; QRadioButton* mRememberUntilClosed; QCheckBox *mUseLightBackground; diff --git a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp --- a/src/Gui/SettingsDialog/GeneralOptionsPage.cpp +++ b/src/Gui/SettingsDialog/GeneralOptionsPage.cpp @@ -23,6 +23,7 @@ #include #include +#include #include #include @@ -35,6 +36,26 @@ { QFormLayout *mainLayout = new QFormLayout(this); setLayout(mainLayout); + + KTitleWidget* runningTitle = new KTitleWidget(this); + runningTitle->setText(i18n("When Spectacle is Running")); + runningTitle->setLevel(2); + mainLayout->addRow(runningTitle); + QRadioButton* takeNew = new QRadioButton(i18n("Take a new screenshot"), this); + QRadioButton* startNewInstance = new QRadioButton(i18n("Open a new Spectacle window"), this); + mPrintKeyActionGroup = new QButtonGroup(this); + mPrintKeyActionGroup->setExclusive(true); + mPrintKeyActionGroup->addButton(takeNew, SpectacleConfig::PrintKeyActionRunning::TakeNewScreenshot); + mPrintKeyActionGroup->addButton(startNewInstance, SpectacleConfig::PrintKeyActionRunning::StartNewInstance); + connect( mPrintKeyActionGroup, static_cast(&QButtonGroup::buttonToggled), this, &GeneralOptionsPage::markDirty); + mainLayout->addRow(i18n("Press screenshot key to:"), takeNew); + mainLayout->addRow(QString(), startNewInstance); + //On Wayland we can't programmatically raise and focus the window so we have to hide the option + if (!(KWindowSystem::isPlatformWayland() || qstrcmp(qgetenv("XDG_SESSION_TYPE"), "wayland") == 0)) { + QRadioButton* focusWindow = new QRadioButton(i18n("Return focus to Spectacle"), this); + mPrintKeyActionGroup->addButton( focusWindow, SpectacleConfig::PrintKeyActionRunning::FocusWindow); + mainLayout->addRow(QString(), focusWindow); + } // Rectangular Region settings KTitleWidget *titleWidget = new KTitleWidget(this); @@ -86,6 +107,7 @@ cfgManager->setRememberLastRectangularRegion(mRememberUntilClosed->isChecked() || mRememberAlways->isChecked()); cfgManager->setAlwaysRememberRegion (mRememberAlways->isChecked()); cfgManager->setShowMagnifierChecked(mShowMagnifier->checkState() == Qt::Checked); + cfgManager->setPrintKeyActionRunning(static_cast(mPrintKeyActionGroup->checkedId())); mChangesMade = false; } @@ -98,6 +120,7 @@ mRememberUntilClosed->setChecked(cfgManager->rememberLastRectangularRegion()); mRememberAlways->setChecked(cfgManager->alwaysRememberRegion()); mShowMagnifier->setChecked(cfgManager->showMagnifierChecked()); + mPrintKeyActionGroup->button(cfgManager->printKeyActionRunning())->setChecked(true); mChangesMade = false; } diff --git a/src/SpectacleConfig.h b/src/SpectacleConfig.h --- a/src/SpectacleConfig.h +++ b/src/SpectacleConfig.h @@ -47,7 +47,13 @@ QUrl lastSaveAsLocation() const; QUrl lastSaveLocation() const; - + + enum PrintKeyActionRunning : int { + TakeNewScreenshot = 0, + StartNewInstance, + FocusWindow + }; + private: explicit SpectacleConfig(QObject *parent = nullptr); @@ -117,6 +123,9 @@ QString saveImageFormat() const; void setSaveImageFormat(const QString &saveFmt); + PrintKeyActionRunning printKeyActionRunning() const; + void setPrintKeyActionRunning (PrintKeyActionRunning action); + private: KSharedConfigPtr mConfig; diff --git a/src/SpectacleConfig.cpp b/src/SpectacleConfig.cpp --- a/src/SpectacleConfig.cpp +++ b/src/SpectacleConfig.cpp @@ -19,6 +19,8 @@ #include "SpectacleConfig.h" +#include + SpectacleConfig::SpectacleConfig(QObject *parent) : QObject(parent) { @@ -315,3 +317,21 @@ mGeneralConfig.writeEntry(QStringLiteral("default-save-image-format"), saveFmt); mGeneralConfig.sync(); } + +SpectacleConfig::PrintKeyActionRunning SpectacleConfig::printKeyActionRunning() const +{ + mConfig->reparseConfiguration(); + int newScreenshotAction = static_cast(SpectacleConfig::PrintKeyActionRunning::TakeNewScreenshot); + int readValue = mGuiConfig.readEntry(QStringLiteral("printKeyActionRunning"), newScreenshotAction); + if ((KWindowSystem::isPlatformWayland() || qstrcmp(qgetenv("XDG_SESSION_TYPE"), "wayland") == 0 ) + && readValue == SpectacleConfig::PrintKeyActionRunning::FocusWindow) { + return SpectacleConfig::PrintKeyActionRunning::TakeNewScreenshot; + } + return static_cast(readValue); +} + +void SpectacleConfig::setPrintKeyActionRunning (SpectacleConfig::PrintKeyActionRunning action) +{ + mGuiConfig.writeEntry(QStringLiteral("printKeyActionRunning"), static_cast(action)); + mGuiConfig.sync(); +} diff --git a/src/SpectacleCore.cpp b/src/SpectacleCore.cpp --- a/src/SpectacleCore.cpp +++ b/src/SpectacleCore.cpp @@ -38,6 +38,7 @@ #include #include #include +#include #include SpectacleCore::SpectacleCore(StartMode startMode, ImageGrabber::GrabMode grabMode, QString &saveFileName, @@ -153,6 +154,21 @@ if (!(mStartMode == GuiMode)) { mStartMode = GuiMode; initGui(); + } else { + using Actions = SpectacleConfig::PrintKeyActionRunning; + switch (SpectacleConfig::instance()->printKeyActionRunning()) { + case Actions::TakeNewScreenshot: + QTimer::singleShot(KWindowSystem::compositingActive() ? 200 : 50, mImageGrabber, &ImageGrabber::doImageGrab); + break; + case Actions::FocusWindow: + KWindowSystem::forceActiveWindow(mMainWindow->winId());; + break; + case Actions::StartNewInstance: + QProcess newInstance; + newInstance.setProgram(QStringLiteral("spectacle")); + newInstance.startDetached(); + break; + } } }