From a4b08ea190ac5bb6b69601318be95ba6775eb018 Mon Sep 17 00:00:00 2001 From: Kurt Hindenburg Date: Sat, 4 Aug 2012 18:05:09 -0400 Subject: [PATCH] Add the "Send Signals" menus from KDE 3.5 This reintroduces the "Send Signals" from KDE 3.5. SIGSTOP/CONT/HUP/INT/TERM/KILL/USR1/USR2 Patch by Kasper Laudrup laudrup@stacktrace.dk FIXED-IN: 4.10 FEATURE: 214908 --- desktop/sessionui.rc | 3 ++- src/Session.cpp | 12 +++++++++ src/Session.h | 2 ++ src/SessionController.cpp | 53 +++++++++++++++++++++++++++++++++++++++ src/SessionController.h | 1 + 5 files changed, 70 insertions(+), 1 deletion(-) diff --git a/desktop/sessionui.rc b/desktop/sessionui.rc index 587570aae..165304c4a 100644 --- a/desktop/sessionui.rc +++ b/desktop/sessionui.rc @@ -1,6 +1,6 @@ - + @@ -11,6 +11,7 @@ + diff --git a/src/Session.cpp b/src/Session.cpp index a9e5d6596..66474a37d 100644 --- a/src/Session.cpp +++ b/src/Session.cpp @@ -725,6 +725,18 @@ void Session::refresh() _shellProcess->setWindowSize(existingSize.width(), existingSize.height()); } +void Session::sendSignal(int signal) +{ + const ProcessInfo* process = getProcessInfo(); + bool ok = false; + int pid; + pid = process->foregroundPid(&ok); + + if (ok) { + ::kill(pid, signal); + } +} + bool Session::kill(int signal) { if (_shellProcess->pid() <= 0) diff --git a/src/Session.h b/src/Session.h index 76a098b8b..12c40b838 100644 --- a/src/Session.h +++ b/src/Session.h @@ -356,6 +356,8 @@ public: void saveSession(KConfigGroup& group); void restoreSession(KConfigGroup& group); + void sendSignal(int signal); + public slots: /** diff --git a/src/SessionController.cpp b/src/SessionController.cpp index eb2732b4c..d3e190206 100644 --- a/src/SessionController.cpp +++ b/src/SessionController.cpp @@ -71,6 +71,9 @@ #include #include "TerminalCharacterDecoder.h" +// For Unix signal names +#include + using namespace Konsole; // TODO - Replace the icon choices below when suitable icons for silence and @@ -429,6 +432,11 @@ void SessionController::configureWebShortcuts() KToolInvocation::kdeinitExec("kcmshell4", QStringList() << "ebrowsing"); } +void SessionController::sendSignal(QAction* action) { + const int signal = action->data().value(); + _session->sendSignal(signal); +} + bool SessionController::eventFilter(QObject* watched , QEvent* event) { if (watched == _view) { @@ -680,6 +688,51 @@ void SessionController::setupExtraActions() action->setIcon(KIcon("format-font-size-less")); action->setShortcut(KShortcut(Qt::CTRL | Qt::Key_Minus)); + // Send signal + KSelectAction* sendSignalActions = collection->add("send_signal"); + sendSignalActions->setText(i18n("Send Signal")); + connect(sendSignalActions, SIGNAL(triggered(QAction*)), this, SLOT(sendSignal(QAction*))); + + action = collection->addAction("sigstop-signal"); + action->setText(i18n("&Suspend Task") + " (STOP)"); + action->setData(SIGSTOP); + sendSignalActions->addAction(action); + + action = collection->addAction("sigcont-signal"); + action->setText(i18n("&Continue Task") + " (CONT)"); + action->setData(SIGCONT); + sendSignalActions->addAction(action); + + action = collection->addAction("sighup-signal"); + action->setText(i18n("&Hangup") + " (HUP)"); + action->setData(SIGHUP); + sendSignalActions->addAction(action); + + action = collection->addAction("sigint-signal"); + action->setText(i18n("&Interrupt Task") + " (INT)"); + action->setData(SIGINT); + sendSignalActions->addAction(action); + + action = collection->addAction("sigterm-signal"); + action->setText(i18n("&Terminate Task") + " (TERM)"); + action->setData(SIGTERM); + sendSignalActions->addAction(action); + + action = collection->addAction("sigkill-signal"); + action->setText(i18n("&Kill Task") + " (KILL)"); + action->setData(SIGKILL); + sendSignalActions->addAction(action); + + action = collection->addAction("sigusr1-signal"); + action->setText(i18n("User Signal &1") + " (USR1)"); + action->setData(SIGUSR1); + sendSignalActions->addAction(action); + + action = collection->addAction("sigusr2-signal"); + action->setText(i18n("User Signal &2") + " (USR2)"); + action->setData(SIGUSR2); + sendSignalActions->addAction(action); + _findAction->setShortcut(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_F)); _findNextAction->setShortcut(QKeySequence(Qt::Key_F3)); _findPreviousAction->setShortcut(QKeySequence(Qt::SHIFT + Qt::Key_F3)); diff --git a/src/SessionController.h b/src/SessionController.h index 576b386c4..86a0bb729 100644 --- a/src/SessionController.h +++ b/src/SessionController.h @@ -238,6 +238,7 @@ private slots: void switchProfile(Profile::Ptr profile); void handleWebShortcutAction(); void configureWebShortcuts(); + void sendSignal(QAction* action); // other void prepareSwitchProfileMenu();