summaryrefslogtreecommitdiff
path: root/daemon/gdm-session-direct.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-session-direct.c')
-rw-r--r--daemon/gdm-session-direct.c221
1 files changed, 193 insertions, 28 deletions
diff --git a/daemon/gdm-session-direct.c b/daemon/gdm-session-direct.c
index 339f335e..d6ca385a 100644
--- a/daemon/gdm-session-direct.c
+++ b/daemon/gdm-session-direct.c
@@ -53,6 +53,8 @@
#include "gdm-session-record.h"
#include "gdm-session-worker-job.h"
+#define GDM_DBUS_NAME "org.gnome.DisplayManager"
+#define GDM_DBUS_DISPLAY_INTERFACE "org.gnome.DisplayManager.Display"
#define GDM_SESSION_DBUS_PATH "/org/gnome/DisplayManager/Session"
#define GDM_SESSION_DBUS_INTERFACE "org.gnome.DisplayManager.Session"
#define GDM_SESSION_DBUS_ERROR_CANCEL "org.gnome.DisplayManager.Session.Error.Cancel"
@@ -85,16 +87,18 @@ struct _GdmSessionDirectPrivate
char *id;
char *display_id;
char *display_name;
- char *display_type;
char *display_hostname;
char *display_device;
char *display_x11_authority_file;
char *display_console_session;
+ char *display_type;
+ char *display_seat_id;
gboolean display_is_local;
DBusServer *server;
char *server_address;
GHashTable *environment;
+ DBusGProxy *display_proxy;
DBusGConnection *connection;
};
@@ -102,13 +106,14 @@ enum {
PROP_0,
PROP_DISPLAY_ID,
PROP_DISPLAY_NAME,
- PROP_DISPLAY_TYPE,
PROP_DISPLAY_HOSTNAME,
PROP_DISPLAY_IS_LOCAL,
PROP_DISPLAY_DEVICE,
PROP_DISPLAY_X11_AUTHORITY_FILE,
PROP_DISPLAY_CONSOLE_SESSION,
PROP_USER_X11_AUTHORITY_FILE,
+ PROP_DISPLAY_TYPE,
+ PROP_DISPLAY_SEAT_ID,
};
static void gdm_session_iface_init (GdmSessionIface *iface);
@@ -1301,6 +1306,7 @@ do_introspect (DBusConnection *connection,
" <arg name=\"service_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_type\" type=\"s\"/>\n"
+ " <arg name=\"x11_display_seat_id\" type=\"s\"/>\n"
" <arg name=\"display_device\" type=\"s\"/>\n"
" <arg name=\"hostname\" type=\"s\"/>\n"
" <arg name=\"x11_authority_file\" type=\"s\"/>\n"
@@ -1309,6 +1315,7 @@ do_introspect (DBusConnection *connection,
" <arg name=\"service_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_name\" type=\"s\"/>\n"
" <arg name=\"x11_display_type\" type=\"s\"/>\n"
+ " <arg name=\"x11_seat_id\" type=\"s\"/>\n"
" <arg name=\"display_device\" type=\"s\"/>\n"
" <arg name=\"hostname\" type=\"s\"/>\n"
" <arg name=\"x11_authority_file\" type=\"s\"/>\n"
@@ -1692,6 +1699,7 @@ send_setup (GdmSessionDirect *session,
DBusMessageIter iter;
const char *display_name;
const char *display_type;
+ const char *display_seat_id;
const char *display_device;
const char *display_hostname;
const char *display_x11_authority_file;
@@ -1708,6 +1716,11 @@ send_setup (GdmSessionDirect *session,
} else {
display_type = "";
}
+ if (session->priv->display_seat_id!= NULL) {
+ display_seat_id = session->priv->display_seat_id;
+ } else {
+ display_seat_id = "";
+ }
if (session->priv->display_hostname != NULL) {
display_hostname = session->priv->display_hostname;
} else {
@@ -1734,6 +1747,7 @@ send_setup (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
@@ -1753,6 +1767,7 @@ send_setup_for_user (GdmSessionDirect *session,
DBusMessageIter iter;
const char *display_name;
const char *display_type;
+ const char *display_seat_id;
const char *display_device;
const char *display_hostname;
const char *display_x11_authority_file;
@@ -1770,6 +1785,11 @@ send_setup_for_user (GdmSessionDirect *session,
} else {
display_type = "";
}
+ if (session->priv->display_seat_id != NULL) {
+ display_seat_id = session->priv->display_seat_id;
+ } else {
+ display_seat_id = "";
+ }
if (session->priv->display_hostname != NULL) {
display_hostname = session->priv->display_hostname;
} else {
@@ -1801,6 +1821,7 @@ send_setup_for_user (GdmSessionDirect *session,
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &service_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_name);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_type);
+ dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_seat_id);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_device);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_hostname);
dbus_message_iter_append_basic (&iter, DBUS_TYPE_STRING, &display_x11_authority_file);
@@ -2206,14 +2227,6 @@ _gdm_session_direct_set_display_name (GdmSessionDirect *session,
}
static void
-_gdm_session_direct_set_display_type (GdmSessionDirect *session,
- const char *type)
-{
- g_free (session->priv->display_type);
- session->priv->display_type = g_strdup (type);
-}
-
-static void
_gdm_session_direct_set_display_hostname (GdmSessionDirect *session,
const char *name)
{
@@ -2247,6 +2260,22 @@ _gdm_session_direct_set_display_x11_authority_file (GdmSessionDirect *session,
}
static void
+_gdm_session_direct_set_display_type (GdmSessionDirect *session,
+ const char *type)
+{
+ g_free (session->priv->display_type);
+ session->priv->display_type = g_strdup (type);
+}
+
+static void
+_gdm_session_direct_set_display_seat_id (GdmSessionDirect *session,
+ const char *sid)
+{
+ g_free (session->priv->display_seat_id);
+ session->priv->display_seat_id = g_strdup (sid);
+}
+
+static void
_gdm_session_direct_set_display_console_session (GdmSessionDirect *session,
const char *console_session)
{
@@ -2278,9 +2307,6 @@ gdm_session_direct_set_property (GObject *object,
case PROP_DISPLAY_NAME:
_gdm_session_direct_set_display_name (self, g_value_get_string (value));
break;
- case PROP_DISPLAY_TYPE:
- _gdm_session_direct_set_display_type (self, g_value_get_string (value));
- break;
case PROP_DISPLAY_HOSTNAME:
_gdm_session_direct_set_display_hostname (self, g_value_get_string (value));
break;
@@ -2299,6 +2325,12 @@ gdm_session_direct_set_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
_gdm_session_direct_set_display_is_local (self, g_value_get_boolean (value));
break;
+ case PROP_DISPLAY_TYPE:
+ _gdm_session_direct_set_display_type (self, g_value_get_string (value));
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ _gdm_session_direct_set_display_seat_id (self, g_value_get_string (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2322,9 +2354,6 @@ gdm_session_direct_get_property (GObject *object,
case PROP_DISPLAY_NAME:
g_value_set_string (value, self->priv->display_name);
break;
- case PROP_DISPLAY_TYPE:
- g_value_set_string (value, self->priv->display_type);
- break;
case PROP_DISPLAY_HOSTNAME:
g_value_set_string (value, self->priv->display_hostname);
break;
@@ -2343,6 +2372,12 @@ gdm_session_direct_get_property (GObject *object,
case PROP_DISPLAY_IS_LOCAL:
g_value_set_boolean (value, self->priv->display_is_local);
break;
+ case PROP_DISPLAY_TYPE:
+ g_value_set_string (value, self->priv->display_type);
+ break;
+ case PROP_DISPLAY_SEAT_ID:
+ g_value_set_string (value, self->priv->display_seat_id);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -2366,9 +2401,6 @@ gdm_session_direct_dispose (GObject *object)
g_free (session->priv->display_name);
session->priv->display_name = NULL;
- g_free (session->priv->display_type);
- session->priv->display_type = NULL;
-
g_free (session->priv->display_hostname);
session->priv->display_hostname = NULL;
@@ -2381,6 +2413,12 @@ gdm_session_direct_dispose (GObject *object)
g_free (session->priv->server_address);
session->priv->server_address = NULL;
+ g_free (session->priv->display_type);
+ session->priv->display_type = NULL;
+
+ g_free (session->priv->display_seat_id);
+ session->priv->display_seat_id = NULL;
+
if (session->priv->server != NULL) {
dbus_server_disconnect (session->priv->server);
dbus_server_unref (session->priv->server);
@@ -2392,6 +2430,11 @@ gdm_session_direct_dispose (GObject *object)
session->priv->environment = NULL;
}
+ if (session->priv->display_proxy != NULL) {
+ g_object_unref (session->priv->display_proxy);
+ }
+
+
G_OBJECT_CLASS (gdm_session_direct_parent_class)->dispose (object);
}
@@ -2521,13 +2564,6 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
- PROP_DISPLAY_TYPE,
- g_param_spec_string ("display-type",
- "display type",
- "display type",
- NULL,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
- g_object_class_install_property (object_class,
PROP_DISPLAY_HOSTNAME,
g_param_spec_string ("display-hostname",
"display hostname",
@@ -2571,15 +2607,143 @@ gdm_session_direct_class_init (GdmSessionDirectClass *session_class)
"display device",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_TYPE,
+ g_param_spec_string ("display-type",
+ "display type",
+ "display type",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+ g_object_class_install_property (object_class,
+ PROP_DISPLAY_SEAT_ID,
+ g_param_spec_string ("seat-id",
+ "seat id",
+ "seat id",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
dbus_g_object_type_install_info (GDM_TYPE_SESSION_DIRECT, &dbus_glib_gdm_session_direct_object_info);
}
+static void
+display_proxy_destroyed_cb (DBusGProxy *display_proxy,
+ GdmSessionDirect *session)
+{
+ g_debug ("GdmSessionDirect: Disconnected from display");
+
+ session->priv->display_proxy = NULL;
+}
+
+static gboolean
+init_display_data (GdmSessionDirect *session)
+{
+ gboolean res;
+ char *id;
+ GError *error;
+
+ g_assert (session->priv->display_proxy == NULL);
+
+ error = NULL;
+ session->priv->connection = dbus_g_bus_get (DBUS_BUS_SYSTEM, &error);
+ if (session->priv->connection == NULL) {
+ if (error != NULL) {
+ g_critical ("error getting system bus: %s", error->message);
+ g_error_free (error);
+ }
+ exit (1);
+ }
+
+ error = NULL;
+ session->priv->display_proxy = dbus_g_proxy_new_for_name_owner (
+ session->priv->connection,
+ GDM_DBUS_NAME,
+ session->priv->display_id,
+ GDM_DBUS_DISPLAY_INTERFACE,
+ &error);
+
+ g_signal_connect (session->priv->display_proxy,
+ "destroy",
+ G_CALLBACK (display_proxy_destroyed_cb),
+ session);
+
+ if (session->priv->display_proxy == NULL) {
+ if (error != NULL) {
+ g_warning ("Failed to create display proxy %s: %s", session->priv->display_id, error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Unable to create display proxy");
+ }
+ return FALSE;
+ }
+
+ /* Make sure display ID works */
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetId",
+ &error,
+ G_TYPE_INVALID,
+ DBUS_TYPE_G_OBJECT_PATH, &id,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get display id %s: %s", session->priv->display_id, error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get display id %s", session->priv->display_id);
+ }
+
+ return FALSE;
+ }
+
+ if (strcmp (id, session->priv->display_id) != 0) {
+ g_critical ("Display ID doesn't match");
+ exit (1);
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetX11DisplayType",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &session->priv->display_type,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get value");
+ }
+
+ return FALSE;
+ }
+
+ error = NULL;
+ res = dbus_g_proxy_call (session->priv->display_proxy,
+ "GetSeatId",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &session->priv->display_seat_id,
+ G_TYPE_INVALID);
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get value: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get value");
+ }
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
GdmSessionDirect *
gdm_session_direct_new (const char *display_id,
const char *display_name,
- const char *display_type,
const char *display_hostname,
const char *display_device,
const char *display_x11_authority_file,
@@ -2590,13 +2754,14 @@ gdm_session_direct_new (const char *display_id,
session = g_object_new (GDM_TYPE_SESSION_DIRECT,
"display-id", display_id,
"display-name", display_name,
- "display-type", display_type,
"display-hostname", display_hostname,
"display-device", display_device,
"display-x11-authority-file", display_x11_authority_file,
"display-is-local", display_is_local,
NULL);
+ init_display_data (session);
+
return session;
}