aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-session
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/lumina-session')
-rw-r--r--src-qt5/core/lumina-session/lumina-session.pro8
-rw-r--r--src-qt5/core/lumina-session/main.cpp32
-rw-r--r--src-qt5/core/lumina-session/session.cpp40
3 files changed, 66 insertions, 14 deletions
diff --git a/src-qt5/core/lumina-session/lumina-session.pro b/src-qt5/core/lumina-session/lumina-session.pro
index 91a5f891..4b06ad60 100644
--- a/src-qt5/core/lumina-session/lumina-session.pro
+++ b/src-qt5/core/lumina-session/lumina-session.pro
@@ -1,14 +1,14 @@
include($${PWD}/../../OS-detect.pri)
-QT = core widgets
+QT = core widgets x11extras
TARGET = start-lumina-desktop
target.path = $${L_BINDIR}
-
-LIBS += -lLuminaUtils
-DEPENDPATH += ../libLumina
+include(../libLumina/LDesktopUtils.pri)
+include(../libLumina/LuminaXDG.pri)
+include(../libLumina/LuminaThemes.pri)
SOURCES += main.cpp \
session.cpp
diff --git a/src-qt5/core/lumina-session/main.cpp b/src-qt5/core/lumina-session/main.cpp
index 464302a7..0e076ac3 100644
--- a/src-qt5/core/lumina-session/main.cpp
+++ b/src-qt5/core/lumina-session/main.cpp
@@ -8,20 +8,25 @@
#include <QCoreApplication>
#include <QProcess>
#include <QString>
+#include <QLockFile>
+#include <QX11Info>
#include "session.h"
-#include <LuminaUtils.h>
+#include <LUtils.h>
+#include <LDesktopUtils.h>
#include <LuminaOS.h>
#include <LuminaThemes.h>
#include <LuminaXDG.h>
+#include <unistd.h>
+
#define DEBUG 0
int main(int argc, char ** argv)
{
if (argc > 1) {
if (QString(argv[1]) == QString("--version")){
- qDebug() << LUtils::LuminaDesktopVersion();
+ qDebug() << LDesktopUtils::LuminaDesktopVersion();
return 0;
}
}
@@ -32,11 +37,15 @@ int main(int argc, char ** argv)
//Start X11 if needed
QString disp = QString(getenv("DISPLAY")).simplified();
if(disp.isEmpty()){
+ qDebug() << "No X11 session detected: Lumina will try to start one...";
//No X session found. Go ahead and re-init this binary within an xinit call
- QStringList args; args << QCoreApplication::applicationFilePath();
- if(LUtils::isValidBinary("x11vnc")){ args << "--" << "-listen" << "tcp"; } //need to be able to VNC into this session
+ QString prog = QString(argv[0]).section("/",-1);
+ LUtils::isValidBinary(prog); //will adjust the path to be absolute
+ QStringList args; args << prog;
+ //if(LUtils::isValidBinary("x11vnc")){ args << "--" << "-listen" << "tcp"; } //need to be able to VNC into this session
return QProcess::execute("xinit", args);
}
+ qDebug() << "Starting the Lumina desktop on current X11 session:" << disp;
//Setup any initialization values
LTHEME::LoadCustomEnvSettings();
LXDG::setEnvironmentVars();
@@ -46,11 +55,26 @@ int main(int argc, char ** argv)
//Check for any missing user config files
+ //Check for any stale desktop lock files and clean them up
+ QString cfile = QDir::tempPath()+"/.LSingleApp-%1-%2-%3";
+ cfile = cfile.arg( QString(getlogin()), "lumina-desktop", QString::number(QX11Info::appScreen()) );
+ if(QFile::exists(cfile)){
+ qDebug() << "Found Desktop Lock for X session:" << disp;
+ qDebug() << " - Disabling Lock and starting new desktop session";
+ QLockFile lock(cfile+"-lock");
+ if(lock.isLocked()){ lock.unlock(); }
+ QFile::remove(cfile);
+ }
+ if(QFile::exists(QDir::tempPath()+"/.luminastopping")){
+ QFile::remove(QDir::tempPath()+"/.luminastopping");
+ }
//Configure X11 monitors if needed
if(LUtils::isValidBinary("lumina-xconfig")){
+ qDebug() << " - Resetting monitor configuration to last-used settings";
QProcess::execute("lumina-xconfig --reset-monitors");
}
+ qDebug() << " - Starting the session...";
//Startup the session
QCoreApplication a(argc, argv);
LSession sess;
diff --git a/src-qt5/core/lumina-session/session.cpp b/src-qt5/core/lumina-session/session.cpp
index 5f9ca6c4..19acdb1c 100644
--- a/src-qt5/core/lumina-session/session.cpp
+++ b/src-qt5/core/lumina-session/session.cpp
@@ -11,7 +11,9 @@
#include <QProcessEnvironment>
#include <QDebug>
#include <QSettings>
-#include <LuminaUtils.h>
+#include <QDir>
+
+#include <LUtils.h>
#include <LuminaOS.h>
void LSession::stopall(){
@@ -23,7 +25,7 @@ void LSession::stopall(){
for(int i=0; i<PROCS.length(); i++){
if(PROCS[i]->state()!=QProcess::NotRunning){ PROCS[i]->terminate(); }
}
- //QCoreApplication::exit(0);
+ QCoreApplication::exit(0);
}
void LSession::procFinished(){
@@ -34,7 +36,8 @@ void LSession::procFinished(){
stopped++;
if(!stopping){
//See if this process is the main desktop binary
- if(PROCS[i]->program().section("/",-1) == "lumina-desktop"){ stopall(); } //start closing down everything
+ if(PROCS[i]->objectName()=="runtime"){ stopall(); }
+ //if(PROCS[i]->program().section("/",-1) == "lumina-desktop"){ stopall(); } //start closing down everything
//else{ PROCS[i]->start(QIODevice::ReadOnly); } //restart the process
break;
}
@@ -56,6 +59,19 @@ void LSession::startProcess(QString ID, QString command, QStringList watchfiles)
proc->setProcessChannelMode(QProcess::MergedChannels);
proc->setProcessEnvironment( QProcessEnvironment::systemEnvironment() );
proc->setStandardOutputFile(logfile);
+ proc->setObjectName(ID);
+ if(ID=="runtime"){
+ //Bypass for a hidden dbus file requirement for Qt itself (Qt 5.5.1+?)
+ if(!QFile::exists("/etc/machine-id") && !QFile::exists("/var/db/dbus/machine-id")){
+ if(LUtils::isValidBinary("dbus-uuidgen") && LUtils::runCmd("dbus-uuidgen --ensure") ){ } //good - the UUID was created successfully
+ else if(LUtils::isValidBinary("dbus-launch")){ command.prepend("dbus-launch --exit-with-session "); }
+ else{
+ //create a simple DBUS UUID and put it in the universal-fallback location (OS-independent)
+ // TO-DO - root vs user level permissions issue?
+ qDebug() << "Could not find '/etc/machine-id' or '/var/db/dbus/machine-id': Qt will most likely crash. \nPlease run 'dbus-uuidgen --ensure' with root permissions to generate this file if Lumina does not start properly.";
+ }
+ }
+ }
proc->start(command, QIODevice::ReadOnly);
connect(proc, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(procFinished()) );
PROCS << proc;
@@ -95,7 +111,7 @@ void LSession::start(){
//Compositing manager
QSettings settings("lumina-desktop","sessionsettings");
if(settings.value("enableCompositing",true).toBool()){
- if(LUtils::isValidBinary("compton")){
+ if(LUtils::isValidBinary("compton")){
QString set = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/compton.conf";
if(!QFile::exists(set)){
if(QFile::exists(LOS::LuminaShare()+"/compton.conf")){
@@ -106,9 +122,21 @@ void LSession::start(){
qDebug() << "Using default compton settings";
startProcess("compositing","compton");
}else{
- startProcess("compositing","compton --config \""+set+"\"", QStringList() << set);
+ //Auto-detect if GLX is available on the system and turn it on/off as needed
+ bool startcompton = true;
+ if(LUtils::isValidBinary("glxinfo")){
+ bool hasAccel =! LUtils::getCmdOutput("glxinfo -B").filter("direct rendering:").filter("Yes").isEmpty();
+ qDebug() << "Detected GPU Acceleration:" << hasAccel;
+ QStringList info = LUtils::readFile(set);
+ for(int i=0; i<info.length(); i++){
+ if(info[i].section("=",0,0).simplified()=="backend"){ info[i] = QString("backend = \"")+ (hasAccel ? "glx" : "xrender")+"\""; break; } //replace this line
+ }
+ LUtils::writeFile(set, info, true);
+ if( !hasAccel && settings.value("compositingWithGpuAccelOnly",true).toBool() ){ startcompton = false; }
+ }
+ if(startcompton){ startProcess("compositing","compton --config \""+set+"\"", QStringList() << set); }
}
- }else if(LUtils::isValidBinary("xcompmgr")){ startProcess("compositing","xcompmgr"); }
+ }else if(LUtils::isValidBinary("xcompmgr") && !settings.value("compositingWithGpuAccelOnly",true).toBool() ){ startProcess("compositing","xcompmgr"); }
}
//Desktop Next
startProcess("runtime","lumina-desktop");
bgstack15