]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/xserver.c
Load and use session types
[sojka/lightdm.git] / src / xserver.c
1 /*
2  * Copyright (C) 2010-2011 Robert Ancell.
3  * Author: Robert Ancell <robert.ancell@canonical.com>
4  * 
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
9  * license.
10  */
11
12 #include <config.h>
13 #include <string.h>
14 #include <xcb/xcb.h>
15
16 #include "xserver.h"
17 #include "configuration.h"
18
19 struct XServerPrivate
20 {  
21     /* Host running the server */
22     gchar *hostname;
23
24     /* Display number */
25     guint number;
26
27     /* Cached server address */
28     gchar *address;
29
30     /* Authority */
31     XAuthority *authority;
32
33     /* Connection to this X server */
34     xcb_connection_t *connection;
35 };
36
37 G_DEFINE_TYPE (XServer, xserver, DISPLAY_SERVER_TYPE);
38
39 void
40 xserver_set_hostname (XServer *server, const gchar *hostname)
41 {
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;
47 }
48
49 gchar *
50 xserver_get_hostname (XServer *server)
51 {
52     g_return_val_if_fail (server != NULL, NULL);
53     return server->priv->hostname;
54 }
55
56 void
57 xserver_set_display_number (XServer *server, guint number)
58 {
59     g_return_if_fail (server != NULL);
60     server->priv->number = number;
61     g_free (server->priv->address);
62     server->priv->address = NULL;
63 }
64
65 guint
66 xserver_get_display_number (XServer *server)
67 {
68     g_return_val_if_fail (server != NULL, 0);
69     return server->priv->number;
70 }
71
72 const gchar *
73 xserver_get_address (XServer *server)
74 {
75     g_return_val_if_fail (server != NULL, NULL);
76
77     if (!server->priv->address)
78     {
79         if (server->priv->hostname)
80             server->priv->address = g_strdup_printf("%s:%d", server->priv->hostname, server->priv->number);
81         else
82             server->priv->address = g_strdup_printf(":%d", server->priv->number);
83     }  
84
85     return server->priv->address;
86 }
87
88 void
89 xserver_set_authority (XServer *server, XAuthority *authority)
90 {
91     g_return_if_fail (server != NULL);
92
93     if (server->priv->authority)
94         g_object_unref (server->priv->authority);
95     if (authority)
96         server->priv->authority = g_object_ref (authority);
97     else
98         server->priv->authority = NULL;
99 }
100
101 XAuthority *
102 xserver_get_authority (XServer *server)
103 {
104     g_return_val_if_fail (server != NULL, NULL);
105     return server->priv->authority;
106 }
107
108 static gboolean
109 xserver_start (DisplayServer *display_server)
110 {
111     XServer *server = XSERVER (display_server);
112     xcb_auth_info_t *auth = NULL, a;
113
114     if (server->priv->authority)
115     {
116         a.namelen = strlen (xauth_get_authorization_name (server->priv->authority));
117         a.name = (char *) xauth_get_authorization_name (server->priv->authority);
118         a.datalen = xauth_get_authorization_data_length (server->priv->authority);
119         a.data = (char *) xauth_get_authorization_data (server->priv->authority);
120         auth = &a;
121     }
122
123     /* Open connection */  
124     g_debug ("Connecting to XServer %s", xserver_get_address (server));
125     server->priv->connection = xcb_connect_to_display_with_auth_info (xserver_get_address (server), auth, NULL);
126     if (xcb_connection_has_error (server->priv->connection))
127     {
128         g_debug ("Error connecting to XServer %s", xserver_get_address (server));
129         return FALSE;
130     }
131
132     return DISPLAY_SERVER_CLASS (xserver_parent_class)->start (display_server);
133 }
134
135 static void
136 xserver_setup_session (DisplayServer *display_server, Session *session)
137 {
138     gint vt;
139
140     display_server = session_get_display_server (session);
141
142     vt = display_server_get_vt (display_server);
143     if (vt > 0)
144     {
145         gchar *t;
146
147         t = g_strdup_printf ("/dev/tty%d", vt);
148         session_set_tty (session, t);
149         g_free (t);
150
151         t = g_strdup_printf ("%d", vt);
152         session_set_env (session, "XDG_VTNR", t);
153         g_free (t);
154     }
155
156     session_set_env (session, "DISPLAY", xserver_get_address (XSERVER (display_server)));
157     session_set_tty (session, xserver_get_address (XSERVER (display_server)));
158     session_set_xdisplay (session, xserver_get_address (XSERVER (display_server)));
159     session_set_remote_host_name (session, xserver_get_hostname (XSERVER (display_server)));
160     session_set_xauthority (session,
161                             xserver_get_authority (XSERVER (display_server)),
162                             config_get_boolean (config_get_instance (), "LightDM", "user-authority-in-system-dir"));
163 }
164
165 static void
166 xserver_init (XServer *server)
167 {
168     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, XSERVER_TYPE, XServerPrivate);
169 }
170
171 static void
172 xserver_finalize (GObject *object)
173 {
174     XServer *self;
175
176     self = XSERVER (object);
177
178     g_free (self->priv->hostname);
179     g_free (self->priv->address);
180     if (self->priv->authority)
181         g_object_unref (self->priv->authority);
182     if (self->priv->connection)
183         xcb_disconnect (self->priv->connection);
184
185     G_OBJECT_CLASS (xserver_parent_class)->finalize (object);
186 }
187
188 static void
189 xserver_class_init (XServerClass *klass)
190 {
191     GObjectClass *object_class = G_OBJECT_CLASS (klass);
192     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
193
194     display_server_class->start = xserver_start;
195     display_server_class->setup_session = xserver_setup_session;
196     object_class->finalize = xserver_finalize;
197
198     g_type_class_add_private (klass, sizeof (XServerPrivate));
199 }