From 39ecc45e5bdf8cf167b7b128e2c3473069bd5119 Mon Sep 17 00:00:00 2001 From: David Edmundson Date: Tue, 25 Jan 2022 22:29:31 +0000 Subject: [PATCH] [systemd] Fix logout issues It is important that we end plasma-core.target plasma-workspace.target and graphical-session.target when we log out. graphical-session in turn closes all other apps and daemons and prevents restarts. Handling it in systemd gives the least racey option. graphical-session used to be hanlded in the plasma-ksmserver service file, but this was removed in 5.24 in a refactor where it caused issues for Xwayland restarting. This patch reintroduces the sentinel programs to close down our target, which in turn take down the other targets. It also removes a complicated use of templates that in hindsight didn't really solve anything. BUG: 448492 Testing done: - logout of wayland shows all targets as inactive, logging in repeatedly works smoothly - logout of X11 behaves the same. - calling systemctl --user stop plasma-kwin_wayland.service closes the session - killing ksmserver on wayland does not close the session - killing ksmserver on X does --- startkde/startplasma.cpp | 4 ++-- startkde/systemd/CMakeLists.txt | 4 +++- startkde/systemd/plasma-core.target | 1 + startkde/systemd/plasma-workspace-wayland.target | 4 ++++ startkde/systemd/plasma-workspace-x11.target | 4 ++++ startkde/systemd/plasma-workspace.target | 8 ++++++++ startkde/systemd/plasma-workspace@.target | 6 ------ 7 files changed, 22 insertions(+), 9 deletions(-) create mode 100644 startkde/systemd/plasma-workspace-wayland.target create mode 100644 startkde/systemd/plasma-workspace-x11.target create mode 100644 startkde/systemd/plasma-workspace.target delete mode 100644 startkde/systemd/plasma-workspace@.target diff --git a/startkde/startplasma.cpp b/startkde/startplasma.cpp index 6a2a19567..49146c23d 100644 --- a/startkde/startplasma.cpp +++ b/startkde/startplasma.cpp @@ -529,7 +529,7 @@ bool useSystemdBoot() return true; } - if (!hasSystemdService(QStringLiteral("plasma-workspace@.target"))) { + if (!hasSystemdService(QStringLiteral("plasma-workspace.target"))) { return false; } @@ -633,7 +633,7 @@ bool startPlasmaSession(bool wayland) QStringLiteral("/org/freedesktop/systemd1"), QStringLiteral("org.freedesktop.systemd1.Manager"), QStringLiteral("StartUnit")); - msg << QStringLiteral("plasma-workspace@%1.target").arg(platform) << QStringLiteral("fail"); + msg << QStringLiteral("plasma-workspace-%1.target").arg(platform) << QStringLiteral("fail"); QDBusReply reply = QDBusConnection::sessionBus().call(msg); if (!reply.isValid()) { qWarning() << "Could not start systemd managed Plasma session:" << reply.error().name() << reply.error().message(); diff --git a/startkde/systemd/CMakeLists.txt b/startkde/systemd/CMakeLists.txt index 89480801f..419c184d4 100644 --- a/startkde/systemd/CMakeLists.txt +++ b/startkde/systemd/CMakeLists.txt @@ -2,7 +2,9 @@ ecm_install_configured_files(INPUT plasma-ksplash-ready.service.in @ONLY DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) install(FILES plasma-core.target DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) -install(FILES plasma-workspace@.target DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) +install(FILES plasma-workspace.target DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) +install(FILES plasma-workspace-wayland.target DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) +install(FILES plasma-workspace-x11.target DESTINATION ${KDE_INSTALL_SYSTEMDUSERUNITDIR}) add_executable(kde-systemd-start-condition kde-systemd-start-condition.cpp) target_link_libraries(kde-systemd-start-condition PUBLIC KF5::ConfigCore KF5::Service PlasmaAutostart) diff --git a/startkde/systemd/plasma-core.target b/startkde/systemd/plasma-core.target index 8f020b4ca..4cc4cb218 100644 --- a/startkde/systemd/plasma-core.target +++ b/startkde/systemd/plasma-core.target @@ -4,3 +4,4 @@ Wants=plasma-plasmashell.service plasma-kcminit.service plasma-kded.service plas Requires=plasma-ksmserver.service After=graphical-session-pre.target plasma-kwin_wayland.service RefuseManualStart=yes +StopWhenUnneeded=true diff --git a/startkde/systemd/plasma-workspace-wayland.target b/startkde/systemd/plasma-workspace-wayland.target new file mode 100644 index 000000000..d960413fe --- /dev/null +++ b/startkde/systemd/plasma-workspace-wayland.target @@ -0,0 +1,4 @@ +[Unit] +Requires=plasma-workspace.target +Requires=plasma-kwin_wayland.service +BindsTo=plasma-kwin_wayland.service diff --git a/startkde/systemd/plasma-workspace-x11.target b/startkde/systemd/plasma-workspace-x11.target new file mode 100644 index 000000000..154b0a0bb --- /dev/null +++ b/startkde/systemd/plasma-workspace-x11.target @@ -0,0 +1,4 @@ +[Unit] +Wants=plasma-kwin_x11.service +Requires=plasma-workspace.target +BindsTo=plasma-ksmserver.service diff --git a/startkde/systemd/plasma-workspace.target b/startkde/systemd/plasma-workspace.target new file mode 100644 index 000000000..7c5fa6ad5 --- /dev/null +++ b/startkde/systemd/plasma-workspace.target @@ -0,0 +1,8 @@ +[Unit] +Description=KDE Plasma Workspace +Requires=plasma-core.target graphical-session.target +Wants=plasma-restoresession.service plasma-xembedsniproxy.service plasma-gmenudbusmenuproxy.service plasma-powerdevil.service plasma-ksplash-ready.service plasma-polkit-agent.service kde-baloo.service plasma-foreground-booster.service plasma-kwallet-pam.service xdg-desktop-autostart.target +BindsTo=graphical-session.target +Before=graphical-session.target xdg-desktop-autostart.target plasma-ksplash-ready.service plasma-restoresession.service +RefuseManualStart=yes +StopWhenUnneeded=true diff --git a/startkde/systemd/plasma-workspace@.target b/startkde/systemd/plasma-workspace@.target deleted file mode 100644 index c5d448fe5..000000000 --- a/startkde/systemd/plasma-workspace@.target +++ /dev/null @@ -1,6 +0,0 @@ -[Unit] -Description=KDE Plasma Workspace -Requires=plasma-core.target graphical-session.target -Wants=plasma-kwin_%i.service plasma-restoresession.service plasma-xembedsniproxy.service plasma-gmenudbusmenuproxy.service plasma-powerdevil.service plasma-ksplash-ready.service plasma-polkit-agent.service kde-baloo.service plasma-foreground-booster.service plasma-kwallet-pam.service xdg-desktop-autostart.target -BindsTo=graphical-session.target -Before=graphical-session.target xdg-desktop-autostart.target plasma-ksplash-ready.service plasma-restoresession.service