diff -ruN gdm-2.29.1.orig/common/gdm-settings-keys.h gdm-2.29.1/common/gdm-settings-keys.h
--- gdm-2.29.1.orig/common/gdm-settings-keys.h	2009-12-12 17:46:09.886072058 -0500
+++ gdm-2.29.1/common/gdm-settings-keys.h	2009-12-12 17:46:52.126548437 -0500
@@ -29,6 +29,7 @@
 #define GDM_KEY_GROUP "daemon/Group"
 #define GDM_KEY_AUTO_LOGIN_ENABLE "daemon/AutomaticLoginEnable"
 #define GDM_KEY_AUTO_LOGIN_USER "daemon/AutomaticLogin"
+#define GDM_KEY_AUTO_LOGIN_GUI "daemon/AutomaticLoginShowGUI"
 #define GDM_KEY_TIMED_LOGIN_ENABLE "daemon/TimedLoginEnable"
 #define GDM_KEY_TIMED_LOGIN_USER "daemon/TimedLogin"
 #define GDM_KEY_TIMED_LOGIN_DELAY "daemon/TimedLoginDelay"
diff -ruN gdm-2.29.1.orig/daemon/gdm-display.c gdm-2.29.1/daemon/gdm-display.c
--- gdm-2.29.1.orig/daemon/gdm-display.c	2009-12-12 17:46:09.942228596 -0500
+++ gdm-2.29.1/daemon/gdm-display.c	2009-12-12 17:46:52.127991872 -0500
@@ -37,6 +37,7 @@
 #include "gdm-display-glue.h"
 #include "gdm-display-access-file.h"
 
+#include "gdm-settings-utils.h"
 #include "gdm-settings-direct.h"
 #include "gdm-settings-keys.h"
 
@@ -316,16 +317,17 @@
 gdm_display_real_get_timed_login_details (GdmDisplay *display,
                                           gboolean   *enabledp,
                                           char      **usernamep,
-                                          int        *delayp)
+                                          char      **delayp)
 {
         gboolean res;
         gboolean enabled;
         int      delay;
         char    *username;
+        char    *delay_str;
 
         enabled = FALSE;
         username = NULL;
-        delay = 0;
+        delay_str = NULL;
 
         res = gdm_settings_direct_get_boolean (GDM_KEY_AUTO_LOGIN_ENABLE, &enabled);
         if (enabled) {
@@ -333,10 +335,13 @@
         }
 
         if (enabled && username != NULL && username[0] != '\0') {
+		res = gdm_settings_direct_get_string (GDM_KEY_AUTO_LOGIN_GUI, &delay_str);
                 goto out;
         }
 
         g_free (username);
+        g_free (delay_str);
+        delay_str = NULL;
         username = NULL;
         enabled = FALSE;
 
@@ -361,6 +366,8 @@
                 delay = 10;
         }
 
+        delay_str = gdm_settings_parse_double_as_value ((gdouble) delay);
+
  out:
         if (enabledp != NULL) {
                 *enabledp = enabled;
@@ -371,7 +378,9 @@
                 g_free (username);
         }
         if (delayp != NULL) {
-                *delayp = delay;
+                *delayp = delay_str;
+        } else {
+                g_free (delay_str);
         }
 }
 
@@ -379,18 +388,18 @@
 gdm_display_get_timed_login_details (GdmDisplay *display,
                                      gboolean   *enabled,
                                      char      **username,
-                                     int        *delay,
+                                     char      **delay,
                                      GError    **error)
 {
         g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
 
         GDM_DISPLAY_GET_CLASS (display)->get_timed_login_details (display, enabled, username, delay);
 
-        g_debug ("GdmSlave: Got timed login details for display %s: %d '%s' %d",
+        g_debug ("GdmSlave: Got timed login details for display %s: %d '%s' %s",
                  display->priv->x11_display_name,
                  *enabled,
                  *username ? *username : "(null)",
-                 *delay);
+                 *delay ? *delay : "(null)");
 
         return TRUE;
 }
diff -ruN gdm-2.29.1.orig/daemon/gdm-display.h gdm-2.29.1/daemon/gdm-display.h
--- gdm-2.29.1.orig/daemon/gdm-display.h	2009-12-12 17:46:09.938518408 -0500
+++ gdm-2.29.1/daemon/gdm-display.h	2009-12-12 17:46:52.128452973 -0500
@@ -73,7 +73,7 @@
         void     (*get_timed_login_details)   (GdmDisplay *display,
                                                gboolean   *enabled,
                                                char      **username,
-                                               int        *delay);
+                                               char      **delay);
 } GdmDisplayClass;
 
 typedef enum
@@ -132,7 +132,7 @@
 gboolean            gdm_display_get_timed_login_details        (GdmDisplay *display,
                                                                 gboolean   *enabled,
                                                                 char      **username,
-                                                                int        *delay,
+                                                                char      **delay,
                                                                 GError    **error);
 
 /* exported but protected */
diff -ruN gdm-2.29.1.orig/daemon/gdm-display.xml gdm-2.29.1/daemon/gdm-display.xml
--- gdm-2.29.1.orig/daemon/gdm-display.xml	2009-12-12 17:46:09.946827250 -0500
+++ gdm-2.29.1/daemon/gdm-display.xml	2009-12-12 17:46:52.128757477 -0500
@@ -57,7 +57,7 @@
     <method name="GetTimedLoginDetails">
       <arg name="enabled" direction="out" type="b"/>
       <arg name="username" direction="out" type="s"/>
-      <arg name="delay" direction="out" type="i"/>
+      <arg name="delay" direction="out" type="s"/>
     </method>
   </interface>
 </node>
diff -ruN gdm-2.29.1.orig/daemon/gdm-greeter-server.c gdm-2.29.1/daemon/gdm-greeter-server.c
--- gdm-2.29.1.orig/daemon/gdm-greeter-server.c	2009-12-12 17:46:09.937620420 -0500
+++ gdm-2.29.1/daemon/gdm-greeter-server.c	2009-12-12 17:46:52.129832757 -0500
@@ -253,6 +253,18 @@
 }
 
 void
+gdm_greeter_server_layout_popup_requested (GdmGreeterServer *greeter_server)
+{
+        send_dbus_void_signal (greeter_server, "LayoutPopupRequested");
+}
+
+void
+gdm_greeter_server_language_popup_requested (GdmGreeterServer *greeter_server)
+{
+        send_dbus_void_signal (greeter_server, "LanguagePopupRequested");
+}
+
+void
 gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
                                           const char       *username)
 {
@@ -739,6 +751,10 @@
                                "    <signal name=\"InfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
+                               "    <signal name=\"LayoutPopupRequested\">\n"
+                               "    </signal>\n"
+                               "    <signal name=\"LanguagePopupRequested\">\n"
+                               "    </signal>\n"
                                "    <signal name=\"SecretInfoQuery\">\n"
                                "      <arg name=\"text\" type=\"s\"/>\n"
                                "    </signal>\n"
diff -ruN gdm-2.29.1.orig/daemon/gdm-greeter-server.h gdm-2.29.1/daemon/gdm-greeter-server.h
--- gdm-2.29.1.orig/daemon/gdm-greeter-server.h	2009-12-12 17:46:09.943637404 -0500
+++ gdm-2.29.1/daemon/gdm-greeter-server.h	2009-12-12 17:46:52.130509569 -0500
@@ -86,6 +86,8 @@
                                                               const char       *text);
 gboolean            gdm_greeter_server_reset                 (GdmGreeterServer *greeter_server);
 gboolean            gdm_greeter_server_ready                 (GdmGreeterServer *greeter_server);
+void            gdm_greeter_server_layout_popup_requested (GdmGreeterServer *greeter_server);
+void            gdm_greeter_server_language_popup_requested (GdmGreeterServer *greeter_server);
 void                gdm_greeter_server_selected_user_changed (GdmGreeterServer *greeter_server,
                                                               const char       *text);
 void                gdm_greeter_server_default_language_name_changed (GdmGreeterServer *greeter_server,
diff -ruN gdm-2.29.1.orig/daemon/gdm-simple-slave.c gdm-2.29.1/daemon/gdm-simple-slave.c
--- gdm-2.29.1.orig/daemon/gdm-simple-slave.c	2009-12-12 17:46:09.943802938 -0500
+++ gdm-2.29.1/daemon/gdm-simple-slave.c	2009-12-12 17:46:52.131456811 -0500
@@ -297,8 +297,23 @@
                        GdmSimpleSlave *slave)
 {
         if (slave->priv->greeter_server != NULL) {
+                gboolean res;
+                gboolean enabled;
+                char    *username;
+                int      delay;
+
+                enabled = FALSE;
                 gdm_greeter_server_user_authorized (slave->priv->greeter_server);
                 gdm_simple_slave_accredit_when_ready (slave);
+
+                gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, &username, &delay);
+               if (enabled && username != NULL && username[0] != '\0' && delay == -1) {
+#ifdef HAVE_LIBXKLAVIER
+		        gdm_greeter_server_layout_popup_requested (slave->priv->greeter_server);
+#endif
+		        gdm_greeter_server_language_popup_requested (slave->priv->greeter_server);
+		}
+		g_free (username);
         } else {
                 slave->priv->start_session_when_ready = TRUE;
                 gdm_simple_slave_accredit_when_ready (slave);
@@ -1053,7 +1068,7 @@
                 delay = 0;
                 enabled = FALSE;
                 gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay);
-                if (! enabled || delay > 0) {
+                if (! enabled || delay != 0) {
                         start_greeter (slave);
                         create_new_session (slave);
                 } else {
diff -ruN gdm-2.29.1.orig/daemon/gdm-slave.c gdm-2.29.1/daemon/gdm-slave.c
--- gdm-2.29.1.orig/daemon/gdm-slave.c	2009-12-12 17:46:09.939386498 -0500
+++ gdm-2.29.1/daemon/gdm-slave.c	2009-12-12 17:46:52.133233583 -0500
@@ -835,74 +835,90 @@
 }
 
 static gchar *
-gdm_slave_parse_enriched_login (GdmSlave *slave,
-                                char *username,
+gdm_slave_parse_piped_item (GdmSlave *slave,
+                                char *name,
                                 char *display_name)
 {
         char in_buffer[20];
         char **argv = NULL;
         gint pipe1[2], in_buffer_len;
-        int  username_length;
+        gint name_length;
         pid_t pid;
+        GPtrArray *env;
+        GError    *error;
+        gboolean   res;
+        char      *std_output;
+        char      *std_error;
 
-        if (username == NULL)
+        if (name == NULL)
                 return (NULL);
 
-        /* A script may be used to generate the automatic/timed login name
-           based on the display/host by ending the name with the pipe symbol
-           '|'. */
 
-        username_length = strlen (username);
-        if (username_length > 0 && username[username_length-1] == '|') {
-                GPtrArray *env;
-                GError    *error;
-                gboolean   res;
-                char     **argv;
-                char      *std_output;
-                char      *std_error;
-
-                /* Remove the pipe symbol */
-                username[username_length-1] = '\0';
-
-                argv = NULL;
-                error = NULL;
-                if (! g_shell_parse_argv (username, NULL, &argv, &error)) {
-                      g_warning ("Could not parse command: %s", error->message);
-                      return (NULL);
-                }
+	name_length = strlen (name);
+        /* Remove the pipe symbol */
+        name[name_length-1] = '\0';
 
-                g_debug ("Calling script %s to acquire auto/timed username",
-                         username);
+        argv = NULL;
+        error = NULL;
+        if (! g_shell_parse_argv (name, NULL, &argv, &error)) {
+              g_warning ("Could not parse command: %s", error->message);
+              return (NULL);
+        }
 
-                env = get_script_environment (slave, NULL);
-                error = NULL;
-                res = g_spawn_sync (NULL,
-                                    argv,
-                                    (char **)env->pdata,
-                                    G_SPAWN_SEARCH_PATH,
-                                    NULL,
-                                    NULL,
-                                    &std_output,
-                                    &std_error,
-                                    NULL,
-                                    &error);
-
-                g_ptr_array_foreach (env, (GFunc)g_free, NULL);
-                g_ptr_array_free (env, TRUE);
-                g_strfreev (argv);
+        g_debug ("Calling script %s to acquire result",
+                 name);
 
-                if (! res) {
-                        g_warning ("Unable to launch auto/timed login script: %s", error->message);
-                        g_error_free (error);
+        env = get_script_environment (slave, NULL);
+        error = NULL;
+        res = g_spawn_sync (NULL,
+                            argv,
+                            (char **)env->pdata,
+                            G_SPAWN_SEARCH_PATH,
+                            NULL,
+                            NULL,
+                            &std_output,
+                            &std_error,
+                            NULL,
+                            &error);
+
+        g_ptr_array_foreach (env, (GFunc)g_free, NULL);
+        g_ptr_array_free (env, TRUE);
+        g_strfreev (argv);
+
+        if (! res) {
+                g_warning ("Unable to launch script: %s", error->message);
+                g_error_free (error);
 	        } else {
-                        if (std_output != NULL) {
-                                g_strchomp (std_output);
-                                if (std_output[0] != '\0') {
-                                        return (g_strdup (std_output));
-                                }
+                if (std_output != NULL) {
+                        g_strchomp (std_output);
+                        if (std_output[0] != '\0') {
+                                return (g_strdup (std_output));
                         }
-                        return NULL;
                 }
+                return NULL;
+        }
+
+	return NULL;
+}
+
+static gchar *
+gdm_slave_parse_login (GdmSlave *slave,
+                                char *username,
+                                char *display_name)
+{
+        int  username_length;
+
+        if (username == NULL)
+                return (NULL);
+
+        /* A script may be used to generate the automatic/timed login name
+           based on the display/host by ending the name with the pipe symbol
+           '|'. */
+
+        username_length = strlen (username);
+        if (username_length > 0 && username[username_length-1] == '|') {
+                g_warning ("%s needs further parsing...", username);
+                return gdm_slave_parse_piped_item (slave, username, display_name);
         } else {
                 return (g_strdup (username));
         }
@@ -910,6 +926,61 @@
 	return NULL;
 }
 
+static gint
+gdm_slave_parse_delay_string (char *s)
+{
+        gint ret = 0;
+
+        if (s && !g_ascii_strcasecmp (s, "true") || !g_ascii_strcasecmp (s, "yes")) {
+	        ret = -1;
+        } else if (s && !g_ascii_strcasecmp (s, "false") || !g_ascii_strcasecmp (s, "no")) {
+	        ret = 0;
+        } else if (s) {
+                ret = (gint) g_ascii_strtod (s, NULL);
+	        if (ret <= 0)
+		        ret = 10;
+	} 
+	return ret;
+}
+
+static gint
+gdm_slave_parse_delay (GdmSlave *slave,
+                                char *delay,
+                                char *display_name)
+{
+        gint  delay_length;
+        gint  ret;
+
+        if (delay == NULL)
+                return (NULL);
+
+        /* Parsing for AutomaticLoginEnable/TimedLoginDelay values.
+           Valid values for AutomaticLoginEnable
+	   AutomaticLoginEnable=true
+	   AutomaticLoginEnable=false
+	   AutomaticLoginEnable=yes
+	   AutomaticLoginEnable=no
+	   AutomaticLoginEnable=/path/to/script|
+           script may be used to generate yes/no or true/false or
+           timed delay value for AutomaticLoginEnable based on certain
+	   conditions. 
+	   TimedLoginDelay value also passed as a string and parsed here. 
+	   It takes in delay in seconds 
+	 */
+
+        delay_length = strlen (delay);
+        if (delay_length > 0 && delay[delay_length-1] == '|') {
+	        char *s = NULL;
+                g_warning ("GdmSlave: %s needs further parsing...", delay);
+                s = gdm_slave_parse_piped_item (slave, delay, display_name);
+		ret = gdm_slave_parse_delay_string (s);
+		g_free (s);
+		return ret;
+        } 
+
+	return gdm_slave_parse_delay_string (delay);
+}
+
 gboolean
 gdm_slave_get_timed_login_details (GdmSlave   *slave,
                                    gboolean   *enabledp,
@@ -921,11 +992,11 @@
         gboolean       res;
         gboolean       enabled;
         char          *username;
-        int            delay;
+        char          *delay;
 
         username = NULL;
         enabled = FALSE;
-        delay = 0;
+        delay = NULL;
 
         g_debug ("GdmSlave: Requesting timed login details");
 
@@ -936,7 +1007,7 @@
                                  G_TYPE_INVALID,
                                  G_TYPE_BOOLEAN, &enabled,
                                  G_TYPE_STRING, &username,
-                                 G_TYPE_INT, &delay,
+                                 G_TYPE_STRING, &delay,
                                  G_TYPE_INVALID);
 
         if (! res) {
@@ -947,11 +1018,18 @@
                         g_warning ("Failed to get timed login details");
                 }
         } else {
-                g_debug ("GdmSlave: Got timed login details: %d %s %d", enabled, username, delay);
+                g_debug ("GdmSlave: Got timed login details: %d %s %s", enabled, username, delay);
+        }
+
+        if (delayp != NULL) {
+                *delayp = gdm_slave_parse_delay (slave,
+                        delay, slave->priv->display_name);
         }
 
+        g_free (delay);
+
         if (usernamep != NULL) {
-                *usernamep = gdm_slave_parse_enriched_login (slave,
+                *usernamep = gdm_slave_parse_login (slave,
                         username, slave->priv->display_name);
         } else {
                 g_free (username);
@@ -959,9 +1037,6 @@
                 if (enabledp != NULL) {
                         *enabledp = enabled;
                 }
-                if (delayp != NULL) {
-                        *delayp = delay;
-                }
                 return TRUE;
         }
         g_free (username);
@@ -980,9 +1055,6 @@
                         if (enabledp != NULL) {
                                 *enabledp = enabled;
                         }
-                        if (delayp != NULL) {
-                                *delayp = delay;
-                        }
                }
         } else {
                 g_debug ("Invalid NULL username for auto/timed login");
diff -ruN gdm-2.29.1.orig/data/gdm.schemas gdm-2.29.1/data/gdm.schemas
--- gdm-2.29.1.orig/data/gdm.schemas	2009-12-12 17:46:09.935313724 -0500
+++ gdm-2.29.1/data/gdm.schemas	2009-12-12 17:46:52.133586563 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>s</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/data/gdm.schemas.in gdm-2.29.1/data/gdm.schemas.in
--- gdm-2.29.1.orig/data/gdm.schemas.in	2009-12-12 17:46:09.935172548 -0500
+++ gdm-2.29.1/data/gdm.schemas.in	2009-12-12 17:46:52.133874810 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>s</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/data/gdm.schemas.in.in gdm-2.29.1/data/gdm.schemas.in.in
--- gdm-2.29.1.orig/data/gdm.schemas.in.in	2009-12-12 17:46:09.934885047 -0500
+++ gdm-2.29.1/data/gdm.schemas.in.in	2009-12-12 17:46:52.134157296 -0500
@@ -33,6 +33,11 @@
       <default></default>
     </schema>
     <schema>
+      <key>daemon/AutomaticLoginShowGUI</key>
+      <signature>s</signature>
+      <default>false</default>
+    </schema>
+    <schema>
       <key>daemon/TimedLoginEnable</key>
       <signature>b</signature>
       <default>false</default>
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.c	2009-12-12 17:46:09.953667369 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.c	2009-12-12 17:46:52.135035535 -0500
@@ -71,6 +71,8 @@
         DEFAULT_SESSION_NAME_CHANGED,
         TIMED_LOGIN_REQUESTED,
         USER_AUTHORIZED,
+        LANGUAGE_POPUP_REQUESTED,
+        LAYOUT_POPUP_REQUESTED,
         LAST_SIGNAL
 };
 
@@ -206,6 +208,24 @@
 }
 
 static void
+on_layout_popup_requested (GdmGreeterClient *client,
+                          DBusMessage      *message)
+{
+        g_signal_emit (client,
+                       gdm_greeter_client_signals[LAYOUT_POPUP_REQUESTED],
+                       0);
+}
+
+static void
+on_language_popup_requested (GdmGreeterClient *client,
+                          DBusMessage      *message)
+{
+        g_signal_emit (client,
+                       gdm_greeter_client_signals[LANGUAGE_POPUP_REQUESTED],
+                       0);
+}
+
+static void
 on_info_query (GdmGreeterClient *client,
                DBusMessage      *message)
 {
@@ -657,6 +677,10 @@
                 on_timed_login_requested (client, message);
         } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "UserAuthorized")) {
                 on_user_authorized (client, message);
+        } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "LayoutPopupRequested")) {
+                on_layout_popup_requested (client, message);
+        } else if (dbus_message_is_signal (message, GREETER_SERVER_DBUS_INTERFACE, "LanguagePopupRequested")) {
+                on_language_popup_requested (client, message);
         } else {
                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
         }
@@ -954,6 +978,26 @@
                               NULL,
                               g_cclosure_marshal_VOID__VOID,
                               G_TYPE_NONE, 0);
+
+        gdm_greeter_client_signals[LANGUAGE_POPUP_REQUESTED] =
+                g_signal_new ("language-popup-requested",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterClientClass, language_popup_requested),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE, 0);
+
+        gdm_greeter_client_signals[LAYOUT_POPUP_REQUESTED] =
+                g_signal_new ("layout-popup-requested",
+                              G_OBJECT_CLASS_TYPE (object_class),
+                              G_SIGNAL_RUN_FIRST,
+                              G_STRUCT_OFFSET (GdmGreeterClientClass, layout_popup_requested),
+                              NULL,
+                              NULL,
+                              g_cclosure_marshal_VOID__VOID,
+                              G_TYPE_NONE, 0);
 }
 
 static void
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.h gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-client.h	2009-12-12 17:46:09.955814575 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-client.h	2009-12-12 17:46:52.135354863 -0500
@@ -70,6 +70,8 @@
                                           const char        *username,
                                           int                delay);
         void (* user_authorized)         (GdmGreeterClient  *client);
+        void (* language_popup_requested)         (GdmGreeterClient  *client);
+        void (* layout_popup_requested)         (GdmGreeterClient  *client);
 } GdmGreeterClientClass;
 
 #define GDM_GREETER_CLIENT_ERROR (gdm_greeter_client_error_quark ())
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-login-window.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-login-window.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-login-window.c	2009-12-12 17:46:09.956577176 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-login-window.c	2009-12-12 17:46:52.136502550 -0500
@@ -298,7 +298,8 @@
 {
         remove_timed_login_timeout (login_window);
 
-        if (login_window->priv->timed_login_enabled) {
+        if (login_window->priv->timed_login_enabled &&
+            login_window->priv->timed_login_delay != UINT_MAX) {
                 g_debug ("GdmGreeterLoginWindow: adding timed login timer");
                 watch_for_user_interaction (login_window);
                 login_window->priv->timed_login_timeout_id = g_timeout_add_seconds (login_window->priv->timed_login_delay,
@@ -704,7 +705,12 @@
                 timed_login_already_enabled = FALSE;
         }
         login_window->priv->timed_login_username = g_strdup (username);
-        login_window->priv->timed_login_delay = delay;
+
+        if (delay == -1) {
+                login_window->priv->timed_login_delay = UINT_MAX;
+        } else {
+                login_window->priv->timed_login_delay = delay;
+        }
 
         if (login_window->priv->dialog_mode != MODE_SELECTION) {
                 reset_dialog (login_window);
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.c	2009-12-12 17:46:09.960985549 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.c	2009-12-12 17:46:52.137294219 -0500
@@ -985,6 +985,18 @@
 }
 
 void
+gdm_greeter_panel_popup_language_dialog (GdmGreeterPanel *panel)
+{
+		gdm_language_option_widget_popup_language_dialog (GDM_LANGUAGE_OPTION_WIDGET(panel->priv->language_option_widget));
+}
+
+void
+gdm_greeter_panel_popup_layout_dialog (GdmGreeterPanel *panel)
+{
+		gdm_layout_option_widget_popup_layout_dialog (GDM_LAYOUT_OPTION_WIDGET(panel->priv->layout_option_widget));
+}
+
+void
 gdm_greeter_panel_show_user_options (GdmGreeterPanel *panel)
 {
         gtk_widget_show (panel->priv->session_option_widget);
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.h gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-panel.h	2009-12-12 17:46:09.954256800 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-panel.h	2009-12-12 17:46:52.137581333 -0500
@@ -71,6 +71,9 @@
                                                                          const char      *layout_name);
 void                   gdm_greeter_panel_set_default_session_name       (GdmGreeterPanel *panel,
                                                                          const char      *session_name);
+void     gdm_greeter_panel_popup_language_dialog                        (GdmGreeterPanel *panel);
+void     gdm_greeter_panel_popup_layout_dialog                          (GdmGreeterPanel *panel);
+
 G_END_DECLS
 
 #endif /* __GDM_GREETER_PANEL_H */
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-session.c gdm-2.29.1/gui/simple-greeter/gdm-greeter-session.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-greeter-session.c	2009-12-12 17:46:09.952894576 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-greeter-session.c	2009-12-12 17:46:52.138146043 -0500
@@ -170,6 +170,23 @@
         gdm_greeter_login_window_user_authorized (GDM_GREETER_LOGIN_WINDOW (session->priv->login_window));
 }
 
+
+static void
+on_language_popup_requested (GdmGreeterClient  *client,
+                    GdmGreeterSession *session)
+{
+        g_debug ("GdmGreeterSession: language dialog requested");
+        gdm_greeter_panel_popup_language_dialog (GDM_GREETER_PANEL (session->priv->panel));
+}
+
+static void
+on_layout_popup_requested (GdmGreeterClient  *client,
+                    GdmGreeterSession *session)
+{
+        g_debug ("GdmGreeterSession: layout dialog requested");
+        gdm_greeter_panel_popup_layout_dialog (GDM_GREETER_PANEL (session->priv->panel));
+}
+
 static void
 on_info_query (GdmGreeterClient  *client,
                const char        *text,
@@ -592,6 +609,14 @@
                           "user-authorized",
                           G_CALLBACK (on_user_authorized),
                           session);
+        g_signal_connect (session->priv->client,
+                          "language-popup-requested",
+                          G_CALLBACK (on_language_popup_requested),
+                          session);
+        g_signal_connect (session->priv->client,
+                          "layout-popup-requested",
+                          G_CALLBACK (on_layout_popup_requested),
+                          session);
 
         /* We want to listen for panel mnemonics even if the
          * login window is focused, so we intercept them here.
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.c gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.c	2009-12-12 17:46:09.956377513 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.c	2009-12-12 17:50:15.985537227 -0500
@@ -42,6 +42,7 @@
 #include "gdm-language-option-widget.h"
 #include "gdm-recent-option-widget.h"
 #include "gdm-language-chooser-dialog.h"
+#include "gdm-settings-client.h"
 
 #define GDM_LANGUAGE_OPTION_WIDGET_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_LANGUAGE_OPTION_WIDGET, GdmLanguageOptionWidgetPrivate))
 
@@ -326,3 +327,16 @@
         gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), normalized_language_name);
         g_free (normalized_language_name);
 }
+
+void
+gdm_language_option_widget_popup_language_dialog (GdmLanguageOptionWidget *widget)
+{
+        char *active_item_id;
+
+        active_item_id = gdm_option_widget_get_default_item (GDM_OPTION_WIDGET (widget));
+        gdm_language_option_widget_set_current_language_name (widget, active_item_id);
+        gdm_language_option_widget_show_dialog (widget, active_item_id);
+        g_signal_emit (G_OBJECT (widget), signals[LANGUAGE_ACTIVATED], 0);
+        g_free (active_item_id);
+        gtk_dialog_run (GTK_DIALOG (widget->priv->dialog));
+}
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.h gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-language-option-widget.h	2009-12-12 17:46:09.952480511 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-language-option-widget.h	2009-12-12 17:46:52.138825768 -0500
@@ -56,6 +56,7 @@
 char *                 gdm_language_option_widget_get_current_language_name      (GdmLanguageOptionWidget *widget);
 void                   gdm_language_option_widget_set_current_language_name      (GdmLanguageOptionWidget *widget,
                                                                                   const char              *lang_name);
+void                  gdm_language_option_widget_popup_language_dialog (GdmLanguageOptionWidget *widget);
 
 
 
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.c gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.c
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.c	2009-12-12 17:46:09.953176432 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.c	2009-12-12 17:50:40.714944400 -0500
@@ -312,3 +312,16 @@
         g_debug ("GdmLayoutOptionWidget: Setting active item: '%s'", id);
         gdm_option_widget_set_active_item (GDM_OPTION_WIDGET (widget), id);
 }
+
+void
+gdm_layout_option_widget_popup_layout_dialog (GdmLayoutOptionWidget *widget)
+{
+        char *active_item_id;
+
+        active_item_id = gdm_option_widget_get_default_item (GDM_OPTION_WIDGET (widget));
+        gdm_layout_option_widget_set_current_layout_name (widget, active_item_id);
+        gdm_layout_option_widget_show_dialog (widget, active_item_id);
+        g_signal_emit (G_OBJECT (widget), signals[LAYOUT_ACTIVATED], 0);
+        g_free (active_item_id);
+        gtk_dialog_run (GTK_DIALOG (widget->priv->dialog));
+}
diff -ruN gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.h gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.h
--- gdm-2.29.1.orig/gui/simple-greeter/gdm-layout-option-widget.h	2009-12-12 17:46:09.956126354 -0500
+++ gdm-2.29.1/gui/simple-greeter/gdm-layout-option-widget.h	2009-12-12 17:46:52.139449052 -0500
@@ -56,6 +56,7 @@
 char *                 gdm_layout_option_widget_get_current_layout_name      (GdmLayoutOptionWidget *widget);
 void                   gdm_layout_option_widget_set_current_layout_name      (GdmLayoutOptionWidget *widget,
                                                                                   const char              *name);
+void 		       gdm_layout_option_widget_popup_layout_dialog (GdmLayoutOptionWidget *widget);
 
 
 
