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
This commit is contained in:
Iain Lane 2019-10-04 12:11:06 +01:00 committed by Jonas Ådahl
parent 9e8b97d474
commit 085531b43d
4 changed files with 23 additions and 12 deletions

View File

@ -229,7 +229,11 @@ function _initializeUI() {
EndSessionDialog.init(); EndSessionDialog.init();
// We're ready for the session manager to move to the next phase // 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(); _startDate = new Date();

View File

@ -24,14 +24,6 @@
#include "shell-perf-log.h" #include "shell-perf-log.h"
#include "st.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); extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell" #define SHELL_DBUS_SERVICE "org.gnome.Shell"
@ -532,9 +524,6 @@ main (int argc, char **argv)
shell_init_debug (g_getenv ("SHELL_DEBUG")); shell_init_debug (g_getenv ("SHELL_DEBUG"));
shell_dbus_init (meta_get_replace_current_wm ()); 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_a11y_init ();
shell_perf_log_init (); shell_perf_log_init ();
shell_introspection_init (); shell_introspection_init ();

View File

@ -26,6 +26,14 @@
#include <langinfo.h> #include <langinfo.h>
#endif #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 static void
stop_pick (ClutterActor *actor, stop_pick (ClutterActor *actor,
const ClutterColor *color) const ClutterColor *color)
@ -659,3 +667,11 @@ shell_util_stop_systemd_unit (const char *unit,
{ {
return shell_util_systemd_call ("StopUnit", unit, mode, error); 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");
}

View File

@ -66,6 +66,8 @@ gboolean shell_util_stop_systemd_unit (const char *unit,
const char *mode, const char *mode,
GError **error); GError **error);
void shell_util_sd_notify (void);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_UTIL_H__ */ #endif /* __SHELL_UTIL_H__ */