#include "windowmanager.h" #include #include #include #include #include namespace WindowManager { static QProcess wm; static void killInstance(); void ensureRunning() { static bool once = false; if (once) return; once = true; wm.start(QLatin1String("openbox")); wm.closeReadChannel(QProcess::StandardError); wm.closeReadChannel(QProcess::StandardOutput); wm.closeWriteChannel(); wm.waitForStarted(500); QTimer::singleShot(100, []() { if (wm.state() == QProcess::Running) { qDebug() << "- Spawned openbox"; QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, killInstance); QProcess::startDetached("wmctrl", QStringList() << "-a" << "vmchooser" << "-F"); } 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(500, killInstance); } } void killInstance() { if (wm.state() == QProcess::Running) { wm.terminate(); QThread::msleep(50); } if (wm.state() == QProcess::Running) { qDebug() << "- Forcefully killing spawned WM"; wm.kill(); } } }