2 * Copyright (C) 2010-2011 Robert Ancell.
3 * Author: Robert Ancell <robert.ancell@canonical.com>
5 * This program is free software: you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation, either version 3 of the License, or (at your option) any later
8 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
17 #include "configuration.h"
21 /* Host running the server */
27 /* Cached server address */
31 XAuthority *authority;
33 /* Connection to this X server */
34 xcb_connection_t *connection;
37 G_DEFINE_TYPE (XServer, x_server, DISPLAY_SERVER_TYPE);
40 x_server_set_hostname (XServer *server, const gchar *hostname)
42 g_return_if_fail (server != NULL);
43 g_free (server->priv->hostname);
44 server->priv->hostname = g_strdup (hostname);
45 g_free (server->priv->address);
46 server->priv->address = NULL;
50 x_server_get_hostname (XServer *server)
52 g_return_val_if_fail (server != NULL, NULL);
53 return server->priv->hostname;
57 x_server_set_display_number (XServer *server, guint number)
59 g_return_if_fail (server != NULL);
60 server->priv->number = number;
61 g_free (server->priv->address);
62 server->priv->address = NULL;
66 x_server_get_display_number (XServer *server)
68 g_return_val_if_fail (server != NULL, 0);
69 return server->priv->number;
73 x_server_get_address (XServer *server)
75 g_return_val_if_fail (server != NULL, NULL);
77 if (!server->priv->address)
79 if (server->priv->hostname)
80 server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, server->priv->number);
82 server->priv->address = g_strdup_printf(":%d", server->priv->number);
85 return server->priv->address;
89 x_server_set_authority (XServer *server, XAuthority *authority)
91 g_return_if_fail (server != NULL);
93 if (server->priv->authority)
94 g_object_unref (server->priv->authority);
96 server->priv->authority = g_object_ref (authority);
98 server->priv->authority = NULL;
102 x_server_get_authority (XServer *server)
104 g_return_val_if_fail (server != NULL, NULL);
105 return server->priv->authority;
109 x_server_get_session_type (DisplayServer *server)
115 x_server_get_can_share (DisplayServer *server)
121 x_server_start (DisplayServer *display_server)
123 XServer *server = X_SERVER (display_server);
124 xcb_auth_info_t *auth = NULL, a;
126 if (server->priv->authority)
128 a.namelen = strlen (x_authority_get_authorization_name (server->priv->authority));
129 a.name = (char *) x_authority_get_authorization_name (server->priv->authority);
130 a.datalen = x_authority_get_authorization_data_length (server->priv->authority);
131 a.data = (char *) x_authority_get_authorization_data (server->priv->authority);
135 /* Open connection */
136 l_debug (server, "Connecting to XServer %s", x_server_get_address (server));
137 server->priv->connection = xcb_connect_to_display_with_auth_info (x_server_get_address (server), auth, NULL);
138 if (xcb_connection_has_error (server->priv->connection))
140 l_debug (server, "Error connecting to XServer %s", x_server_get_address (server));
144 return DISPLAY_SERVER_CLASS (x_server_parent_class)->start (display_server);
148 x_server_connect_session (DisplayServer *display_server, Session *session)
152 display_server = session_get_display_server (session);
154 vt = display_server_get_vt (display_server);
159 t = g_strdup_printf ("/dev/tty%d", vt);
160 session_set_tty (session, t);
163 t = g_strdup_printf ("%d", vt);
164 l_debug (session, "Setting XDG_VTNR=%s", t);
165 session_set_env (session, "XDG_VTNR", t);
169 l_debug (session, "Not setting XDG_VTNR");
171 session_set_env (session, "DISPLAY", x_server_get_address (X_SERVER (display_server)));
172 session_set_tty (session, x_server_get_address (X_SERVER (display_server)));
173 session_set_xdisplay (session, x_server_get_address (X_SERVER (display_server)));
174 session_set_remote_host_name (session, x_server_get_hostname (X_SERVER (display_server)));
175 session_set_x_authority (session,
176 x_server_get_authority (X_SERVER (display_server)),
177 config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
181 x_server_disconnect_session (DisplayServer *display_server, Session *session)
185 vt = display_server_get_vt (display_server);
188 session_set_tty (session, NULL);
189 session_unset_env (session, "XDG_VTNR");
191 session_unset_env (session, "DISPLAY");
192 session_set_xdisplay (session, NULL);
193 session_set_remote_host_name (session, NULL);
194 session_set_x_authority (session, NULL, FALSE);
198 x_server_init (XServer *server)
200 server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_TYPE, XServerPrivate);
204 x_server_finalize (GObject *object)
208 self = X_SERVER (object);
210 g_free (self->priv->hostname);
211 g_free (self->priv->address);
212 if (self->priv->authority)
213 g_object_unref (self->priv->authority);
214 if (self->priv->connection)
215 xcb_disconnect (self->priv->connection);
217 G_OBJECT_CLASS (x_server_parent_class)->finalize (object);
221 x_server_class_init (XServerClass *klass)
223 GObjectClass *object_class = G_OBJECT_CLASS (klass);
224 DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
226 display_server_class->get_session_type = x_server_get_session_type;
227 display_server_class->get_can_share = x_server_get_can_share;
228 display_server_class->start = x_server_start;
229 display_server_class->connect_session = x_server_connect_session;
230 display_server_class->disconnect_session = x_server_disconnect_session;
231 object_class->finalize = x_server_finalize;
233 g_type_class_add_private (klass, sizeof (XServerPrivate));