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.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/seat-xdmcp-session.c b/src/seat-xdmcp-session.c
index 5aebef9a..2594d670 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);
@@ -38,17 +41,21 @@ seat_xdmcp_session_create_display_server (Seat *seat, Session *session)
{
XAuthority *authority;
gchar *host;
- XServerRemote *x_server;
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);
+
+ SEAT_XDMCP_SESSION (seat)->priv->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);
+ return g_object_ref (DISPLAY_SERVER (SEAT_XDMCP_SESSION (seat)->priv->x_server));
}
static void
@@ -65,6 +72,7 @@ seat_xdmcp_session_finalize (GObject *object)
self = SEAT_XDMCP_SESSION (object);
g_object_unref (self->priv->session);
+ g_object_unref (self->priv->x_server);
G_OBJECT_CLASS (seat_xdmcp_session_parent_class)->finalize (object);
}