diff options
Diffstat (limited to 'user/sddm/xephyr.patch')
-rw-r--r-- | user/sddm/xephyr.patch | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/user/sddm/xephyr.patch b/user/sddm/xephyr.patch new file mode 100644 index 000000000..142520ad4 --- /dev/null +++ b/user/sddm/xephyr.patch @@ -0,0 +1,171 @@ +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. |