From 68cc9e31d1a4c4609f42114782fc485cb07353a4 Mon Sep 17 00:00:00 2001
From: Fabian Vogt <fabian@ritter-vogt.de>
Date: Fri, 9 Oct 2020 21:06:01 +0200
Subject: [PATCH] Merge normal and testing paths in XorgDisplayServer::start
They have much in common and this means that Xephyr can also make use use
of -displayfd now.
---
src/daemon/XorgDisplayServer.cpp | 132 ++++++++++++++-----------------
1 file changed, 60 insertions(+), 72 deletions(-)
diff --git a/src/daemon/XorgDisplayServer.cpp b/src/daemon/XorgDisplayServer.cpp
index d5f29a94a..e60c02210 100644
--- a/src/daemon/XorgDisplayServer.cpp
+++ b/src/daemon/XorgDisplayServer.cpp
@@ -136,95 +136,83 @@ namespace SDDM {
return false;
}
- if (daemonApp->testing()) {
- QStringList args;
- QDir x11socketDir(QStringLiteral("/tmp/.X11-unix"));
- int display = 100;
- while (x11socketDir.exists(QStringLiteral("X%1").arg(display))) {
- ++display;
- }
- m_display = QStringLiteral(":%1").arg(display);
- args << m_display << QStringLiteral("-auth") << m_authPath << QStringLiteral("-br") << QStringLiteral("-noreset") << QStringLiteral("-screen") << QStringLiteral("800x600");
- process->start(mainConfig.X11.XephyrPath.get(), args);
-
-
- // wait for display server to start
- if (!process->waitForStarted()) {
- // log message
- qCritical() << "Failed to start display server process.";
+ // set process environment
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ env.insert(QStringLiteral("XCURSOR_THEME"), mainConfig.Theme.CursorTheme.get());
+ process->setProcessEnvironment(env);
- // return fail
- return false;
- }
- emit started();
- } else {
- // set process environment
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
- env.insert(QStringLiteral("XCURSOR_THEME"), mainConfig.Theme.CursorTheme.get());
- process->setProcessEnvironment(env);
-
- //create pipe for communicating with X server
- //0 == read from X, 1== write to from X
- int pipeFds[2];
- if (pipe(pipeFds) != 0) {
- qCritical("Could not create pipe to start X server");
- }
+ //create pipe for communicating with X server
+ //0 == read from X, 1== write to from X
+ int pipeFds[2];
+ if (pipe(pipeFds) != 0) {
+ qCritical("Could not create pipe to start X server");
+ }
- // start display server
- QStringList args = mainConfig.X11.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts);
- args << QStringLiteral("-auth") << m_authPath
+ // start display server
+ QStringList args;
+ if (!daemonApp->testing()) {
+ process->setProgram(mainConfig.X11.ServerPath.get());
+ args << mainConfig.X11.ServerArguments.get().split(QLatin1Char(' '), QString::SkipEmptyParts)
<< QStringLiteral("-background") << QStringLiteral("none")
- << QStringLiteral("-noreset")
- << QStringLiteral("-displayfd") << QString::number(pipeFds[1])
<< QStringLiteral("-seat") << displayPtr()->seat()->name();
if (displayPtr()->seat()->name() == QLatin1String("seat0")) {
args << QStringLiteral("vt%1").arg(displayPtr()->terminalId());
}
- qDebug() << "Running:"
- << qPrintable(mainConfig.X11.ServerPath.get())
- << qPrintable(args.join(QLatin1Char(' ')));
- process->start(mainConfig.X11.ServerPath.get(), args);
-
- // wait for display server to start
- if (!process->waitForStarted()) {
- // log message
- qCritical() << "Failed to start display server process.";
-
- // return fail
- close(pipeFds[0]);
- return false;
- }
+ } else {
+ process->setProgram(mainConfig.X11.XephyrPath.get());
+ args << QStringLiteral("-br")
+ << QStringLiteral("-screen") << QStringLiteral("800x600");
+ }
- // close the other side of pipe in our process, otherwise reading
- // from it may stuck even X server exit.
- close(pipeFds[1]);
+ args << QStringLiteral("-auth") << m_authPath
+ << QStringLiteral("-noreset")
+ << QStringLiteral("-displayfd") << QString::number(pipeFds[1]);
- QFile readPipe;
+ process->setArguments(args);
+ qDebug() << "Running:"
+ << qPrintable(process->program())
+ << qPrintable(process->arguments().join(QLatin1Char(' ')));
+ process->start();
- if (!readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {
- qCritical("Failed to open pipe to start X Server");
+ // wait for display server to start
+ if (!process->waitForStarted()) {
+ // log message
+ qCritical() << "Failed to start display server process.";
- close(pipeFds[0]);
- return false;
- }
- QByteArray displayNumber = readPipe.readLine();
- if (displayNumber.size() < 2) {
- // X server gave nothing (or a whitespace).
- qCritical("Failed to read display number from pipe");
+ // return fail
+ close(pipeFds[0]);
+ return false;
+ }
- close(pipeFds[0]);
- return false;
- }
- displayNumber.prepend(QByteArray(":"));
- displayNumber.remove(displayNumber.size() -1, 1); // trim trailing whitespace
- m_display = QString::fromLocal8Bit(displayNumber);
+ // close the other side of pipe in our process, otherwise reading
+ // from it may stuck even X server exit.
+ close(pipeFds[1]);
+
+ QFile readPipe;
+
+ if (!readPipe.open(pipeFds[0], QIODevice::ReadOnly)) {
+ qCritical("Failed to open pipe to start X Server");
- // close our pipe
close(pipeFds[0]);
+ return false;
+ }
+ QByteArray displayNumber = readPipe.readLine();
+ if (displayNumber.size() < 2) {
+ // X server gave nothing (or a whitespace).
+ qCritical("Failed to read display number from pipe");
- emit started();
+ close(pipeFds[0]);
+ return false;
}
+ displayNumber.prepend(QByteArray(":"));
+ displayNumber.remove(displayNumber.size() -1, 1); // trim trailing whitespace
+ m_display = QString::fromLocal8Bit(displayNumber);
+
+ // close our pipe
+ close(pipeFds[0]);
+
+ emit started();
// The file is also used by the greeter, which does care about the
// display number. Write the proper entry, if it's different.