#include "unity-system-compositor.h"
#include "configuration.h"
#include "process.h"
-#include "greeter.h"
+#include "greeter-session.h"
#include "vt.h"
struct UnitySystemCompositorPrivate
gint vt;
gboolean have_vt_ref;
- /* TRUE if should show hardware cursor */
- gboolean enable_hardware_cursor;
-
/* Pipes to communicate with compositor */
int to_compositor_pipe[2];
int from_compositor_pipe[2];
/* TRUE when received ready signal */
gboolean is_ready;
+
+ /* Counters for Mir IDs to use */
+ int next_session_id;
+ int next_greeter_id;
};
-G_DEFINE_TYPE (UnitySystemCompositor, unity_system_compositor, DISPLAY_SERVER_TYPE);
+static void unity_system_compositor_logger_iface_init (LoggerInterface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (UnitySystemCompositor, unity_system_compositor, DISPLAY_SERVER_TYPE,
+ G_IMPLEMENT_INTERFACE (LOGGER_TYPE, unity_system_compositor_logger_iface_init));
typedef enum
{
}
}
-void
-unity_system_compositor_set_enable_hardware_cursor (UnitySystemCompositor *compositor, gboolean enable_cursor)
-{
- g_return_if_fail (compositor != NULL);
- compositor->priv->enable_hardware_cursor = enable_cursor;
-}
-
void
unity_system_compositor_set_timeout (UnitySystemCompositor *compositor, gint timeout)
{
unity_system_compositor_connect_session (DisplayServer *display_server, Session *session)
{
UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (display_server);
- const gchar *name;
session_set_env (session, "XDG_SESSION_TYPE", "mir");
if (compositor->priv->socket)
- session_set_env (session, "MIR_SOCKET", compositor->priv->socket);
- if (IS_GREETER (session))
- name = "greeter-0";
- else
- name = "session-0";
- session_set_env (session, "MIR_SERVER_NAME", name);
+ session_set_env (session, "MIR_SERVER_HOST_SOCKET", compositor->priv->socket);
+
+ if (!session_get_env (session, "MIR_SERVER_NAME"))
+ {
+ gchar *name;
+ if (IS_GREETER_SESSION (session))
+ {
+ name = g_strdup_printf ("greeter-%d", compositor->priv->next_greeter_id);
+ compositor->priv->next_greeter_id++;
+ }
+ else
+ {
+ name = g_strdup_printf ("session-%d", compositor->priv->next_session_id);
+ compositor->priv->next_session_id++;
+ }
+ session_set_env (session, "MIR_SERVER_NAME", name);
+ g_free (name);
+ }
if (compositor->priv->vt >= 0)
{
unity_system_compositor_disconnect_session (DisplayServer *display_server, Session *session)
{
session_unset_env (session, "XDG_SESSION_TYPE");
- session_unset_env (session, "MIR_SOCKET");
+ session_unset_env (session, "MIR_SERVER_HOST_SOCKET");
session_unset_env (session, "MIR_SERVER_NAME");
session_unset_env (session, "XDG_VTNR");
}
unity_system_compositor_start (DisplayServer *server)
{
UnitySystemCompositor *compositor = UNITY_SYSTEM_COMPOSITOR (server);
- gboolean result;
+ gboolean result, backup_logs;
GString *command;
gchar *dir, *log_file, *absolute_command, *value;
/* Setup environment */
compositor->priv->process = process_new (run_cb, compositor);
- process_set_log_file (compositor->priv->process, log_file, TRUE);
+ backup_logs = config_get_boolean (config_get_instance (), "LightDM", "backup-logs");
+ process_set_log_file (compositor->priv->process, log_file, TRUE, backup_logs ? LOG_MODE_BACKUP_AND_TRUNCATE : LOG_MODE_APPEND);
g_free (log_file);
process_set_clear_environment (compositor->priv->process, TRUE);
process_set_env (compositor->priv->process, "XDG_SEAT", "seat0");
g_string_append_printf (command, " --from-dm-fd %d --to-dm-fd %d", compositor->priv->to_compositor_pipe[0], compositor->priv->from_compositor_pipe[1]);
if (compositor->priv->vt > 0)
g_string_append_printf (command, " --vt %d", compositor->priv->vt);
- if (compositor->priv->enable_hardware_cursor)
- g_string_append (command, " --enable-hardware-cursor=true");
process_set_command (compositor->priv->process, command->str);
g_string_free (command, TRUE);
/* Close compostor ends of the pipes */
close (compositor->priv->to_compositor_pipe[0]);
- compositor->priv->to_compositor_pipe[0] = 0;
+ compositor->priv->to_compositor_pipe[0] = -1;
close (compositor->priv->from_compositor_pipe[1]);
- compositor->priv->from_compositor_pipe[1] = 0;
+ compositor->priv->from_compositor_pipe[1] = -1;
if (!result)
return FALSE;
compositor->priv->command = g_strdup ("unity-system-compositor");
compositor->priv->socket = g_strdup ("/run/mir_socket");
compositor->priv->timeout = -1;
+ compositor->priv->to_compositor_pipe[0] = -1;
+ compositor->priv->to_compositor_pipe[1] = -1;
+ compositor->priv->from_compositor_pipe[0] = -1;
+ compositor->priv->from_compositor_pipe[1] = -1;
}
static void
g_type_class_add_private (klass, sizeof (UnitySystemCompositorPrivate));
}
+
+static gint
+unity_system_compositor_real_logprefix (Logger *self, gchar *buf, gulong buflen)
+{
+ return g_snprintf (buf, buflen, "Unity System Compositor: ");
+}
+
+static void
+unity_system_compositor_logger_iface_init (LoggerInterface *iface)
+{
+ iface->logprefix = &unity_system_compositor_real_logprefix;
+}