Hakan Bayındır has proposed merging 
lp:~hbayindir/lightdm-gtk-greeter/lightdm-gtk-greeter into 
lp:lightdm-gtk-greeter.

Requested reviews:
  Sean Davis (bluesabre)

For more details, see:
https://code.launchpad.net/~hbayindir/lightdm-gtk-greeter/lightdm-gtk-greeter/+merge/296637

Increase the ergonomics and usefulness of the greeter in systems where password 
expiration is enabled. Disabled GTK animations and multiple line infobar 
messages enable all messages to be shown accurately and enables users to 
understand what is going on.

-- 
Your team LightDM Gtk+ Greeter Development Team is subscribed to branch 
lp:lightdm-gtk-greeter.
=== modified file 'src/lightdm-gtk-greeter.c'
--- src/lightdm-gtk-greeter.c	2015-11-18 05:00:06 +0000
+++ src/lightdm-gtk-greeter.c	2016-06-07 07:49:15 +0000
@@ -188,6 +188,10 @@
 /* Screensaver values */
 static int timeout, interval, prefer_blanking, allow_exposures;
 
+/* Support variables for multiple messages in InfoBar */
+gboolean append_next_prompt = FALSE;
+gchar *long_infobar_message = NULL;
+
 /* Handling monitors backgrounds */
 static const gint USER_BACKGROUND_DELAY = 250;
 static GreeterBackground *greeter_background;
@@ -1141,19 +1145,60 @@
         return;
     }
 
+    g_debug ("[process_prompts] Entering while loop");
+
     while (pending_questions)
     {
         PAMConversationMessage *message = (PAMConversationMessage *) pending_questions->data;
         pending_questions = g_slist_remove (pending_questions, (gconstpointer) message);
 
+        g_debug ("[process_prompts] Message is a prompt: %d", message->is_prompt);
+        g_debug ("[process_prompts] Value of type union is %d", message->type.message);
+        g_debug ("[process_prompts] Text of the message is %s", message->text);
+
         if (!message->is_prompt)
         {
-            /* FIXME: this doesn't show multiple messages, but that was
-             * already the case before. */
-            set_message_label (message->type.message, message->text);
+            g_debug ("[process_prompts] Setting message %s since it's a prompt", message->text);
+
+            if (!append_next_prompt)
+            {
+                /*
+                 * Since we're going to change the message label anyway,
+                 * We won't need that message anymore.
+                 */
+                if (long_infobar_message != NULL)
+                {
+                    g_free (long_infobar_message);
+                    long_infobar_message = NULL;
+                }
+                set_message_label (message->type.message, message->text);
+            }
+            else
+            {
+                long_infobar_message =  g_strjoin ("\n", gtk_label_get_text (message_label), message->text, NULL);
+                /* Use the last message's type as the type. */
+                set_message_label (message->type.message, long_infobar_message);
+            }
+
+            g_debug ("[process_prompts] Setting append next prompt to TRUE");
+            append_next_prompt = TRUE;
             continue;
         }
 
+        /* If we're reached here, we're going to write different things to the infobar. */
+        g_debug ("[process_prompts] Setting append next prompt to FALSE");
+        append_next_prompt = FALSE;
+
+        /*
+         * If we've reached here, the message label is gonna change below,
+         * so we won't need that message.
+         */
+        if (long_infobar_message != NULL)
+        {
+            g_free (long_infobar_message);
+            long_infobar_message = NULL;
+        }
+
         gtk_widget_show (GTK_WIDGET (password_entry));
         gtk_widget_grab_focus (GTK_WIDGET (password_entry));
         gtk_entry_set_text (password_entry, "");
@@ -1172,10 +1217,18 @@
                 str = g_strndup (str, strlen (str) - 2);
             else if (g_str_has_suffix (str, ":"))
                 str = g_strndup (str, strlen (str) - 1);
+
+           g_debug ("[process_prompts] Message is a prompt, but no messages beforehand, so setting prompt as message");
+
             set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, str);
             if (str != message->text)
                 g_free (str);
         }
+        else if (message->type.prompt == LIGHTDM_PROMPT_TYPE_SECRET)
+        {
+            g_debug ("[process_prompts] Message is a prompt, but it's secret. Not setting prompt as message");
+        }
+
         gtk_widget_grab_focus (GTK_WIDGET (password_entry));
         prompted = TRUE;
         password_prompted = TRUE;
@@ -2793,6 +2846,9 @@
     clock_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "clock_menuitem"));
     host_menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "host_menuitem"));
 
+    /* Disable GTK Toolkit animations to prevent missing infobar messages bug */
+    g_object_set (gtk_settings_get_default(), "gtk-enable-animations", FALSE, NULL);
+
     /* Power dialog */
     power_window = GTK_WIDGET (gtk_builder_get_object (builder, "power_window"));
     power_ok_button = GTK_BUTTON (gtk_builder_get_object (builder, "power_ok_button"));

-- 
Mailing list: https://launchpad.net/~lightdm-gtk-greeter-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~lightdm-gtk-greeter-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to