]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/display-server.c
Make an XServerXmir object
[sojka/lightdm.git] / src / display-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 <config.h>
13
14 #include "display-server.h"
15
16 enum {
17     READY,
18     STOPPED,
19     LAST_SIGNAL
20 };
21 static guint signals[LAST_SIGNAL] = { 0 };
22
23 struct DisplayServerPrivate
24 {
25     /* Unique name for this display server */
26     gchar *name;
27
28     /* TRUE when started */
29     gboolean is_ready;
30
31     /* TRUE when being stopped */
32     gboolean stopping;
33
34     /* TRUE when the display server has stopped */
35     gboolean stopped;
36 };
37
38 static void display_server_logger_iface_init (LoggerInterface *iface);
39
40 G_DEFINE_TYPE_WITH_CODE (DisplayServer, display_server, G_TYPE_OBJECT,
41                          G_IMPLEMENT_INTERFACE (
42                              LOGGER_TYPE, display_server_logger_iface_init));
43
44 void
45 display_server_set_name (DisplayServer *server, const gchar *name)
46 {
47     g_return_if_fail (server != NULL);
48     g_free (server->priv->name);
49     server->priv->name = g_strdup (name);
50 }
51
52 const gchar *
53 display_server_get_name (DisplayServer *server)
54 {
55     g_return_val_if_fail (server != NULL, NULL);
56     return server->priv->name;
57 }
58
59 const gchar *
60 display_server_get_session_type (DisplayServer *server)
61 {
62     return DISPLAY_SERVER_GET_CLASS (server)->get_session_type (server);
63 }
64
65 gboolean
66 display_server_get_can_share (DisplayServer *server)
67 {
68     return DISPLAY_SERVER_GET_CLASS (server)->get_can_share (server);
69 }
70
71 static gboolean
72 display_server_real_get_can_share (DisplayServer *server)
73 {
74     return FALSE;
75 }
76
77 gint
78 display_server_get_vt (DisplayServer *server)
79 {
80     g_return_val_if_fail (server != NULL, -1);
81     return DISPLAY_SERVER_GET_CLASS (server)->get_vt (server);
82 }
83
84 static gint
85 display_server_real_get_vt (DisplayServer *server)
86 {
87     return -1;
88 }
89
90 gboolean
91 display_server_start (DisplayServer *server)
92 {
93     g_return_val_if_fail (server != NULL, FALSE);
94     return DISPLAY_SERVER_GET_CLASS (server)->start (server);
95 }
96
97 gboolean
98 display_server_get_is_ready (DisplayServer *server)
99 {
100     g_return_val_if_fail (server != NULL, FALSE);
101     return server->priv->is_ready;
102 }
103
104 static gboolean
105 display_server_real_start (DisplayServer *server)
106 {
107     server->priv->is_ready = TRUE;
108     g_signal_emit (server, signals[READY], 0);
109     return TRUE;
110 }
111
112 void
113 display_server_connect_session (DisplayServer *server, Session *session)
114 {
115     return DISPLAY_SERVER_GET_CLASS (server)->connect_session (server, session);
116 }
117
118 static void
119 display_server_real_connect_session (DisplayServer *server, Session *session)
120 {
121 }
122
123 void
124 display_server_disconnect_session (DisplayServer *server, Session *session)
125 {
126     return DISPLAY_SERVER_GET_CLASS (server)->disconnect_session (server, session);
127 }
128
129 static void
130 display_server_real_disconnect_session (DisplayServer *server, Session *session)
131 {
132 }
133
134 void
135 display_server_stop (DisplayServer *server)
136 {
137     g_return_if_fail (server != NULL);
138
139     if (server->priv->stopping)
140         return;
141     server->priv->stopping = TRUE;
142
143     DISPLAY_SERVER_GET_CLASS (server)->stop (server);
144 }
145
146 gboolean
147 display_server_get_is_stopping (DisplayServer *server)
148 {
149     g_return_val_if_fail (server != NULL, FALSE);
150     return server->priv->stopping;
151 }
152
153 static void
154 display_server_real_stop (DisplayServer *server)
155 {
156     g_signal_emit (server, signals[STOPPED], 0);
157 }
158
159 static void
160 display_server_init (DisplayServer *server)
161 {
162     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, DISPLAY_SERVER_TYPE, DisplayServerPrivate);
163 }
164
165 static void
166 display_server_finalize (GObject *object)
167 {
168     DisplayServer *self = DISPLAY_SERVER (object);
169
170     g_free (self->priv->name);
171
172     G_OBJECT_CLASS (display_server_parent_class)->finalize (object);
173 }
174
175 static void
176 display_server_class_init (DisplayServerClass *klass)
177 {
178     GObjectClass *object_class = G_OBJECT_CLASS (klass);
179
180     klass->get_can_share = display_server_real_get_can_share;
181     klass->get_vt = display_server_real_get_vt;
182     klass->start = display_server_real_start;
183     klass->connect_session = display_server_real_connect_session;
184     klass->disconnect_session = display_server_real_disconnect_session;
185     klass->stop = display_server_real_stop;
186     object_class->finalize = display_server_finalize;
187
188     g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
189
190     signals[READY] =
191         g_signal_new (DISPLAY_SERVER_SIGNAL_READY,
192                       G_TYPE_FROM_CLASS (klass),
193                       G_SIGNAL_RUN_LAST,
194                       G_STRUCT_OFFSET (DisplayServerClass, ready),
195                       NULL, NULL,
196                       NULL,
197                       G_TYPE_NONE, 0);
198     signals[STOPPED] =
199         g_signal_new (DISPLAY_SERVER_SIGNAL_STOPPED,
200                       G_TYPE_FROM_CLASS (klass),
201                       G_SIGNAL_RUN_LAST,
202                       G_STRUCT_OFFSET (DisplayServerClass, stopped),
203                       NULL, NULL,
204                       NULL,
205                       G_TYPE_NONE, 0);
206 }
207
208 static gint
209 display_server_real_logprefix (Logger *self, gchar *buf, gulong buflen)
210 {
211     DisplayServer *server = DISPLAY_SERVER (self);
212     const gchar *name = display_server_get_name (server);
213     if (name)
214         return g_snprintf (buf, buflen, "DisplayServer %s: ", name);
215     else
216         return g_snprintf (buf, buflen, "DisplayServer: ");
217 }
218
219 static void
220 display_server_logger_iface_init (LoggerInterface *iface)
221 {
222     iface->logprefix = &display_server_real_logprefix;
223 }