]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/mir-server.c
Make an XServerXmir object
[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
27 G_DEFINE_TYPE (MirServer, mir_server, DISPLAY_SERVER_TYPE);
28
29 MirServer *mir_server_new (void)
30 {
31     return g_object_new (MIR_SERVER_TYPE, NULL);
32 }
33
34 void
35 mir_server_set_vt (MirServer *server, gint vt)
36 {
37     g_return_if_fail (server != NULL);
38     if (server->priv->vt > 0)
39         vt_unref (server->priv->vt);
40     server->priv->vt = vt;
41     if (vt > 0)
42         vt_ref (vt);
43 }
44
45 void
46 mir_server_set_parent_socket (MirServer *server, const gchar *parent_socket)
47 {
48     g_return_if_fail (server != NULL);
49     g_free (server->priv->parent_socket);
50     server->priv->parent_socket = g_strdup (parent_socket);
51 }
52
53 static const gchar *
54 mir_server_get_session_type (DisplayServer *server)
55 {
56     return "mir";
57 }
58
59 static gint
60 mir_server_get_vt (DisplayServer *server)
61 {
62     return MIR_SERVER (server)->priv->vt;
63 }
64
65 static void
66 mir_server_connect_session (DisplayServer *display_server, Session *session)
67 {
68     MirServer *server;
69
70     session_set_env (session, "XDG_SESSION_TYPE", "mir");
71
72     server = MIR_SERVER (display_server);
73     if (server->priv->parent_socket)
74         session_set_env (session, "MIR_SERVER_HOST_SOCKET", server->priv->parent_socket);
75     if (server->priv->vt > 0)
76     {
77         gchar *value = g_strdup_printf ("%d", server->priv->vt);
78         session_set_env (session, "XDG_VTNR", value);
79         g_free (value);
80     }
81 }
82
83 static void
84 mir_server_disconnect_session (DisplayServer *display_server, Session *session)
85 {
86     session_unset_env (session, "XDG_SESSION_TYPE");
87     session_unset_env (session, "MIR_SERVER_HOST_SOCKET");
88     session_unset_env (session, "XDG_VTNR");
89 }
90
91 static void
92 mir_server_init (MirServer *server)
93 {
94     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, MIR_SERVER_TYPE, MirServerPrivate);
95     server->priv->vt = -1;
96     display_server_set_name (DISPLAY_SERVER (server), "mir");
97 }
98
99 static void
100 mir_server_finalize (GObject *object)
101 {
102     MirServer *self = MIR_SERVER (object);
103
104     if (self->priv->vt > 0)
105         vt_unref (self->priv->vt);
106     g_free (self->priv->parent_socket);
107
108     G_OBJECT_CLASS (mir_server_parent_class)->finalize (object);
109 }
110
111 static void
112 mir_server_class_init (MirServerClass *klass)
113 {
114     GObjectClass *object_class = G_OBJECT_CLASS (klass);
115     DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
116
117     display_server_class->get_session_type = mir_server_get_session_type;
118     display_server_class->get_vt = mir_server_get_vt;
119     display_server_class->connect_session = mir_server_connect_session;
120     display_server_class->disconnect_session = mir_server_disconnect_session;
121     object_class->finalize = mir_server_finalize;
122
123     g_type_class_add_private (klass, sizeof (MirServerPrivate));
124 }