display.h \
display-manager.c \
display-manager.h \
+ display-server.c \
+ display-server.h \
dmrc.c \
dmrc.h \
greeter.c \
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#include <config.h>
+
+#include "display-server.h"
+
+enum {
+ READY,
+ STOPPED,
+ LAST_SIGNAL
+};
+static guint signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (DisplayServer, display_server, G_TYPE_OBJECT);
+
+static void
+display_server_real_setup_session (DisplayServer *server, Session *session)
+{
+}
+
+void
+display_server_setup_session (DisplayServer *server, Session *session)
+{
+ g_return_if_fail (server != NULL);
+
+ DISPLAY_SERVER_GET_CLASS (server)->setup_session (server, session);
+}
+
+static gboolean
+display_server_real_start (DisplayServer *server)
+{
+ return FALSE;
+}
+
+gboolean
+display_server_start (DisplayServer *server)
+{
+ g_return_val_if_fail (server != NULL, FALSE);
+ return DISPLAY_SERVER_GET_CLASS (server)->start (server);
+}
+
+void
+display_server_set_ready (DisplayServer *server)
+{
+ g_return_if_fail (server != NULL);
+ g_signal_emit (server, signals[READY], 0);
+}
+
+static gboolean
+display_server_real_restart (DisplayServer *server)
+{
+ return FALSE;
+}
+
+gboolean
+display_server_restart (DisplayServer *server)
+{
+ g_return_val_if_fail (server != NULL, FALSE);
+ return DISPLAY_SERVER_GET_CLASS (server)->restart (server);
+}
+
+static void
+display_server_real_stop (DisplayServer *server)
+{
+}
+
+void
+display_server_stop (DisplayServer *server)
+{
+ g_return_if_fail (server != NULL);
+ DISPLAY_SERVER_GET_CLASS (server)->stop (server);
+}
+
+void
+display_server_set_stopped (DisplayServer *server)
+{
+ g_return_if_fail (server != NULL);
+ g_signal_emit (server, signals[STOPPED], 0);
+}
+
+static void
+display_server_init (DisplayServer *server)
+{
+}
+
+static void
+display_server_class_init (DisplayServerClass *klass)
+{
+ klass->setup_session = display_server_real_setup_session;
+ klass->start = display_server_real_start;
+ klass->restart = display_server_real_restart;
+ klass->stop = display_server_real_stop;
+
+ signals[READY] =
+ g_signal_new ("ready",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (DisplayServerClass, ready),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+ signals[STOPPED] =
+ g_signal_new ("stopped",
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (DisplayServerClass, stopped),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
--- /dev/null
+/*
+ * Copyright (C) 2010-2011 Robert Ancell.
+ * Author: Robert Ancell <robert.ancell@canonical.com>
+ *
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version. See http://www.gnu.org/copyleft/gpl.html the full text of the
+ * license.
+ */
+
+#ifndef _DISPLAY_SERVER_H_
+#define _DISPLAY_SERVER_H_
+
+#include <glib-object.h>
+#include "session.h"
+
+G_BEGIN_DECLS
+
+#define DISPLAY_SERVER_TYPE (display_server_get_type())
+#define DISPLAY_SERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), DISPLAY_SERVER_TYPE, DisplayServer))
+#define DISPLAY_SERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), DISPLAY_SERVER_TYPE, DisplayServerClass))
+#define DISPLAY_SERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), DISPLAY_SERVER_TYPE, DisplayServerClass))
+
+typedef struct DisplayServerPrivate DisplayServerPrivate;
+
+typedef struct
+{
+ GObject parent_instance;
+ DisplayServerPrivate *priv;
+} DisplayServer;
+
+typedef struct
+{
+ GObjectClass parent_class;
+
+ void (*ready)(DisplayServer *server);
+ void (*stopped)(DisplayServer *server);
+
+ void (*setup_session)(DisplayServer *server, Session *session);
+ gboolean (*start)(DisplayServer *server);
+ gboolean (*restart)(DisplayServer *server);
+ void (*stop)(DisplayServer *server);
+} DisplayServerClass;
+
+GType display_server_get_type (void);
+
+void display_server_setup_session (DisplayServer *server, Session *session);
+
+gboolean display_server_start (DisplayServer *server);
+
+void display_server_set_ready (DisplayServer *server);
+
+gboolean display_server_restart (DisplayServer *server);
+
+void display_server_stop (DisplayServer *server);
+
+void display_server_set_stopped (DisplayServer *server);
+
+G_END_DECLS
+
+#endif /* _DISPLAY_SERVER_H_ */
struct DisplayPrivate
{
- /* X server */
- XServer *xserver;
+ /* Display server */
+ DisplayServer *display_server;
/* User to run greeter as */
gchar *greeter_user;
/* Default session */
gchar *default_session;
- /* TRUE if stopping the display (waiting for xserver, greeter and session to stop) */
+ /* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
gboolean stopping;
};
static gboolean start_greeter (Display *display);
Display *
-display_new (const gchar *config_section, XServer *xserver)
+display_new (const gchar *config_section, DisplayServer *display_server)
{
Display *self = g_object_new (DISPLAY_TYPE, NULL);
- g_return_val_if_fail (xserver != NULL, NULL);
+ g_return_val_if_fail (display_server != NULL, NULL);
self->priv->pam_service = g_strdup ("lightdm");
self->priv->pam_autologin_service = g_strdup ("lightdm-autologin");
- self->priv->xserver = g_object_ref (xserver);
+ self->priv->display_server = g_object_ref (display_server);
if (config_section)
self->priv->greeter_user = config_get_string (config_get_instance (), config_section, "greeter-user");
return self;
}
-XServer *
-display_get_xserver (Display *display)
+DisplayServer *
+display_get_display_server (Display *display)
{
g_return_val_if_fail (display != NULL, NULL);
- return display->priv->xserver;
+ return display->priv->display_server;
}
Greeter *
start_ck_session (Display *display, const gchar *session_type, User *user)
{
GDBusProxy *proxy;
- char *display_device = NULL;
- const gchar *address, *hostname = "";
+ const gchar *hostname = "";
GVariantBuilder arg_builder;
GVariant *result;
gchar *cookie = NULL;
if (getuid () != 0)
return NULL;
- if (IS_XSERVER_LOCAL (display->priv->xserver) && xserver_local_get_vt (XSERVER_LOCAL (display->priv->xserver)) >= 0)
- display_device = g_strdup_printf ("/dev/tty%d", xserver_local_get_vt (XSERVER_LOCAL (display->priv->xserver)));
- address = xserver_get_address (display->priv->xserver);
-
proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
g_variant_builder_open (&arg_builder, G_VARIANT_TYPE ("a(sv)"));
g_variant_builder_add (&arg_builder, "(sv)", "unix-user", g_variant_new_int32 (user_get_uid (user)));
g_variant_builder_add (&arg_builder, "(sv)", "session-type", g_variant_new_string (session_type));
- g_variant_builder_add (&arg_builder, "(sv)", "x11-display", g_variant_new_string (address));
- if (display_device)
- g_variant_builder_add (&arg_builder, "(sv)", "x11-display-device", g_variant_new_string (display_device));
+ if (IS_XSERVER (display->priv->display_server))
+ {
+ g_variant_builder_add (&arg_builder, "(sv)", "x11-display",
+ g_variant_new_string (xserver_get_address (XSERVER (display->priv->display_server))));
+
+ if (IS_XSERVER_LOCAL (display->priv->display_server) && xserver_local_get_vt (XSERVER_LOCAL (display->priv->display_server)) >= 0)
+ {
+ gchar *display_device;
+ display_device = g_strdup_printf ("/dev/tty%d", xserver_local_get_vt (XSERVER_LOCAL (display->priv->display_server)));
+ g_variant_builder_add (&arg_builder, "(sv)", "x11-display-device", g_variant_new_string (display_device));
+ g_free (display_device);
+ }
+ }
+
g_variant_builder_add (&arg_builder, "(sv)", "remote-host-name", g_variant_new_string (hostname));
g_variant_builder_add (&arg_builder, "(sv)", "is-local", g_variant_new_boolean (TRUE));
g_variant_builder_close (&arg_builder);
- g_free (display_device);
result = g_dbus_proxy_call_sync (proxy,
"OpenSessionWithParameters",
check_stopped (Display *display)
{
if (display->priv->stopping &&
- display->priv->xserver == NULL &&
+ display->priv->display_server == NULL &&
display->priv->greeter_session == NULL &&
display->priv->user_session == NULL)
{
display->priv->user_ck_cookie = NULL;
/* Restart the X server or start a new one if it failed */
- if (!xserver_restart (display->priv->xserver))
+ if (!display_server_restart (display->priv->display_server))
{
g_debug ("Starting new X server");
- xserver_start (display->priv->xserver);
+ display_server_start (display->priv->display_server);
}
}
}
child_process_set_env (CHILD_PROCESS (display->priv->user_session), "DESKTOP_SESSION", session); // FIXME: Apparently deprecated?
child_process_set_env (CHILD_PROCESS (display->priv->user_session), "GDMSESSION", session); // FIXME: Not cross-desktop
set_env_from_pam_session (display->priv->user_session, display->priv->user_pam_session);
- xserver_setup_session (display->priv->xserver, display->priv->user_session);
+ display_server_setup_session (display->priv->display_server, display->priv->user_session);
// FIXME: Copy old error file
log_filename = g_build_filename (user_get_home_directory (user), ".xsession-errors", NULL);
if (display->priv->greeter_ck_cookie)
child_process_set_env (CHILD_PROCESS (display->priv->greeter_session), "XDG_SESSION_COOKIE", display->priv->greeter_ck_cookie);
set_env_from_pam_session (SESSION (display->priv->greeter_session), display->priv->greeter_pam_session);
- xserver_setup_session (display->priv->xserver, SESSION (display->priv->greeter_session));
+ display_server_setup_session (display->priv->display_server, SESSION (display->priv->greeter_session));
log_dir = config_get_string (config_get_instance (), "Directories", "log-directory");
- filename = g_strdup_printf ("%s-greeter.log", xserver_get_address (display_get_xserver (display)));
+ // FIXME: May not be an X server
+ filename = g_strdup_printf ("%s-greeter.log", xserver_get_address (XSERVER (display->priv->display_server)));
log_filename = g_build_filename (log_dir, filename, NULL);
g_free (log_dir);
g_free (filename);
}
static void
-xserver_stopped_cb (XServer *server, Display *display)
+display_server_stopped_cb (DisplayServer *server, Display *display)
{
g_debug ("X server stopped");
if (display->priv->stopping)
{
- g_object_unref (display->priv->xserver);
- display->priv->xserver = NULL;
+ g_object_unref (display->priv->display_server);
+ display->priv->display_server = NULL;
check_stopped (display);
}
else
else
{
g_debug ("Starting new X server");
- xserver_start (display->priv->xserver);
+ display_server_start (display->priv->display_server);
}
}
}
static void
-xserver_ready_cb (XServer *xserver, Display *display)
+display_server_ready_cb (DisplayServer *display_server, Display *display)
{
const gchar *autologin_user = NULL;
run_script ("Init"); // FIXME: Async
/* Don't run any sessions on local terminals */
- if (IS_XSERVER_LOCAL (xserver) && xserver_local_get_xdmcp_server (XSERVER_LOCAL (xserver)))
+ if (IS_XSERVER_LOCAL (display_server) && xserver_local_get_xdmcp_server (XSERVER_LOCAL (display_server)))
return;
/* If have user then automatically login the first time */
g_return_val_if_fail (display != NULL, FALSE);
- g_signal_connect (G_OBJECT (display->priv->xserver), "ready", G_CALLBACK (xserver_ready_cb), display);
- g_signal_connect (G_OBJECT (display->priv->xserver), "stopped", G_CALLBACK (xserver_stopped_cb), display);
- result = xserver_start (display->priv->xserver);
+ g_signal_connect (G_OBJECT (display->priv->display_server), "ready", G_CALLBACK (display_server_ready_cb), display);
+ g_signal_connect (G_OBJECT (display->priv->display_server), "stopped", G_CALLBACK (display_server_stopped_cb), display);
+ result = display_server_start (display->priv->display_server);
g_signal_emit (display, signals[STARTED], 0);
display->priv->stopping = TRUE;
- xserver_stop (display->priv->xserver);
+ display_server_stop (display->priv->display_server);
if (display->priv->greeter_session)
child_process_stop (CHILD_PROCESS (display->priv->greeter_session));
if (display->priv->user_session)
self = DISPLAY (object);
- g_object_unref (self->priv->xserver);
+ g_object_unref (self->priv->display_server);
g_free (self->priv->greeter_user);
g_free (self->priv->greeter_theme);
g_free (self->priv->session_wrapper);
#include <glib-object.h>
-#include "xserver.h"
+#include "display-server.h"
#include "session.h"
#include "greeter.h"
GType display_get_type (void);
-Display *display_new (const gchar *config_section, XServer *xserver);
+Display *display_new (const gchar *config_section, DisplayServer *server);
-XServer *display_get_xserver (Display *display);
+DisplayServer *display_get_display_server (Display *display);
Greeter *display_get_greeter (Display *display);
xserver_set_authorization (XSERVER (xserver), authorization);
g_object_unref (authorization);
- display = display_new (SEAT_LOCAL (seat)->priv->config_section, XSERVER (xserver));
+ display = display_new (SEAT_LOCAL (seat)->priv->config_section, DISPLAY_SERVER (xserver));
g_object_unref (xserver);
return display;
static void
seat_local_set_active_display (Seat *seat, Display *display)
{
- gint number = xserver_local_get_vt (XSERVER_LOCAL (display_get_xserver (display)));
+ gint number = xserver_local_get_vt (XSERVER_LOCAL (XSERVER (display_get_display_server (display))));
if (number >= 0)
vt_set_active (number);
}
xserver_set_authorization (XSERVER (xserver), authorization);
g_object_unref (authorization);
- SEAT_XDMCP_CLIENT (seat)->priv->display = g_object_ref (display_new (SEAT_XDMCP_CLIENT (seat)->priv->config_section, XSERVER (xserver)));
+ SEAT_XDMCP_CLIENT (seat)->priv->display = g_object_ref (display_new (SEAT_XDMCP_CLIENT (seat)->priv->config_section, DISPLAY_SERVER (xserver)));
g_object_unref (xserver);
return SEAT_XDMCP_CLIENT (seat)->priv->display;
}
g_free (address);
- display = display_new (SEAT_XDMCP_SESSION (seat)->priv->config_section, XSERVER (xserver));
+ display = display_new (SEAT_XDMCP_SESSION (seat)->priv->config_section, DISPLAY_SERVER (xserver));
g_object_unref (xserver);
return display;
/* If already logged in, then switch to that display and stop the greeter display */
if (g_strcmp0 (display_get_session_user (d), username) == 0)
{
- g_debug ("Switching to user %s session on display %s", username, xserver_get_address (display_get_xserver (display)));
+ // FIXME: Use display_get_name
+ g_debug ("Switching to user %s session on display %s", username, xserver_get_address (XSERVER (display_get_display_server (display))));
SEAT_GET_CLASS (seat)->set_active_display (seat, display);
return TRUE;
}
/* If already logged in, then switch to that display */
if (g_strcmp0 (display_get_session_user (display), username) == 0)
{
- g_debug ("Switching to user %s session on display %s", username, xserver_get_address (display_get_xserver (display)));
+ // FIXME: Use display_get_name
+ g_debug ("Switching to user %s session on display %s", username, xserver_get_address (XSERVER (display_get_display_server (display))));
SEAT_GET_CLASS (seat)->set_active_display (seat, display);
return TRUE;
}
plymouth_quit (TRUE);
}
- xserver_connect (XSERVER (server));
+ display_server_set_ready (DISPLAY_SERVER (server));
}
}
plymouth_quit (FALSE);
}
- xserver_disconnect (XSERVER (server));
+ display_server_set_stopped (DISPLAY_SERVER (server));
}
static gboolean
-xserver_local_start (XServer *server)
+xserver_local_start (DisplayServer *server)
{
GError *error = NULL;
gboolean result;
command = g_string_new (absolute_command);
g_free (absolute_command);
- g_string_append_printf (command, " :%d", xserver_get_display_number (server));
+ g_string_append_printf (command, " :%d", xserver_get_display_number (XSERVER (server)));
if (XSERVER_LOCAL (server)->priv->config_file)
g_string_append_printf (command, " -config %s", XSERVER_LOCAL (server)->priv->config_file);
if (XSERVER_LOCAL (server)->priv->layout)
g_string_append_printf (command, " -layout %s", XSERVER_LOCAL (server)->priv->layout);
- auth_file = xserver_get_authority_file (server);
+ auth_file = xserver_get_authority_file (XSERVER (server));
if (auth_file)
{
gchar *path = g_file_get_path (auth_file);
if (XSERVER_LOCAL (server)->priv->xdmcp_port != 0)
g_string_append_printf (command, " -port %d", XSERVER_LOCAL (server)->priv->xdmcp_port);
g_string_append_printf (command, " -query %s", XSERVER_LOCAL (server)->priv->xdmcp_server);
- if (g_strcmp0 (xserver_get_authentication_name (server), "XDM-AUTHENTICATION-1") == 0)
+ if (g_strcmp0 (xserver_get_authentication_name (XSERVER (server)), "XDM-AUTHENTICATION-1") == 0)
{
GString *cookie;
const guint8 *data;
gsize data_length, i;
- data = xserver_get_authentication_data (server);
- data_length = xserver_get_authentication_data_length (server);
+ data = xserver_get_authentication_data (XSERVER (server));
+ data_length = xserver_get_authentication_data_length (XSERVER (server));
cookie = g_string_new ("0x");
for (i = 0; i < data_length; i++)
g_string_append_printf (cookie, "%02X", data[i]);
if (!result)
g_warning ("Unable to create display: %s", error->message);
else
- g_debug ("Waiting for ready signal from X server :%d", xserver_get_display_number (server));
+ g_debug ("Waiting for ready signal from X server :%d", xserver_get_display_number (XSERVER (server)));
g_clear_error (&error);
if (!result)
}
static gboolean
-xserver_local_restart (XServer *server)
+xserver_local_restart (DisplayServer *server)
{
/* Not running */
if (!XSERVER_LOCAL (server)->priv->xserver_process)
}
static void
-xserver_local_stop (XServer *server)
+xserver_local_stop (DisplayServer *server)
{
child_process_stop (XSERVER_LOCAL (server)->priv->xserver_process);
}
xserver_local_class_init (XServerLocalClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
- XServerClass *xserver_class = XSERVER_CLASS (klass);
+ DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
- xserver_class->start = xserver_local_start;
- xserver_class->restart = xserver_local_restart;
- xserver_class->stop = xserver_local_stop;
+ display_server_class->start = xserver_local_start;
+ display_server_class->restart = xserver_local_restart;
+ display_server_class->stop = xserver_local_stop;
object_class->finalize = xserver_local_finalize;
g_type_class_add_private (klass, sizeof (XServerLocalPrivate));
}
static gboolean
-xserver_remote_start (XServer *server)
+xserver_remote_start (DisplayServer *server)
{
- return xserver_connect (server);
+ display_server_set_ready (DISPLAY_SERVER (server));
+ return TRUE;
}
static void
-xserver_remote_stop (XServer *server)
+xserver_remote_stop (DisplayServer *server)
{
- xserver_disconnect (server);
+ display_server_set_stopped (DISPLAY_SERVER (server));
}
static void
static void
xserver_remote_class_init (XServerRemoteClass *klass)
{
- XServerClass *xserver_class = XSERVER_CLASS (klass);
+ DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
- xserver_class->start = xserver_remote_start;
- xserver_class->stop = xserver_remote_stop;
+ display_server_class->start = xserver_remote_start;
+ display_server_class->stop = xserver_remote_stop;
}
#include <config.h>
#include <string.h>
-#include <xcb/xcb.h>
#include <fcntl.h>
#include "xserver.h"
#include "configuration.h"
-enum {
- READY,
- STOPPED,
- LAST_SIGNAL
-};
-static guint signals[LAST_SIGNAL] = { 0 };
-
struct XServerPrivate
{
/* Host running the server */
/* Authority file */
GFile *authority_file;
-
- /* Connection to X server */
- xcb_connection_t *connection;
};
-G_DEFINE_TYPE (XServer, xserver, G_TYPE_OBJECT);
+G_DEFINE_TYPE (XServer, xserver, DISPLAY_SERVER_TYPE);
void
xserver_set_hostname (XServer *server, const gchar *hostname)
}
static void
-xserver_real_setup_session (XServer *server, Session *session)
-{
-}
-
-void
-xserver_setup_session (XServer *server, Session *session)
+xserver_setup_session (DisplayServer *server, Session *session)
{
XAuthorization *authorization;
- g_return_if_fail (server != NULL);
-
- child_process_set_env (CHILD_PROCESS (session), "DISPLAY", xserver_get_address (server));
- authorization = xserver_get_authorization (server);
+ child_process_set_env (CHILD_PROCESS (session), "DISPLAY", xserver_get_address (XSERVER (server)));
+ authorization = xserver_get_authorization (XSERVER (server));
if (authorization)
session_set_authorization (session, authorization);
-
- //XSERVER_GET_CLASS (server)->setup_session (server, session);
-}
-
-static gboolean
-xserver_real_start (XServer *server)
-{
- return FALSE;
-}
-
-gboolean
-xserver_start (XServer *server)
-{
- g_return_val_if_fail (server != NULL, FALSE);
- return XSERVER_GET_CLASS (server)->start (server);
-}
-
-gboolean
-xserver_connect (XServer *server)
-{
- gchar *xauthority = NULL;
-
- g_return_val_if_fail (server != NULL, FALSE);
-
- /* Write the authorization file */
- write_authority_file (server);
-
- /* NOTE: We have to do this hack as xcb_connect_to_display_with_auth_info can't be used
- * for XDM-AUTHORIZATION-1 and the authorization data requires to know the source port */
- // FIXME: Make xcb_connect_with_authority
- if (server->priv->authority_file)
- {
- gchar *path = g_file_get_path (server->priv->authority_file);
- xauthority = g_strdup (g_getenv ("XAUTHORITY"));
- g_setenv ("XAUTHORITY", path, TRUE);
- g_free (path);
- }
-
- // FIXME: Needs to be done in a separate thread, this could block
- g_debug ("Connecting to XServer %s", xserver_get_address (server));
- server->priv->connection = xcb_connect (xserver_get_address (server), NULL);
- if (xcb_connection_has_error (server->priv->connection))
- {
- xcb_disconnect (server->priv->connection);
- server->priv->connection = NULL;
- g_debug ("Error connecting to XServer %s", xserver_get_address (server));
- }
-
- // FIXME: Need to detect when connection is dropped
- //xcb_get_file_descriptor(xcb_connection_t *c);
-
- if (server->priv->authority_file)
- {
- if (xauthority)
- g_setenv ("XAUTHORITY", xauthority, TRUE);
- else
- g_unsetenv ("XAUTHORITY");
- g_free (xauthority);
- }
-
- if (server->priv->connection)
- {
- g_signal_emit (server, signals[READY], 0);
- return TRUE;
- }
- else
- return FALSE;
-}
-
-static gboolean
-xserver_real_restart (XServer *server)
-{
- return FALSE;
-}
-
-gboolean
-xserver_restart (XServer *server)
-{
- g_return_val_if_fail (server != NULL, FALSE);
- return XSERVER_GET_CLASS (server)->restart (server);
-}
-
-void
-xserver_disconnect (XServer *server)
-{
- g_return_if_fail (server != NULL);
-
- if (server->priv->connection)
- {
- xcb_disconnect (server->priv->connection);
- server->priv->connection = NULL;
- }
-
- g_signal_emit (server, signals[STOPPED], 0);
-}
-
-static void
-xserver_real_stop (XServer *server)
-{
-}
-
-void
-xserver_stop (XServer *server)
-{
- g_return_if_fail (server != NULL);
- XSERVER_GET_CLASS (server)->stop (server);
}
static void
self = XSERVER (object);
- if (self->priv->connection)
- xcb_disconnect (self->priv->connection);
-
g_free (self->priv->hostname);
g_free (self->priv->authentication_name);
g_free (self->priv->authentication_data);
xserver_class_init (XServerClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ DisplayServerClass *display_server_class = DISPLAY_SERVER_CLASS (klass);
- klass->setup_session = xserver_real_setup_session;
- klass->start = xserver_real_start;
- klass->restart = xserver_real_restart;
- klass->stop = xserver_real_stop;
+ display_server_class->setup_session = xserver_setup_session;
object_class->finalize = xserver_finalize;
g_type_class_add_private (klass, sizeof (XServerPrivate));
-
- signals[READY] =
- g_signal_new ("ready",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XServerClass, ready),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
- signals[STOPPED] =
- g_signal_new ("stopped",
- G_TYPE_FROM_CLASS (klass),
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (XServerClass, stopped),
- NULL, NULL,
- g_cclosure_marshal_VOID__VOID,
- G_TYPE_NONE, 0);
}
#define _XSERVER_H_
#include <glib-object.h>
-#include "session.h"
+#include "display-server.h"
#include "xauth.h"
G_BEGIN_DECLS
#define XSERVER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), XSERVER_TYPE, XServer))
#define XSERVER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), XSERVER_TYPE, XServerClass))
#define XSERVER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), XSERVER_TYPE, XServerClass))
+#define IS_XSERVER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XSERVER_TYPE))
typedef struct XServerPrivate XServerPrivate;
typedef struct
{
- GObject parent_instance;
+ DisplayServer parent_instance;
XServerPrivate *priv;
} XServer;
typedef struct
{
- GObjectClass parent_class;
-
- void (*ready)(XServer *server);
- void (*stopped)(XServer *server);
-
- void (*setup_session)(XServer *server, Session *session);
- gboolean (*start)(XServer *server);
- gboolean (*restart)(XServer *server);
- void (*stop)(XServer *server);
+ DisplayServerClass parent_class;
} XServerClass;
GType xserver_get_type (void);
GFile *xserver_get_authority_file (XServer *server);
-void xserver_setup_session (XServer *server, Session *session);
-
-gboolean xserver_start (XServer *server);
-
-gboolean xserver_connect (XServer *server);
-
-gboolean xserver_restart (XServer *server);
-
-void xserver_disconnect (XServer *server);
-
-void xserver_stop (XServer *server);
-
G_END_DECLS
#endif /* _XSERVER_H_ */
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Default session starts
SESSION START USER=guest
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Autologin session starts
SESSION START USER=alice
# X server resets
XSERVER :50 DISCONNECT-CLIENTS
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Default session starts
SESSION START USER=alice
# X server restarts and loads greeter
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
GREETER START
XSERVER :50 ACCEPT-CONNECT
GREETER CONNECT-XSERVER :50
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Default session starts
SESSION START USER=alice
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server restarts and loads greeter
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
GREETER START
XSERVER :50 ACCEPT-CONNECT
GREETER CONNECT-XSERVER :50
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server resets
XSERVER :50 DISCONNECT-CLIENTS
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server resets
XSERVER :50 DISCONNECT-CLIENTS
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts on X server
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# XServer starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server restarts and loads greeter
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
GREETER START
XSERVER :50 ACCEPT-CONNECT
GREETER CONNECT-XSERVER :50
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# One X server should start by default
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
XSERVER :50 START
XSERVER :50 INDICATE-READY
PLYMOUTH QUIT RETAIN-SPLASH=TRUE
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts again
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# New X server starts
XSERVER :51 START
XSERVER :51 INDICATE-READY
-XSERVER :51 ACCEPT-CONNECT
# Greeter starts
GREETER START
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# New X server starts
XSERVER :51 START
XSERVER :51 INDICATE-READY
-XSERVER :51 ACCEPT-CONNECT
# Guest session starts
SESSION START USER=guest
# X server starts
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START
# New X server starts
XSERVER :51 START
XSERVER :51 INDICATE-READY
-XSERVER :51 ACCEPT-CONNECT
# New greeter starts
GREETER START
XSERVER :98 SEND-REQUEST DISPLAY-NUMBER=98 AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER"
XSERVER :98 GOT-ACCEPT SESSION-ID=[0-9]* AUTHENTICATION-NAME="" AUTHORIZATION-NAME=""
XSERVER :98 SEND-MANAGE SESSION-ID=[0-9]* DISPLAY-NUMBER=98 DISPLAY-CLASS="DISPLAY CLASS"
-XSERVER :98 ACCEPT-CONNECT
# Greeter starts and connects to remote X server
GREETER START
# X server starts again
XSERVER :50 START
XSERVER :50 INDICATE-READY
-XSERVER :50 ACCEPT-CONNECT
# Greeter starts
GREETER START