diff options
-rw-r--r-- | ChangeLog | 14 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.c | 12 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-login-window.h | 1 | ||||
-rw-r--r-- | gui/simple-greeter/gdm-greeter-session.c | 26 |
4 files changed, 53 insertions, 0 deletions
@@ -1,5 +1,19 @@ 2008-03-09 Ray Strode <rstrode@redhat.com> + * gui/simple-greeter/gdm-greeter-login-window.[ch]: + (on_login_button_clicked_answer_query): + (gdm_greeter_login_window_class_init): + * gui/simple-greeter/gdm-greeter-session.c: + (GdmGreeterSessionPrivate), (on_reset), + (on_interactive), (toggle_login_window): + Add new "interactive" signal to login window which is + emitted when the user has had an opportunity to interact + with session / language choosers. Have greeter session + watch for this signal to decide when to tell the slave + when to proceed with starting the session + +2008-03-09 Ray Strode <rstrode@redhat.com> + * daemon/gdm-simple-slave.c: (GdmSimpleSlavePrivate), (gdm_simple_slave_accredit_when_ready), diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c index 4b94520e..8872eb38 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.c +++ b/gui/simple-greeter/gdm-greeter-login-window.c @@ -144,6 +144,7 @@ enum { USER_SELECTED, DISCONNECTED, CANCELLED, + INTERACTIVE, LAST_SIGNAL }; @@ -349,6 +350,7 @@ on_login_button_clicked_answer_query (GtkButton *button, entry = glade_xml_get_widget (login_window->priv->xml, "auth-prompt-entry"); text = gtk_entry_get_text (GTK_ENTRY (entry)); + g_signal_emit (login_window, signals[INTERACTIVE], 0); g_signal_emit (login_window, signals[QUERY_ANSWER], 0, text); } @@ -1601,6 +1603,16 @@ gdm_greeter_login_window_class_init (GdmGreeterLoginWindowClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + signals [INTERACTIVE] = + g_signal_new ("interactive", + G_TYPE_FROM_CLASS (object_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GdmGreeterLoginWindowClass, interactive), + NULL, + NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + g_object_class_install_property (object_class, PROP_DISPLAY_IS_LOCAL, g_param_spec_boolean ("display-is-local", diff --git a/gui/simple-greeter/gdm-greeter-login-window.h b/gui/simple-greeter/gdm-greeter-login-window.h index 94d969ee..3781473e 100644 --- a/gui/simple-greeter/gdm-greeter-login-window.h +++ b/gui/simple-greeter/gdm-greeter-login-window.h @@ -56,6 +56,7 @@ typedef struct const char *text); void (* cancelled) (GdmGreeterLoginWindow *login_window); void (* disconnected) (GdmGreeterLoginWindow *login_window); + void (* interactive) (GdmGreeterLoginWindow *login_window); } GdmGreeterLoginWindowClass; diff --git a/gui/simple-greeter/gdm-greeter-session.c b/gui/simple-greeter/gdm-greeter-session.c index 47a63a71..4f625c50 100644 --- a/gui/simple-greeter/gdm-greeter-session.c +++ b/gui/simple-greeter/gdm-greeter-session.c @@ -63,6 +63,8 @@ struct GdmGreeterSessionPrivate GtkWidget *login_window; GtkWidget *panel; + + guint was_interactive : 1; }; enum { @@ -114,6 +116,8 @@ on_reset (GdmGreeterClient *client, gdm_greeter_panel_reset (GDM_GREETER_PANEL (session->priv->panel)); gdm_greeter_login_window_reset (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window)); + + session->priv->was_interactive = FALSE; } static void @@ -238,6 +242,24 @@ on_disconnected (GdmGreeterLoginWindow *login_window, } static void +on_interactive (GdmGreeterLoginWindow *login_window, + GdmGreeterSession *session) +{ + if (!session->priv->was_interactive) { + g_debug ("GdmGreeterSession: session was interactive\n"); + + /* We've blocked the UI already for the user to answer a question, + * so we know they've had an opportunity to interact with + * language chooser session selector, etc, and we can start the + * session right away. + */ + gdm_greeter_client_call_start_session_when_ready (session->priv->client, + TRUE); + session->priv->was_interactive = TRUE; + } +} + +static void toggle_panel (GdmSessionManager *manager, gboolean enabled, GdmGreeterSession *session) @@ -302,6 +324,10 @@ toggle_login_window (GdmSessionManager *manager, "disconnected", G_CALLBACK (on_disconnected), session); + g_signal_connect (session->priv->login_window, + "interactive", + G_CALLBACK (on_interactive), + session); gtk_widget_show (session->priv->login_window); } else { gtk_widget_destroy (session->priv->login_window); |