diff options
Diffstat (limited to 'src/seat-xdmcp-session.c')
-rw-r--r-- | src/seat-xdmcp-session.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c index ba24dc69..ebcdb706 100644 --- a/src/seat-xdmcp-session.c +++ b/src/seat-xdmcp-session.c @@ -18,6 +18,9 @@ struct SeatXDMCPSessionPrivate { /* Session being serviced */ XDMCPSession *session; + + /* X server using XDMCP connection */ + XServerRemote *x_server; }; G_DEFINE_TYPE (SeatXDMCPSession, seat_xdmcp_session, SEAT_TYPE) @@ -37,18 +40,21 @@ static DisplayServer * seat_xdmcp_session_create_display_server (Seat *seat, Session *session) { XAuthority *authority; - gchar *host; - XServerRemote *x_server; + g_autofree gchar *host = NULL; if (strcmp (session_get_session_type (session), "x") != 0) return NULL; + /* Only create one server for the lifetime of this seat (XDMCP clients reconnect on logout) */ + if (SEAT_XDMCP_SESSION (seat)->priv->x_server) + return NULL; + authority = xdmcp_session_get_authority (SEAT_XDMCP_SESSION (seat)->priv->session); host = g_inet_address_to_string (xdmcp_session_get_address (SEAT_XDMCP_SESSION (seat)->priv->session)); - x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority); - g_free (host); - return DISPLAY_SERVER (x_server); + SEAT_XDMCP_SESSION (seat)->priv->x_server = x_server_remote_new (host, xdmcp_session_get_display_number (SEAT_XDMCP_SESSION (seat)->priv->session), authority); + + return g_object_ref (DISPLAY_SERVER (SEAT_XDMCP_SESSION (seat)->priv->x_server)); } static void @@ -63,6 +69,7 @@ seat_xdmcp_session_finalize (GObject *object) SeatXDMCPSession *self = SEAT_XDMCP_SESSION (object); g_clear_object (&self->priv->session); + g_clear_object (&self->priv->x_server); G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object); } |