diff options
Diffstat (limited to 'src/seat-xdmcp-session.c')
-rw-r--r-- | src/seat-xdmcp-session.c | 14 |
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); } |