summaryrefslogtreecommitdiff
path: root/daemon/gdm-session.c
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2014-06-05 17:01:48 -0400
committerRay Strode <rstrode@redhat.com>2014-06-05 17:19:33 -0400
commite24484f72bdf1d7c96131c6b7bae6409fabed210 (patch)
tree97054c10d0a1afb6cdce60300e8accc07997b4ea /daemon/gdm-session.c
parentef6954833cf43bef8306823d7fcfb6a04b903ad7 (diff)
downloadgdm-e24484f72bdf1d7c96131c6b7bae6409fabed210.tar.gz
manager: close up timed login race
Previously we would emit the timed-login-requested signal after the client connects, which might be before it was listening for the signal. Now we only emit the signal in direct response to a GetTimedLoginDetails call, which we make implicitly when the appropiate proxy interface is set up. https://bugzilla.gnome.org/show_bug.cgi?id=680348
Diffstat (limited to 'daemon/gdm-session.c')
-rw-r--r--daemon/gdm-session.c44
1 files changed, 35 insertions, 9 deletions
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
index 07eed5eb..60667c5f 100644
--- a/daemon/gdm-session.c
+++ b/daemon/gdm-session.c
@@ -88,6 +88,10 @@ struct _GdmSessionPrivate
char *selected_user;
char *user_x11_authority_file;
+ char *timed_login_username;
+ int timed_login_delay;
+ GList *pending_timed_login_invocations;
+
GHashTable *conversations;
GdmSessionConversation *session_conversation;
@@ -1296,6 +1300,27 @@ gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter *greet
}
static gboolean
+gdm_session_handle_get_timed_login_details (GdmDBusGreeter *greeter_interface,
+ GDBusMethodInvocation *invocation,
+ GdmSession *self)
+{
+
+ if (self->priv->greeter_interface != NULL) {
+ gdm_dbus_greeter_complete_get_timed_login_details (greeter_interface,
+ invocation,
+ self->priv->timed_login_username != NULL,
+ self->priv->timed_login_username != NULL? self->priv->timed_login_username : "",
+ self->priv->timed_login_delay);
+ if (self->priv->timed_login_username != NULL) {
+ gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
+ self->priv->timed_login_username,
+ self->priv->timed_login_delay);
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
gdm_session_handle_client_begin_auto_login (GdmDBusGreeter *greeter_interface,
GDBusMethodInvocation *invocation,
const char *username,
@@ -1368,6 +1393,10 @@ export_greeter_interface (GdmSession *self,
"handle-start-session-when-ready",
G_CALLBACK (gdm_session_handle_client_start_session_when_ready),
self);
+ g_signal_connect (greeter_interface,
+ "handle-get-timed-login-details",
+ G_CALLBACK (gdm_session_handle_get_timed_login_details),
+ self);
g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (greeter_interface),
connection,
@@ -2609,16 +2638,13 @@ gdm_session_reset (GdmSession *self)
}
void
-gdm_session_request_timed_login (GdmSession *self,
- const char *username,
- int delay)
+gdm_session_set_timed_login_details (GdmSession *self,
+ const char *username,
+ int delay)
{
- g_debug ("GdmSession: requesting timed login");
- if (self->priv->greeter_interface != NULL) {
- gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
- username,
- delay);
- }
+ g_debug ("GdmSession: timed login details %s %d", username, delay);
+ self->priv->timed_login_username = g_strdup (username);
+ self->priv->timed_login_delay = delay;
}
gboolean