2 * Copyright (C) 2010-2016 Canonical Ltd.
4 * This program is free software: you can redistribute it and/or modify it under
5 * the terms of the GNU General Public License as published by the Free Software
6 * Foundation, either version 3 of the License, or (at your option) any later
7 * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
13 #include "x-server-xmir.h"
15 struct XServerXmirPrivate
17 /* Compositor we are running under */
18 UnitySystemCompositor *compositor;
20 /* TRUE if we are waiting for the compositor to start */
21 gboolean waiting_for_compositor;
23 /* ID to report to Mir */
26 /* Filename of socket Mir is listening on */
30 G_DEFINE_TYPE (XServerXmir, x_server_xmir, X_SERVER_LOCAL_TYPE);
33 compositor_ready_cb (UnitySystemCompositor *compositor, XServerXmir *server)
37 if (!server->priv->waiting_for_compositor)
39 server->priv->waiting_for_compositor = FALSE;
41 result = X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (DISPLAY_SERVER (server));
43 display_server_stop (DISPLAY_SERVER (server));
47 compositor_stopped_cb (UnitySystemCompositor *compositor, XServerXmir *server)
49 display_server_stop (DISPLAY_SERVER (server));
53 x_server_xmir_new (UnitySystemCompositor *compositor)
57 server = g_object_new (X_SERVER_XMIR_TYPE, NULL);
58 x_server_local_set_command (X_SERVER_LOCAL (server), "Xmir");
59 server->priv->compositor = g_object_ref (compositor);
60 g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_READY, G_CALLBACK (compositor_ready_cb), server);
61 g_signal_connect (compositor, DISPLAY_SERVER_SIGNAL_STOPPED, G_CALLBACK (compositor_stopped_cb), server);
67 x_server_xmir_set_mir_id (XServerXmir *server, const gchar *id)
69 g_return_if_fail (server != NULL);
70 g_free (server->priv->mir_id);
71 server->priv->mir_id = g_strdup (id);
75 x_server_xmir_get_mir_id (XServerXmir *server)
77 g_return_val_if_fail (server != NULL, NULL);
78 return server->priv->mir_id;
82 x_server_xmir_set_mir_socket (XServerXmir *server, const gchar *socket)
84 g_return_if_fail (server != NULL);
85 g_free (server->priv->mir_socket);
86 server->priv->mir_socket = g_strdup (socket);
90 x_server_xmir_add_args (XServerLocal *x_server, GString *command)
92 XServerXmir *server = X_SERVER_XMIR (x_server);
94 if (server->priv->mir_id)
95 g_string_append_printf (command, " -mir %s", server->priv->mir_id);
97 if (server->priv->mir_socket)
98 g_string_append_printf (command, " -mirSocket %s", server->priv->mir_socket);
101 static DisplayServer *
102 x_server_xmir_get_parent (DisplayServer *server)
104 return DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor);
108 x_server_xmir_get_vt (DisplayServer *server)
110 return display_server_get_vt (DISPLAY_SERVER (X_SERVER_XMIR (server)->priv->compositor));
114 x_server_xmir_start (DisplayServer *display_server)
116 XServerXmir *server = X_SERVER_XMIR (display_server);
118 if (display_server_get_is_ready (DISPLAY_SERVER (server->priv->compositor)))
119 return X_SERVER_LOCAL_CLASS (x_server_xmir_parent_class)->start (display_server);
122 if (!server->priv->waiting_for_compositor)
124 server->priv->waiting_for_compositor = TRUE;
125 if (!display_server_start (DISPLAY_SERVER (server->priv->compositor)))
133 x_server_xmir_init (XServerXmir *server)
135 server->priv = G_TYPE_INSTANCE_GET_PRIVATE (server, X_SERVER_XMIR_TYPE, XServerXmirPrivate);
139 x_server_xmir_finalize (GObject *object)
141 XServerXmir *self = X_SERVER_XMIR (object);
143 if (self->priv->compositor)
145 g_signal_handlers_disconnect_matched (self->priv->compositor, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
146 g_object_unref (self->priv->compositor);
148 g_free (self->priv->mir_id);
149 g_free (self->priv->mir_socket);
151 G_OBJECT_CLASS (x_server_xmir_parent_class)->finalize (object);
155 x_server_xmir_class_init (XServerXmirClass *klass)
157 GObjectClass *object_class = G_OBJECT_CLASS (klass);
158 DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
159 XServerLocalClass *x_server_local_class = X_SERVER_LOCAL_CLASS (klass);
161 x_server_local_class->add_args = x_server_xmir_add_args;
162 display_server_class->get_parent = x_server_xmir_get_parent;
163 display_server_class->get_vt = x_server_xmir_get_vt;
164 display_server_class->start = x_server_xmir_start;
165 object_class->finalize = x_server_xmir_finalize;
167 g_type_class_add_private (klass, sizeof (XServerXmirPrivate));