Commit 085531b4 authored by Iain Lane's avatar Iain Lane Committed by Jonas Ådahl

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.

!750
parent 9e8b97d4
Pipeline #120758 passed with stages
in 6 minutes and 40 seconds
......@@ -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();
......
......@@ -24,14 +24,6 @@
#include "shell-perf-log.h"
#include "st.h"
#ifdef HAVE_SYSTEMD
#include <systemd/sd-daemon.h>
#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 ();
......
......@@ -26,6 +26,14 @@
#include <langinfo.h>
#endif
#ifdef HAVE_SYSTEMD
#include <systemd/sd-daemon.h>
#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");
}
......@@ -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__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment