#include "windowmanager.h" #include #include #include #include #include namespace WindowManager { static QProcess wm; static void killInstance(); void ensureRunning() { wm.start(QLatin1String("openbox")); wm.closeReadChannel(QProcess::StandardError); wm.closeReadChannel(QProcess::StandardOutput); wm.closeWriteChannel(); wm.waitForStarted(500); // Ugly, but if openbox initializes just as we map // the main window, it might become invisible for (int i = 0; i < 10 && wm.state() == QProcess::Running; ++i) { QThread::msleep(25); } if (wm.state() == QProcess::Running) { qDebug() << "- Spawned openbox"; QObject::connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, killInstance); } 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(); } } }