diff options
-rw-r--r-- | configure.ac | 13 | ||||
-rw-r--r-- | daemon/gdm-server.c | 8 | ||||
-rw-r--r-- | daemon/gdm-simple-slave.c | 15 | ||||
-rw-r--r-- | gui/libgdmgreeter/gdm-greeter-client.c | 94 | ||||
-rw-r--r-- | gui/libgdmgreeter/gdm-greeter-client.h | 6 |
5 files changed, 78 insertions, 58 deletions
diff --git a/configure.ac b/configure.ac index ecb7e1e5..d54f0f9e 100644 --- a/configure.ac +++ b/configure.ac @@ -276,6 +276,11 @@ AC_ARG_WITH(at-spi-registryd-directory, AT_SPI_REGISTRYD_DIR=$with_at_spi_registryd_directory AC_SUBST(AT_SPI_REGISTRYD_DIR) +AC_ARG_WITH(vt-switch-workaround, + AS_HELP_STRING([--with-vt-switch-workaround], + [Try to workaround missing -novtswitch option for X @<:@default=nor@:>@])],, + [with_vt_switch_workaround="no"]) + # Allow configuration of default PATH # withval="" @@ -923,6 +928,14 @@ AM_CONDITIONAL(WITH_CONSOLE_KIT, test x$use_console_kit = xyes) AC_SUBST(WITH_CONSOLE_KIT) dnl --------------------------------------------------------------------------- +dnl - Check for vt switch support +dnl --------------------------------------------------------------------------- + +if test "x$with_vt_switch_workaround" != "xno" ; then + AC_DEFINE(WITH_VT_SWITCH_WORKAROUND, 1, [Define to enable workaround for missing -novtswitch feature]) +fi + +dnl --------------------------------------------------------------------------- dnl - Check for D-Bus dnl --------------------------------------------------------------------------- diff --git a/daemon/gdm-server.c b/daemon/gdm-server.c index 7135ffaf..8dacdb51 100644 --- a/daemon/gdm-server.c +++ b/daemon/gdm-server.c @@ -52,6 +52,12 @@ extern char **environ; +#ifdef WITH_VT_SWITCH_WORKAROUND +#define X_SERVER_COMMAND_LINE X_SERVER " -br -verbose -logverbose 7" +#else +#define X_SERVER_COMMAND_LINE X_SERVER " -br -verbose -logverbose 7 -novtswitch" +#endif + #define GDM_SERVER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_SERVER, GdmServerPrivate)) /* These are the servstat values, also used as server @@ -941,7 +947,7 @@ gdm_server_init (GdmServer *server) server->priv = GDM_SERVER_GET_PRIVATE (server); server->priv->pid = -1; - server->priv->command = g_strdup (X_SERVER " -br -verbose -logverbose 7"); + server->priv->command = g_strdup (X_SERVER_COMMAND_LINE); server->priv->log_dir = g_strdup (LOGDIR); add_ready_handler (server); diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c index 7b9d7d8b..55c0f19a 100644 --- a/daemon/gdm-simple-slave.c +++ b/daemon/gdm-simple-slave.c @@ -463,12 +463,17 @@ start_session_timeout (GdmSimpleSlave *slave) if (migrated) { destroy_session (slave); - /* We don't stop the slave here because - when Xorg exits it switches to the VT it was - started from. That interferes with fast - user switching. */ +#ifdef WITH_VT_SWITCH_WORKAROUND + /* If the X server doesn't support -novtswitch, then when the + * user logs out from their session later, they're going to get thrown + * back to the VT the greeter is currently running on. We keep the + * greeter alive here, so when that happens the user doesn't see + * a blank VT or some confusing thing. + */ queue_greeter_reset (slave); - +#else + gdm_slave_stopped (GDM_SLAVE (slave)); +#endif goto out; } diff --git a/gui/libgdmgreeter/gdm-greeter-client.c b/gui/libgdmgreeter/gdm-greeter-client.c index cb1ce00b..c712d2bd 100644 --- a/gui/libgdmgreeter/gdm-greeter-client.c +++ b/gui/libgdmgreeter/gdm-greeter-client.c @@ -54,6 +54,7 @@ struct GdmGreeterClientPrivate enum { PROP_0, + PROP_DISPLAY_IS_LOCAL }; enum { @@ -95,6 +96,13 @@ gdm_greeter_client_error_quark (void) return error_quark; } +/** + * gdm_greeter_get_display_is_local: + * + * @client: a #GdmGreeterClient + * + * Returns: %TRUE if display is local display + */ gboolean gdm_greeter_client_get_display_is_local (GdmGreeterClient *client) { @@ -643,7 +651,8 @@ send_get_display_id (GdmGreeterClient *client, return ret; } -char * + +static char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client) { char *display_id; @@ -779,9 +788,20 @@ client_dbus_filter_function (DBusConnection *connection, return DBUS_HANDLER_RESULT_HANDLED; } +/** + * gdm_greeter_client_connect: + * + * @client: a #GdmGreeterClient + * + * Initiates a connection to GDM daemon "slave" process. + * + * This function should be called before doing other calls. + * + * Returns: %TRUE if connected, or %FALSE if unavailable + */ gboolean -gdm_greeter_client_start (GdmGreeterClient *client, - GError **error) +gdm_greeter_client_connect (GdmGreeterClient *client, + GError **error) { gboolean ret; DBusError local_error; @@ -833,61 +853,35 @@ gdm_greeter_client_start (GdmGreeterClient *client, return ret; } -void -gdm_greeter_client_stop (GdmGreeterClient *client) -{ - g_return_if_fail (GDM_IS_GREETER_CLIENT (client)); - -} - static void -gdm_greeter_client_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) +gdm_greeter_client_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) { - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } static void -gdm_greeter_client_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) +gdm_greeter_client_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) { + GdmGreeterClient *self; + + self = GDM_GREETER_CLIENT (object); + switch (prop_id) { + case PROP_DISPLAY_IS_LOCAL: + g_value_set_boolean (value, self->priv->display_is_local); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } -static GObject * -gdm_greeter_client_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GdmGreeterClient *greeter_client; - - greeter_client = GDM_GREETER_CLIENT (G_OBJECT_CLASS (gdm_greeter_client_parent_class)->constructor (type, - n_construct_properties, - construct_properties)); - - return G_OBJECT (greeter_client); -} - -static void -gdm_greeter_client_dispose (GObject *object) -{ - g_debug ("GdmGreeterClient: Disposing greeter_client"); - - G_OBJECT_CLASS (gdm_greeter_client_parent_class)->dispose (object); -} - static void gdm_greeter_client_class_init (GdmGreeterClientClass *klass) { @@ -895,8 +889,6 @@ gdm_greeter_client_class_init (GdmGreeterClientClass *klass) object_class->get_property = gdm_greeter_client_get_property; object_class->set_property = gdm_greeter_client_set_property; - object_class->constructor = gdm_greeter_client_constructor; - object_class->dispose = gdm_greeter_client_dispose; object_class->finalize = gdm_greeter_client_finalize; g_type_class_add_private (klass, sizeof (GdmGreeterClientPrivate)); @@ -1032,6 +1024,14 @@ gdm_greeter_client_class_init (GdmGreeterClientClass *klass) g_cclosure_marshal_generic, G_TYPE_NONE, 1, G_TYPE_STRING); + + g_object_class_install_property (object_class, + PROP_DISPLAY_IS_LOCAL, + g_param_spec_boolean ("display-is-local", + "display is local", + "display is local", + FALSE, + G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); } static void diff --git a/gui/libgdmgreeter/gdm-greeter-client.h b/gui/libgdmgreeter/gdm-greeter-client.h index d0eaf58a..9b2be8d8 100644 --- a/gui/libgdmgreeter/gdm-greeter-client.h +++ b/gui/libgdmgreeter/gdm-greeter-client.h @@ -87,14 +87,10 @@ GQuark gdm_greeter_client_error_quark (void); GdmGreeterClient * gdm_greeter_client_new (void); -gboolean gdm_greeter_client_start (GdmGreeterClient *client, +gboolean gdm_greeter_client_connect (GdmGreeterClient *client, GError **error); -void gdm_greeter_client_stop (GdmGreeterClient *client); - gboolean gdm_greeter_client_get_display_is_local (GdmGreeterClient *client); -char * gdm_greeter_client_call_get_display_id (GdmGreeterClient *client); - void gdm_greeter_client_call_start_conversation (GdmGreeterClient *client, const char *service_name); void gdm_greeter_client_call_begin_auto_login (GdmGreeterClient *client, |