From 84b823187c8e0b23274cd1a93f4e47a2c585c75b Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 5 Feb 2020 15:20:48 -0500 Subject: [PATCH 2/2] gdm-x-session: run session bus on non-seat0 seats GNOME doesn't deal very well with multiple sessions running on a multiple seats at the moment. Until that's fixed, ensure sessions run on auxillary seats get their own session bus. --- daemon/gdm-session.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c index a8263ba11..55637b378 100644 --- a/daemon/gdm-session.c +++ b/daemon/gdm-session.c @@ -2846,130 +2846,139 @@ on_start_program_cb (GdmDBusWorker *worker, if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED) || g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) return; self = conversation->session; service_name = conversation->service_name; if (worked) { self->priv->session_pid = pid; self->priv->session_conversation = conversation; g_debug ("GdmSession: Emitting 'session-started' signal with pid '%d'", pid); g_signal_emit (self, signals[SESSION_STARTED], 0, service_name, pid); } else { gdm_session_stop_conversation (self, service_name); g_debug ("GdmSession: Emitting 'session-start-failed' signal"); g_signal_emit (self, signals[SESSION_START_FAILED], 0, service_name, error->message); } } void gdm_session_start_session (GdmSession *self, const char *service_name) { GdmSessionConversation *conversation; GdmSessionDisplayMode display_mode; gboolean is_x11 = TRUE; gboolean run_launcher = FALSE; gboolean allow_remote_connections = FALSE; + gboolean run_separate_bus = FALSE; char *command; char *program; g_return_if_fail (GDM_IS_SESSION (self)); g_return_if_fail (self->priv->session_conversation == NULL); conversation = find_conversation_by_name (self, service_name); if (conversation == NULL) { g_warning ("GdmSession: Tried to start session of " "nonexistent conversation %s", service_name); return; } stop_all_other_conversations (self, conversation, FALSE); display_mode = gdm_session_get_display_mode (self); #ifdef ENABLE_WAYLAND_SUPPORT is_x11 = g_strcmp0 (self->priv->session_type, "wayland") != 0; #endif if (display_mode == GDM_SESSION_DISPLAY_MODE_LOGIND_MANAGED || display_mode == GDM_SESSION_DISPLAY_MODE_NEW_VT) { run_launcher = TRUE; } + if (g_strcmp0 (self->priv->display_seat_id, "seat0") != 0 && !run_launcher) { + run_separate_bus = TRUE; + } + if (self->priv->selected_program == NULL) { gboolean run_xsession_script; command = get_session_command (self); run_xsession_script = !gdm_session_bypasses_xsession (self); if (self->priv->display_is_local) { gboolean disallow_tcp = TRUE; gdm_settings_direct_get_boolean (GDM_KEY_DISALLOW_TCP, &disallow_tcp); allow_remote_connections = !disallow_tcp; } else { allow_remote_connections = TRUE; } if (run_launcher) { if (is_x11) { program = g_strdup_printf (LIBEXECDIR "/gdm-x-session %s %s\"%s\"", run_xsession_script? "--run-script " : "", allow_remote_connections? "--allow-remote-connections " : "", command); } else { program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", command); } } else if (run_xsession_script) { - program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); + if (run_separate_bus) { + program = g_strdup_printf ("dbus-run-session -- " GDMCONFDIR "/Xsession \"%s\"", command); + } else { + program = g_strdup_printf (GDMCONFDIR "/Xsession \"%s\"", command); + } } else { program = g_strdup (command); } g_free (command); } else { if (run_launcher) { if (is_x11) { - program = g_strdup_printf (LIBEXECDIR "/gdm-x-session \"%s\"", - self->priv->selected_program); + program = g_strdup_printf (LIBEXECDIR "/gdm-x-session \"%s\"", + self->priv->selected_program); } else { program = g_strdup_printf (LIBEXECDIR "/gdm-wayland-session \"%s\"", self->priv->selected_program); } } else { - if (g_strcmp0 (self->priv->display_seat_id, "seat0") != 0) { + if (run_separate_bus) { program = g_strdup_printf ("dbus-run-session -- %s", self->priv->selected_program); } else { program = g_strdup (self->priv->selected_program); } } } set_up_session_environment (self); send_environment (self, conversation); gdm_dbus_worker_call_start_program (conversation->worker_proxy, program, conversation->worker_cancellable, (GAsyncReadyCallback) on_start_program_cb, conversation); g_free (program); } static void stop_all_conversations (GdmSession *self) { stop_all_other_conversations (self, NULL, TRUE); } static void do_reset (GdmSession *self) { stop_all_conversations (self); -- 2.21.1