diff options
author | Brian Cameron <brian.cameron@oracle.com> | 2011-12-15 19:53:43 -0600 |
---|---|---|
committer | Brian Cameron <brian.cameron@oracle.com> | 2011-12-15 19:53:43 -0600 |
commit | d987eb9e59f837448ca08fe85bc1190a228934d1 (patch) | |
tree | 09c29041113c50dbf48e7fa0e53d3b4cc582a5fd /daemon/gdm-slave.c | |
parent | feb2c3410a53ea806016ca8ee3582dcf66dbc9a7 (diff) | |
download | gdm-d987eb9e59f837448ca08fe85bc1190a228934d1.tar.gz |
Add ConsoleKit MultiSeat support. See bug 536355.wip/multi-seat
Diffstat (limited to 'daemon/gdm-slave.c')
-rw-r--r-- | daemon/gdm-slave.c | 185 |
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); |