mirror of https://github.com/cutefishos/core
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.4 KiB
C++
132 lines
3.4 KiB
C++
#include "processmanager.h"
|
|
|
|
#include <QCoreApplication>
|
|
#include <QFileInfoList>
|
|
#include <QFileInfo>
|
|
#include <QSettings>
|
|
#include <QDebug>
|
|
#include <QTimer>
|
|
#include <QThread>
|
|
#include <QDir>
|
|
|
|
ProcessManager::ProcessManager(QObject *parent)
|
|
: QObject(parent)
|
|
{
|
|
}
|
|
|
|
ProcessManager::~ProcessManager()
|
|
{
|
|
QMapIterator<QString, QProcess *> 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<QString, QProcess *> 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<QPair<QString, QStringList>> 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-fm"), QStringList("--desktop"));
|
|
list << qMakePair(QString("cutefish-dock"), QStringList());
|
|
list << qMakePair(QString("cutefish-launcher"), QStringList());
|
|
|
|
for (QPair<QString, QStringList> 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();
|
|
}
|
|
}
|
|
}
|