summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac13
-rw-r--r--daemon/gdm-server.c8
-rw-r--r--daemon/gdm-simple-slave.c15
-rw-r--r--gui/libgdmgreeter/gdm-greeter-client.c94
-rw-r--r--gui/libgdmgreeter/gdm-greeter-client.h6
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,