From d6651f307d896848372ac696e8335ac47eac8888 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 2 Jul 2019 15:55:51 +0200 Subject: Temporarily spawn openbox if no WM is running --- src/dialog.cpp | 6 ++++++ src/windowmanager.cpp | 43 +++++++++++++++++++++++++++++++++++++++++++ src/windowmanager.h | 22 ++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 src/windowmanager.cpp create mode 100644 src/windowmanager.h diff --git a/src/dialog.cpp b/src/dialog.cpp index a23e3ce..932f28c 100644 --- a/src/dialog.cpp +++ b/src/dialog.cpp @@ -22,11 +22,16 @@ #include "vsession.h" #include "userconfig.h" #include "filedownloader.h" +#include "windowmanager.h" static bool isProcessRunning(const QString &binary); Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { + + // Make sure a window manager is running, so any modals or other popups work properly + WindowManager::ensureRunning(); + model_[TAB_NATIVE] = new SessionTreeModel(parent); model_[TAB_RECENT_COURSES] = new SessionTreeModel(parent, true); model_[TAB_ALL_VMS] = new SessionTreeModel(parent); @@ -153,6 +158,7 @@ void Dialog::on_treeView_doubleClicked(const QModelIndex& index) // Run session if (s->run()) { + WindowManager::stopOwnInstance(); // Run session start script if the session could be initialized successfully if (QFile::exists(SESSION_START_SCRIPT)) { // Use the current environment variables and add the necessary diff --git a/src/windowmanager.cpp b/src/windowmanager.cpp new file mode 100644 index 0000000..e5e14a3 --- /dev/null +++ b/src/windowmanager.cpp @@ -0,0 +1,43 @@ +#include "windowmanager.h" + +#include +#include +#include + +namespace WindowManager { + +static QProcess wm; + +void ensureRunning() +{ + wm.start(QLatin1String("openbox")); + wm.closeReadChannel(QProcess::StandardError); + wm.closeReadChannel(QProcess::StandardOutput); + wm.closeWriteChannel(); + wm.waitForStarted(1000); + QTimer::singleShot(200, []() { + if (wm.state() == QProcess::Running) { + qDebug() << "- Spawned openbox"; + } else if (wm.exitCode() == 0) { + qDebug() << "- A WM is already running"; + } else { + qDebug() << "- openbox binary not in $PATH"; + } + }); +} + +void stopOwnInstance() +{ + if (wm.state() == QProcess::Running) { + qDebug() << "- Politely terminating spawned WM"; + wm.terminate(); + QTimer::singleShot(1000, []() { + if (wm.state() == QProcess::Running) { + qDebug() << "- Forcefully killing spawned WM"; + wm.kill(); + } + }); + } +} + +} diff --git a/src/windowmanager.h b/src/windowmanager.h new file mode 100644 index 0000000..c89f983 --- /dev/null +++ b/src/windowmanager.h @@ -0,0 +1,22 @@ +#ifndef _WINDOWSMANAGER_H_ +#define _WINDOWSMANAGER_H_ + +namespace WindowManager +{ + +/** + * Make sure a window manager is running. + * If none is running, start openbox. + */ +void ensureRunning(); + +/** + * If we started openbox as the window manager, + * terminate it, otherwise leave the current + * one running. + */ +void stopOwnInstance(); + +} + +#endif -- cgit v1.2.3-55-g7522