summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-11-25 12:42:28 +0100
committerHolger Freyther <holger+qt@freyther.de>2017-11-29 02:13:28 +0000
commit163764be406dd6f64dbd4affd6c294359f00501e (patch)
treeae381fcc9049b69686cbb9838639cf5fa09c7894
parentf73fdd97d4bf70b02aac4c0b680a51e632f732eb (diff)
democompositor: Introduce a graceful stop of a client application
Use SIGTERM to terminate the application but to make sure it will go away create a unique timer and start it. The timer is owned by the QProcess and will go away once the process has terminated. On timeout use SIGKILL to make sure the process is going away. Change-Id: I9f9617a579952697aa61bd7bfa1d2fd264a443ce Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
-rw-r--r--wayland/democompositor/processlauncher.cpp19
-rw-r--r--wayland/democompositor/processlauncher.h1
-rw-r--r--wayland/democompositor/qml/Screen.qml4
3 files changed, 23 insertions, 1 deletions
diff --git a/wayland/democompositor/processlauncher.cpp b/wayland/democompositor/processlauncher.cpp
index 6147f05..29e4d64 100644
--- a/wayland/democompositor/processlauncher.cpp
+++ b/wayland/democompositor/processlauncher.cpp
@@ -52,6 +52,7 @@
#include "apps/appentry.h"
#include <QProcess>
+#include <QTimer>
Q_LOGGING_CATEGORY(procs, "launcher.procs")
@@ -118,6 +119,24 @@ void WaylandProcessLauncher::kill(const AppEntry& entry)
}
}
+void WaylandProcessLauncher::stop(const AppEntry& entry, int ms)
+{
+ for (auto state : m_appStates) {
+ if (state.appEntry.sourceFileName != entry.sourceFileName)
+ continue;
+
+ auto timer = new QTimer(state.process);
+ connect(timer, &QTimer::timeout, [entry, state, timer] {
+ qCDebug(procs) << "Sending SIGKILL " << state.process->pid() << " for " << entry.sourceFileName;
+ timer->deleteLater();
+ state.process->kill();
+ });
+ timer->start(ms);
+ qCDebug(procs) << "Sending SIGTERM " << state.process->pid() << " for " << entry.sourceFileName;
+ state.process->terminate();
+ }
+}
+
void WaylandProcessLauncher::launch(const AppEntry &entry)
{
qCDebug(procs) << "Launching" << entry.executableName;
diff --git a/wayland/democompositor/processlauncher.h b/wayland/democompositor/processlauncher.h
index 9453368..ae847e2 100644
--- a/wayland/democompositor/processlauncher.h
+++ b/wayland/democompositor/processlauncher.h
@@ -87,6 +87,7 @@ public:
Q_INVOKABLE QVariant appStateForPid(int pid) const;
Q_INVOKABLE bool isRunning(const AppEntry& entry) const;
Q_INVOKABLE void kill(const AppEntry& entry);
+ Q_INVOKABLE void stop(const AppEntry& entry, int timeout_ms);
Q_SIGNALS:
void appStarted(const AppState &appState);
diff --git a/wayland/democompositor/qml/Screen.qml b/wayland/democompositor/qml/Screen.qml
index bea189b..2986562 100644
--- a/wayland/democompositor/qml/Screen.qml
+++ b/wayland/democompositor/qml/Screen.qml
@@ -202,7 +202,9 @@ WaylandOutput {
}
onSlideTrigger: {
//console.log("slide " + winItem + " : " + winItem.shellSurface.surface)
- winItem.shellSurface.surface.client.close()
+ winItem.appEntry === null ?
+ winItem.shellSurface.surface.client.close() :
+ launcher.stop(winItem.appEntry, 5000);
}
}
Rectangle {