From 085531b43d1a9647af03f9c5d2fa16c6344d63e5 Mon Sep 17 00:00:00 2001 From: Iain Lane Date: Fri, 4 Oct 2019 12:11:06 +0100 Subject: [PATCH] main, util: Notify systemd once we are fully initialised If graphical applications want to start from systemd units, they need to start after we're properly ready to display them. This is particularly important under X where `_GTK_FRAME_EXTENTS` and other xprops are needed to have the right theming. We're doing this in an idle callback so that the dynamic starting of `gnome-session-x11-service.target` (which launches `gsd-xsettings`) as the result of a signal emission happens before us signalling we're ready for later things to start. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/750 --- js/ui/main.js | 6 +++++- src/main.c | 11 ----------- src/shell-util.c | 16 ++++++++++++++++ src/shell-util.h | 2 ++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/js/ui/main.js b/js/ui/main.js index e8269f09b..17f5bc716 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -229,7 +229,11 @@ function _initializeUI() { EndSessionDialog.init(); // We're ready for the session manager to move to the next phase - Meta.register_with_session(); + GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { + Shell.util_sd_notify(); + Meta.register_with_session(); + return GLib.SOURCE_REMOVE; + }); _startDate = new Date(); diff --git a/src/main.c b/src/main.c index 489026b76..6faf9934f 100644 --- a/src/main.c +++ b/src/main.c @@ -24,14 +24,6 @@ #include "shell-perf-log.h" #include "st.h" -#ifdef HAVE_SYSTEMD -#include -#else -/* So we don't need to add ifdef's everywhere */ -#define sd_notify(u, m) do {} while (0) -#define sd_notifyf(u, m, ...) do {} while (0) -#endif - extern GType gnome_shell_plugin_get_type (void); #define SHELL_DBUS_SERVICE "org.gnome.Shell" @@ -532,9 +524,6 @@ main (int argc, char **argv) shell_init_debug (g_getenv ("SHELL_DEBUG")); shell_dbus_init (meta_get_replace_current_wm ()); - /* We only use NOTIFY_SOCKET exactly once; unset it so it doesn't remain in - * our environment. */ - sd_notify (1, "READY=1"); shell_a11y_init (); shell_perf_log_init (); shell_introspection_init (); diff --git a/src/shell-util.c b/src/shell-util.c index c22dd1c6e..f93462c73 100644 --- a/src/shell-util.c +++ b/src/shell-util.c @@ -26,6 +26,14 @@ #include #endif +#ifdef HAVE_SYSTEMD +#include +#else +/* So we don't need to add ifdef's everywhere */ +#define sd_notify(u, m) do {} while (0) +#define sd_notifyf(u, m, ...) do {} while (0) +#endif + static void stop_pick (ClutterActor *actor, const ClutterColor *color) @@ -659,3 +667,11 @@ shell_util_stop_systemd_unit (const char *unit, { return shell_util_systemd_call ("StopUnit", unit, mode, error); } + +void +shell_util_sd_notify (void) +{ + /* We only use NOTIFY_SOCKET exactly once; unset it so it doesn't remain in + * our environment. */ + sd_notify (1, "READY=1"); +} diff --git a/src/shell-util.h b/src/shell-util.h index c41e02c79..4453beb4a 100644 --- a/src/shell-util.h +++ b/src/shell-util.h @@ -66,6 +66,8 @@ gboolean shell_util_stop_systemd_unit (const char *unit, const char *mode, GError **error); +void shell_util_sd_notify (void); + G_END_DECLS #endif /* __SHELL_UTIL_H__ */