From cf5eccaf06b226a90401d8ac71853246b04154e7 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 20 Jun 2016 11:16:20 +1200 Subject: [PATCH] Only run a single USC instance on xlocal seats (it no longer supports multiple instances) --- src/seat-xlocal.c | 204 ++++++++++++------ tests/scripts/mir-autologin.conf | 2 +- tests/scripts/mir-container-session.conf | 2 +- tests/scripts/mir-greeter.conf | 2 +- tests/scripts/mir-script-hooks.conf | 4 +- .../scripts/mir-session-compositor-crash.conf | 2 +- tests/scripts/mir-session-crash.conf | 13 +- tests/scripts/mir-session.conf | 2 +- 8 files changed, 150 insertions(+), 81 deletions(-) diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c index 817335c6..7d1b1ddb 100644 --- a/src/seat-xlocal.c +++ b/src/seat-xlocal.c @@ -21,13 +21,19 @@ struct SeatXLocalPrivate { + /* System compositor being used for Mir sessions */ + UnitySystemCompositor *compositor; + + /* Session currently active on compositor */ + Session *active_compositor_session; + /* X server being used for XDMCP */ XServerLocal *xdmcp_x_server; }; G_DEFINE_TYPE (SeatXLocal, seat_xlocal, SEAT_TYPE); -static XServerLocal *create_x_server (Seat *seat); +static XServerLocal *create_x_server (SeatXLocal *seat); static void seat_xlocal_setup (Seat *seat) @@ -45,20 +51,30 @@ check_stopped (SeatXLocal *seat) } static void -xdmcp_x_server_stopped_cb (DisplayServer *display_server, Seat *seat) +xdmcp_x_server_stopped_cb (DisplayServer *display_server, SeatXLocal *seat) { l_debug (seat, "XDMCP X server stopped"); - g_signal_handlers_disconnect_matched (SEAT_XLOCAL (seat)->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); - SEAT_XLOCAL (seat)->priv->xdmcp_x_server = NULL; - g_object_unref (display_server); + g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); + g_clear_object (&seat->priv->xdmcp_x_server); - if (seat_get_is_stopping (seat)) - check_stopped (SEAT_XLOCAL (seat)); + if (seat_get_is_stopping (SEAT (seat))) + check_stopped (seat); else - seat_stop (seat); + seat_stop (SEAT (seat)); } +static void +compositor_stopped_cb (UnitySystemCompositor *compositor, SeatXLocal *seat) +{ + l_debug (seat, "Compositor stopped"); + + g_clear_object (&seat->priv->compositor); + + if (seat_get_is_stopping (SEAT (seat))) + check_stopped (seat); +} + static gboolean seat_xlocal_start (Seat *seat) { @@ -72,7 +88,7 @@ seat_xlocal_start (Seat *seat) const gchar *key_name = NULL; gint port = 0; - s->priv->xdmcp_x_server = create_x_server (seat); + s->priv->xdmcp_x_server = create_x_server (s); x_server_local_set_xdmcp_server (s->priv->xdmcp_x_server, xdmcp_manager); port = seat_get_integer_property (seat, "xdmcp-port"); if (port > 0) @@ -136,10 +152,10 @@ display_server_transition_plymouth_cb (DisplayServer *display_server, Seat *seat } static gint -get_vt (Seat *seat, DisplayServer *display_server) +get_vt (SeatXLocal *seat, DisplayServer *display_server) { gint vt = -1; - const gchar *xdg_seat = seat_get_name (seat); + const gchar *xdg_seat = seat_get_name (SEAT (seat)); if (strcmp (xdg_seat, "seat0") != 0) return vt; @@ -166,8 +182,45 @@ get_vt (Seat *seat, DisplayServer *display_server) return vt; } +static UnitySystemCompositor * +create_unity_system_compositor (SeatXLocal *seat) +{ + UnitySystemCompositor *compositor; + const gchar *command; + gint timeout, vt; + + compositor = unity_system_compositor_new (); + + command = seat_get_string_property (SEAT (seat), "unity-compositor-command"); + if (command) + unity_system_compositor_set_command (compositor, command); + + timeout = seat_get_integer_property (SEAT (seat), "unity-compositor-timeout"); + if (timeout <= 0) + timeout = 60; + unity_system_compositor_set_timeout (compositor, timeout); + + vt = get_vt (seat, DISPLAY_SERVER (compositor)); + if (vt >= 0) + unity_system_compositor_set_vt (compositor, vt); + + return compositor; +} + +static UnitySystemCompositor * +get_unity_system_compositor (SeatXLocal *seat) +{ + if (seat->priv->compositor) + return seat->priv->compositor; + + seat->priv->compositor = create_unity_system_compositor (seat); + g_signal_connect (seat->priv->compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), seat); + + return seat->priv->compositor; +} + static XServerLocal * -create_x_server (Seat *seat) +create_x_server (SeatXLocal *seat) { XServerLocal *x_server; gchar *number; @@ -191,7 +244,7 @@ create_x_server (Seat *seat) if (g_getenv ("DISPLAY")) command = "Xephyr"; if (!command) - command = seat_get_string_property (seat, "xserver-command"); + command = seat_get_string_property (SEAT (seat), "xserver-command"); if (command) x_server_local_set_command (x_server, command); @@ -201,59 +254,24 @@ create_x_server (Seat *seat) g_free (number); g_object_unref (cookie); - layout = seat_get_string_property (seat, "xserver-layout"); + layout = seat_get_string_property (SEAT (seat), "xserver-layout"); if (layout) x_server_local_set_layout (x_server, layout); - x_server_local_set_xdg_seat (x_server, seat_get_name (seat)); + x_server_local_set_xdg_seat (x_server, seat_get_name (SEAT (seat))); - config_file = seat_get_string_property (seat, "xserver-config"); + config_file = seat_get_string_property (SEAT (seat), "xserver-config"); if (config_file) x_server_local_set_config (x_server, config_file); - allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); + allow_tcp = seat_get_boolean_property (SEAT (seat), "xserver-allow-tcp"); x_server_local_set_allow_tcp (x_server, allow_tcp); return x_server; } static DisplayServer * -create_unity_system_compositor (Seat *seat) -{ - UnitySystemCompositor *compositor; - const gchar *command; - gchar *socket_name; - gint vt, timeout, i; - - compositor = unity_system_compositor_new (); - - command = seat_get_string_property (seat, "unity-compositor-command"); - if (command) - unity_system_compositor_set_command (compositor, command); - - timeout = seat_get_integer_property (seat, "unity-compositor-timeout"); - if (timeout <= 0) - timeout = 60; - unity_system_compositor_set_timeout (compositor, timeout); - - vt = get_vt (seat, DISPLAY_SERVER (compositor)); - if (vt >= 0) - unity_system_compositor_set_vt (compositor, vt); - - for (i = 0; ; i++) - { - socket_name = g_strdup_printf ("/run/lightdm-mir-%d", i); - if (!g_file_test (socket_name, G_FILE_TEST_EXISTS)) - break; - } - unity_system_compositor_set_socket (compositor, socket_name); - g_free (socket_name); - - return DISPLAY_SERVER (compositor); -} - -static DisplayServer * -create_wayland_session (Seat *seat) +create_wayland_session (SeatXLocal *seat) { WaylandSession *session; gint vt; @@ -268,28 +286,29 @@ create_wayland_session (Seat *seat) } static DisplayServer * -seat_xlocal_create_display_server (Seat *seat, Session *session) +seat_xlocal_create_display_server (Seat *s, Session *session) { + SeatXLocal *seat = SEAT_XLOCAL (s); const gchar *session_type; session_type = session_get_session_type (session); if (strcmp (session_type, "x") == 0) return DISPLAY_SERVER (create_x_server (seat)); else if (strcmp (session_type, "mir") == 0) - return create_unity_system_compositor (seat); + return g_object_ref (get_unity_system_compositor (seat)); else if (strcmp (session_type, "wayland") == 0) return create_wayland_session (seat); else if (strcmp (session_type, "mir-container") == 0) { - DisplayServer *compositor; + UnitySystemCompositor *compositor; const gchar *compositor_command; compositor = create_unity_system_compositor (seat); compositor_command = session_config_get_compositor_command (session_get_config (session)); if (compositor_command) - unity_system_compositor_set_command (UNITY_SYSTEM_COMPOSITOR (compositor), compositor_command); + unity_system_compositor_set_command (compositor, compositor_command); - return compositor; + return DISPLAY_SERVER (compositor); } else { @@ -298,6 +317,15 @@ seat_xlocal_create_display_server (Seat *seat, Session *session) } } +static gboolean +seat_xlocal_display_server_is_used (Seat *seat, DisplayServer *display_server) +{ + if (display_server == DISPLAY_SERVER (SEAT_XLOCAL (seat)->priv->compositor)) + return TRUE; + + return SEAT_CLASS (seat_xlocal_parent_class)->display_server_is_used (seat, display_server); +} + static GreeterSession * seat_xlocal_create_greeter_session (Seat *seat) { @@ -321,8 +349,9 @@ seat_xlocal_create_session (Seat *seat) } static void -seat_xlocal_set_active_session (Seat *seat, Session *session) +seat_xlocal_set_active_session (Seat *s, Session *session) { + SeatXLocal *seat = SEAT_XLOCAL (s); DisplayServer *display_server; display_server = session_get_display_server (session); @@ -331,15 +360,19 @@ seat_xlocal_set_active_session (Seat *seat, Session *session) if (vt >= 0) vt_set_active (vt); - if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) + g_clear_object (&seat->priv->active_compositor_session); + if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) { unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), session_get_env (session, "MIR_SERVER_NAME")); + seat->priv->active_compositor_session = g_object_ref (session); + } - SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (seat, session); + SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (s, session); } static Session * -seat_xlocal_get_active_session (Seat *seat) +seat_xlocal_get_active_session (Seat *s) { + SeatXLocal *seat = SEAT_XLOCAL (s); gint vt; GList *link; @@ -347,7 +380,12 @@ seat_xlocal_get_active_session (Seat *seat) if (vt < 0) return NULL; - for (link = seat_get_sessions (seat); link; link = link->next) + /* If the compositor is active return the session it is displaying */ + if (seat->priv->compositor && display_server_get_vt (DISPLAY_SERVER (seat->priv->compositor)) == vt) + return seat->priv->active_compositor_session; + + /* Otherwise find out which session is on this VT */ + for (link = seat_get_sessions (s); link; link = link->next) { Session *session = link->data; DisplayServer *display_server; @@ -360,6 +398,26 @@ seat_xlocal_get_active_session (Seat *seat) return NULL; } +static void +seat_xlocal_set_next_session (Seat *seat, Session *session) +{ + const gchar *id = NULL; + + if (!session) + return; + + id = session_get_env (session, "MIR_SERVER_NAME"); + if (id) + { + l_debug (seat, "Marking Mir session %s as the next session", id); + unity_system_compositor_set_next_session (SEAT_XLOCAL (seat)->priv->compositor, id); + } + else + l_debug (seat, "Failed to work out session ID to mark"); + + SEAT_CLASS (seat_xlocal_parent_class)->set_next_session (seat, session); +} + static void seat_xlocal_run_script (Seat *seat, DisplayServer *display_server, Process *script) { @@ -378,13 +436,19 @@ seat_xlocal_run_script (Seat *seat, DisplayServer *display_server, Process *scri } static void -seat_xlocal_stop (Seat *seat) +seat_xlocal_stop (Seat *s) { - /* Stop the XDMCP X server first */ - if (SEAT_XLOCAL (seat)->priv->xdmcp_x_server) - display_server_stop (DISPLAY_SERVER (SEAT_XLOCAL (seat)->priv->xdmcp_x_server)); + SeatXLocal *seat = SEAT_XLOCAL (s); + + /* Stop the compositor */ + if (seat->priv->compositor) + display_server_stop (DISPLAY_SERVER (seat->priv->compositor)); + + /* Stop the XDMCP X server */ + if (seat->priv->xdmcp_x_server) + display_server_stop (DISPLAY_SERVER (seat->priv->xdmcp_x_server)); - check_stopped (SEAT_XLOCAL (seat)); + check_stopped (seat); } static void @@ -398,6 +462,8 @@ seat_xlocal_finalize (GObject *object) { SeatXLocal *seat = SEAT_XLOCAL (object); + g_clear_object (&seat->priv->compositor); + g_clear_object (&seat->priv->active_compositor_session); if (seat->priv->xdmcp_x_server) { g_signal_handlers_disconnect_matched (seat->priv->xdmcp_x_server, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat); @@ -418,10 +484,12 @@ seat_xlocal_class_init (SeatXLocalClass *klass) seat_class->setup = seat_xlocal_setup; seat_class->start = seat_xlocal_start; seat_class->create_display_server = seat_xlocal_create_display_server; + seat_class->display_server_is_used = seat_xlocal_display_server_is_used; seat_class->create_greeter_session = seat_xlocal_create_greeter_session; seat_class->create_session = seat_xlocal_create_session; seat_class->set_active_session = seat_xlocal_set_active_session; seat_class->get_active_session = seat_xlocal_get_active_session; + seat_class->set_next_session = seat_xlocal_set_next_session; seat_class->run_script = seat_xlocal_run_script; seat_class->stop = seat_xlocal_stop; diff --git a/tests/scripts/mir-autologin.conf b/tests/scripts/mir-autologin.conf index 766533d0..9d941a1a 100644 --- a/tests/scripts/mir-autologin.conf +++ b/tests/scripts/mir-autologin.conf @@ -10,7 +10,7 @@ user-session=mir #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts diff --git a/tests/scripts/mir-container-session.conf b/tests/scripts/mir-container-session.conf index 67cc4f46..02aed84b 100644 --- a/tests/scripts/mir-container-session.conf +++ b/tests/scripts/mir-container-session.conf @@ -30,7 +30,7 @@ user-session=mir-container #?*GREETER-X-0 START-SESSION # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=8 XDG_VTNR=8 CONTAINER=TRUE +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=8 XDG_VTNR=8 CONTAINER=TRUE #?*UNITY-SYSTEM-COMPOSITOR READY # Switch to system compositor diff --git a/tests/scripts/mir-greeter.conf b/tests/scripts/mir-greeter.conf index 05ec6f58..7135be6c 100644 --- a/tests/scripts/mir-greeter.conf +++ b/tests/scripts/mir-greeter.conf @@ -6,7 +6,7 @@ #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Greeter starts diff --git a/tests/scripts/mir-script-hooks.conf b/tests/scripts/mir-script-hooks.conf index 0e24bfbb..51349ac3 100644 --- a/tests/scripts/mir-script-hooks.conf +++ b/tests/scripts/mir-script-hooks.conf @@ -15,7 +15,7 @@ user-session=mir #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Script hooks run @@ -42,7 +42,7 @@ user-session=mir #?SCRIPT-HOOK DISPLAY-STOPPED # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 ENABLE-HARDWARE-CURSOR=TRUE XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 ENABLE-HARDWARE-CURSOR=TRUE XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Script hooks run diff --git a/tests/scripts/mir-session-compositor-crash.conf b/tests/scripts/mir-session-compositor-crash.conf index 0486857f..7d2d24b2 100644 --- a/tests/scripts/mir-session-compositor-crash.conf +++ b/tests/scripts/mir-session-compositor-crash.conf @@ -10,7 +10,7 @@ user-session=mir #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts diff --git a/tests/scripts/mir-session-crash.conf b/tests/scripts/mir-session-crash.conf index 7e55a087..e99d50ee 100644 --- a/tests/scripts/mir-session-crash.conf +++ b/tests/scripts/mir-session-crash.conf @@ -10,7 +10,7 @@ user-session=mir #?RUNNER DAEMON-START # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=7 XDG_VTNR=7 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=7 XDG_VTNR=7 #?*UNITY-SYSTEM-COMPOSITOR READY # Session starts @@ -23,19 +23,19 @@ user-session=mir # Crash session #?*SESSION-MIR-session-0 CRASH -# Compositor is stopped -#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15 - # X server starts -#?XSERVER-0 START VT=7 SEAT=seat0 +#?XSERVER-0 START VT=8 SEAT=seat0 # Daemon connects when X server is ready #?*XSERVER-0 INDICATE-READY #?XSERVER-0 INDICATE-READY #?XSERVER-0 ACCEPT-CONNECT +# Switch to X +#?VT ACTIVATE VT=8 + # Greeter starts -#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_SESSION_CLASS=greeter +#?GREETER-X-0 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_SESSION_CLASS=greeter #?LOGIN1 ACTIVATE-SESSION SESSION=c1 #?XSERVER-0 ACCEPT-CONNECT #?GREETER-X-0 CONNECT-XSERVER @@ -44,6 +44,7 @@ user-session=mir # Cleanup #?*STOP-DAEMON +#?UNITY-SYSTEM-COMPOSITOR TERMINATE SIGNAL=15 #?GREETER-X-0 TERMINATE SIGNAL=15 #?XSERVER-0 TERMINATE SIGNAL=15 #?RUNNER DAEMON-EXIT STATUS=0 diff --git a/tests/scripts/mir-session.conf b/tests/scripts/mir-session.conf index 852a40fb..1e730af8 100644 --- a/tests/scripts/mir-session.conf +++ b/tests/scripts/mir-session.conf @@ -30,7 +30,7 @@ user-session=mir #?*GREETER-X-0 START-SESSION # System compositor starts -#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/lightdm-mir-0 VT=8 XDG_VTNR=8 +#?UNITY-SYSTEM-COMPOSITOR START FILE=/run/mir_socket VT=8 XDG_VTNR=8 #?*UNITY-SYSTEM-COMPOSITOR READY # Switch to system compositor -- 2.39.2