From 885277506a913a7c1b64ddc9f02451fe83212edd Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Thu, 11 Jan 2018 15:06:59 +1300 Subject: Ensure only one Xvnc server is run. We only have one VNC connection - so make sure we don't try and use it twice. --- src/seat-xvnc.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/seat-xvnc.c b/src/seat-xvnc.c index 6026859e..0c3fde49 100644 --- a/src/seat-xvnc.c +++ b/src/seat-xvnc.c @@ -21,6 +21,9 @@ struct SeatXVNCPrivate { /* VNC connection */ GSocket *connection; + + /* X server using VNC connection */ + XServerXVNC *x_server; }; SeatXVNC *seat_xvnc_new (GSocket *connection) @@ -33,6 +36,13 @@ SeatXVNC *seat_xvnc_new (GSocket *connection) return seat; } +static void +seat_xvnc_setup (Seat *seat) +{ + seat_set_supports_multi_session (seat, FALSE); + SEAT_CLASS (seat_xvnc_parent_class)->setup (seat); +} + static DisplayServer * seat_xvnc_create_display_server (Seat *seat, Session *session) { @@ -44,7 +54,11 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) if (strcmp (session_get_session_type (session), "x") != 0) return NULL; - x_server = x_server_xvnc_new (); + /* Can only create one server for the lifetime of this seat (can't re-use VNC connection) */ + if (SEAT_XVNC (seat)->priv->x_server) + return NULL; + + SEAT_XVNC (seat)->priv->x_server = x_server = x_server_xvnc_new (); number = g_strdup_printf ("%d", x_server_get_display_number (X_SERVER (x_server))); cookie = x_authority_new_local_cookie (number); x_server_set_authority (X_SERVER (x_server), cookie); @@ -73,7 +87,7 @@ seat_xvnc_create_display_server (Seat *seat, Session *session) x_server_xvnc_set_depth (x_server, depth); } - return DISPLAY_SERVER (x_server); + return g_object_ref (DISPLAY_SERVER (x_server)); } static void @@ -111,6 +125,7 @@ seat_xvnc_session_finalize (GObject *object) SeatXVNC *self = SEAT_XVNC (object); g_clear_object (&self->priv->connection); + g_clear_object (&self->priv->x_server); G_OBJECT_CLASS (seat_xvnc_parent_class)->finalize (object); } @@ -121,6 +136,7 @@ seat_xvnc_class_init (SeatXVNCClass *klass) SeatClass *seat_class = SEAT_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); + seat_class->setup = seat_xvnc_setup; seat_class->create_display_server = seat_xvnc_create_display_server; seat_class->run_script = seat_xvnc_run_script; object_class->finalize = seat_xvnc_session_finalize; -- cgit v1.2.1