Git commit b69a2b88ef0283cd1176b48590f24973ec1b053c by Kurt Hindenburg, on behalf of Matan Ziv-Av. Committed on 14/05/2023 at 14:15. Pushed by hindenburg into branch 'master'.
Add a menu option for monitors to only notify once. When this option is enabled, the monitors (prompt, activity, silence, process termination) are disabled automatically after one notification. M +2 -1 desktop/sessionui.rc M +7 -0 doc/manual/index.docbook M +8 -0 src/session/Session.cpp M +17 -1 src/session/SessionController.cpp M +7 -0 src/session/SessionController.h https://invent.kde.org/utilities/konsole/commit/b69a2b88ef0283cd1176b48590f24973ec1b053c diff --git a/desktop/sessionui.rc b/desktop/sessionui.rc index 992517f11..614a8553b 100644 --- a/desktop/sessionui.rc +++ b/desktop/sessionui.rc @@ -1,7 +1,7 @@ <?xml version="1.0"?> <!DOCTYPE gui SYSTEM "kpartgui.dtd"> -<gui name="session" version="34"> +<gui name="session" version="35"> <MenuBar> <Menu name="file"> <Action name="file_save_as" group="session-operations"/> @@ -28,6 +28,7 @@ <Action name="edit_find_prev" group="session-edit-operations"/> </Menu> <Menu name="view"> + <Action name="monitor-once" group="session-view-operations"/> <Action name="monitor-prompt" group="session-view-operations"/> <Action name="monitor-silence" group="session-view-operations"/> <Action name="monitor-activity" group="session-view-operations"/> diff --git a/doc/manual/index.docbook b/doc/manual/index.docbook index 1a81bc382..e33fb7af3 100644 --- a/doc/manual/index.docbook +++ b/doc/manual/index.docbook @@ -899,6 +899,13 @@ menu item earlier.</action> The default layouts (2x2, 2x1, and 1x2) can be loade </para></listitem> </varlistentry> +<varlistentry> +<term><menuchoice> +<guimenu>View</guimenu><guimenuitem>One-shot monitors</guimenuitem></menuchoice></term> +<listitem><para><action>The following monitors only notify once, and are then disabled. </action> +</para></listitem> +</varlistentry> + <varlistentry> <term><menuchoice> <shortcut><keycombo action="simul">&Ctrl;&Shift;<keycap>R</keycap></keycombo></shortcut> diff --git a/src/session/Session.cpp b/src/session/Session.cpp index d4fc12e6f..e821e46e9 100644 --- a/src/session/Session.cpp +++ b/src/session/Session.cpp @@ -26,6 +26,7 @@ #include <QKeyEvent> // KDE +#include <KActionCollection> #include <KConfigGroup> #include <KIO/DesktopExecParser> #include <KLocalizedString> @@ -44,6 +45,7 @@ #include "Pty.h" #include "SSHProcessInfo.h" +#include "SessionController.h" #include "SessionManager.h" #include "ShellCommand.h" #include "Vt102Emulation.h" @@ -743,6 +745,9 @@ void Session::silenceTimerDone() connect(notification, &KNotification::defaultActivated, this, [view, notification]() { view->notificationClicked(notification->xdgActivationToken()); }); + if (view->sessionController()->isMonitorOnce()) { + view->sessionController()->actionCollection()->action(QStringLiteral("monitor-silence"))->setChecked(false); + } setPendingNotification(Notification::Silence); } @@ -1936,6 +1941,9 @@ void Session::handleActivity() connect(notification, &KNotification::defaultActivated, this, [view, notification]() { view->notificationClicked(notification->xdgActivationToken()); }); + if (view->sessionController()->isMonitorOnce()) { + view->sessionController()->actionCollection()->action(QStringLiteral("monitor-activity"))->setChecked(false); + } // mask activity notification for a while to avoid flooding _notifiedActivity = true; diff --git a/src/session/SessionController.cpp b/src/session/SessionController.cpp index fa5a033b8..3395f4682 100644 --- a/src/session/SessionController.cpp +++ b/src/session/SessionController.cpp @@ -134,6 +134,7 @@ SessionController::SessionController(Session *sessionParam, TerminalDisplay *vie , _isSearchBarEnabled(false) , _searchBar(viewParam->searchBar()) , _monitorProcessFinish(false) + , _monitorOnce(false) , _escapedUrlFilter(nullptr) { Q_ASSERT(sessionParam); @@ -365,6 +366,9 @@ void SessionController::snapshot() connect(notification, &KNotification::defaultActivated, this, [this, notification]() { view()->notificationClicked(notification->xdgActivationToken()); }); + if (_monitorOnce) { + actionCollection()->action(QStringLiteral("monitor-process-finish"))->setChecked(false); + } } _previousForegroundProcessName = isForegroundProcessActive ? session()->foregroundProcessName() : QString(); } @@ -884,7 +888,12 @@ void SessionController::setupExtraActions() collection->setDefaultShortcut(action, Qt::CTRL | Qt::ALT | Qt::Key_U); // Monitor - KToggleAction *toggleAction = new KToggleAction(i18n("Monitor for &Prompt"), this); + KToggleAction *toggleAction = new KToggleAction(i18n("One-shot monitors"), this); + action = collection->addAction(QStringLiteral("monitor-once"), toggleAction); + connect(action, &QAction::toggled, this, &Konsole::SessionController::monitorOnce); + action->setIcon(QIcon::fromTheme(QStringLiteral("tools-media-optical-burn"))); + + toggleAction = new KToggleAction(i18n("Monitor for &Prompt"), this); collection->setDefaultShortcut(toggleAction, Konsole::ACCEL | Qt::Key_R); action = collection->addAction(QStringLiteral("monitor-prompt"), toggleAction); connect(action, &QAction::toggled, this, &Konsole::SessionController::monitorPrompt); @@ -1844,8 +1853,15 @@ void SessionController::notifyPrompt() connect(notification, &KNotification::defaultActivated, this, [this, notification]() { view()->notificationClicked(notification->xdgActivationToken()); }); + if (_monitorOnce) { + actionCollection()->action(QStringLiteral("monitor-prompt"))->setChecked(false); + } } } +void SessionController::monitorOnce(bool once) +{ + _monitorOnce = once; +} void SessionController::monitorPrompt(bool monitor) { session()->setMonitorPrompt(monitor); diff --git a/src/session/SessionController.h b/src/session/SessionController.h index b59ea199b..9924fdbd1 100644 --- a/src/session/SessionController.h +++ b/src/session/SessionController.h @@ -152,6 +152,11 @@ public: void setVisible(QString name, bool visible); + bool isMonitorOnce() const + { + return _monitorOnce; + }; + Q_SIGNALS: /** * Emitted when the view associated with the controller is focused. @@ -265,6 +270,7 @@ private Q_SLOTS: void showHistoryOptions(); void clearHistory(); void clearHistoryAndReset(); + void monitorOnce(bool once); void monitorPrompt(bool monitor); void monitorActivity(bool monitor); void monitorSilence(bool monitor); @@ -390,6 +396,7 @@ private: QString _previousForegroundProcessName; bool _monitorProcessFinish; + bool _monitorOnce; EscapeSequenceUrlFilter *_escapedUrlFilter; std::unique_ptr<KXMLGUIBuilder> _clientBuilder;
