summaryrefslogtreecommitdiff
path: root/src/seat-xdmcp-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/seat-xdmcp-session.c')
-rw-r--r--src/seat-xdmcp-session.c17
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);
}