#include "processmanager.h" #include #include #include #include #include #include #include #include ProcessManager::ProcessManager(QObject *parent) : QObject(parent) { } ProcessManager::~ProcessManager() { QMapIterator i(m_systemProcess); while (i.hasNext()) { i.next(); QProcess *p = i.value(); delete p; } } void ProcessManager::start() { loadSystemProcess(); QTimer::singleShot(100, this, &ProcessManager::loadAutoStartProcess); } void ProcessManager::logout() { QMapIterator i(m_systemProcess); while (i.hasNext()) { i.next(); QProcess *p = i.value(); p->terminate(); } i.toFront(); while (i.hasNext()) { i.next(); QProcess *p = i.value(); if (p->state() != QProcess::NotRunning && !p->waitForFinished(2000)) { p->kill(); } } QCoreApplication::exit(0); } void ProcessManager::loadSystemProcess() { QList> list; list << qMakePair(QString("kwin_x11"), QStringList()); list << qMakePair(QString("cutefish-settings-daemon"), QStringList()); list << qMakePair(QString("cutefish-xembedsniproxy"), QStringList()); // Desktop components list << qMakePair(QString("cutefish-filemanager"), QStringList("--desktop")); list << qMakePair(QString("cutefish-dock"), QStringList()); list << qMakePair(QString("cutefish-launcher"), QStringList()); for (QPair pair : list) { QProcess *process = new QProcess; process->setProcessChannelMode(QProcess::ForwardedChannels); process->setProgram(pair.first); process->setArguments(pair.second); process->start(); process->waitForStarted(); if (pair.first == "cutefish-settings-daemon") { QThread::msleep(800); } qDebug() << "Load DE components: " << pair.first << pair.second; // Add to map if (process->exitCode() == 0) { m_autoStartProcess.insert(pair.first, process); } else { process->deleteLater(); } } } void ProcessManager::loadAutoStartProcess() { QStringList execList; QStringList xdgDesktopList; xdgDesktopList << "/etc/xdg/autostart"; for (const QString &dirName : xdgDesktopList) { QDir dir(dirName); if (!dir.exists()) continue; const QFileInfoList files = dir.entryInfoList(QStringList("*.desktop"), QDir::Files | QDir::Readable); for (const QFileInfo &fi : files) { QSettings desktop(fi.filePath(), QSettings::IniFormat); desktop.setIniCodec("UTF-8"); desktop.beginGroup("Desktop Entry"); if (desktop.contains("OnlyShowIn")) continue; const QString execValue = desktop.value("Exec").toString(); if (!execValue.isEmpty()) { execList << execValue; } } } for (const QString &exec : execList) { QProcess *process = new QProcess; process->setProgram(exec); process->start(); process->waitForStarted(); if (process->exitCode() == 0) { m_autoStartProcess.insert(exec, process); } else { process->deleteLater(); } } }