summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--meson.build15
-rw-r--r--meson_options.txt1
-rw-r--r--plugins/a11y-settings/gsd-a11y-settings.service.in18
-rw-r--r--plugins/a11y-settings/gsd-a11y-settings.target.in10
-rw-r--r--plugins/a11y-settings/org.gnome.SettingsDaemon.A11ySettings.desktop.in1
-rw-r--r--plugins/color/gsd-color.service.in19
-rw-r--r--plugins/color/gsd-color.target.in10
-rw-r--r--plugins/color/org.gnome.SettingsDaemon.Color.desktop.in1
-rw-r--r--plugins/common/daemon-skeleton-gtk.h49
-rw-r--r--plugins/common/daemon-skeleton.h46
-rw-r--r--plugins/datetime/gsd-datetime.service.in18
-rw-r--r--plugins/datetime/gsd-datetime.target.in13
-rw-r--r--plugins/datetime/org.gnome.SettingsDaemon.Datetime.desktop.in1
-rw-r--r--plugins/dummy/gsd-dummy.service.in18
-rw-r--r--plugins/dummy/gsd-dummy.target.in28
-rw-r--r--plugins/dummy/org.gnome.SettingsDaemon.Dummy.desktop.in1
-rw-r--r--plugins/housekeeping/gsd-housekeeping.service.in18
-rw-r--r--plugins/housekeeping/gsd-housekeeping.target.in13
-rw-r--r--plugins/housekeeping/org.gnome.SettingsDaemon.Housekeeping.desktop.in1
-rw-r--r--plugins/keyboard/gsd-keyboard.service.in18
-rw-r--r--plugins/keyboard/gsd-keyboard.target.in10
-rw-r--r--plugins/keyboard/org.gnome.SettingsDaemon.Keyboard.desktop.in1
-rw-r--r--plugins/media-keys/gsd-media-keys.service.in18
-rw-r--r--plugins/media-keys/gsd-media-keys.target.in10
-rw-r--r--plugins/media-keys/org.gnome.SettingsDaemon.MediaKeys.desktop.in1
-rwxr-xr-xplugins/meson-add-wants.sh30
-rw-r--r--plugins/meson.build68
-rw-r--r--plugins/power/gsd-power.service.in18
-rw-r--r--plugins/power/gsd-power.target.in10
-rw-r--r--plugins/power/org.gnome.SettingsDaemon.Power.desktop.in1
-rw-r--r--plugins/print-notifications/gsd-print-notifications.service.in18
-rw-r--r--plugins/print-notifications/gsd-print-notifications.target.in10
-rw-r--r--plugins/print-notifications/org.gnome.SettingsDaemon.PrintNotifications.desktop.in1
-rw-r--r--plugins/rfkill/gsd-rfkill.service.in18
-rw-r--r--plugins/rfkill/gsd-rfkill.target.in10
-rw-r--r--plugins/rfkill/org.gnome.SettingsDaemon.Rfkill.desktop.in1
-rw-r--r--plugins/screensaver-proxy/gsd-screensaver-proxy.service.in18
-rw-r--r--plugins/screensaver-proxy/gsd-screensaver-proxy.target.in13
-rw-r--r--plugins/screensaver-proxy/org.gnome.SettingsDaemon.ScreensaverProxy.desktop.in1
-rw-r--r--plugins/sharing/gsd-sharing.service.in18
-rw-r--r--plugins/sharing/gsd-sharing.target.in13
-rw-r--r--plugins/sharing/org.gnome.SettingsDaemon.Sharing.desktop.in1
-rw-r--r--plugins/smartcard/gsd-smartcard.service.in18
-rw-r--r--plugins/smartcard/gsd-smartcard.target.in17
-rw-r--r--plugins/smartcard/org.gnome.SettingsDaemon.Smartcard.desktop.in1
-rw-r--r--plugins/sound/gsd-sound.service.in18
-rw-r--r--plugins/sound/gsd-sound.target.in14
-rw-r--r--plugins/sound/org.gnome.SettingsDaemon.Sound.desktop.in1
-rw-r--r--plugins/wacom/gsd-wacom.service.in18
-rw-r--r--plugins/wacom/gsd-wacom.target.in16
-rw-r--r--plugins/wacom/org.gnome.SettingsDaemon.Wacom.desktop.in1
-rw-r--r--plugins/wwan/gsd-wwan.service.in18
-rw-r--r--plugins/wwan/gsd-wwan.target.in10
-rw-r--r--plugins/wwan/org.gnome.SettingsDaemon.Wwan.desktop.in1
-rw-r--r--plugins/xsettings/gsd-xsettings.service.in18
-rw-r--r--plugins/xsettings/gsd-xsettings.target.in16
-rw-r--r--plugins/xsettings/org.gnome.SettingsDaemon.XSettings.desktop.in1
57 files changed, 668 insertions, 88 deletions
diff --git a/meson.build b/meson.build
index 1cf16b3a..1a5a312d 100644
--- a/meson.build
+++ b/meson.build
@@ -102,6 +102,18 @@ polkit_gobject_dep = dependency('polkit-gobject-1', version: '>= 0.114')
upower_glib_dep = dependency('upower-glib', version: '>= 0.99.8')
x11_dep = dependency('x11')
+enable_systemd = get_option('systemd')
+if enable_systemd
+ systemd_dep = dependency('systemd', required: false)
+ assert(systemd_dep.found(), 'Systemd support explicitly required, but systemd not found')
+
+ # XXX: Once https://github.com/systemd/systemd/issues/9595 is fixed and we can
+ # depend on this version, replace with something like:
+ # systemduserunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir')
+ # and uncomment systemd_dep below
+ systemd_userunitdir = join_paths(gsd_prefix, 'lib', 'systemd', 'user')
+endif
+
m_dep = cc.find_library('m')
# ALSA integration (default enabled)
@@ -252,6 +264,9 @@ output += ' RFKill support: ' + enable_rfkill.to_string() + '\n
if enable_smartcard
output += ' System nssdb: ' + system_nssdb_dir + '\n'
endif
+if enable_systemd
+ output += ' Systemd user unit dir: ' + systemd_userunitdir + '\n'
+endif
if enable_rfkill
output += ' udev dir: ' + udev_dir + '\n'
endif
diff --git a/meson_options.txt b/meson_options.txt
index 7da7421a..542c3b28 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,5 +1,6 @@
option('nssdb_dir', type: 'string', value: '', description: 'Absolute path to the system NSS database directory')
option('udev_dir', type: 'string', value: '', description: 'Absolute path of the udev base directory')
+option('systemd', type: 'boolean', value: true, description: 'Enable systemd integration')
option('alsa', type: 'boolean', value: true, description: 'build with ALSA support (not optional on Linux platforms)')
option('gudev', type: 'boolean', value: true, description: 'build with gudev device support (not optional on Linux platforms)')
diff --git a/plugins/a11y-settings/gsd-a11y-settings.service.in b/plugins/a11y-settings/gsd-a11y-settings.service.in
new file mode 100644
index 00000000..d5fa3792
--- /dev/null
+++ b/plugins/a11y-settings/gsd-a11y-settings.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Accessibility settings
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-a11y-settings.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-a11y-settings
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/a11y-settings/gsd-a11y-settings.target.in b/plugins/a11y-settings/gsd-a11y-settings.target.in
new file mode 100644
index 00000000..638d2f70
--- /dev/null
+++ b/plugins/a11y-settings/gsd-a11y-settings.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Accessibility settings
+
+BindsTo=gsd-a11y-settings.service
+After=gsd-a11y-settings.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/a11y-settings/org.gnome.SettingsDaemon.A11ySettings.desktop.in b/plugins/a11y-settings/org.gnome.SettingsDaemon.A11ySettings.desktop.in
index 2f0ac936..02faf401 100644
--- a/plugins/a11y-settings/org.gnome.SettingsDaemon.A11ySettings.desktop.in
+++ b/plugins/a11y-settings/org.gnome.SettingsDaemon.A11ySettings.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/color/gsd-color.service.in b/plugins/color/gsd-color.service.in
new file mode 100644
index 00000000..b51b5e4e
--- /dev/null
+++ b/plugins/color/gsd-color.service.in
@@ -0,0 +1,19 @@
+[Unit]
+Description=GNOME Color management
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-color.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-color
+Restart=on-failure
+BusName=@plugin_dbus_name@
+
diff --git a/plugins/color/gsd-color.target.in b/plugins/color/gsd-color.target.in
new file mode 100644
index 00000000..fe27b65c
--- /dev/null
+++ b/plugins/color/gsd-color.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Color management
+
+BindsTo=gsd-color.service
+After=gsd-color.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/color/org.gnome.SettingsDaemon.Color.desktop.in b/plugins/color/org.gnome.SettingsDaemon.Color.desktop.in
index a9d72231..6cf58d41 100644
--- a/plugins/color/org.gnome.SettingsDaemon.Color.desktop.in
+++ b/plugins/color/org.gnome.SettingsDaemon.Color.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/common/daemon-skeleton-gtk.h b/plugins/common/daemon-skeleton-gtk.h
index 6253c44c..87bafb3d 100644
--- a/plugins/common/daemon-skeleton-gtk.h
+++ b/plugins/common/daemon-skeleton-gtk.h
@@ -40,37 +40,6 @@ static GOptionEntry entries[] = {
{NULL}
};
-static const char *gdm_helpers[] = {
- "a11y-keyboard",
- "a11y-settings",
- "clipboard",
- "color",
- "keyboard",
- "media-keys",
- "power",
- "smartcard",
- "sound",
- "xsettings",
- "wacom",
-};
-
-static gboolean
-should_run (void)
-{
- const char *session_mode;
- guint i;
-
- session_mode = g_getenv ("GNOME_SHELL_SESSION_MODE");
- if (g_strcmp0 (session_mode, "gdm") != 0)
- return TRUE;
-
- for (i = 0; i < G_N_ELEMENTS (gdm_helpers); i++) {
- if (g_str_equal (PLUGIN_NAME, gdm_helpers[i]))
- return TRUE;
- }
- return FALSE;
-}
-
static void
respond_to_end_session (GDBusProxy *proxy)
{
@@ -242,7 +211,7 @@ name_lost_cb (GDBusConnection *connection,
int
main (int argc, char **argv)
{
- GError *error;
+ GError *error = NULL;
guint name_own_id;
bindtextdomain (GETTEXT_PACKAGE, GNOME_SETTINGS_LOCALEDIR);
@@ -291,14 +260,11 @@ main (int argc, char **argv)
manager = NEW ();
register_with_gnome_session ();
- if (should_run ()) {
- error = NULL;
- if (!START (manager, &error)) {
- fprintf (stderr, "Failed to start: %s\n", error->message);
- g_error_free (error);
- exit (1);
- }
- }
+ if (!START (manager, &error)) {
+ fprintf (stderr, "Failed to start: %s\n", error->message);
+ g_error_free (error);
+ exit (1);
+ }
name_own_id = g_bus_own_name (G_BUS_TYPE_SESSION,
PLUGIN_DBUS_NAME,
@@ -311,8 +277,7 @@ main (int argc, char **argv)
gtk_main ();
- if (should_run ())
- STOP (manager);
+ STOP (manager);
g_object_unref (manager);
g_bus_unown_name (name_own_id);
diff --git a/plugins/common/daemon-skeleton.h b/plugins/common/daemon-skeleton.h
index 49a3d930..40b7f149 100644
--- a/plugins/common/daemon-skeleton.h
+++ b/plugins/common/daemon-skeleton.h
@@ -43,36 +43,6 @@ static GOptionEntry entries[] = {
{NULL}
};
-static const char *gdm_helpers[] = {
- "a11y-keyboard",
- "a11y-settings",
- "clipboard",
- "color",
- "keyboard",
- "media-keys",
- "power",
- "smartcard",
- "sound",
- "xsettings"
-};
-
-static gboolean
-should_run (void)
-{
- const char *session_mode;
- guint i;
-
- session_mode = g_getenv ("GNOME_SHELL_SESSION_MODE");
- if (g_strcmp0 (session_mode, "gdm") != 0)
- return TRUE;
-
- for (i = 0; i < G_N_ELEMENTS (gdm_helpers); i++) {
- if (g_str_equal (PLUGIN_NAME, gdm_helpers[i]))
- return TRUE;
- }
- return FALSE;
-}
-
static void
respond_to_end_session (GDBusProxy *proxy)
{
@@ -268,14 +238,11 @@ main (int argc, char **argv)
manager = NEW ();
register_with_gnome_session (loop);
- if (should_run ()) {
- error = NULL;
- if (!START (manager, &error)) {
- fprintf (stderr, "Failed to start: %s\n", error->message);
- g_error_free (error);
- exit (1);
- }
- }
+ if (!START (manager, &error)) {
+ fprintf (stderr, "Failed to start: %s\n", error->message);
+ g_error_free (error);
+ exit (1);
+ }
name_own_id = g_bus_own_name (G_BUS_TYPE_SESSION,
PLUGIN_DBUS_NAME,
@@ -288,8 +255,7 @@ main (int argc, char **argv)
g_main_loop_run (loop);
- if (should_run ())
- STOP (manager);
+ STOP (manager);
g_object_unref (manager);
g_bus_unown_name (name_own_id);
diff --git a/plugins/datetime/gsd-datetime.service.in b/plugins/datetime/gsd-datetime.service.in
new file mode 100644
index 00000000..980a6c91
--- /dev/null
+++ b/plugins/datetime/gsd-datetime.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Date & Time handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-datetime.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-datetime
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/datetime/gsd-datetime.target.in b/plugins/datetime/gsd-datetime.target.in
new file mode 100644
index 00000000..88df818c
--- /dev/null
+++ b/plugins/datetime/gsd-datetime.target.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=GNOME Date & Time handling
+
+BindsTo=gsd-datetime.service
+After=gsd-datetime.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+Conflicts=gnome-session@gnome-login.target
+Conflicts=gnome-session@gnome-initial-setup.target
diff --git a/plugins/datetime/org.gnome.SettingsDaemon.Datetime.desktop.in b/plugins/datetime/org.gnome.SettingsDaemon.Datetime.desktop.in
index ac99312f..567b9a0a 100644
--- a/plugins/datetime/org.gnome.SettingsDaemon.Datetime.desktop.in
+++ b/plugins/datetime/org.gnome.SettingsDaemon.Datetime.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/dummy/gsd-dummy.service.in b/plugins/dummy/gsd-dummy.service.in
new file mode 100644
index 00000000..554df09c
--- /dev/null
+++ b/plugins/dummy/gsd-dummy.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Settings Daemon dummy replacement plugin (@pluginname@)
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-dummy.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-dummy --dummy-name=@pluginname@
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/dummy/gsd-dummy.target.in b/plugins/dummy/gsd-dummy.target.in
new file mode 100644
index 00000000..bf680ef0
--- /dev/null
+++ b/plugins/dummy/gsd-dummy.target.in
@@ -0,0 +1,28 @@
+[Unit]
+Description=GNOME Settings Daemon dummy replacement plugin (@pluginname@)
+
+BindsTo=gsd-dummy.service
+After=gsd-dummy.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+# See require-started.target on how to require another unit to be already running
+# See dependency.target on how to start a dependency and require it to be present
+#
+#Requisite=require-started.target
+#After=require-started.target
+#PartOf=require-started.target
+#Requires=dependency.target
+#After=dependency.target
+#
+# Also add PartOf if this unit should be stopped together with dependency.target
+#PartOf=dependency.target
+
+# This is what the install section would look like, but we create the symlinks
+# through meson
+#[Install]
+#WantedBy=gnome-session-initialized.target
+##WantedBy=require-started.target
diff --git a/plugins/dummy/org.gnome.SettingsDaemon.Dummy.desktop.in b/plugins/dummy/org.gnome.SettingsDaemon.Dummy.desktop.in
index fa80c87d..a946da92 100644
--- a/plugins/dummy/org.gnome.SettingsDaemon.Dummy.desktop.in
+++ b/plugins/dummy/org.gnome.SettingsDaemon.Dummy.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/housekeeping/gsd-housekeeping.service.in b/plugins/housekeeping/gsd-housekeeping.service.in
new file mode 100644
index 00000000..176e24d2
--- /dev/null
+++ b/plugins/housekeeping/gsd-housekeeping.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Maintenance of expirable data
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-housekeeping.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-housekeeping
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/housekeeping/gsd-housekeeping.target.in b/plugins/housekeeping/gsd-housekeeping.target.in
new file mode 100644
index 00000000..5b70f267
--- /dev/null
+++ b/plugins/housekeeping/gsd-housekeeping.target.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=GNOME Maintenance of expirable data
+
+BindsTo=gsd-housekeeping.service
+After=gsd-housekeeping.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+Conflicts=gnome-session@gnome-login.target
+Conflicts=gnome-session@gnome-initial-setup.target
diff --git a/plugins/housekeeping/org.gnome.SettingsDaemon.Housekeeping.desktop.in b/plugins/housekeeping/org.gnome.SettingsDaemon.Housekeeping.desktop.in
index a557ff04..e13d3669 100644
--- a/plugins/housekeeping/org.gnome.SettingsDaemon.Housekeeping.desktop.in
+++ b/plugins/housekeeping/org.gnome.SettingsDaemon.Housekeeping.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/keyboard/gsd-keyboard.service.in b/plugins/keyboard/gsd-keyboard.service.in
new file mode 100644
index 00000000..095468ee
--- /dev/null
+++ b/plugins/keyboard/gsd-keyboard.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Keyboard handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-keyboard.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-keyboard
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/keyboard/gsd-keyboard.target.in b/plugins/keyboard/gsd-keyboard.target.in
new file mode 100644
index 00000000..f46cfce3
--- /dev/null
+++ b/plugins/keyboard/gsd-keyboard.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Keyboard handling
+
+BindsTo=gsd-keyboard.service
+After=gsd-keyboard.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/keyboard/org.gnome.SettingsDaemon.Keyboard.desktop.in b/plugins/keyboard/org.gnome.SettingsDaemon.Keyboard.desktop.in
index 9cf0fbd4..1e9e063a 100644
--- a/plugins/keyboard/org.gnome.SettingsDaemon.Keyboard.desktop.in
+++ b/plugins/keyboard/org.gnome.SettingsDaemon.Keyboard.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/media-keys/gsd-media-keys.service.in b/plugins/media-keys/gsd-media-keys.service.in
new file mode 100644
index 00000000..0b715b6b
--- /dev/null
+++ b/plugins/media-keys/gsd-media-keys.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Media keys handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-media-keys.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-media-keys
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/media-keys/gsd-media-keys.target.in b/plugins/media-keys/gsd-media-keys.target.in
new file mode 100644
index 00000000..519738bb
--- /dev/null
+++ b/plugins/media-keys/gsd-media-keys.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Media keys handling
+
+BindsTo=gsd-media-keys.service
+After=gsd-media-keys.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/media-keys/org.gnome.SettingsDaemon.MediaKeys.desktop.in b/plugins/media-keys/org.gnome.SettingsDaemon.MediaKeys.desktop.in
index de53c3f1..58f4cf4e 100644
--- a/plugins/media-keys/org.gnome.SettingsDaemon.MediaKeys.desktop.in
+++ b/plugins/media-keys/org.gnome.SettingsDaemon.MediaKeys.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/meson-add-wants.sh b/plugins/meson-add-wants.sh
new file mode 100755
index 00000000..c33d1b4f
--- /dev/null
+++ b/plugins/meson-add-wants.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+set -eu
+
+# Script copied from systemd
+
+unitdir="$1"
+target="$2"
+unit="$3"
+
+case "$target" in
+ */?*) # a path, but not just a slash at the end
+ dir="${DESTDIR:-}${target}"
+ ;;
+ *)
+ dir="${DESTDIR:-}${unitdir}/${target}"
+ ;;
+esac
+
+unitpath="${DESTDIR:-}${unitdir}/${unit}"
+
+case "$target" in
+ */)
+ mkdir -vp -m 0755 "$dir"
+ ;;
+ *)
+ mkdir -vp -m 0755 "$(dirname "$dir")"
+ ;;
+esac
+
+ln -vfs --relative "$unitpath" "$dir"
diff --git a/plugins/meson.build b/plugins/meson.build
index a8a39e40..547e8bdb 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -1,6 +1,6 @@
enabled_plugins = [
- ['a11y-settings', 'A11ySettings'],
- ['color', 'Color'],
+ ['a11y-settings', 'A11ySettings', ''],
+ ['color', 'Color', ''],
['datetime', 'Datetime'],
['dummy', ''],
['power', 'Power'],
@@ -18,7 +18,7 @@ if enable_smartcard
endif
if enable_wacom
- enabled_plugins += [['wacom', 'Wacom']]
+ enabled_plugins += [['wacom', 'Wacom', 'wacom.target.wants/']]
endif
if enable_cups
@@ -33,33 +33,89 @@ if enable_wwan
enabled_plugins += [['wwan', 'Wwan']]
endif
+plugin_install_extra_wants = {
+# 'dummy': ['required-started.target.wants/'],
+# 'xsettings': ['gnome-session-x11.target.wants/'],
+# 'wacom': ['wacom.target.wants/'],
+# 'smartcard': ['smartcard.target.wants/'],
+}
+
plugins_conf = configuration_data()
plugins_conf.set('libexecdir', gsd_libexecdir)
+plugins_conf.set('systemd_hidden', enable_systemd ? 'true' : 'false')
plugins_deps = [libgsd_dep]
plugins_cflags = ['-DGNOME_SETTINGS_LOCALEDIR="@0@"'.format(gsd_localedir)]
+enabled_plugins_file = []
+
foreach plugin: [['common', '']] + enabled_plugins
plugin_name = plugin[0]
- plugin_dbus_name = plugin[1]
+ desktop = 'org.gnome.SettingsDaemon.@0@.desktop'.format(plugin[1])
+
+ if plugin[1] == '' # common or dummy
+ desktop_in_file = ''
+ else
+ desktop_in_file = files(join_paths(plugin_name, desktop + '.in'))
+ endif
+
+ enabled_plugins_file += [[plugin_name, plugin[1], desktop_in_file]]
+endforeach
+
+foreach plugin: enabled_plugins_file
+ plugin_name = plugin[0]
+ plugin_name_case = plugin[1]
+ plugin_dbus_name='org.gnome.SettingsDaemon.@0@'.format(plugin_name_case)
cflags = [
'-DG_LOG_DOMAIN="@0@-plugin"'.format(plugin_name),
'-DPLUGIN_NAME="@0@"'.format(plugin_name),
- '-DPLUGIN_DBUS_NAME="org.gnome.SettingsDaemon.@0@"'.format(plugin_dbus_name),
+ '-DPLUGIN_DBUS_NAME="@0@"'.format(plugin_dbus_name),
] + plugins_cflags
if not ['common', 'dummy'].contains(plugin_name)
desktop = 'org.gnome.SettingsDaemon.@0@.desktop'.format(plugin[1])
+ desktop_in_file = plugin[2]
+ user_target = 'gsd-@0@.target'.format(plugin_name)
+ user_service = 'gsd-@0@.service'.format(plugin_name)
+
+ unit_conf = configuration_data()
+ unit_conf.set('libexecdir', gsd_libexecdir)
+ unit_conf.set('plugin_dbus_name', plugin_dbus_name)
configure_file(
- input: join_paths(plugin_name, desktop + '.in'),
+ input: desktop_in_file,
output: desktop,
configuration: plugins_conf,
install: true,
install_dir: gsd_xdg_autostart
)
+ if enable_systemd
+ configure_file(
+ input: join_paths(plugin_name, user_service + '.in'),
+ output: user_service,
+ configuration: unit_conf,
+ install: true,
+ install_dir: systemd_userunitdir
+ )
+ configure_file(
+ input: join_paths(plugin_name, user_target + '.in'),
+ output: user_target,
+ configuration: unit_conf,
+ install: true,
+ install_dir: systemd_userunitdir
+ )
+
+ wants = ['gnome-session-initialized.target.wants/']
+ if plugin_name in plugin_install_extra_wants
+ wants += [plugin_install_extra_wants[plugin_name]]
+ endif
+
+ foreach target: wants
+ meson.add_install_script('meson-add-wants.sh', systemd_userunitdir, target, user_target)
+ endforeach
+ endif
endif
subdir(plugin_name)
diff --git a/plugins/power/gsd-power.service.in b/plugins/power/gsd-power.service.in
new file mode 100644
index 00000000..c1c57add
--- /dev/null
+++ b/plugins/power/gsd-power.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Power management handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-power.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-power
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/power/gsd-power.target.in b/plugins/power/gsd-power.target.in
new file mode 100644
index 00000000..bfc12811
--- /dev/null
+++ b/plugins/power/gsd-power.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Power management handling
+
+BindsTo=gsd-power.service
+After=gsd-power.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/power/org.gnome.SettingsDaemon.Power.desktop.in b/plugins/power/org.gnome.SettingsDaemon.Power.desktop.in
index 82d1505d..81db05ff 100644
--- a/plugins/power/org.gnome.SettingsDaemon.Power.desktop.in
+++ b/plugins/power/org.gnome.SettingsDaemon.Power.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/print-notifications/gsd-print-notifications.service.in b/plugins/print-notifications/gsd-print-notifications.service.in
new file mode 100644
index 00000000..6504c69b
--- /dev/null
+++ b/plugins/print-notifications/gsd-print-notifications.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Printer notifications
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-print-notifications.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-print-notifications
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/print-notifications/gsd-print-notifications.target.in b/plugins/print-notifications/gsd-print-notifications.target.in
new file mode 100644
index 00000000..90e63492
--- /dev/null
+++ b/plugins/print-notifications/gsd-print-notifications.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME Printer notifications
+
+BindsTo=gsd-print-notifications.service
+After=gsd-print-notifications.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/print-notifications/org.gnome.SettingsDaemon.PrintNotifications.desktop.in b/plugins/print-notifications/org.gnome.SettingsDaemon.PrintNotifications.desktop.in
index bbcd6abb..146cc16e 100644
--- a/plugins/print-notifications/org.gnome.SettingsDaemon.PrintNotifications.desktop.in
+++ b/plugins/print-notifications/org.gnome.SettingsDaemon.PrintNotifications.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/rfkill/gsd-rfkill.service.in b/plugins/rfkill/gsd-rfkill.service.in
new file mode 100644
index 00000000..3dbb5150
--- /dev/null
+++ b/plugins/rfkill/gsd-rfkill.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME RFKill handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-rfkill.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-rfkill
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/rfkill/gsd-rfkill.target.in b/plugins/rfkill/gsd-rfkill.target.in
new file mode 100644
index 00000000..8fca6efe
--- /dev/null
+++ b/plugins/rfkill/gsd-rfkill.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME RFKill handling
+
+BindsTo=gsd-rfkill.service
+After=gsd-rfkill.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/rfkill/org.gnome.SettingsDaemon.Rfkill.desktop.in b/plugins/rfkill/org.gnome.SettingsDaemon.Rfkill.desktop.in
index baa845b6..2607dd00 100644
--- a/plugins/rfkill/org.gnome.SettingsDaemon.Rfkill.desktop.in
+++ b/plugins/rfkill/org.gnome.SettingsDaemon.Rfkill.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/screensaver-proxy/gsd-screensaver-proxy.service.in b/plugins/screensaver-proxy/gsd-screensaver-proxy.service.in
new file mode 100644
index 00000000..bd90ced6
--- /dev/null
+++ b/plugins/screensaver-proxy/gsd-screensaver-proxy.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Freedesktop screensaver handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-screensaver-proxy.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-screensaver-proxy
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/screensaver-proxy/gsd-screensaver-proxy.target.in b/plugins/screensaver-proxy/gsd-screensaver-proxy.target.in
new file mode 100644
index 00000000..71a604b7
--- /dev/null
+++ b/plugins/screensaver-proxy/gsd-screensaver-proxy.target.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=GNOME Freedesktop screensaver handling
+
+BindsTo=gsd-screensaver-proxy.service
+After=gsd-screensaver-proxy.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+Conflicts=gnome-session@gnome-login.target
+Conflicts=gnome-session@gnome-initial-setup.target
diff --git a/plugins/screensaver-proxy/org.gnome.SettingsDaemon.ScreensaverProxy.desktop.in b/plugins/screensaver-proxy/org.gnome.SettingsDaemon.ScreensaverProxy.desktop.in
index 43822fb4..97a339f0 100644
--- a/plugins/screensaver-proxy/org.gnome.SettingsDaemon.ScreensaverProxy.desktop.in
+++ b/plugins/screensaver-proxy/org.gnome.SettingsDaemon.ScreensaverProxy.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/sharing/gsd-sharing.service.in b/plugins/sharing/gsd-sharing.service.in
new file mode 100644
index 00000000..f4572482
--- /dev/null
+++ b/plugins/sharing/gsd-sharing.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Sharing handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-sharing.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-sharing
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/sharing/gsd-sharing.target.in b/plugins/sharing/gsd-sharing.target.in
new file mode 100644
index 00000000..f33f0620
--- /dev/null
+++ b/plugins/sharing/gsd-sharing.target.in
@@ -0,0 +1,13 @@
+[Unit]
+Description=GNOME Sharing handling
+
+BindsTo=gsd-sharing.service
+After=gsd-sharing.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+Conflicts=gnome-session@gnome-login.target
+Conflicts=gnome-session@gnome-initial-setup.target
diff --git a/plugins/sharing/org.gnome.SettingsDaemon.Sharing.desktop.in b/plugins/sharing/org.gnome.SettingsDaemon.Sharing.desktop.in
index 891ba205..dd5dc72b 100644
--- a/plugins/sharing/org.gnome.SettingsDaemon.Sharing.desktop.in
+++ b/plugins/sharing/org.gnome.SettingsDaemon.Sharing.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/smartcard/gsd-smartcard.service.in b/plugins/smartcard/gsd-smartcard.service.in
new file mode 100644
index 00000000..e8a5a6a0
--- /dev/null
+++ b/plugins/smartcard/gsd-smartcard.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Smartcard handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-smartcard.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-smartcard
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/smartcard/gsd-smartcard.target.in b/plugins/smartcard/gsd-smartcard.target.in
new file mode 100644
index 00000000..0853e311
--- /dev/null
+++ b/plugins/smartcard/gsd-smartcard.target.in
@@ -0,0 +1,17 @@
+[Unit]
+Description=GNOME Smartcard handling
+
+BindsTo=gsd-smartcard.service
+After=gsd-smartcard.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+# Start when smartcard hardware is present (requires systemd v234)
+# https://github.com/systemd/systemd/issues/12330
+#Requisite=smartcard.target
+#After=smartcard.target
+#PartOf=smartcard.target
+# When done, also add the target to the meson.build file!
diff --git a/plugins/smartcard/org.gnome.SettingsDaemon.Smartcard.desktop.in b/plugins/smartcard/org.gnome.SettingsDaemon.Smartcard.desktop.in
index 71d058c2..9c5f3458 100644
--- a/plugins/smartcard/org.gnome.SettingsDaemon.Smartcard.desktop.in
+++ b/plugins/smartcard/org.gnome.SettingsDaemon.Smartcard.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/sound/gsd-sound.service.in b/plugins/sound/gsd-sound.service.in
new file mode 100644
index 00000000..2babe33d
--- /dev/null
+++ b/plugins/sound/gsd-sound.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Sound sample caching handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-sound.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-sound
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/sound/gsd-sound.target.in b/plugins/sound/gsd-sound.target.in
new file mode 100644
index 00000000..2f18d163
--- /dev/null
+++ b/plugins/sound/gsd-sound.target.in
@@ -0,0 +1,14 @@
+[Unit]
+Description=GNOME Sound sample caching handling
+
+BindsTo=gsd-sound.service
+After=gsd-sound.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+Requires=pulseaudio.service
+After=pulseaudio.service
+# Keep running when pulseaudio.service stops
diff --git a/plugins/sound/org.gnome.SettingsDaemon.Sound.desktop.in b/plugins/sound/org.gnome.SettingsDaemon.Sound.desktop.in
index 2048b01b..4701a2a0 100644
--- a/plugins/sound/org.gnome.SettingsDaemon.Sound.desktop.in
+++ b/plugins/sound/org.gnome.SettingsDaemon.Sound.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/wacom/gsd-wacom.service.in b/plugins/wacom/gsd-wacom.service.in
new file mode 100644
index 00000000..56cf0f7e
--- /dev/null
+++ b/plugins/wacom/gsd-wacom.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME Wacom handling
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-wacom.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-wacom
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/wacom/gsd-wacom.target.in b/plugins/wacom/gsd-wacom.target.in
new file mode 100644
index 00000000..051dec72
--- /dev/null
+++ b/plugins/wacom/gsd-wacom.target.in
@@ -0,0 +1,16 @@
+[Unit]
+Description=GNOME Wacom handling
+
+BindsTo=gsd-wacom.service
+After=gsd-wacom.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+# Use the following once wacom.target or similar exists
+#Requisite=wacom.target
+#After=wacom.target
+#PartOf=wacom.target
+# When done, also add the target to the meson.build file!
diff --git a/plugins/wacom/org.gnome.SettingsDaemon.Wacom.desktop.in b/plugins/wacom/org.gnome.SettingsDaemon.Wacom.desktop.in
index efa5bf00..c10b461c 100644
--- a/plugins/wacom/org.gnome.SettingsDaemon.Wacom.desktop.in
+++ b/plugins/wacom/org.gnome.SettingsDaemon.Wacom.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/wwan/gsd-wwan.service.in b/plugins/wwan/gsd-wwan.service.in
new file mode 100644
index 00000000..fd8bfdc8
--- /dev/null
+++ b/plugins/wwan/gsd-wwan.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME WWan management
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-wwan.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-wwan
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/wwan/gsd-wwan.target.in b/plugins/wwan/gsd-wwan.target.in
new file mode 100644
index 00000000..fc11339f
--- /dev/null
+++ b/plugins/wwan/gsd-wwan.target.in
@@ -0,0 +1,10 @@
+[Unit]
+Description=GNOME WWan management
+
+BindsTo=gsd-wwan.service
+After=gsd-wwan.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
diff --git a/plugins/wwan/org.gnome.SettingsDaemon.Wwan.desktop.in b/plugins/wwan/org.gnome.SettingsDaemon.Wwan.desktop.in
index 33eb438c..61ea7747 100644
--- a/plugins/wwan/org.gnome.SettingsDaemon.Wwan.desktop.in
+++ b/plugins/wwan/org.gnome.SettingsDaemon.Wwan.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@
diff --git a/plugins/xsettings/gsd-xsettings.service.in b/plugins/xsettings/gsd-xsettings.service.in
new file mode 100644
index 00000000..e644c541
--- /dev/null
+++ b/plugins/xsettings/gsd-xsettings.service.in
@@ -0,0 +1,18 @@
+[Unit]
+Description=GNOME XSettings
+# Note that we do the shenanigans with having a target and a service solely
+# so that OnFailure is not called in case of a dependency failure.
+# See also https://github.com/systemd/systemd/issues/12352
+OnFailure=gnome-session-failed.target
+CollectMode=inactive-or-failed
+RefuseManualStart=true
+RefuseManualStop=true
+
+PartOf=gsd-xsettings.target
+After=gnome-session-initialized.target
+
+[Service]
+Type=dbus
+ExecStart=@libexecdir@/gsd-xsettings
+Restart=on-failure
+BusName=@plugin_dbus_name@
diff --git a/plugins/xsettings/gsd-xsettings.target.in b/plugins/xsettings/gsd-xsettings.target.in
new file mode 100644
index 00000000..019c5719
--- /dev/null
+++ b/plugins/xsettings/gsd-xsettings.target.in
@@ -0,0 +1,16 @@
+[Unit]
+Description=GNOME XSettings
+
+BindsTo=gsd-xsettings.service
+After=gsd-xsettings.service
+
+Requisite=gnome-session-initialized.target
+After=gnome-session-initialized.target
+PartOf=gnome-session-initialized.target
+Before=gnome-session.target
+
+# Use something similar once appropriate an appropriate target exists for X11
+#Requisite=gnome-session-x11.target
+#After=gnome-session-x11.target
+#PartOf=gnome-session-x11.target
+# When done, also add the target to the meson.build file!
diff --git a/plugins/xsettings/org.gnome.SettingsDaemon.XSettings.desktop.in b/plugins/xsettings/org.gnome.SettingsDaemon.XSettings.desktop.in
index 249fafd7..59086a78 100644
--- a/plugins/xsettings/org.gnome.SettingsDaemon.XSettings.desktop.in
+++ b/plugins/xsettings/org.gnome.SettingsDaemon.XSettings.desktop.in
@@ -7,3 +7,4 @@ NoDisplay=true
X-GNOME-Autostart-Phase=Initialization
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=true
+X-GNOME-HiddenUnderSystemd=@systemd_hidden@