Initial commit
This commit is contained in:
commit
9c3746ec9f
9 changed files with 726 additions and 0 deletions
42
.SRCINFO
Normal file
42
.SRCINFO
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
pkgbase = sddm-black-screen-fix
|
||||||
|
pkgdesc = QML based X11 and Wayland display manager
|
||||||
|
pkgver = 0.21.0
|
||||||
|
pkgrel = 3
|
||||||
|
url = https://github.com/sddm/sddm
|
||||||
|
arch = x86_64
|
||||||
|
license = GPL-2.0-only
|
||||||
|
makedepends = extra-cmake-modules
|
||||||
|
makedepends = git
|
||||||
|
makedepends = python-docutils
|
||||||
|
makedepends = qt5-base
|
||||||
|
makedepends = qt5-declarative
|
||||||
|
makedepends = qt5-tools
|
||||||
|
makedepends = qt6-tools
|
||||||
|
depends = bash
|
||||||
|
depends = gcc-libs
|
||||||
|
depends = glibc
|
||||||
|
depends = libxau
|
||||||
|
depends = libxcb
|
||||||
|
depends = pam
|
||||||
|
depends = qt6-base
|
||||||
|
depends = qt6-declarative
|
||||||
|
depends = systemd-libs
|
||||||
|
depends = ttf-font
|
||||||
|
depends = xorg-server
|
||||||
|
depends = xorg-xauth
|
||||||
|
optdepends = qt5-base: for using Qt5 themes
|
||||||
|
optdepends = qt5-declarative: for using Qt5 themes
|
||||||
|
provides = display-manager
|
||||||
|
provides = sddm
|
||||||
|
conflicts = sddm
|
||||||
|
backup = usr/share/sddm/scripts/Xsetup
|
||||||
|
backup = usr/share/sddm/scripts/Xstop
|
||||||
|
backup = etc/pam.d/sddm
|
||||||
|
backup = etc/pam.d/sddm-autologin
|
||||||
|
backup = etc/pam.d/sddm-greeter
|
||||||
|
source = git+https://github.com/sddm/sddm#tag=v0.21.0
|
||||||
|
source = https://github.com/sddm/sddm/pull/2103.patch
|
||||||
|
b2sums = 956fd205369c022d18e67e8a77ca7d571b145c339be923d73bac95d9ff78f2f3c6648b5f682408fd6750411cf877c38de67cce631d310e129c0013a2cd868844
|
||||||
|
b2sums = c8a00434660e35cd009edb8b0f0198e8eb5da3bfff7f7b4c421a372a93c8a4f536e5ef0bbd3fa970870e3b5d8d569d70c15737a7875471ac9270535624b22f9d
|
||||||
|
|
||||||
|
pkgname = sddm-black-screen-fix
|
||||||
17
.gitignore
vendored
Normal file
17
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
# Ignore everything
|
||||||
|
*
|
||||||
|
|
||||||
|
# But not these files...
|
||||||
|
!.gitignore
|
||||||
|
!PKGBUILD
|
||||||
|
!.SRCINFO
|
||||||
|
!LICENSE
|
||||||
|
!chroot-build
|
||||||
|
!.nvchecker.toml
|
||||||
|
!/keys
|
||||||
|
!/keys/pgp
|
||||||
|
!/keys/pgp/*.asc
|
||||||
|
!/LICENSES
|
||||||
|
!/LICENSES/*.txt
|
||||||
|
!REUSE.toml
|
||||||
|
!*.patch
|
||||||
5
.nvchecker.toml
Normal file
5
.nvchecker.toml
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
[sddm-black-screen-fix]
|
||||||
|
source = 'github'
|
||||||
|
github = 'sddm/sddm'
|
||||||
|
use_max_tag = true
|
||||||
|
prefix = 'v'
|
||||||
457
2103.patch
Normal file
457
2103.patch
Normal file
|
|
@ -0,0 +1,457 @@
|
||||||
|
From 4d06b6f77024d3ecaa458f0474691bf8b5f1306e Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Sun, 13 Jul 2025 19:42:40 +0200
|
||||||
|
Subject: [PATCH 1/9] fix(helper): do not badly exit on SIGHUP
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index 32da42df3..49b7e1d79 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -53,8 +53,13 @@ namespace SDDM {
|
||||||
|
, m_socket(new QLocalSocket(this)) {
|
||||||
|
qInstallMessageHandler(HelperMessageHandler);
|
||||||
|
SignalHandler *s = new SignalHandler(this);
|
||||||
|
+ s->addCustomSignal(SIGHUP);
|
||||||
|
QObject::connect(s, &SignalHandler::sigtermReceived, m_session, [] {
|
||||||
|
- QCoreApplication::instance()->exit(-1);
|
||||||
|
+ QCoreApplication::instance()->exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ });
|
||||||
|
+
|
||||||
|
+ QObject::connect(s, &SignalHandler::customSignalReceived, m_session, [](int) {
|
||||||
|
+ QCoreApplication::instance()->exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
});
|
||||||
|
|
||||||
|
QTimer::singleShot(0, this, SLOT(setUp()));
|
||||||
|
|
||||||
|
From 2eba0aa7e32da2becfb2e48327b7f4e94cdd0275 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Sun, 20 Jul 2025 17:15:54 +0200
|
||||||
|
Subject: [PATCH 2/9] fix(helper): avoid exiting 1 at all costs when session
|
||||||
|
finishes
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 7 ++++++-
|
||||||
|
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index 49b7e1d79..7e8cd6d10 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -199,7 +199,12 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperApp::sessionFinished(int status) {
|
||||||
|
- exit(status);
|
||||||
|
+ if (status != 0) {
|
||||||
|
+ qWarning("Session crashed (exit code %d).", status);
|
||||||
|
+ exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ exit(Auth::HELPER_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperApp::info(const QString& message, Auth::Info type) {
|
||||||
|
|
||||||
|
From ff0a330ada7062094fc2360e0432c92063f3ec2d Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Tue, 29 Jul 2025 22:18:34 +0200
|
||||||
|
Subject: [PATCH 3/9] fix(auth): do not cast exit status if `QProcess` is not
|
||||||
|
exited normally
|
||||||
|
|
||||||
|
A QProcess::CrashExit happen in most cases when a signal killed it. And
|
||||||
|
returning from a signal-killed process on Linux makes QProcess:finished
|
||||||
|
return the signal, which is a really bad idea to cast into a random
|
||||||
|
enum.
|
||||||
|
|
||||||
|
Qt also mentions that `exitCode` is only valid for QProcess::NormalExit
|
||||||
|
invocations
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/auth/Auth.cpp | 5 ++++-
|
||||||
|
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/auth/Auth.cpp b/src/auth/Auth.cpp
|
||||||
|
index 6c9b5c6b4..6ff38ef1f 100644
|
||||||
|
--- a/src/auth/Auth.cpp
|
||||||
|
+++ b/src/auth/Auth.cpp
|
||||||
|
@@ -230,7 +230,10 @@ namespace SDDM {
|
||||||
|
else
|
||||||
|
qWarning("Auth: sddm-helper exited with %d", exitCode);
|
||||||
|
|
||||||
|
- Q_EMIT qobject_cast<Auth*>(parent())->finished((Auth::HelperExitStatus)exitCode);
|
||||||
|
+ if (exitStatus == QProcess::NormalExit)
|
||||||
|
+ Q_EMIT qobject_cast<Auth*>(parent())->finished((Auth::HelperExitStatus)exitCode);
|
||||||
|
+ else
|
||||||
|
+ Q_EMIT qobject_cast<Auth*>(parent())->finished(Auth::HELPER_OTHER_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Auth::Private::childError(QProcess::ProcessError error) {
|
||||||
|
|
||||||
|
From 97e918b17a5ebc6cb8629cde3a6bc8b5bf44cacc Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Wed, 30 Jul 2025 12:24:17 +0200
|
||||||
|
Subject: [PATCH 4/9] fix(helper): remove overload of `QProcess::finished` in
|
||||||
|
UserSession
|
||||||
|
|
||||||
|
This will allow HelperApp to dinstinguish between a crash (most likely
|
||||||
|
by a signal) from a normal exit.
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 12 ++++++++----
|
||||||
|
src/helper/HelperApp.h | 2 +-
|
||||||
|
src/helper/UserSession.cpp | 3 +--
|
||||||
|
src/helper/UserSession.h | 4 ----
|
||||||
|
4 files changed, 10 insertions(+), 11 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index 7e8cd6d10..e0141bb7c 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -131,7 +131,7 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
|
||||||
|
connect(m_socket, &QLocalSocket::connected, this, &HelperApp::doAuth);
|
||||||
|
- connect(m_session, &UserSession::finished, this, &HelperApp::sessionFinished);
|
||||||
|
+ connect(m_session, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &HelperApp::sessionFinished);
|
||||||
|
m_socket->connectToServer(server, QIODevice::ReadWrite | QIODevice::Unbuffered);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -198,9 +198,13 @@ namespace SDDM {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- void HelperApp::sessionFinished(int status) {
|
||||||
|
- if (status != 0) {
|
||||||
|
- qWarning("Session crashed (exit code %d).", status);
|
||||||
|
+ void HelperApp::sessionFinished(int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
|
+ if (exitStatus == QProcess::CrashExit) {
|
||||||
|
+ qWarning("Session crashed (killed by signal %d).", exitCode);
|
||||||
|
+ exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ }
|
||||||
|
+ else if (exitCode != 0) {
|
||||||
|
+ qWarning("Session crashed (exit code %d).", exitCode);
|
||||||
|
exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
diff --git a/src/helper/HelperApp.h b/src/helper/HelperApp.h
|
||||||
|
index 64ea0e1c8..9874ab8eb 100644
|
||||||
|
--- a/src/helper/HelperApp.h
|
||||||
|
+++ b/src/helper/HelperApp.h
|
||||||
|
@@ -54,7 +54,7 @@ namespace SDDM {
|
||||||
|
void setUp();
|
||||||
|
void doAuth();
|
||||||
|
|
||||||
|
- void sessionFinished(int status);
|
||||||
|
+ void sessionFinished(int exitCode, QProcess::ExitStatus exitStatus);
|
||||||
|
|
||||||
|
private:
|
||||||
|
qint64 m_id { -1 };
|
||||||
|
diff --git a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp
|
||||||
|
index 03fd396ee..5fd378a6e 100644
|
||||||
|
--- a/src/helper/UserSession.cpp
|
||||||
|
+++ b/src/helper/UserSession.cpp
|
||||||
|
@@ -47,7 +47,6 @@ namespace SDDM {
|
||||||
|
UserSession::UserSession(HelperApp *parent)
|
||||||
|
: QProcess(parent)
|
||||||
|
{
|
||||||
|
- connect(this, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &UserSession::finished);
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
setChildProcessModifier(std::bind(&UserSession::childModifier, this));
|
||||||
|
#endif
|
||||||
|
@@ -157,7 +156,7 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- Q_EMIT finished(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ Q_EMIT finished(Auth::HELPER_OTHER_ERROR, QProcess::NormalExit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff --git a/src/helper/UserSession.h b/src/helper/UserSession.h
|
||||||
|
index ecaef8679..78cd994a7 100644
|
||||||
|
--- a/src/helper/UserSession.h
|
||||||
|
+++ b/src/helper/UserSession.h
|
||||||
|
@@ -51,10 +51,6 @@ namespace SDDM {
|
||||||
|
*/
|
||||||
|
qint64 cachedProcessId();
|
||||||
|
|
||||||
|
-
|
||||||
|
- Q_SIGNALS:
|
||||||
|
- void finished(int exitCode);
|
||||||
|
-
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
protected:
|
||||||
|
void setupChildProcess() override;
|
||||||
|
|
||||||
|
From 7052ba863174faa05fed8cbbdc7c71cf202e6cfd Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Wed, 30 Jul 2025 13:37:14 +0200
|
||||||
|
Subject: [PATCH 5/9] style(helper): rearrange if conditions to explicitly
|
||||||
|
check for normal exit
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 18 +++++++++---------
|
||||||
|
1 file changed, 9 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index e0141bb7c..fa1167c9f 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -199,16 +199,16 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperApp::sessionFinished(int exitCode, QProcess::ExitStatus exitStatus) {
|
||||||
|
- if (exitStatus == QProcess::CrashExit) {
|
||||||
|
- qWarning("Session crashed (killed by signal %d).", exitCode);
|
||||||
|
- exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
- }
|
||||||
|
- else if (exitCode != 0) {
|
||||||
|
- qWarning("Session crashed (exit code %d).", exitCode);
|
||||||
|
- exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ if (exitStatus == QProcess::NormalExit) {
|
||||||
|
+ if (exitCode != 0) {
|
||||||
|
+ qWarning("Session crashed (exit code %d).", exitCode);
|
||||||
|
+ exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ exit(Auth::HELPER_SUCCESS);
|
||||||
|
}
|
||||||
|
- else
|
||||||
|
- exit(Auth::HELPER_SUCCESS);
|
||||||
|
+ qWarning("Session crashed (killed by signal %d).", exitCode);
|
||||||
|
+ exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperApp::info(const QString& message, Auth::Info type) {
|
||||||
|
|
||||||
|
From f886081f98f02ed42e517be6949e1a22971b3e1e Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Fri, 1 Aug 2025 01:26:48 +0200
|
||||||
|
Subject: [PATCH 6/9] fix(helper): return after exits and check for session
|
||||||
|
state in destructor
|
||||||
|
|
||||||
|
This avoids calling exit an unnecessary number of times, which can
|
||||||
|
potentially falsify the real return code, and cause restrat loops
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 8 +++++++-
|
||||||
|
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index fa1167c9f..6a39ac00b 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -206,7 +206,11 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
else
|
||||||
|
exit(Auth::HELPER_SUCCESS);
|
||||||
|
+ return;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ Q_ASSERT_X(exitCode != 0, "HelperApp::sessionFinished", "Crashing with 0 is impossible");
|
||||||
|
+
|
||||||
|
qWarning("Session crashed (killed by signal %d).", exitCode);
|
||||||
|
exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
}
|
||||||
|
@@ -298,7 +302,9 @@ namespace SDDM {
|
||||||
|
HelperApp::~HelperApp() {
|
||||||
|
Q_ASSERT(getuid() == 0);
|
||||||
|
|
||||||
|
- m_session->stop();
|
||||||
|
+ // Avoid re-emitting QProcess::finished if session is not running
|
||||||
|
+ if (m_session->state() != QProcess::NotRunning)
|
||||||
|
+ m_session->stop();
|
||||||
|
m_backend->closeSession();
|
||||||
|
|
||||||
|
// write logout to utmp/wtmp
|
||||||
|
|
||||||
|
From 72db1388b931858af3d0f066ed5c3a1948979422 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Fri, 1 Aug 2025 11:42:46 +0200
|
||||||
|
Subject: [PATCH 7/9] fix(helper): do not emit finish when stopping already
|
||||||
|
stopped session
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/UserSession.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/UserSession.cpp b/src/helper/UserSession.cpp
|
||||||
|
index 5fd378a6e..3e0a5afb4 100644
|
||||||
|
--- a/src/helper/UserSession.cpp
|
||||||
|
+++ b/src/helper/UserSession.cpp
|
||||||
|
@@ -156,7 +156,7 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
- Q_EMIT finished(Auth::HELPER_OTHER_ERROR, QProcess::NormalExit);
|
||||||
|
+ qInfo() << "Attempted to stop session, but was already not running";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
From 7aa2576b1a916796b1700a426bd9df1b368007b7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Fri, 1 Aug 2025 11:43:58 +0200
|
||||||
|
Subject: [PATCH 8/9] style(helper): explicit usage of `QCoreApplication::exit`
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 26 +++++++++++++-------------
|
||||||
|
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index 6a39ac00b..f7958e9be 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -73,7 +73,7 @@ namespace SDDM {
|
||||||
|
if ((pos = args.indexOf(QStringLiteral("--socket"))) >= 0) {
|
||||||
|
if (pos >= args.length() - 1) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
server = args[pos + 1];
|
||||||
|
@@ -82,7 +82,7 @@ namespace SDDM {
|
||||||
|
if ((pos = args.indexOf(QStringLiteral("--id"))) >= 0) {
|
||||||
|
if (pos >= args.length() - 1) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_id = QString(args[pos + 1]).toLongLong();
|
||||||
|
@@ -91,7 +91,7 @@ namespace SDDM {
|
||||||
|
if ((pos = args.indexOf(QStringLiteral("--start"))) >= 0) {
|
||||||
|
if (pos >= args.length() - 1) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_session->setPath(args[pos + 1]);
|
||||||
|
@@ -100,7 +100,7 @@ namespace SDDM {
|
||||||
|
if ((pos = args.indexOf(QStringLiteral("--user"))) >= 0) {
|
||||||
|
if (pos >= args.length() - 1) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_user = args[pos + 1];
|
||||||
|
@@ -109,7 +109,7 @@ namespace SDDM {
|
||||||
|
if ((pos = args.indexOf(QStringLiteral("--display-server"))) >= 0) {
|
||||||
|
if (pos >= args.length() - 1) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
m_session->setDisplayServerCommand(args[pos + 1]);
|
||||||
|
@@ -126,7 +126,7 @@ namespace SDDM {
|
||||||
|
|
||||||
|
if (server.isEmpty() || m_id <= 0) {
|
||||||
|
qCritical() << "This application is not supposed to be executed manually";
|
||||||
|
- exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_OTHER_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -151,7 +151,7 @@ namespace SDDM {
|
||||||
|
const QString vt = env.value(QStringLiteral("XDG_VTNR"));
|
||||||
|
utmpLogin(vt, displayId, m_user, 0, false);
|
||||||
|
|
||||||
|
- exit(Auth::HELPER_AUTH_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_AUTH_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -165,7 +165,7 @@ namespace SDDM {
|
||||||
|
const QString vt = env.value(QStringLiteral("XDG_VTNR"));
|
||||||
|
utmpLogin(vt, displayId, m_user, 0, false);
|
||||||
|
|
||||||
|
- exit(Auth::HELPER_AUTH_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_AUTH_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -178,7 +178,7 @@ namespace SDDM {
|
||||||
|
|
||||||
|
if (!m_backend->openSession()) {
|
||||||
|
sessionOpened(false);
|
||||||
|
- exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -194,7 +194,7 @@ namespace SDDM {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- exit(Auth::HELPER_SUCCESS);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_SUCCESS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -202,17 +202,17 @@ namespace SDDM {
|
||||||
|
if (exitStatus == QProcess::NormalExit) {
|
||||||
|
if (exitCode != 0) {
|
||||||
|
qWarning("Session crashed (exit code %d).", exitCode);
|
||||||
|
- exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- exit(Auth::HELPER_SUCCESS);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_SUCCESS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Q_ASSERT_X(exitCode != 0, "HelperApp::sessionFinished", "Crashing with 0 is impossible");
|
||||||
|
|
||||||
|
qWarning("Session crashed (killed by signal %d).", exitCode);
|
||||||
|
- exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
+ QCoreApplication::exit(Auth::HELPER_SESSION_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void HelperApp::info(const QString& message, Auth::Info type) {
|
||||||
|
|
||||||
|
From 4978251750021d5686f5837dffd12a5e99b7ada6 Mon Sep 17 00:00:00 2001
|
||||||
|
From: "tsrk." <tsrk@tsrk.me>
|
||||||
|
Date: Fri, 1 Aug 2025 12:13:12 +0200
|
||||||
|
Subject: [PATCH 9/9] fix(helper): disconnect `sessionFinished` when exiting
|
||||||
|
|
||||||
|
Calling `UserSession::stop` results in a call to `QProcess::terminate`,
|
||||||
|
which sends a SIGTERM to the session. `QProcess` will catch that and
|
||||||
|
emit an excess `QProcess::finished(15, 1)` which we don't want to handle
|
||||||
|
since we are in the process of exiting.
|
||||||
|
|
||||||
|
Signed-off-by: tsrk. <tsrk@tsrk.me>
|
||||||
|
---
|
||||||
|
src/helper/HelperApp.cpp | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/helper/HelperApp.cpp b/src/helper/HelperApp.cpp
|
||||||
|
index f7958e9be..744a4ef01 100644
|
||||||
|
--- a/src/helper/HelperApp.cpp
|
||||||
|
+++ b/src/helper/HelperApp.cpp
|
||||||
|
@@ -302,7 +302,8 @@ namespace SDDM {
|
||||||
|
HelperApp::~HelperApp() {
|
||||||
|
Q_ASSERT(getuid() == 0);
|
||||||
|
|
||||||
|
- // Avoid re-emitting QProcess::finished if session is not running
|
||||||
|
+ // Avoid calls to sessionFinished when exiting
|
||||||
|
+ disconnect(m_session, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &HelperApp::sessionFinished);
|
||||||
|
if (m_session->state() != QProcess::NotRunning)
|
||||||
|
m_session->stop();
|
||||||
|
m_backend->closeSession();
|
||||||
12
LICENSE
Normal file
12
LICENSE
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
Copyright Arch Linux Contributors
|
||||||
|
|
||||||
|
Permission to use, copy, modify, and/or distribute this software for
|
||||||
|
any purpose with or without fee is hereby granted.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL
|
||||||
|
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
||||||
|
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE
|
||||||
|
FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
|
||||||
|
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||||
|
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||||
|
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
1
LICENSES/0BSD.txt
Symbolic link
1
LICENSES/0BSD.txt
Symbolic link
|
|
@ -0,0 +1 @@
|
||||||
|
../LICENSE
|
||||||
105
PKGBUILD
Normal file
105
PKGBUILD
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
# Maintainer: Christian Schendel <doppelhelix@gmail.com>
|
||||||
|
# Contributor: Felix Yan <felixonmars@archlinux.org>
|
||||||
|
# Contributor: Antonio Rojas <arojas@archlinux.org>
|
||||||
|
# Contributor: Andrea Scarpino <andrea@archlinux.org>
|
||||||
|
|
||||||
|
pkgname=sddm-black-screen-fix
|
||||||
|
_pkgname=sddm
|
||||||
|
pkgver=0.21.0
|
||||||
|
pkgrel=3
|
||||||
|
pkgdesc='QML based X11 and Wayland display manager'
|
||||||
|
arch=(
|
||||||
|
x86_64
|
||||||
|
)
|
||||||
|
url='https://github.com/sddm/sddm'
|
||||||
|
license=(
|
||||||
|
GPL-2.0-only
|
||||||
|
)
|
||||||
|
depends=(
|
||||||
|
bash
|
||||||
|
gcc-libs
|
||||||
|
glibc
|
||||||
|
libxau
|
||||||
|
libxcb
|
||||||
|
pam
|
||||||
|
qt6-base
|
||||||
|
qt6-declarative
|
||||||
|
systemd-libs
|
||||||
|
ttf-font
|
||||||
|
xorg-server
|
||||||
|
xorg-xauth
|
||||||
|
)
|
||||||
|
makedepends=(
|
||||||
|
extra-cmake-modules
|
||||||
|
git
|
||||||
|
python-docutils
|
||||||
|
qt5-base
|
||||||
|
qt5-declarative
|
||||||
|
qt5-tools
|
||||||
|
qt6-tools)
|
||||||
|
optdepends=(
|
||||||
|
'qt5-base: for using Qt5 themes'
|
||||||
|
'qt5-declarative: for using Qt5 themes'
|
||||||
|
)
|
||||||
|
backup=(
|
||||||
|
'usr/share/sddm/scripts/Xsetup'
|
||||||
|
'usr/share/sddm/scripts/Xstop'
|
||||||
|
'etc/pam.d/sddm'
|
||||||
|
'etc/pam.d/sddm-autologin'
|
||||||
|
'etc/pam.d/sddm-greeter'
|
||||||
|
)
|
||||||
|
provides=(
|
||||||
|
"display-manager"
|
||||||
|
"sddm"
|
||||||
|
)
|
||||||
|
conflicts=(
|
||||||
|
"sddm"
|
||||||
|
)
|
||||||
|
source=(
|
||||||
|
"git+https://github.com/$_pkgname/$_pkgname#tag=v$pkgver"
|
||||||
|
"2103.patch"
|
||||||
|
)
|
||||||
|
b2sums=('956fd205369c022d18e67e8a77ca7d571b145c339be923d73bac95d9ff78f2f3c6648b5f682408fd6750411cf877c38de67cce631d310e129c0013a2cd868844'
|
||||||
|
'c8a00434660e35cd009edb8b0f0198e8eb5da3bfff7f7b4c421a372a93c8a4f536e5ef0bbd3fa970870e3b5d8d569d70c15737a7875471ac9270535624b22f9d')
|
||||||
|
|
||||||
|
prepare() {
|
||||||
|
git -C $_pkgname cherry-pick -n 228778c2b4b7e26db1e1d69fe484ed75c5791c3a # Fix build with cmake 4
|
||||||
|
patch -d $_pkgname -Np1 -i ../2103.patch #https://github.com/sddm/sddm/pull/2103
|
||||||
|
}
|
||||||
|
|
||||||
|
build() {
|
||||||
|
local cmake_options=(
|
||||||
|
-S "$_pkgname"
|
||||||
|
-B build
|
||||||
|
-D CMAKE_INSTALL_PREFIX=/usr
|
||||||
|
-D CMAKE_INSTALL_LIBEXECDIR=/usr/lib/sddm
|
||||||
|
-D BUILD_WITH_QT6=ON
|
||||||
|
-D DBUS_CONFIG_DIR=/usr/share/dbus-1/system.d
|
||||||
|
-D DBUS_CONFIG_FILENAME=sddm_org.freedesktop.DisplayManager.conf
|
||||||
|
-D BUILD_MAN_PAGES=ON
|
||||||
|
-D UID_MAX=60513
|
||||||
|
)
|
||||||
|
cmake "${cmake_options[@]}"
|
||||||
|
cmake --build build
|
||||||
|
|
||||||
|
cmake -B build5 -S $_pkgname \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=/usr
|
||||||
|
cmake --build build5/src/greeter
|
||||||
|
cmake --build build5/components
|
||||||
|
}
|
||||||
|
|
||||||
|
package() {
|
||||||
|
DESTDIR="$pkgdir" cmake --install build
|
||||||
|
DESTDIR="$pkgdir" cmake --install build5/src/greeter
|
||||||
|
DESTDIR="$pkgdir" cmake --install build5/components
|
||||||
|
|
||||||
|
install -d "$pkgdir"/usr/lib/sddm/sddm.conf.d
|
||||||
|
"$pkgdir"/usr/bin/sddm --example-config > "$pkgdir"/usr/lib/sddm/sddm.conf.d/default.conf
|
||||||
|
# Don't set PATH in sddm.conf
|
||||||
|
sed -r 's|DefaultPath=.*|DefaultPath=/usr/local/sbin:/usr/local/bin:/usr/bin|g' -i "$pkgdir"/usr/lib/sddm/sddm.conf.d/default.conf
|
||||||
|
# Unset InputMethod https://github.com/sddm/sddm/issues/952
|
||||||
|
sed -e "/^InputMethod/s/qtvirtualkeyboard//" -i "$pkgdir"/usr/lib/sddm/sddm.conf.d/default.conf
|
||||||
|
}
|
||||||
|
|
||||||
|
# vim: set ft=sh ts=4 sw=4 et:
|
||||||
|
|
||||||
22
REUSE.toml
Normal file
22
REUSE.toml
Normal file
|
|
@ -0,0 +1,22 @@
|
||||||
|
version = 1
|
||||||
|
|
||||||
|
[[annotations]]
|
||||||
|
path = [
|
||||||
|
"PKGBUILD",
|
||||||
|
"README.md",
|
||||||
|
"keys/**",
|
||||||
|
".SRCINFO",
|
||||||
|
".nvchecker.toml",
|
||||||
|
"*.install",
|
||||||
|
"*.sysusers",
|
||||||
|
"*.tmpfiles",
|
||||||
|
"*.logrotate",
|
||||||
|
"*.pam",
|
||||||
|
"*.service",
|
||||||
|
"*.socket",
|
||||||
|
"*.timer",
|
||||||
|
"*.desktop",
|
||||||
|
"*.hook",
|
||||||
|
]
|
||||||
|
SPDX-FileCopyrightText = "Arch Linux contributors"
|
||||||
|
SPDX-License-Identifier = "0BSD"
|
||||||
65
chroot-build
Executable file
65
chroot-build
Executable file
|
|
@ -0,0 +1,65 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# SPDX-FileCopyrightText: Christian Schendel
|
||||||
|
# SPDX-License-Identifier: 0BSD
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
use_tmpfs=true
|
||||||
|
CHROOT="/tmp/mkarchroot"
|
||||||
|
|
||||||
|
check_available_ram() {
|
||||||
|
if [ "$(awk '/^MemAvailable:/ { print $2; }' /proc/meminfo)" -lt 50000 ]; then
|
||||||
|
use_tmpfs=false
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_chroot_directory() {
|
||||||
|
if [ $use_tmpfs ]; then
|
||||||
|
sudo mount --mkdir -t tmpfs -o defaults,size=20G tmpfs $CHROOT
|
||||||
|
else
|
||||||
|
sudo mkdir -p "$CHROOT"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
create_chroot_environment() {
|
||||||
|
if [[ ! -d "$CHROOT/root" ]]; then
|
||||||
|
mkarchroot -M ~/.config/pacman/makepkg.conf "$CHROOT/root" base-devel
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
build_package(){
|
||||||
|
arch-nspawn "$CHROOT/root" pacman -Syu
|
||||||
|
if makechrootpkg -c -r "$CHROOT" -- -Asf . ; then
|
||||||
|
makepkg --printsrcinfo >.SRCINFO
|
||||||
|
else
|
||||||
|
delete_chroot_environment && echo -e "\n\e[1;31m==> BUILD FAILED: \e[1;37m$CHROOT removed\e[0m " && exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
sign_package(){
|
||||||
|
PACKAGE="$(makepkg --packagelist)"
|
||||||
|
gpg --use-agent --output "$PACKAGE.sig" --detach-sign "$PACKAGE"
|
||||||
|
}
|
||||||
|
|
||||||
|
delete_chroot_environment() {
|
||||||
|
if [ "$(stat -f --format=%T "$CHROOT")" == "btrfs" ]; then
|
||||||
|
{
|
||||||
|
sudo btrfs subvolume delete "$CHROOT/root/var/lib/portables"
|
||||||
|
sudo btrfs subvolume delete "$CHROOT/root/var/lib/machines"
|
||||||
|
sudo btrfs subvolume delete "$CHROOT/root"
|
||||||
|
sudo rm -Rf $CHROOT
|
||||||
|
} >>/dev/null 2>&1
|
||||||
|
elif [ "$(stat -f --format=%T "$CHROOT")" == "tmpfs" ]; then
|
||||||
|
sudo umount -f $CHROOT
|
||||||
|
fi
|
||||||
|
sudo rm -Rf $CHROOT
|
||||||
|
}
|
||||||
|
|
||||||
|
check_available_ram
|
||||||
|
create_chroot_directory
|
||||||
|
create_chroot_environment
|
||||||
|
build_package
|
||||||
|
sign_package
|
||||||
|
delete_chroot_environment
|
||||||
|
|
||||||
|
# vim: set ts=4 sw=4 et:
|
||||||
Loading…
Add table
Add a link
Reference in a new issue