summaryrefslogtreecommitdiff
path: root/daemon/gdm-slave.c
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/gdm-slave.c')
-rw-r--r--daemon/gdm-slave.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/daemon/gdm-slave.c b/daemon/gdm-slave.c
index 2dc0323f..695f6cf6 100644
--- a/daemon/gdm-slave.c
+++ b/daemon/gdm-slave.c
@@ -83,11 +83,13 @@ struct GdmSlavePrivate
/* cached display values */
char *display_id;
char *display_name;
+ char *display_type;
int display_number;
char *display_hostname;
gboolean display_is_local;
gboolean display_is_parented;
char *display_seat_id;
+ char *display_session_id;
char *display_x11_authority_file;
char *parent_display_name;
char *parent_display_x11_authority_file;
@@ -103,15 +105,18 @@ enum {
PROP_0,
PROP_DISPLAY_ID,
PROP_DISPLAY_NAME,
+ PROP_DISPLAY_TYPE,
PROP_DISPLAY_NUMBER,
PROP_DISPLAY_HOSTNAME,
PROP_DISPLAY_IS_LOCAL,
PROP_DISPLAY_SEAT_ID,
+ PROP_DISPLAY_SESSION_ID,
PROP_DISPLAY_X11_AUTHORITY_FILE
};
enum {
STOPPED,
+ FAILED,
LAST_SIGNAL
};
@@ -749,6 +754,24 @@ gdm_slave_real_start (GdmSlave *slave)
error = NULL;
res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "GetX11DisplayType",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &slave->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 (slave->priv->display_proxy,
"GetX11DisplayNumber",
&error,
G_TYPE_INVALID,
@@ -838,6 +861,24 @@ gdm_slave_real_start (GdmSlave *slave)
return FALSE;
}
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "GetSessionId",
+ &error,
+ G_TYPE_INVALID,
+ G_TYPE_STRING, &slave->priv->display_session_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;
}
@@ -893,6 +934,42 @@ gdm_slave_stopped (GdmSlave *slave)
g_signal_emit (slave, signals [STOPPED], 0);
}
+void
+gdm_slave_failed (GdmSlave *slave)
+{
+ g_return_if_fail (GDM_IS_SLAVE (slave));
+
+ g_signal_emit (slave, signals [FAILED], 0);
+}
+
+void
+gdm_slave_set_console_session_id (GdmSlave *slave,
+ const char *session_id)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GdmSlave: Informing display of new session id");
+
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "SetConsoleSessionId",
+ &error,
+ G_TYPE_STRING, session_id,
+ G_TYPE_INVALID, G_TYPE_INVALID);
+
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to set console session id: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to set console session id");
+ }
+ } else {
+ g_debug ("GdmSlave: Set console session id");
+ }
+}
+
gboolean
gdm_slave_add_user_authorization (GdmSlave *slave,
const char *username,
@@ -1476,6 +1553,59 @@ gdm_slave_switch_to_user_session (GdmSlave *slave,
return ret;
}
+void
+gdm_slave_block_console_session_requests_on_display (GdmSlave *slave)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GdmSlave: Asking display to ignore ConsoleKit");
+
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "BlockConsoleSessionRequests",
+ &error,
+ G_TYPE_INVALID, G_TYPE_INVALID);
+
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get display to ignore ConsoleKit: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get display to ignore ConsoleKit");
+ }
+ } else {
+ g_debug ("GdmSlave: Display is now ignoring ConsoleKit");
+ }
+}
+
+void
+gdm_slave_unblock_console_session_requests_on_display (GdmSlave *slave)
+{
+ gboolean res;
+ GError *error;
+
+ g_debug ("GdmSlave: Informing display to stop ignoring ConsoleKit");
+
+ error = NULL;
+ res = dbus_g_proxy_call (slave->priv->display_proxy,
+ "UnblockConsoleSessionRequests",
+ &error,
+ G_TYPE_INVALID, G_TYPE_INVALID);
+
+ if (! res) {
+ if (error != NULL) {
+ g_warning ("Failed to get display to stop ignoring ConsoleKit: %s", error->message);
+ g_error_free (error);
+ } else {
+ g_warning ("Failed to get display to stop ignoring ConsoleKit");
+ }
+ } else {
+ g_debug ("GdmSlave: Display is no longer ignoring ConsoleKit");
+ }
+}
+
+
static void
_gdm_slave_set_display_id (GdmSlave *slave,
const char *id)
@@ -1492,6 +1622,15 @@ _gdm_slave_set_display_name (GdmSlave *slave,
slave->priv->display_name = g_strdup (name);
}
+
+static void
+_gdm_slave_set_display_type (GdmSlave *slave,
+ const char *type)
+{
+ g_free (slave->priv->display_type);
+ slave->priv->display_type = g_strdup (type);
+}
+
static void
_gdm_slave_set_display_number (GdmSlave *slave,
int number)
@@ -1524,6 +1663,14 @@ _gdm_slave_set_display_seat_id (GdmSlave *slave,
}
static void
+_gdm_slave_set_display_session_id (GdmSlave *slave,
+ const char *id)
+{
+ g_free (slave->priv->display_session_id);
+ slave->priv->display_session_id = g_strdup (id);
+}
+
+static void
_gdm_slave_set_display_is_local (GdmSlave *slave,
gboolean is)
{
@@ -1547,6 +1694,9 @@ gdm_slave_set_property (GObject *object,
case PROP_DISPLAY_NAME:
_gdm_slave_set_display_name (self, g_value_get_string (value));
break;
+ case PROP_DISPLAY_TYPE:
+ _gdm_slave_set_display_type (self, g_value_get_string (value));
+ break;
case PROP_DISPLAY_NUMBER:
_gdm_slave_set_display_number (self, g_value_get_int (value));
break;
@@ -1556,6 +1706,9 @@ gdm_slave_set_property (GObject *object,
case PROP_DISPLAY_SEAT_ID:
_gdm_slave_set_display_seat_id (self, g_value_get_string (value));
break;
+ case PROP_DISPLAY_SESSION_ID:
+ _gdm_slave_set_display_session_id (self, g_value_get_string (value));
+ break;
case PROP_DISPLAY_X11_AUTHORITY_FILE:
_gdm_slave_set_display_x11_authority_file (self, g_value_get_string (value));
break;
@@ -1585,6 +1738,9 @@ gdm_slave_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_NUMBER:
g_value_set_int (value, self->priv->display_number);
break;
@@ -1594,6 +1750,9 @@ gdm_slave_get_property (GObject *object,
case PROP_DISPLAY_SEAT_ID:
g_value_set_string (value, self->priv->display_seat_id);
break;
+ case PROP_DISPLAY_SESSION_ID:
+ g_value_set_string (value, self->priv->display_session_id);
+ break;
case PROP_DISPLAY_X11_AUTHORITY_FILE:
g_value_set_string (value, self->priv->display_x11_authority_file);
break;
@@ -1688,6 +1847,13 @@ gdm_slave_class_init (GdmSlaveClass *klass)
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_NUMBER,
g_param_spec_int ("display-number",
"display number",
@@ -1711,6 +1877,13 @@ gdm_slave_class_init (GdmSlaveClass *klass)
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
g_object_class_install_property (object_class,
+ PROP_DISPLAY_SESSION_ID,
+ g_param_spec_string ("display-session-id",
+ "",
+ "",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+ g_object_class_install_property (object_class,
PROP_DISPLAY_X11_AUTHORITY_FILE,
g_param_spec_string ("display-x11-authority-file",
"",
@@ -1736,6 +1909,17 @@ gdm_slave_class_init (GdmSlaveClass *klass)
G_TYPE_NONE,
0);
+ signals [FAILED] =
+ g_signal_new ("failed",
+ G_TYPE_FROM_CLASS (object_class),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (GdmSlaveClass, failed),
+ NULL,
+ NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE,
+ 0);
+
dbus_g_object_type_install_info (GDM_TYPE_SLAVE, &dbus_glib_gdm_slave_object_info);
}
@@ -1765,6 +1949,7 @@ gdm_slave_finalize (GObject *object)
g_free (slave->priv->id);
g_free (slave->priv->display_id);
g_free (slave->priv->display_name);
+ g_free (slave->priv->display_type);
g_free (slave->priv->display_hostname);
g_free (slave->priv->display_seat_id);
g_free (slave->priv->display_x11_authority_file);