]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/mir-server.c
Set MIR_SERVER_NAME instead of MIR_ID, some minor cleanup
[sojka/lightdm.git] / src / mir-server.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 <string.h>
13
14 #include "mir-server.h"
15 #include "configuration.h"
16 #include "vt.h"
17
18 struct MirServerPrivate
19 {
20     /* VT to run on */
21     gint vt;
22
23     /* Mir socket for this server to talk to parent */
24     gchar *parent_socket;
25
26     /* ID to use for Mir connection */
27     gchar *id;
28 };
29
30 G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
31
32 MirServer *mir_server_new (void)
33 {
34     return g_object_new (MIR_SERVER_TYPE, NULL);  
35 }
36
37 void
38 mir_server_set_vt (MirServer *server, gint vt)
39 {
40     g_return_if_fail (server != NULL);
41     if (server->priv->vt > 0)
42         vt_unref (server->priv->vt);
43     server->priv->vt = vt;
44     if (vt > 0)
45         vt_ref (vt);
46 }
47
48 void
49 mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket)
50 {
51     g_return_if_fail (server != NULL);
52     g_free (server->priv->parent_socket);
53     server->priv->parent_socket = g_strdup (parent_socket);
54 }
55
56 static void
57 update_name (MirServer *server)
58 {
59     gchar *name;
60
61     if (server->priv->id)
62         name = g_strdup_printf ("mir-%s", type, server->priv->id);
63     else
64         name = g_strdup (type);
65     display_server_set_name (DISPLAY_SERVER (server), name);
66     g_free (name);
67 }
68
69 void
70 mir_server_set_id (MirServer *server, const gchar *id)
71 {
72     g_return_if_fail (server != NULL);
73     g_free (server->priv->id);
74     server->priv->id = g_strdup (id);
75     update_name (server);
76 }
77
78 const gchar *
79 mir_server_get_id (MirServer *server)
80 {
81     g_return_val_if_fail (server != NULL, NULL);
82     return server->priv->id;
83 }
84
85 static const gchar *
86 mir_server_get_session_type (DisplayServer *server)
87 {
88     return "mir";
89 }
90
91 static gint
92 mir_server_get_vt (DisplayServer *server)
93 {
94     return MIR_SERVER (server)->priv->vt;
95 }
96
97 static void
98 mir_server_connect_session (DisplayServer *display_server, Session *session)
99 {
100     MirServer *server;
101
102     server = MIR_SERVER (display_server);
103     if (server->priv->id)
104         session_set_env (session, "MIR_SERVER_NAME", server->priv->id);
105     if (server->priv->parent_socket)
106         session_set_env (session, "MIR_SERVER_FILE", server->priv->parent_socket);
107     if (server->priv->vt > 0)
108     {
109         gchar *value = g_strdup_printf ("%d", server->priv->vt);
110         session_set_env (session, "MIR_SERVER_VT", value);
111         g_free (value);
112     }
113 }
114
115 static void
116 mir_server_disconnect_session (DisplayServer *display_server, Session *session)
117 {
118     session_unset_env (session, "MIR_SERVER_NAME");
119     session_unset_env (session, "MIR_SERVER_FILE");
120     session_unset_env (session, "MIR_SERVER_VT");
121 }
122
123 static void
124 mir_server_init (MirServer *server)
125 {
126     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
127     server->priv->vt = -1;
128     update_name (server);
129 }
130
131 static void
132 mir_server_finalize (GObject *object)
133 {
134     MirServer *server;
135
136     server = MIR_SERVER (object);
137
138     if (server->priv->vt > 0)
139         vt_unref (server->priv->vt);
140     g_free (server->priv->id);
141     g_free (server->priv->parent_socket);
142
143     G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
144 }
145
146 static void
147 mir_server_class_init (MirServerClass *klass)
148 {
149     GObjectClass *object_class = G_OBJECT_CLASS (klass);
150     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
151
152     display_server_class->get_session_type = mir_server_get_session_type;
153     display_server_class->get_vt = mir_server_get_vt;
154     display_server_class->connect_session = mir_server_connect_session;
155     display_server_class->disconnect_session = mir_server_disconnect_session;
156     object_class->finalize = mir_server_finalize;
157
158     g_type_class_add_private (klass, sizeof (MirServerPrivate));
159 }