From 7446ca2054044636d219ad95ee5f6cbdc3d9f945 Mon Sep 17 00:00:00 2001 From: Raboneko <119771935+raboneko@users.noreply.github.com> Date: Sun, 5 May 2024 03:46:24 -0700 Subject: [PATCH] add: terra-sddm (#1204) (#1207) * add: sddm * fix: terra-sddm instead of just sddm (cherry picked from commit 61ee2b6de9ac9558104d379734715ee83b35f997) Co-authored-by: madomado --- ...lay-for-logind-and-fallback-to-seat0.patch | 142 +++ anda/desktops/sddm/README.scripts | 2 + anda/desktops/sddm/anda.hcl | 5 + .../sddm/sddm-0.18.0-environment_file.patch | 11 + .../sddm/sddm-0.20.0-fedora_config.patch | 53 + .../sddm/sddm-0.21.0-qt6greeter.patch | 67 ++ anda/desktops/sddm/sddm-PR1876.patch | 1018 +++++++++++++++++ anda/desktops/sddm/sddm-autologin.pam | 20 + anda/desktops/sddm/sddm-greeter.pam | 17 + .../sddm/sddm-rpmostree-tmpfiles-hack.patch | 12 + anda/desktops/sddm/sddm-systemd-sysusers.conf | 2 + anda/desktops/sddm/sddm-x11.conf | 2 + anda/desktops/sddm/sddm.conf | 122 ++ anda/desktops/sddm/sddm.pam | 23 + anda/desktops/sddm/sddm.sysconfig | 5 + anda/desktops/sddm/terra-sddm.spec | 293 +++++ anda/desktops/sddm/update.rhai | 1 + 17 files changed, 1795 insertions(+) create mode 100644 anda/desktops/sddm/0001-Delay-for-logind-and-fallback-to-seat0.patch create mode 100644 anda/desktops/sddm/README.scripts create mode 100644 anda/desktops/sddm/anda.hcl create mode 100644 anda/desktops/sddm/sddm-0.18.0-environment_file.patch create mode 100644 anda/desktops/sddm/sddm-0.20.0-fedora_config.patch create mode 100644 anda/desktops/sddm/sddm-0.21.0-qt6greeter.patch create mode 100644 anda/desktops/sddm/sddm-PR1876.patch create mode 100644 anda/desktops/sddm/sddm-autologin.pam create mode 100644 anda/desktops/sddm/sddm-greeter.pam create mode 100644 anda/desktops/sddm/sddm-rpmostree-tmpfiles-hack.patch create mode 100644 anda/desktops/sddm/sddm-systemd-sysusers.conf create mode 100644 anda/desktops/sddm/sddm-x11.conf create mode 100644 anda/desktops/sddm/sddm.conf create mode 100644 anda/desktops/sddm/sddm.pam create mode 100644 anda/desktops/sddm/sddm.sysconfig create mode 100644 anda/desktops/sddm/terra-sddm.spec create mode 100644 anda/desktops/sddm/update.rhai diff --git a/anda/desktops/sddm/0001-Delay-for-logind-and-fallback-to-seat0.patch b/anda/desktops/sddm/0001-Delay-for-logind-and-fallback-to-seat0.patch new file mode 100644 index 0000000000..e6292da34b --- /dev/null +++ b/anda/desktops/sddm/0001-Delay-for-logind-and-fallback-to-seat0.patch @@ -0,0 +1,142 @@ +From 4d44531c8f624f5b479c3ff23e8fecc67eb848ab Mon Sep 17 00:00:00 2001 +From: Jeremy Linton +Date: Fri, 22 Oct 2021 14:51:54 -0500 +Subject: [PATCH] Delay for logind, and fallback to seat0 + +There is systemd/logind race with when restarting +sddm that causes logind1 not to be available. Previously +this meant the seat0 was immediately created regardless +of the state of CanGraphical. + +Fixing this, though we still want seat0 to be started +if none of the seats appear to be graphical. Presumably +there are some graphics on the machine, otherwise +why run sddm? Wait a bit, and create seat0 anyway. If +this fails the output from Xorg should tell us why. This +is generally a better strategy than what happens a good +amount of time now, where sddm is started and silent about +why the screen is blank. + +References: +* https://bugzilla.redhat.com/2011991 +* https://bugzilla.redhat.com/2016310 + +Signed-off-by: Jeremy Linton +--- + src/daemon/LogindDBusTypes.cpp | 31 +++++++++++++++++++++---------- + src/daemon/SeatManager.cpp | 22 ++++++++++++++++++++++ + src/daemon/SeatManager.h | 1 + + 3 files changed, 44 insertions(+), 10 deletions(-) + +diff --git a/src/daemon/LogindDBusTypes.cpp b/src/daemon/LogindDBusTypes.cpp +index 011bb7f..6255c69 100644 +--- a/src/daemon/LogindDBusTypes.cpp ++++ b/src/daemon/LogindDBusTypes.cpp +@@ -8,6 +8,8 @@ + + #include + ++#include ++ + class LogindPathInternal { + public: + LogindPathInternal(); +@@ -46,17 +48,26 @@ LogindPathInternal::LogindPathInternal() + qRegisterMetaType("UserInfoList"); + qDBusRegisterMetaType(); + +- if (QDBusConnection::systemBus().interface()->isServiceRegistered(QStringLiteral("org.freedesktop.login1"))) { +- qDebug() << "Logind interface found"; +- available = true; +- serviceName = QStringLiteral("org.freedesktop.login1"); +- managerPath = QStringLiteral("/org/freedesktop/login1"); +- managerIfaceName = QStringLiteral("org.freedesktop.login1.Manager"); +- seatIfaceName = QStringLiteral("org.freedesktop.login1.Seat"); +- sessionIfaceName = QStringLiteral("org.freedesktop.login1.Session"); +- userIfaceName = QStringLiteral("org.freedesktop.login1.User"); +- return; ++#ifdef HAVE_SYSTEMD ++ // systemd-logind should be running, although because it takes a few moments to restart after ++ // systemctl isolate calls, it may not yet be running. Wait a few seconds for it, while blocking everything else. ++ int logind_wait_seconds = 50; ++ while (logind_wait_seconds--) { ++ if (QDBusConnection::systemBus().interface()->isServiceRegistered(QStringLiteral("org.freedesktop.login1"))) { ++ qDebug() << "Logind interface found"; ++ available = true; ++ serviceName = QStringLiteral("org.freedesktop.login1"); ++ managerPath = QStringLiteral("/org/freedesktop/login1"); ++ managerIfaceName = QStringLiteral("org.freedesktop.login1.Manager"); ++ seatIfaceName = QStringLiteral("org.freedesktop.login1.Seat"); ++ sessionIfaceName = QStringLiteral("org.freedesktop.login1.Session"); ++ userIfaceName = QStringLiteral("org.freedesktop.login1.User"); ++ return; ++ } ++ qDebug() << "Sleeping for systemd-logind"; ++ usleep(100000); + } ++#endif + + if (QDBusConnection::systemBus().interface()->isServiceRegistered(QStringLiteral("org.freedesktop.ConsoleKit"))) { + qDebug() << "Console kit interface found"; +diff --git a/src/daemon/SeatManager.cpp b/src/daemon/SeatManager.cpp +index bd207e6..39d8b85 100644 +--- a/src/daemon/SeatManager.cpp ++++ b/src/daemon/SeatManager.cpp +@@ -26,6 +26,9 @@ + #include + #include + #include ++#include ++#include ++#include + + #include "LogindDBusTypes.h" + +@@ -115,6 +118,8 @@ namespace SDDM { + + QDBusConnection::systemBus().connect(Logind::serviceName(), Logind::managerPath(), Logind::managerIfaceName(), QStringLiteral("SeatNew"), this, SLOT(logindSeatAdded(QString,QDBusObjectPath))); + QDBusConnection::systemBus().connect(Logind::serviceName(), Logind::managerPath(), Logind::managerIfaceName(), QStringLiteral("SeatRemoved"), this, SLOT(logindSeatRemoved(QString,QDBusObjectPath))); ++ ++ QTimer::singleShot(5000, this, &SeatManager::checkSeat); + } + + void SeatManager::createSeat(const QString &name) { +@@ -152,6 +157,23 @@ namespace SDDM { + m_seats.value(name)->createDisplay(Display::defaultDisplayServerType()); + } + ++ // this is a bit hacky, but linux DRM drivers ++ // won't initially be available so there is a race ++ // between determing if a efifb/etc graphical object ++ // is the only graphics on the machine, or a DRM driver ++ // will take over the display. So we will hang out for a few ++ // seconds and if none of the seats are declared cangraphical ++ // its possible the only graphics on the machine don't have ++ // a drm driver. ++ void SeatManager::checkSeat(void) { ++ if (m_seats.isEmpty()) { ++ //if (QFileInfo::exists(QStringLiteral("/dev/fb0"))) { ++ qWarning() << "No graphical seats found, attempt to start one on the main console anyway..."; ++ createSeat(QStringLiteral("seat0")); ++ //} ++ } ++ } ++ + void SDDM::SeatManager::logindSeatAdded(const QString& name, const QDBusObjectPath& objectPath) + { + auto logindSeat = new LogindSeat(name, objectPath); +diff --git a/src/daemon/SeatManager.h b/src/daemon/SeatManager.h +index b2f9796..aa43047 100644 +--- a/src/daemon/SeatManager.h ++++ b/src/daemon/SeatManager.h +@@ -49,6 +49,7 @@ namespace SDDM { + private: + QHash m_seats; //these will exist only for graphical seats + QHash m_systemSeats; //these will exist for all seats ++ void checkSeat(void); + }; + } + +-- +2.39.2 + diff --git a/anda/desktops/sddm/README.scripts b/anda/desktops/sddm/README.scripts new file mode 100644 index 0000000000..70b5243104 --- /dev/null +++ b/anda/desktops/sddm/README.scripts @@ -0,0 +1,2 @@ +This scripts dir contains only samples, but are generally not used directly. +In practice, sddm runtime uses items under /etc/sddm by default diff --git a/anda/desktops/sddm/anda.hcl b/anda/desktops/sddm/anda.hcl new file mode 100644 index 0000000000..3c3e12cf82 --- /dev/null +++ b/anda/desktops/sddm/anda.hcl @@ -0,0 +1,5 @@ +project pkg { + rpm { + spec = "terra-sddm.spec" + } +} diff --git a/anda/desktops/sddm/sddm-0.18.0-environment_file.patch b/anda/desktops/sddm/sddm-0.18.0-environment_file.patch new file mode 100644 index 0000000000..6f89c36b18 --- /dev/null +++ b/anda/desktops/sddm/sddm-0.18.0-environment_file.patch @@ -0,0 +1,11 @@ +diff -up sddm-0.18.0/services/sddm.service.in.env sddm-0.18.0/services/sddm.service.in +--- sddm-0.18.0/services/sddm.service.in.env 2018-07-18 05:31:40.000000000 -0500 ++++ sddm-0.18.0/services/sddm.service.in 2019-03-14 08:23:22.095498405 -0500 +@@ -7,6 +7,7 @@ After=systemd-user-sessions.service gett + [Service] + ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/sddm + Restart=always ++EnvironmentFile=-/etc/sysconfig/sddm + + [Install] + Alias=display-manager.service diff --git a/anda/desktops/sddm/sddm-0.20.0-fedora_config.patch b/anda/desktops/sddm/sddm-0.20.0-fedora_config.patch new file mode 100644 index 0000000000..ec6c1b6c88 --- /dev/null +++ b/anda/desktops/sddm/sddm-0.20.0-fedora_config.patch @@ -0,0 +1,53 @@ +diff --git a/src/common/Configuration.h b/src/common/Configuration.h +index 54bcace..9b8fa22 100644 +--- a/src/common/Configuration.h ++++ b/src/common/Configuration.h +@@ -37,9 +37,8 @@ namespace SDDM { + enum NumState { NUM_NONE, NUM_SET_ON, NUM_SET_OFF }; + + // Name Type Default value Description +- // TODO: Change default to x11-user in a future release +- Entry(DisplayServer, QString, _S("x11"), _S("Which display server should be used.\n" +- "Valid values are: x11, x11-user, wayland. Wayland support is experimental")); ++ Entry(DisplayServer, QString, _S("wayland"), _S("Which display server should be used.\n" ++ "Valid values are: x11, x11-user, wayland.")); + Entry(HaltCommand, QString, _S(HALT_COMMAND), _S("Halt command")); + Entry(RebootCommand, QString, _S(REBOOT_COMMAND), _S("Reboot command")); + Entry(Numlock, NumState, NUM_NONE, _S("Initial NumLock state. Can be on, off or none.\n" +@@ -51,7 +50,7 @@ namespace SDDM { + // Name Entries (but it's a regular class again) + Section(Theme, + Entry(ThemeDir, QString, _S(DATA_INSTALL_DIR "/themes"), _S("Theme directory path")); +- Entry(Current, QString, _S(""), _S("Current theme name")); ++ Entry(Current, QString, _S("01-breeze-fedora"), _S("Current theme name")); + Entry(FacesDir, QString, _S(DATA_INSTALL_DIR "/faces"), _S("Global directory for user avatars\n" + "The files should be named .face.icon")); + Entry(CursorTheme, QString, QString(), _S("Cursor theme used in the greeter")); +@@ -71,9 +70,9 @@ namespace SDDM { + Entry(SessionDir, QStringList, {_S("/usr/local/share/xsessions"), + _S("/usr/share/xsessions")}, _S("Comma-separated list of directories containing available X sessions")); + Entry(SessionCommand, QString, _S(SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); +- Entry(SessionLogFile, QString, _S(".local/share/sddm/xorg-session.log"), _S("Path to the user session log file")); +- Entry(DisplayCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xsetup"), _S("Path to a script to execute when starting the display server")); +- Entry(DisplayStopCommand, QString, _S(DATA_INSTALL_DIR "/scripts/Xstop"), _S("Path to a script to execute when stopping the display server")); ++ Entry(SessionLogFile, QString, _S(".cache/xsession-errors"), _S("Path to the user session log file")); ++ Entry(DisplayCommand, QString, _S(SYS_CONFIG_DIR "/sddm/Xsetup"), _S("Path to a script to execute when starting the display server")); ++ Entry(DisplayStopCommand, QString, _S(SYS_CONFIG_DIR "/sddm/Xstop"), _S("Path to a script to execute when stopping the display server")); + Entry(EnableHiDPI, bool, true, _S("Enable Qt's automatic high-DPI scaling")); + ); + +@@ -82,12 +81,12 @@ namespace SDDM { + Entry(SessionDir, QStringList, {_S("/usr/local/share/wayland-sessions"), + _S("/usr/share/wayland-sessions")}, _S("Comma-separated list of directories containing available Wayland sessions")); + Entry(SessionCommand, QString, _S(WAYLAND_SESSION_COMMAND), _S("Path to a script to execute when starting the desktop session")); +- Entry(SessionLogFile, QString, _S(".local/share/sddm/wayland-session.log"),_S("Path to the user session log file")); ++ Entry(SessionLogFile, QString, _S(".cache/wayland-errors"), _S("Path to the user session log file")); + Entry(EnableHiDPI, bool, true, _S("Enable Qt's automatic high-DPI scaling")); + ); + + Section(Users, +- Entry(DefaultPath, QString, _S("/usr/local/bin:/usr/bin:/bin"), _S("Default $PATH for logged in users")); ++ Entry(DefaultPath, QString, _S("/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin"), _S("Default $PATH for logged in users")); + Entry(MinimumUid, int, UID_MIN, _S("Minimum user id for displayed users")); + Entry(MaximumUid, int, UID_MAX, _S("Maximum user id for displayed users")); + Entry(HideUsers, QStringList, QStringList(), _S("Comma-separated list of users that should not be listed")); diff --git a/anda/desktops/sddm/sddm-0.21.0-qt6greeter.patch b/anda/desktops/sddm/sddm-0.21.0-qt6greeter.patch new file mode 100644 index 0000000000..b9e95a5a36 --- /dev/null +++ b/anda/desktops/sddm/sddm-0.21.0-qt6greeter.patch @@ -0,0 +1,67 @@ +From 52175648f4e1b415f93b24a3ef970983024659f2 Mon Sep 17 00:00:00 2001 +From: Neal Gompa +Date: Wed, 28 Feb 2024 16:47:16 -0500 +Subject: [PATCH] Default to Qt6 and always use versioned greeters + +Distributors can handle creating an unversioned name if necessary. +--- + src/common/ThemeMetadata.cpp | 4 ++-- + src/daemon/Greeter.cpp | 3 +-- + src/greeter/CMakeLists.txt | 9 +-------- + 3 files changed, 4 insertions(+), 12 deletions(-) + +diff --git a/src/common/ThemeMetadata.cpp b/src/common/ThemeMetadata.cpp +index 2cb3762..003056a 100644 +--- a/src/common/ThemeMetadata.cpp ++++ b/src/common/ThemeMetadata.cpp +@@ -28,7 +28,7 @@ namespace SDDM { + QString mainScript { QStringLiteral("Main.qml") }; + QString configFile; + QString translationsDirectory { QStringLiteral(".") }; +- int qtVersion = 5; ++ int qtVersion = 6; + }; + + ThemeMetadata::ThemeMetadata(const QString &path, QObject *parent) : QObject(parent), d(new ThemeMetadataPrivate()) { +@@ -61,6 +61,6 @@ namespace SDDM { + d->mainScript = settings.value(QStringLiteral("SddmGreeterTheme/MainScript"), QStringLiteral("Main.qml")).toString(); + d->configFile = settings.value(QStringLiteral("SddmGreeterTheme/ConfigFile"), QStringLiteral("theme.conf")).toString(); + d->translationsDirectory = settings.value(QStringLiteral("SddmGreeterTheme/TranslationsDirectory"), QStringLiteral(".")).toString(); +- d->qtVersion = settings.value(QStringLiteral("SddmGreeterTheme/QtVersion"), 5).toInt(); ++ d->qtVersion = settings.value(QStringLiteral("SddmGreeterTheme/QtVersion"), 6).toInt(); + } + } +diff --git a/src/daemon/Greeter.cpp b/src/daemon/Greeter.cpp +index 07fccde..5a956b6 100644 +--- a/src/daemon/Greeter.cpp ++++ b/src/daemon/Greeter.cpp +@@ -82,8 +82,7 @@ namespace SDDM { + + QString Greeter::greeterPathForQt(int qtVersion) + { +- const QString suffix = qtVersion == 5 ? QString() : QStringLiteral("-qt%1").arg(qtVersion); +- return QStringLiteral(BIN_INSTALL_DIR "/sddm-greeter%1").arg(suffix); ++ return QStringLiteral(BIN_INSTALL_DIR "/sddm-greeter-qt%1").arg(qtVersion); + } + + bool Greeter::start() { +diff --git a/src/greeter/CMakeLists.txt b/src/greeter/CMakeLists.txt +index 72769e4..524368d 100644 +--- a/src/greeter/CMakeLists.txt ++++ b/src/greeter/CMakeLists.txt +@@ -1,11 +1,4 @@ +-if(QT_MAJOR_VERSION EQUAL "5") +- # Keep the unversioned name for Qt5. When upgrading SDDM, the old daemon +- # might still be running and only know about "sddm-greeter". Keeping the +- # previous name around also helps users calling it directly. +- set(GREETER_TARGET sddm-greeter) +-else() +- set(GREETER_TARGET sddm-greeter-qt${QT_MAJOR_VERSION}) +-endif() ++set(GREETER_TARGET sddm-greeter-qt${QT_MAJOR_VERSION}) + + message(STATUS "Building greeter for Qt ${QT_MAJOR_VERSION} as ${GREETER_TARGET}") + +-- +2.43.0 + diff --git a/anda/desktops/sddm/sddm-PR1876.patch b/anda/desktops/sddm/sddm-PR1876.patch new file mode 100644 index 0000000000..c0a89faa52 --- /dev/null +++ b/anda/desktops/sddm/sddm-PR1876.patch @@ -0,0 +1,1018 @@ +From 6831a26862e15347296a48a9b7825c7db7b5b957 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Tue, 30 Jan 2024 20:16:25 -0800 +Subject: [PATCH 1/7] Mark keyboard backend as disabled on Wayland + +8c370d9 already cleared the list of layouts, but Num/Caps indicators +are also not supported on Wayland. Let's communicate that clearly by +marking the KeyboardModel as disabled. +--- + src/greeter/waylandkeyboardbackend.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/greeter/waylandkeyboardbackend.cpp b/src/greeter/waylandkeyboardbackend.cpp +index fcea53614..c42bee6f2 100644 +--- a/src/greeter/waylandkeyboardbackend.cpp ++++ b/src/greeter/waylandkeyboardbackend.cpp +@@ -95,6 +95,7 @@ void WaylandKeyboardBackend::init() + // TODO: We can't actually switch keyboard layout yet, so don't populate a list of layouts + // so that themes can know to not show the option to change layout + // d->layouts = parseRules(QStringLiteral("/usr/share/X11/xkb/rules/evdev.xml"), d->layout_id); ++ d->enabled = false; + } + + void WaylandKeyboardBackend::disconnect() + +From e490bb994ada2a565e95fd32fb18818b1f05ff82 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Tue, 30 Jan 2024 21:10:15 -0800 +Subject: [PATCH 2/7] Themes: hide LayoutBox when keyboard model is empty or + disabled + +--- + data/themes/elarun/Main.qml | 4 ++++ + data/themes/maldives/Main.qml | 2 ++ + data/themes/maya/Main.qml | 4 ++++ + src/greeter/theme/Main.qml | 4 ++++ + 4 files changed, 14 insertions(+) + +diff --git a/data/themes/elarun/Main.qml b/data/themes/elarun/Main.qml +index e559b741b..523dab7b3 100644 +--- a/data/themes/elarun/Main.qml ++++ b/data/themes/elarun/Main.qml +@@ -270,6 +270,8 @@ Rectangle { + height: parent.height + anchors.verticalCenter: parent.verticalCenter + ++ visible: layoutBox.visible ++ + text: textConstants.layout + font.pixelSize: 14 + verticalAlignment: Text.AlignVCenter +@@ -281,6 +283,8 @@ Rectangle { + anchors.verticalCenter: parent.verticalCenter + font.pixelSize: 14 + ++ visible: keyboard.enabled && keyboard.layouts.length > 0 ++ + arrowIcon: "angle-down.png" + + KeyNavigation.backtab: session; KeyNavigation.tab: user_entry +diff --git a/data/themes/maldives/Main.qml b/data/themes/maldives/Main.qml +index 4fac9f3c5..7f1959a5f 100644 +--- a/data/themes/maldives/Main.qml ++++ b/data/themes/maldives/Main.qml +@@ -201,6 +201,8 @@ Rectangle { + spacing : 4 + anchors.bottom: parent.bottom + ++ visible: keyboard.enabled && keyboard.layouts.length > 0 ++ + Text { + id: lblLayout + width: parent.width +diff --git a/data/themes/maya/Main.qml b/data/themes/maya/Main.qml +index d8e470b39..d166b718c 100644 +--- a/data/themes/maya/Main.qml ++++ b/data/themes/maya/Main.qml +@@ -239,6 +239,8 @@ Rectangle { + width : spUnit * 2 + height : parent.height + ++ visible : keyboard.enabled && keyboard.layouts.length > 0 ++ + color : primaryHue1 + borderColor : primaryHue3 + focusColor : accentLight +@@ -261,6 +263,8 @@ Rectangle { + + text : textConstants.layout + ++ visible : maya_layout.visible ++ + color : normalText + + font.family : opensans_cond_light.name +diff --git a/src/greeter/theme/Main.qml b/src/greeter/theme/Main.qml +index 0a2ab9c84..2106f6004 100644 +--- a/src/greeter/theme/Main.qml ++++ b/src/greeter/theme/Main.qml +@@ -236,6 +236,8 @@ Rectangle { + height: parent.height + anchors.verticalCenter: parent.verticalCenter + ++ visible: layoutBox.visible ++ + text: textConstants.layout + font.pixelSize: 16 + verticalAlignment: Text.AlignVCenter +@@ -247,6 +249,8 @@ Rectangle { + anchors.verticalCenter: parent.verticalCenter + font.pixelSize: 14 + ++ visible: keyboard.enabled && keyboard.layouts.length > 0 ++ + arrowIcon: "angle-down.png" + + KeyNavigation.backtab: session; KeyNavigation.tab: btnShutdown + +From a8dad084766a31d92252b2c2707c778dca1f30cc Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Wed, 31 Jan 2024 02:08:47 -0800 +Subject: [PATCH 3/7] Themes: explicitly resolve image URLs + +Qt6 no longer resolves relative URLs on assignment to a property of type +url[^1]. The resolution now happens late, in the context of the item that +uses the URL. In our case, it would be a QML component containing Image. +However, the themes shipped with SDDM contain resources in the theme +directories and rely on the previous algorithm of the URL resolution. + +The only documented[^2] way to address that is to resolve the paths in +advance with `Qt.resolvedUrl` to avoid any ambiguity. `Qt.resolvedUrl` +is supported in Qt5, so that should be a safe, albeit a bit verbose, +conversion. + +Fixes following error: +``` +file:///usr/lib64/qt6/qml/SddmComponents/ComboBox.qml:105:9: QML Image: Cannot open: file:///usr/lib64/qt6/qml/SddmComponents/angle-down.png +``` + +[^1]: https://doc.qt.io/qt-6/qml-url.html +[^2]: `QQmlAbstractUrlInterceptor` exists in Qt5, but + `QQmlEngine::setUrlInterceptor` is undocumented and has potential +negative side-effects. It also receives already resolved absolute URLs. +--- + data/themes/elarun/Main.qml | 29 +++++++++++++++-------------- + data/themes/maldives/Main.qml | 13 +++++++------ + data/themes/maya/Main.qml | 10 +++++----- + docs/THEMING.md | 2 +- + src/greeter/theme/Main.qml | 14 +++++++------- + 5 files changed, 35 insertions(+), 33 deletions(-) + +diff --git a/data/themes/elarun/Main.qml b/data/themes/elarun/Main.qml +index 523dab7b3..8151bb52a 100644 +--- a/data/themes/elarun/Main.qml ++++ b/data/themes/elarun/Main.qml +@@ -50,11 +50,12 @@ Rectangle { + + Background { + anchors.fill: parent +- source: config.background ++ source: Qt.resolvedUrl(config.background) + fillMode: Image.PreserveAspectCrop + onStatusChanged: { +- if (status == Image.Error && source != config.defaultBackground) { +- source = config.defaultBackground ++ var defaultBackground = Qt.resolvedUrl(config.defaultBackground) ++ if (status == Image.Error && source != defaultBackground) { ++ source = defaultBackground + } + } + } +@@ -72,12 +73,12 @@ Rectangle { + + Image { + anchors.fill: parent +- source: "images/rectangle.png" ++ source: Qt.resolvedUrl("images/rectangle.png") + } + + Image { + anchors.fill: parent +- source: "images/rectangle_overlay.png" ++ source: Qt.resolvedUrl("images/rectangle_overlay.png") + opacity: 0.1 + } + +@@ -103,7 +104,7 @@ Rectangle { + anchors.centerIn: parent + + Row { +- Image { source: "images/user_icon.png" } ++ Image { source: Qt.resolvedUrl("images/user_icon.png") } + + TextBox { + id: user_entry +@@ -121,7 +122,7 @@ Rectangle { + + Row { + +- Image { source: "images/lock.png" } ++ Image { source: Qt.resolvedUrl("images/lock.png") } + + PasswordBox { + id: pw_entry +@@ -150,7 +151,7 @@ Rectangle { + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 20 + +- source: "images/login_normal.png" ++ source: Qt.resolvedUrl("images/login_normal.png") + + onClicked: sddm.login(user_entry.text, pw_entry.text, sessionIndex) + +@@ -171,7 +172,7 @@ Rectangle { + + ImageButton { + id: system_button +- source: "images/system_shutdown.png" ++ source: Qt.resolvedUrl("images/system_shutdown.png") + onClicked: sddm.powerOff() + + KeyNavigation.backtab: session; KeyNavigation.tab: reboot_button +@@ -179,7 +180,7 @@ Rectangle { + + ImageButton { + id: reboot_button +- source: "images/system_reboot.png" ++ source: Qt.resolvedUrl("images/system_reboot.png") + onClicked: sddm.reboot() + + KeyNavigation.backtab: system_button; KeyNavigation.tab: suspend_button +@@ -187,7 +188,7 @@ Rectangle { + + ImageButton { + id: suspend_button +- source: "images/system_suspend.png" ++ source: Qt.resolvedUrl("images/system_suspend.png") + visible: sddm.canSuspend + onClicked: sddm.suspend() + +@@ -196,7 +197,7 @@ Rectangle { + + ImageButton { + id: hibernate_button +- source: "images/system_hibernate.png" ++ source: Qt.resolvedUrl("images/system_hibernate.png") + visible: sddm.canHibernate + onClicked: sddm.hibernate() + +@@ -256,7 +257,7 @@ Rectangle { + width: 245 + anchors.verticalCenter: parent.verticalCenter + +- arrowIcon: "angle-down.png" ++ arrowIcon: Qt.resolvedUrl("angle-down.png") + + model: sessionModel + index: sessionModel.lastIndex +@@ -285,7 +286,7 @@ Rectangle { + + visible: keyboard.enabled && keyboard.layouts.length > 0 + +- arrowIcon: "angle-down.png" ++ arrowIcon: Qt.resolvedUrl("angle-down.png") + + KeyNavigation.backtab: session; KeyNavigation.tab: user_entry + } +diff --git a/data/themes/maldives/Main.qml b/data/themes/maldives/Main.qml +index 7f1959a5f..f346829e8 100644 +--- a/data/themes/maldives/Main.qml ++++ b/data/themes/maldives/Main.qml +@@ -58,11 +58,12 @@ Rectangle { + + Background { + anchors.fill: parent +- source: config.background ++ source: Qt.resolvedUrl(config.background) + fillMode: Image.PreserveAspectCrop + onStatusChanged: { +- if (status == Image.Error && source != config.defaultBackground) { +- source = config.defaultBackground ++ var defaultBackground = Qt.resolvedUrl(config.defaultBackground) ++ if (status == Image.Error && source != defaultBackground) { ++ source = defaultBackground + } + } + } +@@ -87,7 +88,7 @@ Rectangle { + width: Math.max(320, mainColumn.implicitWidth + 50) + height: Math.max(320, mainColumn.implicitHeight + 50) + +- source: "rectangle.png" ++ source: Qt.resolvedUrl("rectangle.png") + + Column { + id: mainColumn +@@ -186,7 +187,7 @@ Rectangle { + width: parent.width; height: 30 + font.pixelSize: 14 + +- arrowIcon: "angle-down.png" ++ arrowIcon: Qt.resolvedUrl("angle-down.png") + + model: sessionModel + index: sessionModel.lastIndex +@@ -217,7 +218,7 @@ Rectangle { + width: parent.width; height: 30 + font.pixelSize: 14 + +- arrowIcon: "angle-down.png" ++ arrowIcon: Qt.resolvedUrl("angle-down.png") + + KeyNavigation.backtab: session; KeyNavigation.tab: loginButton + } +diff --git a/data/themes/maya/Main.qml b/data/themes/maya/Main.qml +index d166b718c..30bb530ca 100644 +--- a/data/themes/maya/Main.qml ++++ b/data/themes/maya/Main.qml +@@ -251,7 +251,7 @@ Rectangle { + font.family : opensans_cond_light.name + font.pixelSize : spFontNormal + +- arrowIcon: "images/ic_arrow_drop_down_white_24px.svg" ++ arrowIcon: Qt.resolvedUrl("images/ic_arrow_drop_down_white_24px.svg") + arrowColor: primaryHue3 + + KeyNavigation.tab : maya_username +@@ -296,7 +296,7 @@ Rectangle { + font.family : opensans_cond_light.name + font.pixelSize : spFontNormal + +- arrowIcon: "images/ic_arrow_drop_down_white_24px.svg" ++ arrowIcon: Qt.resolvedUrl("images/ic_arrow_drop_down_white_24px.svg") + arrowColor: primaryHue3 + + KeyNavigation.tab : maya_layout +@@ -355,7 +355,7 @@ Rectangle { + label : textConstants.shutdown + labelColor : normalText + +- icon : "images/ic_power_settings_new_white_24px.svg" ++ icon : Qt.resolvedUrl("images/ic_power_settings_new_white_24px.svg") + iconColor : accentShade + + hoverIconColor : powerColor +@@ -381,7 +381,7 @@ Rectangle { + label : textConstants.reboot + labelColor : normalText + +- icon : "images/ic_refresh_white_24px.svg" ++ icon : Qt.resolvedUrl("images/ic_refresh_white_24px.svg") + iconColor : accentLight + + hoverIconColor : rebootColor +@@ -492,7 +492,7 @@ Rectangle { + hoverColor : accentLight + textColor : normalText + +- image : "images/ic_warning_white_24px.svg" ++ image : Qt.resolvedUrl("images/ic_warning_white_24px.svg") + + tooltipEnabled : true + tooltipText : textConstants.capslockWarning +diff --git a/docs/THEMING.md b/docs/THEMING.md +index bc69be003..873172192 100644 +--- a/docs/THEMING.md ++++ b/docs/THEMING.md +@@ -8,7 +8,7 @@ We also provide models containing information about the screens, available sessi + + ComboBox { + id: session +- arrowIcon: "angle-down.png" ++ arrowIcon: Qt.resolvedPath("angle-down.png") + model: sessionModel + index: sessionModel.lastIndex + } +diff --git a/src/greeter/theme/Main.qml b/src/greeter/theme/Main.qml +index 2106f6004..b799670ac 100644 +--- a/src/greeter/theme/Main.qml ++++ b/src/greeter/theme/Main.qml +@@ -55,7 +55,7 @@ Rectangle { + + Background { + anchors.fill: parent +- source: "qrc:/theme/background.png" ++ source: "qrc:///theme/background.png" + fillMode: Image.PreserveAspectCrop + onStatusChanged: { + if (status == Image.Error && source != config.defaultBackground) { +@@ -131,7 +131,7 @@ Rectangle { + anchors.left: parent.left + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 10 +- source: "angle-left.png" ++ source: "qrc:///theme/angle-left.png" + onClicked: listView.decrementCurrentIndex() + + KeyNavigation.backtab: btnShutdown; KeyNavigation.tab: listView +@@ -162,7 +162,7 @@ Rectangle { + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + anchors.margins: 10 +- source: "angle-right.png" ++ source: "qrc:///theme/angle-right.png" + onClicked: listView.incrementCurrentIndex() + KeyNavigation.backtab: listView; KeyNavigation.tab: session + } +@@ -222,7 +222,7 @@ Rectangle { + width: 245 + anchors.verticalCenter: parent.verticalCenter + +- arrowIcon: "angle-down.png" ++ arrowIcon: "qrc:///theme/angle-down.png" + + model: sessionModel + index: sessionModel.lastIndex +@@ -251,7 +251,7 @@ Rectangle { + + visible: keyboard.enabled && keyboard.layouts.length > 0 + +- arrowIcon: "angle-down.png" ++ arrowIcon: "qrc:///theme/angle-down.png" + + KeyNavigation.backtab: session; KeyNavigation.tab: btnShutdown + } +@@ -266,7 +266,7 @@ Rectangle { + ImageButton { + id: btnReboot + height: parent.height +- source: "reboot.png" ++ source: "qrc:///theme/reboot.png" + + visible: sddm.canReboot + +@@ -278,7 +278,7 @@ Rectangle { + ImageButton { + id: btnShutdown + height: parent.height +- source: "shutdown.png" ++ source: "qrc:///theme/shutdown.png" + + visible: sddm.canPowerOff + + +From fb6849312dd5eddf312b7bdb660162f23a2bdab8 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Mon, 26 Feb 2024 19:39:53 -0800 +Subject: [PATCH 4/7] Components: use Transitions instead of Behaviors + +It's not recommended[^1] to use Behaviors with States, but the specific +examples in SDDM weren't causing any problems previously (on Qt5). + +Now, with Qt6 support, we can finally observe the promised bugs from the +referenced article in the wild: + +* ComboBox can be closed only once. On a second activation it stays open +* Button color transitions on focus out are abruptly stopped on a wrong + color +* ... (this is where I noticed a pattern and decided to convert + everything else preemptively). + +This commit essentially reverts 930fa07bf24d391d42abcfb981f145117292d49d + +[^1]: https://doc.qt.io/qt-5/qtquick-statesanimations-behaviors.html +--- + components/2.0/Button.qml | 4 +++- + components/2.0/ComboBox.qml | 12 ++++++++---- + components/2.0/ImageButton.qml | 4 +++- + components/2.0/Menu.qml | 6 ++++-- + components/2.0/PictureBox.qml | 6 ++++-- + components/2.0/TextBox.qml | 6 ++++-- + 6 files changed, 26 insertions(+), 12 deletions(-) + +diff --git a/components/2.0/Button.qml b/components/2.0/Button.qml +index cedc8356e..7c74f1ded 100644 +--- a/components/2.0/Button.qml ++++ b/components/2.0/Button.qml +@@ -67,7 +67,9 @@ Rectangle { + } + ] + +- Behavior on color { NumberAnimation { duration: 200 } } ++ transitions: Transition { ++ ColorAnimation { duration: 200 } ++ } + + clip: true + smooth: true +diff --git a/components/2.0/ComboBox.qml b/components/2.0/ComboBox.qml +index 26bbef35e..e7fdb3362 100644 +--- a/components/2.0/ComboBox.qml ++++ b/components/2.0/ComboBox.qml +@@ -70,8 +70,6 @@ FocusScope { + border.color: container.borderColor + border.width: container.borderWidth + +- Behavior on border.color { ColorAnimation { duration: 100 } } +- + states: [ + State { + name: "hover"; when: mouseArea.containsMouse +@@ -82,6 +80,10 @@ FocusScope { + PropertyChanges { target: main; border.width: container.borderWidth; border.color: container.focusColor } + } + ] ++ ++ transitions: Transition { ++ ColorAnimation { property: "border.color"; duration: 100 } ++ } + } + + Loader { +@@ -157,8 +159,6 @@ FocusScope { + + clip: true + +- Behavior on height { NumberAnimation { duration: 100 } } +- + Component { + id: myDelegate + +@@ -214,6 +214,10 @@ FocusScope { + PropertyChanges { target: dropDown; height: (container.height - 2*container.borderWidth) * listView.count + container.borderWidth} + } + ] ++ ++ transitions: Transition { ++ NumberAnimation { property: "height"; duration: 100 } ++ } + } + + function toggle() { +diff --git a/components/2.0/ImageButton.qml b/components/2.0/ImageButton.qml +index 6277148ab..28bc940be 100644 +--- a/components/2.0/ImageButton.qml ++++ b/components/2.0/ImageButton.qml +@@ -53,7 +53,9 @@ Image { + } + ] + +- Behavior on opacity { NumberAnimation { duration: 200 } } ++ transitions: Transition { ++ NumberAnimation { property: "opacity"; duration: 200 } ++ } + + clip: true + smooth: true +diff --git a/components/2.0/Menu.qml b/components/2.0/Menu.qml +index 8ef29841e..9acecb9e2 100644 +--- a/components/2.0/Menu.qml ++++ b/components/2.0/Menu.qml +@@ -34,8 +34,6 @@ Rectangle { + property alias model: menuList.model + property alias index: menuList.currentIndex + +- Behavior on height { NumberAnimation { duration: 100 } } +- + states: [ + State { + name: "visible"; +@@ -43,6 +41,10 @@ Rectangle { + } + ] + ++ transitions: Transition { ++ NumberAnimation { property: "height"; duration: 100 } ++ } ++ + Component { + id: listViewItem + +diff --git a/components/2.0/PictureBox.qml b/components/2.0/PictureBox.qml +index eb2fbfee8..b9571f04e 100644 +--- a/components/2.0/PictureBox.qml ++++ b/components/2.0/PictureBox.qml +@@ -37,8 +37,6 @@ FocusScope { + + signal login() + +- Behavior on height { NumberAnimation { duration: 100 } } +- + states: [ + State { + name: "" +@@ -50,6 +48,10 @@ FocusScope { + } + ] + ++ transitions: Transition { ++ NumberAnimation { property: "height"; duration: 100 } ++ } ++ + Rectangle { + id: shadow + anchors.fill: parent +diff --git a/components/2.0/TextBox.qml b/components/2.0/TextBox.qml +index a8d89afd5..0db8ce885 100644 +--- a/components/2.0/TextBox.qml ++++ b/components/2.0/TextBox.qml +@@ -47,8 +47,6 @@ FocusScope { + border.color: container.borderColor + border.width: 1 + +- Behavior on border.color { ColorAnimation { duration: 100 } } +- + states: [ + State { + name: "hover"; when: mouseArea.containsMouse +@@ -59,6 +57,10 @@ FocusScope { + PropertyChanges { target: main; border.width: 1; border.color: container.focusColor } + } + ] ++ ++ transitions: Transition { ++ ColorAnimation { duration: 100 } ++ } + } + + MouseArea { + +From 5c9a8b7d479f8bf019c5fa1a5d9a78ca12db5793 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Mon, 26 Feb 2024 21:11:01 -0800 +Subject: [PATCH 5/7] Themes: fix deprecated signal handler declarations + +Fixes following warnings: +``` +QML Connections: Implicitly defined onFoo properties in Connections are deprecated. Use this syntax instead: function onFoo() { ... } +Parameter "event" is not declared. Injection of parameters into signal handlers is deprecated. Use JavaScript functions with formal parameters instead. +``` +--- + components/2.0/Button.qml | 4 ++-- + components/2.0/ComboBox.qml | 2 +- + components/2.0/ImageButton.qml | 4 ++-- + components/2.0/LayoutBox.qml | 8 ++++++-- + components/2.0/PictureBox.qml | 2 +- + data/themes/elarun/Main.qml | 8 ++++---- + data/themes/maldives/Main.qml | 11 +++++------ + data/themes/maya/Main.qml | 10 +++++----- + src/greeter/theme/Main.qml | 6 +++--- + 9 files changed, 29 insertions(+), 26 deletions(-) + +diff --git a/components/2.0/Button.qml b/components/2.0/Button.qml +index 7c74f1ded..4d6d40a76 100644 +--- a/components/2.0/Button.qml ++++ b/components/2.0/Button.qml +@@ -111,7 +111,7 @@ Rectangle { + onReleased: { container.focus = true; container.released() } + } + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Space) { + container.spaceDown = true; + container.pressed() +@@ -122,7 +122,7 @@ Rectangle { + } + } + +- Keys.onReleased: { ++ Keys.onReleased: function (event) { + if (event.key === Qt.Key_Space) { + container.spaceDown = false; + container.released() +diff --git a/components/2.0/ComboBox.qml b/components/2.0/ComboBox.qml +index e7fdb3362..997a3886e 100644 +--- a/components/2.0/ComboBox.qml ++++ b/components/2.0/ComboBox.qml +@@ -134,7 +134,7 @@ FocusScope { + } + } + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Up) { + listView.decrementCurrentIndex() + } else if (event.key === Qt.Key_Down) { +diff --git a/components/2.0/ImageButton.qml b/components/2.0/ImageButton.qml +index 28bc940be..b2c267d2b 100644 +--- a/components/2.0/ImageButton.qml ++++ b/components/2.0/ImageButton.qml +@@ -77,7 +77,7 @@ Image { + onReleased: { container.focus = true; container.released() } + } + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Space) { + container.spaceDown = true; + container.pressed() +@@ -88,7 +88,7 @@ Image { + } + } + +- Keys.onReleased: { ++ Keys.onReleased: function (event) { + if (event.key === Qt.Key_Space) { + container.spaceDown = false; + container.released() +diff --git a/components/2.0/LayoutBox.qml b/components/2.0/LayoutBox.qml +index b992f28de..5e62acd3f 100644 +--- a/components/2.0/LayoutBox.qml ++++ b/components/2.0/LayoutBox.qml +@@ -30,12 +30,16 @@ ComboBox { + model: keyboard.layouts + index: keyboard.currentLayout + +- onValueChanged: keyboard.currentLayout = id ++ function onValueChanged(id) { ++ keyboard.currentLayout = id ++ } + + Connections { + target: keyboard + +- onCurrentLayoutChanged: combo.index = keyboard.currentLayout ++ function onCurrentLayoutChanged() { ++ combo.index = keyboard.currentLayout ++ } + } + + rowDelegate: Rectangle { +diff --git a/components/2.0/PictureBox.qml b/components/2.0/PictureBox.qml +index b9571f04e..560556e40 100644 +--- a/components/2.0/PictureBox.qml ++++ b/components/2.0/PictureBox.qml +@@ -105,7 +105,7 @@ FocusScope { + focus: true + visible: showPassword + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + container.login(); + event.accepted = true +diff --git a/data/themes/elarun/Main.qml b/data/themes/elarun/Main.qml +index 8151bb52a..d0caadaea 100644 +--- a/data/themes/elarun/Main.qml ++++ b/data/themes/elarun/Main.qml +@@ -39,11 +39,11 @@ Rectangle { + + Connections { + target: sddm +- onLoginSucceeded: { ++ function onLoginSucceeded() { + } +- onInformationMessage: { ++ function onInformationMessage(message) { + } +- onLoginFailed: { ++ function onLoginFailed() { + pw_entry.text = "" + } + } +@@ -135,7 +135,7 @@ Rectangle { + + KeyNavigation.backtab: user_entry; KeyNavigation.tab: login_button + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(user_entry.text, pw_entry.text, sessionIndex) + event.accepted = true +diff --git a/data/themes/maldives/Main.qml b/data/themes/maldives/Main.qml +index f346829e8..17b1b8aff 100644 +--- a/data/themes/maldives/Main.qml ++++ b/data/themes/maldives/Main.qml +@@ -40,17 +40,16 @@ Rectangle { + Connections { + target: sddm + +- onLoginSucceeded: { ++ function onLoginSucceeded() { + errorMessage.color = "steelblue" + errorMessage.text = textConstants.loginSucceeded + } +- +- onLoginFailed: { ++ function onLoginFailed() { + password.text = "" + errorMessage.color = "red" + errorMessage.text = textConstants.loginFailed + } +- onInformationMessage: { ++ function onInformationMessage(message) { + errorMessage.color = "red" + errorMessage.text = message + } +@@ -126,7 +125,7 @@ Rectangle { + + KeyNavigation.backtab: rebootButton; KeyNavigation.tab: password + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(name.text, password.text, sessionIndex) + event.accepted = true +@@ -153,7 +152,7 @@ Rectangle { + + KeyNavigation.backtab: name; KeyNavigation.tab: session + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) { + sddm.login(name.text, password.text, sessionIndex) + event.accepted = true +diff --git a/data/themes/maya/Main.qml b/data/themes/maya/Main.qml +index 30bb530ca..60473a473 100644 +--- a/data/themes/maya/Main.qml ++++ b/data/themes/maya/Main.qml +@@ -75,7 +75,7 @@ Rectangle { + Connections { + target: sddm + +- onLoginSucceeded: { ++ function onLoginSucceeded() { + prompt_bg.color = successText + prompt_txt.text = textConstants.loginSucceeded + +@@ -84,7 +84,7 @@ Rectangle { + + anim_success.start() + } +- onLoginFailed: { ++ function onLoginFailed() { + prompt_bg.color = failureText + prompt_txt.text = textConstants.loginFailed + +@@ -93,7 +93,7 @@ Rectangle { + + anim_failure.start() + } +- onInformationMessage: { ++ function onInformationMessage(message) { + prompt_bg.color = failureText + prompt_txt.text = message + +@@ -505,7 +505,7 @@ Rectangle { + KeyNavigation.tab : maya_login + KeyNavigation.backtab : maya_username + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if ((event.key === Qt.Key_Return) || (event.key === Qt.Key_Enter)) { + maya_root.tryLogin() + +@@ -546,7 +546,7 @@ Rectangle { + + onClicked: maya_root.tryLogin() + +- Keys.onPressed: { ++ Keys.onPressed: function (event) { + if ((event.key === Qt.Key_Return) || (event.key === Qt.Key_Enter)) { + maya_root.tryLogin() + +diff --git a/src/greeter/theme/Main.qml b/src/greeter/theme/Main.qml +index b799670ac..257153b16 100644 +--- a/src/greeter/theme/Main.qml ++++ b/src/greeter/theme/Main.qml +@@ -40,15 +40,15 @@ Rectangle { + + Connections { + target: sddm +- onLoginSucceeded: { ++ function onLoginSucceeded() { + } + +- onLoginFailed: { ++ function onLoginFailed() { + txtMessage.text = textConstants.loginFailed + listView.currentItem.password = "" + } + +- onInformationMessage: { ++ function onInformationMessage(message) { + txtMessage.text = message + } + } + +From ae6313e7433acff4e8bbbfd431a44d715cb306a9 Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Tue, 27 Feb 2024 00:00:04 -0800 +Subject: [PATCH 6/7] Themes: set QtVersion=@QT_MAJOR_VERSION@ + +--- + data/themes/CMakeLists.txt | 12 +++++++++--- + .../elarun/{metadata.desktop => metadata.desktop.in} | 2 +- + .../{metadata.desktop => metadata.desktop.in} | 1 + + .../maya/{metadata.desktop => metadata.desktop.in} | 1 + + src/greeter/CMakeLists.txt | 1 + + src/greeter/theme.qrc | 2 +- + .../theme/{metadata.desktop => metadata.desktop.in} | 1 + + 7 files changed, 15 insertions(+), 5 deletions(-) + rename data/themes/elarun/{metadata.desktop => metadata.desktop.in} (97%) + rename data/themes/maldives/{metadata.desktop => metadata.desktop.in} (92%) + rename data/themes/maya/{metadata.desktop => metadata.desktop.in} (92%) + rename src/greeter/theme/{metadata.desktop => metadata.desktop.in} (92%) + +diff --git a/data/themes/CMakeLists.txt b/data/themes/CMakeLists.txt +index 60b29be2e..a18fe8926 100644 +--- a/data/themes/CMakeLists.txt ++++ b/data/themes/CMakeLists.txt +@@ -10,9 +10,15 @@ foreach(THEME ${THEMES}) + + qt_add_translation(QM_FILES "${TRANSLATION_SOURCES}") + +- install(DIRECTORY "${THEME}" DESTINATION "${DATA_INSTALL_DIR}/themes" PATTERN "${THEME}/*.ts" +- EXCLUDE PATTERN "${THEME}/.gitattributes" +- EXCLUDE) ++ configure_file("${THEME}/metadata.desktop.in" "${THEME}/metadata.desktop" @ONLY) ++ ++ install(DIRECTORY "${THEME}" DESTINATION "${DATA_INSTALL_DIR}/themes" ++ PATTERN "${THEME}/*.in" EXCLUDE ++ PATTERN "${THEME}/*.ts" EXCLUDE ++ PATTERN "${THEME}/.gitattributes" EXCLUDE) ++ ++ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${THEME}/metadata.desktop" ++ DESTINATION "${DATA_INSTALL_DIR}/themes/${THEME}/") + + list(APPEND THEMES_QM_FILES ${QM_FILES}) + endforeach(THEME) +diff --git a/data/themes/elarun/metadata.desktop b/data/themes/elarun/metadata.desktop.in +similarity index 97% +rename from data/themes/elarun/metadata.desktop +rename to data/themes/elarun/metadata.desktop.in +index 50455880a..a992a6102 100644 +--- a/data/themes/elarun/metadata.desktop ++++ b/data/themes/elarun/metadata.desktop.in +@@ -46,4 +46,4 @@ TranslationsDirectory=translations + Theme-Id=elarun + Theme-API=2.0 + Website=https://github.com/sddm/sddm +- ++QtVersion=@QT_MAJOR_VERSION@ +diff --git a/data/themes/maldives/metadata.desktop b/data/themes/maldives/metadata.desktop.in +similarity index 92% +rename from data/themes/maldives/metadata.desktop +rename to data/themes/maldives/metadata.desktop.in +index acd0fa47d..8931da6cd 100644 +--- a/data/themes/maldives/metadata.desktop ++++ b/data/themes/maldives/metadata.desktop.in +@@ -14,3 +14,4 @@ TranslationsDirectory=translations + Email=abdurrahmanavci@gmail.com + Theme-Id=maldives + Theme-API=2.0 ++QtVersion=@QT_MAJOR_VERSION@ +diff --git a/data/themes/maya/metadata.desktop b/data/themes/maya/metadata.desktop.in +similarity index 92% +rename from data/themes/maya/metadata.desktop +rename to data/themes/maya/metadata.desktop.in +index 0c2ab2623..ccda38bfb 100644 +--- a/data/themes/maya/metadata.desktop ++++ b/data/themes/maya/metadata.desktop.in +@@ -14,3 +14,4 @@ TranslationsDirectory=translations + Email=spremi@ymail.com + Theme-Id=maya + Theme-API=2.0 ++QtVersion=@QT_MAJOR_VERSION@ +diff --git a/src/greeter/CMakeLists.txt b/src/greeter/CMakeLists.txt +index 72769e4d0..b9159c53d 100644 +--- a/src/greeter/CMakeLists.txt ++++ b/src/greeter/CMakeLists.txt +@@ -36,6 +36,7 @@ set(GREETER_SOURCES + ) + + configure_file("theme.qrc" "theme.qrc") ++configure_file("theme/metadata.desktop.in" "theme/metadata.desktop" @ONLY) + + qt_add_resources(RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/theme.qrc) + +diff --git a/src/greeter/theme.qrc b/src/greeter/theme.qrc +index efed01179..299169ec1 100644 +--- a/src/greeter/theme.qrc ++++ b/src/greeter/theme.qrc +@@ -7,7 +7,7 @@ + ${CMAKE_CURRENT_SOURCE_DIR}/theme/Main.qml + ${CMAKE_CURRENT_SOURCE_DIR}/theme/reboot.png + ${CMAKE_CURRENT_SOURCE_DIR}/theme/shutdown.png +- ${CMAKE_CURRENT_SOURCE_DIR}/theme/metadata.desktop ++ ${CMAKE_CURRENT_BINARY_DIR}/theme/metadata.desktop + ${CMAKE_CURRENT_SOURCE_DIR}/theme/theme.conf + + +diff --git a/src/greeter/theme/metadata.desktop b/src/greeter/theme/metadata.desktop.in +similarity index 92% +rename from src/greeter/theme/metadata.desktop +rename to src/greeter/theme/metadata.desktop.in +index a1c22ce93..0a4c9f349 100644 +--- a/src/greeter/theme/metadata.desktop ++++ b/src/greeter/theme/metadata.desktop.in +@@ -14,3 +14,4 @@ TranslationsDirectory=translations + Email=abdurrahmanavci@gmail.com + Theme-Id=maui + Theme-API=2.0 ++QtVersion=@QT_MAJOR_VERSION@ + +From ed30ef9f3897dd14ef1d7d04674166171f646fce Mon Sep 17 00:00:00 2001 +From: Aleksei Bavshin +Date: Tue, 27 Feb 2024 07:07:26 -0800 +Subject: [PATCH 7/7] Docs: add QtVersion information to THEMING + +--- + docs/THEMING.md | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/docs/THEMING.md b/docs/THEMING.md +index 873172192..69997e88a 100644 +--- a/docs/THEMING.md ++++ b/docs/THEMING.md +@@ -13,6 +13,8 @@ We also provide models containing information about the screens, available sessi + index: sessionModel.lastIndex + } + ++Themes are run by a Qt 5 built sddm-greeter, unless the `QtVersion` property in metadata.desktop specifies a different version, such as `QtVersion=6` for using `sddm-greeter-qt6`. ++ + ## Proxy Object + + We provide a proxy object, called as `sddm` to the themes as a context property. This object holds some useful properties about the host system. It also acts as a proxy between the greeter and the daemon. All of the methods called on this object will be transferred to the daemon through a local socket to be executed there. diff --git a/anda/desktops/sddm/sddm-autologin.pam b/anda/desktops/sddm/sddm-autologin.pam new file mode 100644 index 0000000000..f62fad0baf --- /dev/null +++ b/anda/desktops/sddm/sddm-autologin.pam @@ -0,0 +1,20 @@ + #%PAM-1.0 +auth required pam_env.so +auth required pam_permit.so +auth include postlogin + +account required pam_nologin.so +account include system-auth + +password include system-auth + +session required pam_selinux.so close +session required pam_loginuid.so +session required pam_selinux.so open +session optional pam_keyinit.so force revoke +session required pam_namespace.so +session include system-auth +-session optional pam_gnome_keyring.so auto_start +-session optional pam_kwallet5.so auto_start +-session optional pam_kwallet.so auto_start +session include postlogin diff --git a/anda/desktops/sddm/sddm-greeter.pam b/anda/desktops/sddm/sddm-greeter.pam new file mode 100644 index 0000000000..44e209e904 --- /dev/null +++ b/anda/desktops/sddm/sddm-greeter.pam @@ -0,0 +1,17 @@ +#%PAM-1.0 + +# Load environment from /etc/environment and ~/.pam_environment +auth required pam_env.so + +# Always let the greeter start without authentication +auth required pam_permit.so + +# No action required for account management +account required pam_permit.so + +# Can't change password +password required pam_deny.so + +# Setup session +session required pam_unix.so +session optional pam_systemd.so diff --git a/anda/desktops/sddm/sddm-rpmostree-tmpfiles-hack.patch b/anda/desktops/sddm/sddm-rpmostree-tmpfiles-hack.patch new file mode 100644 index 0000000000..4f06aa1946 --- /dev/null +++ b/anda/desktops/sddm/sddm-rpmostree-tmpfiles-hack.patch @@ -0,0 +1,12 @@ +diff --git a/services/sddm-tmpfiles.conf.in b/services/sddm-tmpfiles.conf.in +index fb45553..6acfb6c 100644 +--- a/services/sddm-tmpfiles.conf.in ++++ b/services/sddm-tmpfiles.conf.in +@@ -1,5 +1,7 @@ + # Home dir of the sddm user, also contains state.conf + d ${STATE_DIR} 0750 sddm sddm ++# Workaround for https://pagure.io/fedora-kde/SIG/issue/87 ++Z ${STATE_DIR} - sddm sddm + # This contains X11 auth files passed to Xorg and the greeter + d ${RUNTIME_DIR} 0711 root root + # Sockets for IPC diff --git a/anda/desktops/sddm/sddm-systemd-sysusers.conf b/anda/desktops/sddm/sddm-systemd-sysusers.conf new file mode 100644 index 0000000000..05fcb1c076 --- /dev/null +++ b/anda/desktops/sddm/sddm-systemd-sysusers.conf @@ -0,0 +1,2 @@ +#Type Name ID GECOS Home directory Shell +u sddm - "SDDM Greeter Account" /var/lib/sddm - diff --git a/anda/desktops/sddm/sddm-x11.conf b/anda/desktops/sddm/sddm-x11.conf new file mode 100644 index 0000000000..6d16a4a0b2 --- /dev/null +++ b/anda/desktops/sddm/sddm-x11.conf @@ -0,0 +1,2 @@ +[General] +DisplayServer=x11 diff --git a/anda/desktops/sddm/sddm.conf b/anda/desktops/sddm/sddm.conf new file mode 100644 index 0000000000..c4696b5878 --- /dev/null +++ b/anda/desktops/sddm/sddm.conf @@ -0,0 +1,122 @@ +[Autologin] +# Whether sddm should automatically log back into sessions when they exit +#Relogin=false + +# Name of session file for autologin session +#Session= + +# Username for autologin session +#User= + + +[General] +# Enable Qt's automatic high-DPI scaling +#EnableHiDPI=false + +# Halt command +#HaltCommand=/usr/bin/systemctl poweroff + +# Initial NumLock state. Can be on, off or none. +# If property is set to none, numlock won't be changed +# NOTE: Currently ignored if autologin is enabled. +#Numlock=none + +# Reboot command +#RebootCommand=/usr/bin/systemctl reboot + +# Control x11/wayland startup +# DisplayServer=wayland + +[Theme] +# Current theme name +#Current=01-breeze-fedora + +# Cursor theme used in the greeter +#CursorTheme= + +# Number of users to use as threshold +# above which avatars are disabled +# unless explicitly enabled with EnableAvatars +#DisableAvatarsThreshold=7 + +# Enable display of custom user avatars +#EnableAvatars=true + +# Global directory for user avatars +# The files should be named .face.icon +#FacesDir=/usr/share/sddm/faces + +# Theme directory path +#ThemeDir=/usr/share/sddm/themes + + +[Users] +# Default $PATH for logged in users +#DefaultPath=/usr/local/bin:/usr/bin:/bin + +# Comma-separated list of shells. +# Users with these shells as their default won't be listed +#HideShells= + +# Comma-separated list of users that should not be listed +#HideUsers= + +# Maximum user id for displayed users +#MaximumUid=60000 + +# Minimum user id for displayed users +#MinimumUid=1000 + +# Remember the session of the last successfully logged in user +#RememberLastSession=true + +# Remember the last successfully logged in user +#RememberLastUser=true + + +[Wayland] +# Path to a script to execute when starting the desktop session +#SessionCommand=/etc/sddm/wayland-session + +# Directory containing available Wayland sessions +#SessionDir=/usr/share/wayland-sessions + +# Path to the user session log file +#SessionLogFile=.cache/wayland-errors + + +[X11] +# Path to a script to execute when starting the display server +#DisplayCommand=/etc/sddm/Xsetup + +# Path to a script to execute when stopping the display server +#DisplayStopCommand=/etc/sddm/Xstop + +# The lowest virtual terminal number that will be used. +#MinimumVT=1 + +# Arguments passed to the X server invocation +#ServerArguments=-nolisten tcp + +# Path to X server binary +#ServerPath=/usr/bin/X + +# Path to a script to execute when starting the desktop session +#SessionCommand=/etc/X11/xinit/Xsession + +# Directory containing available X sessions +#SessionDir=/usr/share/xsessions + +# Path to the user session log file +#SessionLogFile=.cache/xsession-errors + +# Path to the Xauthority file +#UserAuthFile=.Xauthority + +# Path to xauth binary +#XauthPath=/usr/bin/xauth + +# Path to Xephyr binary +#XephyrPath=/usr/bin/Xephyr + + diff --git a/anda/desktops/sddm/sddm.pam b/anda/desktops/sddm/sddm.pam new file mode 100644 index 0000000000..34c0777516 --- /dev/null +++ b/anda/desktops/sddm/sddm.pam @@ -0,0 +1,23 @@ +auth [success=done ignore=ignore default=bad] pam_selinux_permit.so +auth substack password-auth +-auth optional pam_gnome_keyring.so +-auth optional pam_kwallet5.so +-auth optional pam_kwallet.so +auth include postlogin + +account required pam_nologin.so +account include password-auth + +password include password-auth + +session required pam_selinux.so close +session required pam_loginuid.so +-session optional pam_ck_connector.so +session required pam_selinux.so open +session optional pam_keyinit.so force revoke +session required pam_namespace.so +session include password-auth +-session optional pam_gnome_keyring.so auto_start +-session optional pam_kwallet5.so auto_start +-session optional pam_kwallet.so auto_start +session include postlogin diff --git a/anda/desktops/sddm/sddm.sysconfig b/anda/desktops/sddm/sddm.sysconfig new file mode 100644 index 0000000000..4911cb4af3 --- /dev/null +++ b/anda/desktops/sddm/sddm.sysconfig @@ -0,0 +1,5 @@ +# workaround https://bugzilla.redhat.com/1686675 +# see also https://bugreports.qt.io/browse/QTBUG-58508 +QML_DISABLE_DISK_CACHE=1 +# enable qDebug messages for debug build +# QT_LOGGING_RULES="*.debug=true" diff --git a/anda/desktops/sddm/terra-sddm.spec b/anda/desktops/sddm/terra-sddm.spec new file mode 100644 index 0000000000..7e5e82ceb2 --- /dev/null +++ b/anda/desktops/sddm/terra-sddm.spec @@ -0,0 +1,293 @@ +# Disable X11 for RHEL 10+ +%bcond x11 %[%{undefined rhel} || 0%{?rhel} < 10] + +Name: terra-sddm +Version: 0.21.0 +Release: 5%{?dist} +License: GPL-2.0-or-later +Summary: QML based desktop and login manager +Provides: sddm = %version-%release + +URL: https://github.com/sddm/sddm +Source0: %{url}/archive/v%{version}/sddm-%{version}.tar.gz + +## upstream patches +# Port all themes to Qt 6 +# Submitted: https://github.com/sddm/sddm/pull/1876 +Patch1: sddm-PR1876.patch + +## upstreamable patches +# Fix race with logind restart, and start seat0 if !CanGraphical on timer +# https://bugzilla.redhat.com/show_bug.cgi?id=2011991 +# https://bugzilla.redhat.com/show_bug.cgi?id=2016310 +# Submmited: https://github.com/sddm/sddm/pull/1494 +Patch11: 0001-Delay-for-logind-and-fallback-to-seat0.patch + +## downstream patches +Patch101: sddm-0.20.0-fedora_config.patch + +# sddm.service: +EnvironmentFile=-/etc/sysconfig/sddm +Patch103: sddm-0.18.0-environment_file.patch + +# Workaround for https://pagure.io/fedora-kde/SIG/issue/87 +Patch104: sddm-rpmostree-tmpfiles-hack.patch + +# Workaround lack of Qt 5 greeter build +Patch105: sddm-0.21.0-qt6greeter.patch + +# https://github.com/sddm/sddm/pull/1779 +Patch106: https://github.com/sddm/sddm/pull/1779.patch + +# Shamelessly stolen from gdm +Source10: sddm.pam +# Shamelessly stolen from gdm +Source11: sddm-autologin.pam +# Previously included in sddm sources +Source12: sddm-greeter.pam +# sample sddm.conf generated with sddm --example-config, and entries commented-out +Source13: sddm.conf +# README.scripts +Source14: README.scripts +# sysconfig snippet +Source15: sddm.sysconfig +# sddm x11 override config +Source16: sddm-x11.conf +# sysusers config file. note these are shipped in the upstream tarball +# but we cannot use the files from the tarball for %pre scriptlet +# generation, so we duplicate them as source files for that purpose; +# this is an ugly hack that should be removed if it becomes possible. +# see https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/thread/TFDMAU7KLMSQTKPJELHSM6PFVXIZ56GK/ +Source17: sddm-systemd-sysusers.conf + + +Provides: service(graphical-login) = sddm + +BuildRequires: cmake >= 2.8.8 +BuildRequires: extra-cmake-modules +BuildRequires: pam-devel +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(xcb) +BuildRequires: pkgconfig(xcb-xkb) +# sometimes python-docutils, sometimes python2-docutils, sometimes python3-docutils. +# use path then for sanity +BuildRequires: /usr/bin/rst2man +BuildRequires: cmake(Qt6Core) +BuildRequires: cmake(Qt6DBus) +BuildRequires: cmake(Qt6Gui) +BuildRequires: cmake(Qt6Qml) +BuildRequires: cmake(Qt6Quick) +BuildRequires: cmake(Qt6LinguistTools) +BuildRequires: cmake(Qt6Test) +BuildRequires: cmake(Qt6QuickTest) +# verify presence to pull defaults from /etc/login.defs +BuildRequires: shadow-utils +BuildRequires: systemd +BuildRequires: systemd-rpm-macros + +Obsoletes: kde-settings-sddm < 20-5 + +%if 0%{?fedora} +# for /usr/share/backgrounds/default.png +BuildRequires: desktop-backgrounds-compat +BuildRequires: GraphicsMagick +Requires: desktop-backgrounds-compat +# for /usr/share/pixmaps/system-logo-white.png +Requires: system-logos +%endif +Requires: systemd +%if %{with x11} +Requires: xorg-x11-xinit +%endif +%{?systemd_requires} + +Requires(pre): shadow-utils + +# Virtual dependency for sddm greeter setup +Requires: sddm-greeter-displayserver +Suggests: sddm-wayland-generic + +%description +SDDM is a modern graphical display manager aiming to be fast, simple and +beautiful. It uses modern technologies like QtQuick, which in turn gives the +designer the ability to create smooth, animated user interfaces. + +%package wayland-generic +Summary: Generic Wayland SDDM greeter configuration +Provides: sddm-greeter-displayserver +Conflicts: sddm-greeter-displayserver +Requires: weston +Requires: %{name} = %{version}-%{release} +BuildArch: noarch + +%description wayland-generic +This package contains configuration and dependencies for SDDM +to use Weston for the greeter display server. + +This is the generic default Wayland configuration provided +by SDDM. + +%if %{with x11} +%package x11 +Summary: X11 SDDM greeter configuration +Provides: sddm-greeter-displayserver +Conflicts: sddm-greeter-displayserver +# This will eventually go away... +Provides: deprecated() +Requires: xorg-x11-server-Xorg +Requires: %{name} = %{version}-%{release} +Recommends: qt6-qtvirtualkeyboard +BuildArch: noarch + +%description x11 +This package contains configuration and dependencies for SDDM +to use X11 for the greeter display server. +%endif + +%package themes +Summary: SDDM Themes +# for upgrade path +Obsoletes: sddm < 0.2.0-0.12 +Requires: %{name} = %{version}-%{release} +BuildArch: noarch +%description themes +A collection of sddm themes, including: elarun, maldives, maya + + +%prep +%autosetup -p1 %{?commitdate:-n sddm-%{commit}} -n sddm-%version + +%if 0%{?fedora} +#FIXME/TODO: use version on filesystem instead of using a bundled copy +cp -v /usr/share/backgrounds/default.png \ + src/greeter/theme/background.png +ls -sh src/greeter/theme/background.png +gm mogrify -resize 1920x1200 src/greeter/theme/background.png +ls -sh src/greeter/theme/background.png +%endif + + +%build +%cmake \ + -DBUILD_WITH_QT6:BOOL=ON \ + -DBUILD_MAN_PAGES:BOOL=ON \ + -DCMAKE_BUILD_TYPE:STRING="Release" \ + -DENABLE_JOURNALD:BOOL=ON \ + -DSESSION_COMMAND:PATH=/etc/X11/xinit/Xsession \ + -DWAYLAND_SESSION_COMMAND:PATH=/etc/sddm/wayland-session + +%cmake_build + + +%install +%cmake_install + +mkdir -p %{buildroot}%{_sysconfdir}/sddm.conf.d +mkdir -p %{buildroot}%{_prefix}/lib/sddm/sddm.conf.d +install -Dpm 644 %{SOURCE10} %{buildroot}%{_sysconfdir}/pam.d/sddm +install -Dpm 644 %{SOURCE11} %{buildroot}%{_sysconfdir}/pam.d/sddm-autologin +install -Dpm 644 %{SOURCE12} %{buildroot}%{_sysconfdir}/pam.d/sddm-greeter +install -Dpm 644 %{SOURCE13} %{buildroot}%{_sysconfdir}/sddm.conf +install -Dpm 644 %{SOURCE14} %{buildroot}%{_datadir}/sddm/scripts/README.scripts +install -Dpm 644 %{SOURCE15} %{buildroot}%{_sysconfdir}/sysconfig/sddm +%if %{with x11} +install -Dpm 644 %{SOURCE16} %{buildroot}%{_prefix}/lib/sddm/sddm.conf.d/x11.conf +%endif +mkdir -p %{buildroot}/run/sddm +mkdir -p %{buildroot}%{_localstatedir}/lib/sddm +mkdir -p %{buildroot}%{_sysconfdir}/sddm/ +cp -a %{buildroot}%{_datadir}/sddm/scripts/* \ + %{buildroot}%{_sysconfdir}/sddm/ +# we're using /etc/X11/xinit/Xsession (by default) instead +rm -fv %{buildroot}%{_sysconfdir}/sddm/Xsession + +# De-conflict the dbus file +mv %{buildroot}%{_datadir}/dbus-1/system.d/org.freedesktop.DisplayManager.conf \ + %{buildroot}%{_datadir}/dbus-1/system.d/org.freedesktop.DisplayManager-sddm.conf + +%if 0%{?fedora} && 0%{?fedora} < 43 +# Provide unversioned greeter until F40 is EOL +ln -sr %{buildroot}%{_bindir}/sddm-greeter-qt6 %{buildroot}%{_bindir}/sddm-greeter +%endif + + +%pre +%sysusers_create_compat %{SOURCE17} + +%post +%systemd_post sddm.service +# handle incompatible configuration changes +(grep \ + -e '^Current=fedora$' \ + -e '^\[XDisplay\]$' \ + -e '^\[WaylandDisplay\]$' \ + %{_sysconfdir}/sddm.conf > /dev/null && \ + sed -i.rpmsave \ + -e 's|^Current=fedora$|#Current=01-breeze-fedora|' \ + -e 's|^\[XDisplay\]$|\[X11\]|' \ + -e 's|^\[WaylandDisplay\]$|\[Wayland\]|' \ + %{_sysconfdir}/sddm.conf +) ||: + + +%preun +%systemd_preun sddm.service + + +%postun +%systemd_postun sddm.service + + +%files +%license LICENSE +%doc README.md CONTRIBUTORS +%dir %{_sysconfdir}/sddm/ +%dir %{_sysconfdir}/sddm.conf.d +%dir %{_prefix}/lib/sddm/sddm.conf.d +%config(noreplace) %{_sysconfdir}/sddm/* +%config(noreplace) %{_sysconfdir}/sddm.conf +%config(noreplace) %{_sysconfdir}/sysconfig/sddm +%config(noreplace) %{_sysconfdir}/pam.d/sddm* +%{_datadir}/dbus-1/system.d/org.freedesktop.DisplayManager-sddm.conf +%{_bindir}/sddm +%{_bindir}/sddm-greeter* +%{_libexecdir}/sddm-helper +%{_libexecdir}/sddm-helper-start-wayland +%{_libexecdir}/sddm-helper-start-x11user +%{_tmpfilesdir}/sddm.conf +%{_sysusersdir}/sddm.conf +%attr(0711, root, sddm) %dir /run/sddm +%attr(1770, sddm, sddm) %dir %{_localstatedir}/lib/sddm +%{_unitdir}/sddm.service +%{_qt6_archdatadir}/qml/SddmComponents/ +%dir %{_datadir}/sddm +%{_datadir}/sddm/faces/ +%{_datadir}/sddm/flags/ +%{_datadir}/sddm/scripts/ +%dir %{_datadir}/sddm/themes/ +# %%lang'ify? they're small, probably not worth it -- rex +%{_datadir}/sddm/translations*/ +%{_mandir}/man1/sddm.1* +%{_mandir}/man1/sddm-greeter.1* +%{_mandir}/man5/sddm.conf.5* +%{_mandir}/man5/sddm-state.conf.5* + + +%files wayland-generic +# No files since default configuration + + +%if %{with x11} +%files x11 +%{_prefix}/lib/sddm/sddm.conf.d/x11.conf +%endif + + +%files themes +%{_datadir}/sddm/themes/elarun/ +%{_datadir}/sddm/themes/maldives/ +%{_datadir}/sddm/themes/maya/ + + +%changelog +%autochangelog diff --git a/anda/desktops/sddm/update.rhai b/anda/desktops/sddm/update.rhai new file mode 100644 index 0000000000..857392fd70 --- /dev/null +++ b/anda/desktops/sddm/update.rhai @@ -0,0 +1 @@ +rpm.version(gh("sddm/sddm"));