From: Robert Ancell Date: Fri, 17 Jun 2016 04:03:28 +0000 (+1200) Subject: Make an XServerXmir object X-Git-Url: https://rtime.felk.cvut.cz/gitweb/sojka/lightdm.git/commitdiff_plain/ecd31c70c4902afdb4ca9c49f5a971031e4872a4 Make an XServerXmir object --- diff --git a/src/Makefile.am b/src/Makefile.am index a664c942..d519e638 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -63,6 +63,8 @@ lightdm_SOURCES = \ x-server-local.h \ x-server-remote.c \ x-server-remote.h \ + x-server-xmir.c \ + x-server-xmir.h \ x-server-xvnc.c \ x-server-xvnc.h \ x-server.c \ diff --git a/src/display-server.c b/src/display-server.c index 7821b6ab..2e48a09e 100644 --- a/src/display-server.c +++ b/src/display-server.c @@ -25,6 +25,9 @@ struct DisplayServerPrivate /* Unique name for this display server */ gchar *name; + /* TRUE when started */ + gboolean is_ready; + /* TRUE when being stopped */ gboolean stopping; @@ -91,9 +94,17 @@ display_server_start (DisplayServer *server) return DISPLAY_SERVER_GET_CLASS (server)->start (server); } +gboolean +display_server_get_is_ready (DisplayServer *server) +{ + g_return_val_if_fail (server != NULL, FALSE); + return server->priv->is_ready; +} + static gboolean display_server_real_start (DisplayServer *server) { + server->priv->is_ready = TRUE; g_signal_emit (server, signals[READY], 0); return TRUE; } diff --git a/src/display-server.h b/src/display-server.h index 4d6f888a..00e9e26f 100644 --- a/src/display-server.h +++ b/src/display-server.h @@ -67,6 +67,8 @@ gint display_server_get_vt (DisplayServer *server); gboolean display_server_start (DisplayServer *server); +gboolean display_server_get_is_ready (DisplayServer *server); + void display_server_connect_session (DisplayServer *server, Session *session); void display_server_disconnect_session (DisplayServer *server, Session *session); diff --git a/src/mir-server.c b/src/mir-server.c index 6c4a1b8e..5acca00c 100644 --- a/src/mir-server.c +++ b/src/mir-server.c @@ -75,7 +75,7 @@ mir_server_connect_session (DisplayServer *display_server, Session *session) if (server->priv->vt > 0) { gchar *value = g_strdup_printf ("%d", server->priv->vt); - session_set_env (session, "MIR_SERVER_VT", value); + session_set_env (session, "XDG_VTNR", value); g_free (value); } } @@ -85,7 +85,7 @@ mir_server_disconnect_session (DisplayServer *display_server, Session *session) { session_unset_env (session, "XDG_SESSION_TYPE"); session_unset_env (session, "MIR_SERVER_HOST_SOCKET"); - session_unset_env (session, "MIR_SERVER_VT"); + session_unset_env (session, "XDG_VTNR"); } static void diff --git a/src/seat-unity.c b/src/seat-unity.c index 48ddfbea..3df0aa53 100644 --- a/src/seat-unity.c +++ b/src/seat-unity.c @@ -17,7 +17,7 @@ #include "seat-unity.h" #include "configuration.h" #include "unity-system-compositor.h" -#include "x-server-local.h" +#include "x-server-xmir.h" #include "mir-server.h" #include "vt.h" #include "plymouth.h" @@ -28,7 +28,7 @@ struct SeatUnityPrivate UnitySystemCompositor *compositor; /* X server being used for XDMCP */ - XServerLocal *xdmcp_x_server; + XServerXmir *xdmcp_x_server; /* Next Mir ID to use for a Mir sessions, X server and greeters */ gint next_session_id; @@ -42,7 +42,7 @@ struct SeatUnityPrivate G_DEFINE_TYPE (SeatUnity, seat_unity, SEAT_TYPE); -static XServerLocal *create_x_server (Seat *seat); +static XServerXmir *create_x_server (Seat *seat); static void seat_unity_setup (Seat *seat) @@ -89,10 +89,10 @@ compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) gint port = 0; seat->priv->xdmcp_x_server = create_x_server (SEAT (seat)); - x_server_local_set_xdmcp_server (seat->priv->xdmcp_x_server, xdmcp_manager); + x_server_local_set_xdmcp_server (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), xdmcp_manager); port = seat_get_integer_property (SEAT (seat), "xdmcp-port"); if (port > 0) - x_server_local_set_xdmcp_port (seat->priv->xdmcp_x_server, port); + x_server_local_set_xdmcp_port (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), port); key_name = seat_get_string_property (SEAT (seat), "xdmcp-key"); if (key_name) { @@ -119,7 +119,7 @@ compositor_ready_cb (UnitySystemCompositor *compositor, SeatUnity *seat) l_debug (seat, "Key %s not defined", key_name); if (key) - x_server_local_set_xdmcp_key (seat->priv->xdmcp_x_server, key); + x_server_local_set_xdmcp_key (X_SERVER_LOCAL (seat->priv->xdmcp_x_server), key); g_free (key); } @@ -190,10 +190,10 @@ seat_unity_start (Seat *seat) return display_server_start (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor)); } -static XServerLocal * +static XServerXmir * create_x_server (Seat *seat) { - XServerLocal *x_server; + XServerXmir *x_server; gchar *number; XAuthority *cookie; const gchar *command = NULL, *layout = NULL, *config_file = NULL; @@ -202,15 +202,15 @@ create_x_server (Seat *seat) l_debug (seat, "Starting X server on Unity compositor"); - x_server = x_server_local_new (); + x_server = x_server_xmir_new (SEAT_UNITY (seat)->priv->compositor); command = seat_get_string_property (seat, "xmir-command"); - x_server_local_set_command (x_server, command); + x_server_local_set_command (X_SERVER_LOCAL (x_server), command); id = g_strdup_printf ("x-%d", SEAT_UNITY (seat)->priv->next_x_server_id); SEAT_UNITY (seat)->priv->next_x_server_id++; - x_server_local_set_mir_id (x_server, id); - x_server_local_set_mir_socket (x_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); + x_server_xmir_set_mir_id (x_server, id); + x_server_xmir_set_mir_socket (x_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); g_free (id); number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); @@ -221,16 +221,16 @@ create_x_server (Seat *seat) layout = seat_get_string_property (seat, "xserver-layout"); if (layout) - x_server_local_set_layout (x_server, layout); + x_server_local_set_layout (X_SERVER_LOCAL (x_server), layout); - x_server_local_set_xdg_seat (x_server, seat_get_name (seat)); + x_server_local_set_xdg_seat (X_SERVER_LOCAL (x_server), seat_get_name (seat)); config_file = seat_get_string_property (seat, "xserver-config"); if (config_file) - x_server_local_set_config (x_server, config_file); + x_server_local_set_config (X_SERVER_LOCAL (x_server), config_file); allow_tcp = seat_get_boolean_property (seat, "xserver-allow-tcp"); - x_server_local_set_allow_tcp (x_server, allow_tcp); + x_server_local_set_allow_tcp (X_SERVER_LOCAL (x_server), allow_tcp); return x_server; } @@ -242,6 +242,7 @@ create_mir_server (Seat *seat) mir_server = mir_server_new (); mir_server_set_parent_socket (mir_server, unity_system_compositor_get_socket (SEAT_UNITY (seat)->priv->compositor)); + mir_server_set_vt (mir_server, display_server_get_vt (DISPLAY_SERVER (SEAT_UNITY (seat)->priv->compositor))); return DISPLAY_SERVER (mir_server); } @@ -332,7 +333,7 @@ seat_unity_set_active_session (Seat *seat, Session *session) SEAT_UNITY (seat)->priv->active_display_server = g_object_ref (display_server); if (IS_X_SERVER_LOCAL (display_server)) - id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server)); + id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); else id = session_get_env (session, "MIR_SERVER_NAME"); @@ -366,7 +367,7 @@ seat_unity_set_next_session (Seat *seat, Session *session) display_server = session_get_display_server (session); if (IS_X_SERVER_LOCAL (display_server)) - id = x_server_local_get_mir_id (X_SERVER_LOCAL (display_server)); + id = x_server_xmir_get_mir_id (X_SERVER_XMIR (display_server)); else id = session_get_env (session, "MIR_SERVER_NAME"); @@ -386,13 +387,13 @@ seat_unity_set_next_session (Seat *seat, Session *session) static void seat_unity_run_script (Seat *seat, DisplayServer *display_server, Process *script) { - if (IS_X_SERVER_LOCAL (display_server)) + if (IS_X_SERVER_XMIR (display_server)) { - XServerLocal *x_server; + XServerXmir *x_server; const gchar *path; - x_server = X_SERVER_LOCAL (display_server); - path = x_server_local_get_authority_file_path (x_server); + x_server = X_SERVER_XMIR (display_server); + path = x_server_local_get_authority_file_path (X_SERVER_LOCAL (x_server)); process_set_env (script, "DISPLAY", x_server_get_address (X_SERVER (x_server))); process_set_env (script, "XAUTHORITY", path); } diff --git a/src/session.c b/src/session.c index e2967b43..3c7a34bd 100644 --- a/src/session.c +++ b/src/session.c @@ -807,6 +807,7 @@ session_real_run (Session *session) write_data (session, &argc, sizeof (argc)); for (link = session->priv->env; link; link = link->next) write_string (session, (gchar *) link->data); + argc = g_strv_length (session->priv->argv); write_data (session, &argc, sizeof (argc)); for (i = 0; i < argc; i++) diff --git a/src/x-server-local.c b/src/x-server-local.c index 78006700..ce850fef 100644 --- a/src/x-server-local.c +++ b/src/x-server-local.c @@ -57,12 +57,6 @@ struct XServerLocalPrivate /* XDMCP key to use */ gchar *xdmcp_key; - /* ID to report to Mir */ - gchar *mir_id; - - /* Filename of socket Mir is listening on */ - gchar *mir_socket; - /* TRUE when received ready signal */ gboolean got_signal; @@ -317,28 +311,6 @@ x_server_local_set_background (XServerLocal *server, const gchar *background) server->priv->background = g_strdup (background); } -void -x_server_local_set_mir_id (XServerLocal *server, const gchar *id) -{ - g_return_if_fail (server != NULL); - g_free (server->priv->mir_id); - server->priv->mir_id = g_strdup (id); -} - -const gchar *x_server_local_get_mir_id (XServerLocal *server) -{ - g_return_val_if_fail (server != NULL, NULL); - return server->priv->mir_id; -} - -void -x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket) -{ - g_return_if_fail (server != NULL); - g_free (server->priv->mir_socket); - server->priv->mir_socket = g_strdup (socket); -} - static guint x_server_local_get_display_number (XServer *server) { @@ -536,13 +508,6 @@ x_server_local_start (DisplayServer *display_server) if (server->priv->authority_file) g_string_append_printf (command, " -auth %s", server->priv->authority_file); - /* Setup for running inside Mir */ - if (server->priv->mir_id) - g_string_append_printf (command, " -mir %s", server->priv->mir_id); - - if (server->priv->mir_socket) - g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket); - /* Connect to a remote server using XDMCP */ if (server->priv->xdmcp_server != NULL) { @@ -640,8 +605,6 @@ x_server_local_finalize (GObject *object) g_free (self->priv->xdg_seat); g_free (self->priv->xdmcp_server); g_free (self->priv->xdmcp_key); - g_free (self->priv->mir_id); - g_free (self->priv->mir_socket); g_free (self->priv->authority_file); if (self->priv->have_vt_ref) vt_unref (self->priv->vt); @@ -661,7 +624,7 @@ x_server_local_class_init (XServerLocalClass *klass) klass->get_log_stdout = x_server_local_get_log_stdout; x_server_class->get_display_number = x_server_local_get_display_number; display_server_class->get_vt = x_server_local_get_vt; - display_server_class->start = x_server_local_start; + display_server_class->start = klass->start = x_server_local_start; display_server_class->stop = x_server_local_stop; object_class->finalize = x_server_local_finalize; diff --git a/src/x-server-local.h b/src/x-server-local.h index 7c37f01d..b6a2b409 100644 --- a/src/x-server-local.h +++ b/src/x-server-local.h @@ -37,6 +37,7 @@ typedef struct ProcessRunFunc (*get_run_function)(XServerLocal *server); gboolean (*get_log_stdout)(XServerLocal *server); void (*add_args)(XServerLocal *server, GString *command); + gboolean (*start)(DisplayServer *server); } XServerLocalClass; const gchar *x_server_local_get_version (void); @@ -75,12 +76,6 @@ void x_server_local_set_xdmcp_key (XServerLocal *server, const gchar *key); void x_server_local_set_background (XServerLocal *server, const gchar *background); -void x_server_local_set_mir_id (XServerLocal *server, const gchar *id); - -const gchar *x_server_local_get_mir_id (XServerLocal *server); - -void x_server_local_set_mir_socket (XServerLocal *server, const gchar *socket); - const gchar *x_server_local_get_authority_file_path (XServerLocal *server); G_END_DECLS diff --git a/src/x-server-xmir.c b/src/x-server-xmir.c new file mode 100644 index 00000000..7f90c4e1 --- /dev/null +++ b/src/x-server-xmir.c @@ -0,0 +1,167 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#include + +#include "x-server-xmir.h" + +struct XServerXmirPrivate +{ + /* Compositor we are running under */ + UnitySystemCompositor *compositor; + + /* TRUE if we are waiting for the compositor to start */ + gboolean waiting_for_compositor; + + /* ID to report to Mir */ + gchar *mir_id; + + /* Filename of socket Mir is listening on */ + gchar *mir_socket; +}; + +G_DEFINE_TYPE (XServerXmir, x_server_xmir, X_SERVER_LOCAL_TYPE); + +static void +compositor_ready_cb (UnitySystemCompositor *compositor, XServerXmir *server) +{ + gboolean result; + + if (!server->priv->waiting_for_compositor) + return; + server->priv->waiting_for_compositor = FALSE; + + result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server)); + if (!result) + display_server_stop (DISPLAY_SERVER (server)); +} + +static void +compositor_stopped_cb (UnitySystemCompositor *compositor, XServerXmir *server) +{ + display_server_stop (DISPLAY_SERVER (server)); +} + +XServerXmir * +x_server_xmir_new (UnitySystemCompositor *compositor) +{ + XServerXmir *server; + gchar *name; + + server = g_object_new (X_SERVER_XMIR_TYPE, NULL); + x_server_local_set_command (X_SERVER_LOCAL (server), "Xmir"); + server->priv->compositor = g_object_ref (compositor); + g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), server); + g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), server); + + name = g_strdup_printf ("x-%d", x_server_get_display_number (X_SERVER (server))); + display_server_set_name (DISPLAY_SERVER (server), name); + g_free (name); + + + return server; +} + +void +x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id) +{ + g_return_if_fail (server != NULL); + g_free (server->priv->mir_id); + server->priv->mir_id = g_strdup (id); +} + +const gchar * +x_server_xmir_get_mir_id (XServerXmir *server) +{ + g_return_val_if_fail (server != NULL, NULL); + return server->priv->mir_id; +} + +void +x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket) +{ + g_return_if_fail (server != NULL); + g_free (server->priv->mir_socket); + server->priv->mir_socket = g_strdup (socket); +} + +static void +x_server_xmir_add_args (XServerLocal *x_server, GString *command) +{ + XServerXmir *server = X_SERVER_XMIR (x_server); + + if (server->priv->mir_id) + g_string_append_printf (command, " -mir %s", server->priv->mir_id); + + if (server->priv->mir_socket) + g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket); +} + +static gint +x_server_xmir_get_vt (DisplayServer *server) +{ + return display_server_get_vt (DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor)); +} + +static gboolean +x_server_xmir_start (DisplayServer *display_server) +{ + XServerXmir *server = X_SERVER_XMIR (display_server); + + if (display_server_get_is_ready (DISPLAY_SERVER (server->priv->compositor))) + return X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (display_server); + else + { + if (!server->priv->waiting_for_compositor) + { + server->priv->waiting_for_compositor = TRUE; + if (!display_server_start (DISPLAY_SERVER (server->priv->compositor))) + return FALSE; + } + return TRUE; + } +} + +static void +x_server_xmir_init (XServerXmir *server) +{ + server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XMIR_TYPE, XServerXmirPrivate); +} + +static void +x_server_xmir_finalize (GObject *object) +{ + XServerXmir *self = X_SERVER_XMIR (object); + + if (self->priv->compositor) + { + g_signal_handlers_disconnect_matched (self->priv->compositor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self); + g_object_unref (self->priv->compositor); + } + g_free (self->priv->mir_id); + g_free (self->priv->mir_socket); + + G_OBJECT_CLASS (x_server_xmir_parent_class)->finalize (object); +} + +static void +x_server_xmir_class_init (XServerXmirClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass); + XServerLocalClass *x_server_local_class = X_SERVER_LOCAL_CLASS (klass); + + x_server_local_class->add_args = x_server_xmir_add_args; + display_server_class->get_vt = x_server_xmir_get_vt; + display_server_class->start = x_server_xmir_start; + object_class->finalize = x_server_xmir_finalize; + + g_type_class_add_private (klass, sizeof (XServerXmirPrivate)); +} diff --git a/src/x-server-xmir.h b/src/x-server-xmir.h new file mode 100644 index 00000000..65acd238 --- /dev/null +++ b/src/x-server-xmir.h @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2010-2016 Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation, either version 3 of the License, or (at your option) any later + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#ifndef X_SERVER_XMIR_H_ +#define X_SERVER_XMIR_H_ + +#include "x-server-local.h" +#include "unity-system-compositor.h" + +G_BEGIN_DECLS + +#define X_SERVER_XMIR_TYPE (x_server_xmir_get_type()) +#define X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), X_SERVER_XMIR_TYPE, XServerXmir)) +#define IS_X_SERVER_XMIR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), X_SERVER_XMIR_TYPE)) + +typedef struct XServerXmirPrivate XServerXmirPrivate; + +typedef struct +{ + XServerLocal parent_instance; + XServerXmirPrivate *priv; +} XServerXmir; + +typedef struct +{ + XServerLocalClass parent_class; +} XServerXmirClass; + +GType x_server_xmir_get_type (void); + +XServerXmir *x_server_xmir_new (UnitySystemCompositor *compositor); + +void x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id); + +const gchar *x_server_xmir_get_mir_id (XServerXmir *server); + +void x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket); + +const gchar *x_server_xmir_get_authority_file_path (XServerXmir *server); + +G_END_DECLS + +#endif /* X_SERVER_XMIR_H_ */