]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blob - src/display-server.c
fb919ebe053f0cac7bffad202fea4645987ce421
[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 DisplayServer *
66 display_server_get_parent (DisplayServer *server)
67 {
68     return DISPLAY_SERVER_GET_CLASS (server)->get_parent (server);
69 }
70
71 static DisplayServer *
72 display_server_real_get_parent (DisplayServer *server)
73 {
74     return NULL;
75 }
76
77 gboolean
78 display_server_get_can_share (DisplayServer *server)
79 {
80     return DISPLAY_SERVER_GET_CLASS (server)->get_can_share (server);
81 }
82
83 static gboolean
84 display_server_real_get_can_share (DisplayServer *server)
85 {
86     return FALSE;
87 }
88
89 gint
90 display_server_get_vt (DisplayServer *server)
91 {
92     g_return_val_if_fail (server != NULL, -1);
93     return DISPLAY_SERVER_GET_CLASS (server)->get_vt (server);
94 }
95
96 static gint
97 display_server_real_get_vt (DisplayServer *server)
98 {
99     return -1;
100 }
101
102 gboolean
103 display_server_start (DisplayServer *server)
104 {
105     g_return_val_if_fail (server != NULL, FALSE);
106     return DISPLAY_SERVER_GET_CLASS (server)->start (server);
107 }
108
109 gboolean
110 display_server_get_is_ready (DisplayServer *server)
111 {
112     g_return_val_if_fail (server != NULL, FALSE);
113     return server->priv->is_ready;
114 }
115
116 static gboolean
117 display_server_real_start (DisplayServer *server)
118 {
119     server->priv->is_ready = TRUE;
120     g_signal_emit (server, signals[READY], 0);
121     return TRUE;
122 }
123
124 void
125 display_server_connect_session (DisplayServer *server, Session *session)
126 {
127     return DISPLAY_SERVER_GET_CLASS (server)->connect_session (server, session);
128 }
129
130 static void
131 display_server_real_connect_session (DisplayServer *server, Session *session)
132 {
133 }
134
135 void
136 display_server_disconnect_session (DisplayServer *server, Session *session)
137 {
138     return DISPLAY_SERVER_GET_CLASS (server)->disconnect_session (server, session);
139 }
140
141 static void
142 display_server_real_disconnect_session (DisplayServer *server, Session *session)
143 {
144 }
145
146 void
147 display_server_stop (DisplayServer *server)
148 {
149     g_return_if_fail (server != NULL);
150
151     if (server->priv->stopping)
152         return;
153     server->priv->stopping = TRUE;
154
155     DISPLAY_SERVER_GET_CLASS (server)->stop (server);
156 }
157
158 gboolean
159 display_server_get_is_stopping (DisplayServer *server)
160 {
161     g_return_val_if_fail (server != NULL, FALSE);
162     return server->priv->stopping;
163 }
164
165 static void
166 display_server_real_stop (DisplayServer *server)
167 {
168     g_signal_emit (server, signals[STOPPED], 0);
169 }
170
171 static void
172 display_server_init (DisplayServer *server)
173 {
174     server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, DISPLAY_SERVER_TYPE, DisplayServerPrivate);
175 }
176
177 static void
178 display_server_finalize (GObject *object)
179 {
180     DisplayServer *self = DISPLAY_SERVER (object);
181
182     g_free (self->priv->name);
183
184     G_OBJECT_CLASS (display_server_parent_class)->finalize (object);
185 }
186
187 static void
188 display_server_class_init (DisplayServerClass *klass)
189 {
190     GObjectClass *object_class = G_OBJECT_CLASS (klass);
191
192     klass->get_parent = display_server_real_get_parent;  
193     klass->get_can_share = display_server_real_get_can_share;
194     klass->get_vt = display_server_real_get_vt;
195     klass->start = display_server_real_start;
196     klass->connect_session = display_server_real_connect_session;
197     klass->disconnect_session = display_server_real_disconnect_session;
198     klass->stop = display_server_real_stop;
199     object_class->finalize = display_server_finalize;
200
201     g_type_class_add_private (klass, sizeof (DisplayServerPrivate));
202
203     signals[READY] =
204         g_signal_new (DISPLAY_SERVER_SIGNAL_READY,
205                       G_TYPE_FROM_CLASS (klass),
206                       G_SIGNAL_RUN_LAST,
207                       G_STRUCT_OFFSET (DisplayServerClass, ready),
208                       NULL, NULL,
209                       NULL,
210                       G_TYPE_NONE, 0);
211     signals[STOPPED] =
212         g_signal_new (DISPLAY_SERVER_SIGNAL_STOPPED,
213                       G_TYPE_FROM_CLASS (klass),
214                       G_SIGNAL_RUN_LAST,
215                       G_STRUCT_OFFSET (DisplayServerClass, stopped),
216                       NULL, NULL,
217                       NULL,
218                       G_TYPE_NONE, 0);
219 }
220
221 static gint
222 display_server_real_logprefix (Logger *self, gchar *buf, gulong buflen)
223 {
224     DisplayServer *server = DISPLAY_SERVER (self);
225     const gchar *name = display_server_get_name (server);
226     if (name)
227         return g_snprintf (buf, buflen, "DisplayServer %s: ", name);
228     else
229         return g_snprintf (buf, buflen, "DisplayServer: ");
230 }
231
232 static void
233 display_server_logger_iface_init (LoggerInterface *iface)
234 {
235     iface->logprefix = &display_server_real_logprefix;
236 }