//=========================================== // Lumina-DE source code // Copyright (c) 2016, Ken Moore // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== #include #include #include #include class LSession : public QObject{ private: QList PROCS; bool stopping; void startProcess(QString ID, QString command){ QString logfile = QDir::homePath()+"/.lumina/logs/"+ID+".log"; if(QFile::exists(logfile+".old")){ QFile::remove(logfile+".old"); } if(QFile::exists(logfile)){ QFile::rename(logfile,logfile+".old"); } QProcess *proc = new QProcess(); proc->setProcessChannelMode(QProcess::MergedChannels); proc->setProcessEnvironment( QProcessEnvironment::systemEnvironment() ); proc->setStandardOutputFile(logfile); proc->start(command, QIODevice::ReadOnly); connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(procFinished()) ); PROCS << proc; } private slots: void stopall(){ stopping = true; for(int i=0; istate()!=QProcess::NotRunning){ PROCS[i]->kill(); } } } void procFinished(){ //Go through and check the status on all the procs to determine which one finished int stopped = 0; for(int i=0; istate()==QProcess::NotRunning){ stopped++; if(!stopping){ //See if this process is the main desktop binary if(PROCS[i]->program().section("/",-1) == "Lumina-DE"){ stopall(); } //start closing down everything //else{ PROCS[i]->start(QIODevice::ReadOnly); } //restart the process break; } } } if(stopping && stopped==PROCS.length()){ QCoreApplication::exit(0); } } public: LSession(){ stopping = false; } ~LSession(){ } void start(){ //First check for a valid installation if( !LUtils::isValidBinary("fluxbox") || !LUtils::isValidBinary("Lumina-DE") ){ exit(1); } //Window Manager First // FLUXBOX BUG BYPASS: if the ~/.fluxbox dir does not exist, it will ignore the given config file //if(!QFile::exists(QDir::homePath()+"/.fluxbox")){ QDir dir; dir.mkpath(QDir::homePath()+"/.fluxbox"); } //startProcess("wm", "fluxbox -rc "+QDir::homePath()+"/.lumina/fluxbox-init -no-slit -no-toolbar"); //Desktop Next startProcess("runtime","Lumina-DE"); //ScreenSaver if(LUtils::isValidBinary("xscreensaver")){ startProcess("screensaver","xscreensaver -no-splash"); } //Compositing manager if(LUtils::isValidBinary("xcompmgr")){ startProcess("compositing","xcompmgr"); } } };