diff options
Diffstat (limited to 'daemon/gdm-wayland-session.c')
-rw-r--r-- | daemon/gdm-wayland-session.c | 81 |
1 files changed, 63 insertions, 18 deletions
diff --git a/daemon/gdm-wayland-session.c b/daemon/gdm-wayland-session.c index 94f49e19..35679b19 100644 --- a/daemon/gdm-wayland-session.c +++ b/daemon/gdm-wayland-session.c @@ -45,6 +45,7 @@ typedef struct GSubprocess *bus_subprocess; GDBusConnection *bus_connection; + GdmDBusManager *display_manager_proxy; char *bus_address; char **environment; @@ -53,6 +54,8 @@ typedef struct char *session_command; int session_exit_status; + guint register_session_id; + GMainLoop *main_loop; guint32 debug_enabled : 1; @@ -385,29 +388,14 @@ static gboolean register_display (State *state, GCancellable *cancellable) { - GdmDBusManager *manager = NULL; GError *error = NULL; gboolean registered = FALSE; GVariantBuilder details; - manager = gdm_dbus_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, - G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | - G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, - "org.gnome.DisplayManager", - "/org/gnome/DisplayManager/Manager", - cancellable, - &error); - - if (!manager) { - g_debug ("could not contact display manager: %s", error->message); - g_error_free (error); - goto out; - } - g_variant_builder_init (&details, G_VARIANT_TYPE ("a{ss}")); g_variant_builder_add (&details, "{ss}", "session-type", "wayland"); - registered = gdm_dbus_manager_call_register_display_sync (manager, + registered = gdm_dbus_manager_call_register_display_sync (state->display_manager_proxy, g_variant_builder_end (&details), cancellable, &error); @@ -416,8 +404,6 @@ register_display (State *state, g_error_free (error); } -out: - g_clear_object (&manager); return registered; } @@ -439,6 +425,7 @@ clear_state (State **out_state) g_clear_object (&state->session_subprocess); g_clear_pointer (&state->environment, g_strfreev); g_clear_pointer (&state->main_loop, g_main_loop_unref); + g_clear_handle_id (&state->register_session_id, g_source_remove); *out_state = NULL; } @@ -454,6 +441,49 @@ on_sigterm (State *state) return G_SOURCE_CONTINUE; } +static gboolean +register_session_timeout_cb (gpointer user_data) +{ + State *state; + GError *error = NULL; + + state = (State *) user_data; + + gdm_dbus_manager_call_register_session_sync (state->display_manager_proxy, + g_variant_new ("a{sv}", NULL), + state->cancellable, + &error); + + if (error != NULL) { + g_warning ("Could not register session: %s", error->message); + g_error_free (error); + } + + return G_SOURCE_REMOVE; +} + +static gboolean +connect_to_display_manager (State *state) +{ + g_autoptr (GError) error = NULL; + + state->display_manager_proxy = gdm_dbus_manager_proxy_new_for_bus_sync ( + G_BUS_TYPE_SYSTEM, + G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES | G_DBUS_PROXY_FLAGS_DO_NOT_CONNECT_SIGNALS, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/Manager", + state->cancellable, + &error); + + if (state->display_manager_proxy == NULL) { + g_printerr ("gdm-wayland-session: could not contact display manager: %s\n", + error->message); + return FALSE; + } + + return TRUE; +} + int main (int argc, char **argv) @@ -464,7 +494,10 @@ main (int argc, gboolean debug = FALSE; gboolean ret; int exit_status = EX_OK; + static gboolean register_session = FALSE; + static GOptionEntry entries [] = { + { "register-session", 0, 0, G_OPTION_ARG_NONE, ®ister_session, "Register session after a delay", NULL }, { G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &args, "", "" }, { NULL } }; @@ -528,6 +561,9 @@ main (int argc, goto out; } + if (!connect_to_display_manager (state)) + goto out; + ret = register_display (state, state->cancellable); if (!ret) { @@ -536,6 +572,15 @@ main (int argc, goto out; } + if (register_session) { + g_debug ("gdm-wayland-session: Will register session in %d seconds", REGISTER_SESSION_TIMEOUT); + state->register_session_id = g_timeout_add_seconds (REGISTER_SESSION_TIMEOUT, + register_session_timeout_cb, + state); + } else { + g_debug ("gdm-wayland-session: Session will register itself"); + } + g_main_loop_run (state->main_loop); /* Only use exit status of session if we're here because it exit */ |