[gdm/multi-stack: 20/21] manage tasks outside of task list
- From: Ray Strode <halfline src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gdm/multi-stack: 20/21] manage tasks outside of task list
- Date: Tue, 8 Mar 2011 06:41:36 +0000 (UTC)
commit 3686fcdd1cf904355e2682a680c81e56817669f7
Author: Ray Strode <rstrode redhat com>
Date: Fri Aug 6 11:14:23 2010 -0400
manage tasks outside of task list
The task list isn't very good for tracking tasks as
they come and go, since it relies on the groaty details
of toggle buttons and widget activation and such.
We now use it soley for display purposes when necessary
and otherwise, keep track of the tasks in a separate list.
Also, differentiate single authentication modes from
multiple authentication modes, so we don't show the task list
when we don't need to.
gui/simple-greeter/gdm-greeter-login-window.c | 396 +++++++++++++------------
1 files changed, 206 insertions(+), 190 deletions(-)
---
diff --git a/gui/simple-greeter/gdm-greeter-login-window.c b/gui/simple-greeter/gdm-greeter-login-window.c
index 658bab4..5d863b7 100644
--- a/gui/simple-greeter/gdm-greeter-login-window.c
+++ b/gui/simple-greeter/gdm-greeter-login-window.c
@@ -100,6 +100,7 @@ enum {
MODE_TIMED_LOGIN,
MODE_SELECTION,
MODE_AUTHENTICATION,
+ MODE_MULTIPLE_AUTHENTICATION,
};
enum {
@@ -121,6 +122,8 @@ struct GdmGreeterLoginWindowPrivate
guint is_interactive : 1;
guint user_chooser_loaded : 1;
GConfClient *client;
+ GList *tasks;
+ GdmTask *active_task;
GList *tasks_to_enable;
gboolean banner_message_enabled;
@@ -182,6 +185,9 @@ static void gdm_greeter_login_window_start_session_when_ready (GdmGreeterLog
static void handle_stopped_conversation (GdmGreeterLoginWindow *login_window,
const char *service_name);
+static void begin_single_service_verification (GdmGreeterLoginWindow *login_window,
+ const char *service_name);
+
G_DEFINE_TYPE (GdmGreeterLoginWindow, gdm_greeter_login_window, GTK_TYPE_WINDOW)
static void
@@ -215,26 +221,22 @@ set_sensitive (GdmGreeterLoginWindow *login_window,
static void
set_focus (GdmGreeterLoginWindow *login_window)
{
- GdmTask *task;
-
gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (login_window)), GDK_CURRENT_TIME);
- task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
-
- if (task != NULL && gdm_conversation_focus (GDM_CONVERSATION (task))) {
+ if (login_window->priv->active_task != NULL &&
+ gdm_conversation_focus (GDM_CONVERSATION (login_window->priv->active_task))) {
char *name;
- name = gdm_task_get_name (task);
+ name = gdm_task_get_name (login_window->priv->active_task);
g_debug ("GdmGreeterLoginWindow: focusing task %s", name);
g_free (name);
} else if (gtk_widget_get_realized (login_window->priv->user_chooser) && ! gtk_widget_has_focus (login_window->priv->user_chooser)) {
gtk_widget_grab_focus (login_window->priv->user_chooser);
}
- g_object_unref (task);
+
}
static gboolean
-set_task_conversation_message (GdmTaskList *task_list,
- GdmTask *task,
+set_task_conversation_message (GdmTask *task,
const char *message)
{
@@ -249,10 +251,9 @@ set_message (GdmGreeterLoginWindow *login_window,
{
g_return_if_fail (GDM_IS_GREETER_LOGIN_WINDOW (login_window));
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- set_task_conversation_message,
- (gpointer) text);
+ g_list_foreach (login_window->priv->tasks,
+ (GFunc) set_task_conversation_message,
+ (gpointer) text);
}
static void
@@ -455,7 +456,6 @@ set_log_in_button_mode (GdmGreeterLoginWindow *login_window,
GtkWidget *unlock_button;
char *item;
gboolean in_use;
- GdmTask *task;
in_use = FALSE;
item = gdm_chooser_widget_get_active_item (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser));
@@ -499,20 +499,16 @@ set_log_in_button_mode (GdmGreeterLoginWindow *login_window,
switch (mode) {
case LOGIN_BUTTON_HIDDEN:
- task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
- if (task != NULL) {
- hide_task_actions (task);
- g_object_unref (task);
+ if (login_window->priv->active_task != NULL) {
+ hide_task_actions (login_window->priv->active_task);
}
gtk_widget_hide (button);
break;
case LOGIN_BUTTON_ANSWER_QUERY:
- task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
- if (task != NULL) {
- show_task_actions (task);
- grab_default_button_for_task (task);
- g_object_unref (task);
+ if (login_window->priv->active_task != NULL) {
+ show_task_actions (login_window->priv->active_task);
+ grab_default_button_for_task (login_window->priv->active_task);
}
gtk_widget_hide (button);
@@ -559,6 +555,7 @@ maybe_show_cancel_button (GdmGreeterLoginWindow *login_window)
show = TRUE;
break;
case MODE_AUTHENTICATION:
+ case MODE_MULTIPLE_AUTHENTICATION:
if (login_window->priv->num_queries > 1) {
/* if we are inside a pam conversation past
the first step */
@@ -583,7 +580,7 @@ update_conversation_list_visibility (GdmGreeterLoginWindow *login_window)
{
int number_of_tasks;
- if (login_window->priv->dialog_mode != MODE_AUTHENTICATION) {
+ if (login_window->priv->dialog_mode != MODE_MULTIPLE_AUTHENTICATION) {
gtk_widget_hide (login_window->priv->conversation_list);
return;
}
@@ -626,6 +623,7 @@ switch_mode (GdmGreeterLoginWindow *login_window,
gtk_widget_show (login_window->priv->session_option_widget);
break;
case MODE_AUTHENTICATION:
+ case MODE_MULTIPLE_AUTHENTICATION:
set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY);
gtk_widget_show (login_window->priv->session_option_widget);
break;
@@ -665,39 +663,36 @@ switch_mode (GdmGreeterLoginWindow *login_window,
}
}
-static gboolean
-task_has_service_name (GdmTaskList *task_list,
- GdmTask *task,
- const char *service_name)
+static GdmTask *
+find_task_with_service_name (GdmGreeterLoginWindow *login_window,
+ const char *service_name)
{
- char *task_service_name;
- gboolean has_service_name;
+ GList *node;
- task_service_name = gdm_conversation_get_service_name (GDM_CONVERSATION (task));
+ node = login_window->priv->tasks;
+ while (node != NULL) {
+ GdmTask *task;
+ char *task_service_name;
+ gboolean has_service_name;
- has_service_name = strcmp (service_name, task_service_name) == 0;
- g_free (task_service_name);
+ task = GDM_TASK (node->data);
- return has_service_name;
-}
+ task_service_name = gdm_conversation_get_service_name (GDM_CONVERSATION (task));
+ has_service_name = strcmp (service_name, task_service_name) == 0;
+ g_free (task_service_name);
-static GdmTask *
-find_task_with_service_name (GdmGreeterLoginWindow *login_window,
- const char *service_name)
-{
- GdmTask *task;
+ if (has_service_name) {
+ return task;
+ }
- task = gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- task_has_service_name,
- (gpointer) service_name);
+ node = node->next;
+ }
- return task;
+ return NULL;
}
static gboolean
-reset_task (GdmTaskList *task_list,
- GdmTask *task,
+reset_task (GdmTask *task,
GdmGreeterLoginWindow *login_window)
{
char *name;
@@ -709,28 +704,31 @@ reset_task (GdmTaskList *task_list,
login_window->priv->tasks_to_enable = g_list_remove (login_window->priv->tasks_to_enable, task);
hide_task_actions (task);
+ gdm_task_list_remove_task (GDM_TASK_LIST (login_window->priv->conversation_list), task);
gdm_conversation_reset (GDM_CONVERSATION (task));
return FALSE;
}
static gboolean
-task_is_disabled (GdmTaskList *task_list,
- GdmTask *task)
-{
- return !gdm_task_is_enabled (task);
-}
-
-static gboolean
tasks_are_enabled (GdmGreeterLoginWindow *login_window)
{
- GdmTask *task;
- task = gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- task_is_disabled,
- NULL);
+ GList *node;
+
+ node = login_window->priv->tasks;
+ while (node != NULL) {
+ GdmTask *task;
+
+ task = GDM_TASK (node->data);
+
+ if (!gdm_task_is_enabled (task)) {
+ return FALSE;
+ }
+
+ node = node->next;
+ }
- return task == NULL;
+ return TRUE;
}
static gboolean
@@ -744,6 +742,8 @@ can_jump_to_authenticate (GdmGreeterLoginWindow *login_window)
res = FALSE;
} else if (login_window->priv->dialog_mode == MODE_AUTHENTICATION) {
res = FALSE;
+ } else if (login_window->priv->dialog_mode == MODE_MULTIPLE_AUTHENTICATION) {
+ res = FALSE;
} else if (login_window->priv->user_list_disabled) {
res = (login_window->priv->timed_login_username == NULL);
} else {
@@ -753,39 +753,81 @@ can_jump_to_authenticate (GdmGreeterLoginWindow *login_window)
return res;
}
-static gboolean
-begin_task_verification (GdmTaskList *task_list,
- GdmTask *task,
- GdmGreeterLoginWindow *login_window)
+static void
+begin_other_verification (GdmGreeterLoginWindow *login_window)
{
- char *service_name;
+ /* FIXME: we should drop this code and do all OTHER handling
+ * entirely from within the password plugin
+ * (ala how smart card manages its "Smartcard Authentication" item)
+ */
+ begin_single_service_verification (login_window, "gdm-password");
+}
- if (!gdm_task_is_visible (task)) {
- return FALSE;
- }
+static void
+set_task_active (GdmGreeterLoginWindow *login_window,
+ GdmTask *task)
+{
+ GtkWidget *container;
+ char *name;
- service_name = gdm_conversation_get_service_name (GDM_CONVERSATION (task));
- if (service_name != NULL) {
- g_signal_emit (login_window, signals[BEGIN_VERIFICATION], 0, service_name);
- g_free (service_name);
+ name = gdm_task_get_name (task);
+ g_debug ("GdmGreeterLoginWindow: task '%s' activated", name);
+ g_free (name);
+
+ container = g_object_get_data (G_OBJECT (task),
+ "gdm-greeter-login-window-page-container");
+
+ if (container == NULL) {
+ GtkWidget *page;
+
+ container = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
+ gtk_container_add (GTK_CONTAINER (login_window->priv->auth_page_box),
+ container);
+
+ page = gdm_conversation_get_page (GDM_CONVERSATION (task));
+ if (page != NULL) {
+ gtk_container_add (GTK_CONTAINER (container), page);
+ gtk_widget_show (page);
+ }
+ g_object_set_data (G_OBJECT (task),
+ "gdm-greeter-login-window-page-container",
+ container);
}
- return FALSE;
+ gtk_widget_show (container);
+
+ login_window->priv->active_task = task;
+ switch_mode (login_window, login_window->priv->dialog_mode);
}
static void
-begin_verification (GdmGreeterLoginWindow *login_window)
+clear_active_task (GdmGreeterLoginWindow *login_window)
{
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- begin_task_verification,
- login_window);
- switch_mode (login_window, MODE_AUTHENTICATION);
+ GtkWidget *container;
+ GtkActionGroup *actions;
- update_conversation_list_visibility (login_window);
-}
+ if (login_window->priv->active_task == NULL) {
+ return;
+ }
+
+ container = g_object_get_data (G_OBJECT (login_window->priv->active_task),
+ "gdm-greeter-login-window-page-container");
+
+ if (container != NULL) {
+ gtk_widget_hide (container);
+ }
+
+ actions = gdm_conversation_get_actions (GDM_CONVERSATION (login_window->priv->active_task));
+
+ if (actions != NULL) {
+ gtk_action_group_set_sensitive (actions, FALSE);
+ gtk_action_group_set_visible (actions, FALSE);
+ g_object_unref (actions);
+ }
+ login_window->priv->active_task = NULL;
+}
static void
reset_dialog (GdmGreeterLoginWindow *login_window,
@@ -820,18 +862,16 @@ reset_dialog (GdmGreeterLoginWindow *login_window,
set_message (login_window, "");
}
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- reset_task,
- login_window);
+ g_list_foreach (login_window->priv->tasks, (GFunc) reset_task, login_window);
if (can_jump_to_authenticate (login_window)) {
/* If we don't have a user list jump straight to authenticate */
g_debug ("GdmGreeterLoginWindow: jumping straight to authenticate");
g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
0, GDM_USER_CHOOSER_USER_OTHER);
- begin_verification (login_window);
+ begin_other_verification (login_window);
} else {
+ clear_active_task (login_window);
switch_mode (login_window, dialog_mode);
}
@@ -876,9 +916,9 @@ gdm_greeter_login_window_ready (GdmGreeterLoginWindow *login_window,
if (gdm_chooser_widget_is_loaded (GDM_CHOOSER_WIDGET (login_window->priv->user_chooser))) {
gdm_conversation_set_ready (GDM_CONVERSATION (task));
} else {
- login_window->priv->tasks_to_enable = g_list_prepend (login_window->priv->tasks_to_enable, task);
+ login_window->priv->tasks_to_enable = g_list_prepend (login_window->priv->tasks_to_enable,
+ g_object_ref (task));
}
- g_object_unref (task);
}
set_sensitive (GDM_GREETER_LOGIN_WINDOW (login_window), TRUE);
@@ -891,7 +931,7 @@ gdm_greeter_login_window_ready (GdmGreeterLoginWindow *login_window,
g_debug ("Starting PAM conversation since user list disabled or no local users");
g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
0, GDM_USER_CHOOSER_USER_OTHER);
- begin_verification (login_window);
+ begin_other_verification (login_window);
}
return TRUE;
@@ -913,24 +953,37 @@ handle_stopped_conversation (GdmGreeterLoginWindow *login_window,
return;
}
+ if (login_window->priv->dialog_mode == MODE_AUTHENTICATION) {
+ g_debug ("GdmGreeterLoginWindow: conversation failed, starting over");
+ restart_conversations (login_window);
+ return;
+ } else if (login_window->priv->dialog_mode != MODE_MULTIPLE_AUTHENTICATION) {
+ g_warning ("conversation %s stopped when it shouldn't have been running (mode %d)",
+ service_name, login_window->priv->dialog_mode);
+ restart_conversations (login_window);
+ return;
+ }
+
task = find_task_with_service_name (login_window, service_name);
if (task != NULL) {
gdm_conversation_reset (GDM_CONVERSATION (task));
g_object_set_data (G_OBJECT (task), "needs-to-be-stopped", GINT_TO_POINTER (FALSE));
- g_object_unref (task);
}
/* If every conversation has failed, then just start over.
*/
task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
- if (!gdm_task_is_enabled (task)) {
+ if (task == NULL || !gdm_task_is_enabled (task)) {
g_debug ("GdmGreeterLoginWindow: No conversations left, starting over");
restart_conversations (login_window);
}
- g_object_unref (task);
+
+ if (task != NULL) {
+ g_object_unref (task);
+ }
update_conversation_list_visibility (login_window);
}
@@ -946,8 +999,8 @@ gdm_greeter_login_window_conversation_stopped (GdmGreeterLoginWindow *login_wind
g_debug ("GdmGreeterLoginWindow: conversation '%s' has stopped", service_name);
- task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
- if (task != NULL && task_has_service_name (GDM_TASK_LIST (login_window->priv->conversation_list), task, service_name)) {
+ task = find_task_with_service_name (login_window, service_name);
+ if (task != NULL && gdm_task_is_enabled (task)) {
messages_pending = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (task), "message-pending"));
} else {
@@ -966,8 +1019,7 @@ gdm_greeter_login_window_conversation_stopped (GdmGreeterLoginWindow *login_wind
}
static gboolean
-restart_task_conversation (GdmTaskList *task_list,
- GdmTask *task,
+restart_task_conversation (GdmTask *task,
GdmGreeterLoginWindow *login_window)
{
char *service_name;
@@ -996,10 +1048,7 @@ gdm_greeter_login_window_reset (GdmGreeterLoginWindow *login_window)
g_return_val_if_fail (GDM_IS_GREETER_LOGIN_WINDOW (login_window), FALSE);
reset_dialog (GDM_GREETER_LOGIN_WINDOW (login_window), MODE_SELECTION);
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- restart_task_conversation,
- login_window);
+ g_list_foreach (login_window->priv->tasks, (GFunc) restart_task_conversation, login_window);
g_free (login_window->priv->service_name_of_session_ready_to_start);
login_window->priv->service_name_of_session_ready_to_start = NULL;
@@ -1025,7 +1074,6 @@ gdm_greeter_login_window_info (GdmGreeterLoginWindow *login_window,
gdm_conversation_set_message (GDM_CONVERSATION (task),
text);
show_task_actions (task);
- g_object_unref (task);
}
return TRUE;
@@ -1049,7 +1097,6 @@ gdm_greeter_login_window_problem (GdmGreeterLoginWindow *login_window,
gdm_conversation_set_message (GDM_CONVERSATION (task),
text);
show_task_actions (task);
- g_object_unref (task);
}
gdk_window_beep (gtk_widget_get_window (GTK_WIDGET (login_window)));
@@ -1088,9 +1135,19 @@ gdm_greeter_login_window_service_unavailable (GdmGreeterLoginWindow *login_windo
task = find_task_with_service_name (login_window, service_name);
if (task != NULL) {
- gdm_task_list_remove_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- task);
- g_object_unref (task);
+ GdmTask *active_task;
+
+ gdm_task_set_enabled (task, FALSE);
+
+ active_task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
+
+ if (active_task == task) {
+ restart_conversations (login_window);
+ }
+
+ if (active_task != NULL) {
+ g_object_unref (active_task);
+ }
}
return TRUE;
@@ -1225,7 +1282,6 @@ gdm_greeter_login_window_info_query (GdmGreeterLoginWindow *login_window,
if (task != NULL) {
gdm_conversation_ask_question (GDM_CONVERSATION (task),
text);
- g_object_unref (task);
}
set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY);
@@ -1256,7 +1312,6 @@ gdm_greeter_login_window_secret_info_query (GdmGreeterLoginWindow *login_window,
if (task != NULL) {
gdm_conversation_ask_secret (GDM_CONVERSATION (task),
text);
- g_object_unref (task);
}
set_log_in_button_mode (login_window, LOGIN_BUTTON_ANSWER_QUERY);
@@ -1351,8 +1406,7 @@ on_user_chooser_visibility_changed (GdmGreeterLoginWindow *login_window)
}
static gboolean
-begin_task_verification_for_selected_user (GdmTaskList *task_list,
- GdmTask *task,
+begin_task_verification_for_selected_user (GdmTask *task,
GdmGreeterLoginWindow *login_window)
{
char *user_name;
@@ -1370,6 +1424,9 @@ begin_task_verification_for_selected_user (GdmTaskList *task_list,
g_free (service_name);
}
+ gdm_task_list_add_task (GDM_TASK_LIST (login_window->priv->conversation_list),
+ task);
+
g_free (user_name);
return FALSE;
}
@@ -1417,7 +1474,7 @@ on_users_loaded (GdmUserChooserWidget *user_chooser,
g_debug ("GdmGreeterLoginWindow: jumping straight to authenticate");
g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
0, GDM_USER_CHOOSER_USER_OTHER);
- begin_verification (login_window);
+ begin_other_verification (login_window);
}
}
@@ -1425,19 +1482,23 @@ static void
choose_user (GdmGreeterLoginWindow *login_window,
const char *user_name)
{
+ GdmTask *task;
+
g_assert (user_name != NULL);
g_debug ("GdmGreeterLoginWindow: user chosen '%s'", user_name);
g_signal_emit (G_OBJECT (login_window), signals[USER_SELECTED],
0, user_name);
+ g_list_foreach (login_window->priv->tasks,
+ (GFunc) begin_task_verification_for_selected_user,
+ login_window);
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- begin_task_verification_for_selected_user,
- login_window);
+ task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
+ set_task_active (login_window, task);
+ g_object_unref (task);
- switch_mode (login_window, MODE_AUTHENTICATION);
+ switch_mode (login_window, MODE_MULTIPLE_AUTHENTICATION);
update_conversation_list_visibility (login_window);
}
@@ -1453,35 +1514,34 @@ begin_auto_login (GdmGreeterLoginWindow *login_window)
/* just wait for the user to select language and stuff */
set_message (login_window, _("Select language and click Log In"));
+ clear_active_task (login_window);
switch_mode (login_window, MODE_TIMED_LOGIN);
show_widget (login_window, "conversation-list", FALSE);
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc) reset_task,
- login_window);
+ g_list_foreach (login_window->priv->tasks,
+ (GFunc) reset_task,
+ login_window);
}
-static gboolean
-reset_task_if_not_given (GdmTaskList *task_list,
- GdmTask *task,
+static void
+reset_task_if_not_given (GdmTask *task,
GdmTask *given_task)
{
if (task == given_task) {
- return FALSE;
+ return;
}
gdm_conversation_reset (GDM_CONVERSATION (task));
- return FALSE;
}
static void
reset_every_task_but_given_task (GdmGreeterLoginWindow *login_window,
GdmTask *task)
{
- gdm_task_list_foreach_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- (GdmTaskListForeachFunc)
- reset_task_if_not_given,
- task);
+ g_list_foreach (login_window->priv->tasks,
+ (GFunc) reset_task_if_not_given,
+ task);
+
}
static void
@@ -1504,11 +1564,10 @@ begin_single_service_verification (GdmGreeterLoginWindow *login_window,
*/
g_signal_emit (login_window, signals[BEGIN_VERIFICATION], 0, service_name);
- switch_mode (login_window, MODE_AUTHENTICATION);
- gdm_task_list_set_active_task (GDM_TASK_LIST (login_window->priv->conversation_list), task);
-
reset_every_task_but_given_task (login_window, task);
- g_object_unref (task);
+
+ set_task_active (login_window, task);
+ switch_mode (login_window, MODE_AUTHENTICATION);
show_widget (login_window, "conversation-list", FALSE);
}
@@ -1539,7 +1598,7 @@ on_user_chooser_activated (GdmUserChooserWidget *user_chooser,
g_debug ("GdmGreeterLoginWindow: Starting all auth conversations");
g_free (item_id);
- begin_verification (login_window);
+ begin_other_verification (login_window);
} else if (strcmp (item_id, GDM_USER_CHOOSER_USER_GUEST) == 0) {
/* FIXME: handle guest account stuff */
g_free (item_id);
@@ -1777,63 +1836,28 @@ static void
on_task_activated (GdmGreeterLoginWindow *login_window,
GdmTask *task)
{
- GtkWidget *container;
- char *name;
-
- name = gdm_task_get_name (task);
- g_debug ("GdmGreeterLoginWindow: task '%s' activated", name);
- g_free (name);
-
- container = g_object_get_data (G_OBJECT (task),
- "gdm-greeter-login-window-page-container");
-
- if (container == NULL) {
- GtkWidget *page;
-
- container = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
- gtk_container_add (GTK_CONTAINER (login_window->priv->auth_page_box),
- container);
-
- page = gdm_conversation_get_page (GDM_CONVERSATION (task));
- if (page != NULL) {
- gtk_container_add (GTK_CONTAINER (container), page);
- gtk_widget_show (page);
- }
- g_object_set_data (G_OBJECT (task),
- "gdm-greeter-login-window-page-container",
- container);
- }
-
- gtk_widget_show (container);
- switch_mode (login_window, login_window->priv->dialog_mode);
+ set_task_active (login_window, task);
}
static void
on_task_deactivated (GdmGreeterLoginWindow *login_window,
GdmTask *task)
{
- GtkWidget *container;
char *name;
- GtkActionGroup *actions;
+
+ if (login_window->priv->active_task != task) {
+ g_warning ("inactive task has been deactivated");
+ return;
+ }
name = gdm_task_get_name (task);
g_debug ("GdmGreeterLoginWindow: task '%s' now in background", name);
g_free (name);
- container = g_object_get_data (G_OBJECT (task),
- "gdm-greeter-login-window-page-container");
+ clear_active_task (login_window);
- if (container != NULL) {
- gtk_widget_hide (container);
- }
-
- actions = gdm_conversation_get_actions (GDM_CONVERSATION (task));
-
- if (actions != NULL) {
- gtk_action_group_set_sensitive (actions, FALSE);
- gtk_action_group_set_visible (actions, FALSE);
- g_object_unref (actions);
- }
+ login_window->priv->active_task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
+ g_object_unref (login_window->priv->active_task);
}
static void
@@ -1946,6 +1970,7 @@ load_theme (GdmGreeterLoginWindow *login_window)
box = GTK_WIDGET (gtk_builder_get_object (login_window->priv->builder, "computer-info-event-box"));
g_signal_connect (box, "button-press-event", G_CALLBACK (on_computer_info_label_button_press), login_window);
+ clear_active_task (login_window);
switch_mode (login_window, MODE_SELECTION);
gdm_profile_end (NULL);
@@ -2325,15 +2350,12 @@ on_conversation_chose_user (GdmGreeterLoginWindow *login_window,
/* If we're already authenticating then we can't pick a user
*/
- if (login_window->priv->dialog_mode == MODE_AUTHENTICATION) {
+ if (login_window->priv->dialog_mode == MODE_AUTHENTICATION || login_window->priv->dialog_mode == MODE_MULTIPLE_AUTHENTICATION) {
return FALSE;
}
- if (gdm_task_list_set_active_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- GDM_TASK (conversation))) {
- gdm_user_chooser_widget_set_chosen_user_name (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser),
- username);
- }
+ gdm_user_chooser_widget_set_chosen_user_name (GDM_USER_CHOOSER_WIDGET (login_window->priv->user_chooser),
+ username);
return TRUE;
}
@@ -2357,11 +2379,7 @@ on_conversation_message_set (GdmGreeterLoginWindow *login_window,
}
if (login_window->priv->service_name_of_session_ready_to_start != NULL ) {
- GdmTask *task;
-
- task = gdm_task_list_get_active_task (GDM_TASK_LIST (login_window->priv->conversation_list));
-
- if (task == GDM_TASK (conversation)) {
+ if (login_window->priv->active_task == GDM_TASK (conversation)) {
gdm_greeter_login_window_start_session (login_window);
}
}
@@ -2537,9 +2555,7 @@ gdm_greeter_login_window_add_extension (GdmGreeterLoginWindow *login_window,
g_debug ("GdmGreeterLoginWindow: new extension '%s - %s' added",
name, description);
- gdm_task_list_add_task (GDM_TASK_LIST (login_window->priv->conversation_list),
- GDM_TASK (extension));
-
+ login_window->priv->tasks = g_list_append (login_window->priv->tasks, extension);
service_name = gdm_conversation_get_service_name (GDM_CONVERSATION (extension));
if (gdm_task_is_choosable (GDM_TASK (extension))) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]