← Back to team overview

lightdm-gtk-greeter-team team mailing list archive

[Merge] lp:~smd-seandavis/lightdm-gtk-greeter/ui-refresh into lp:lightdm-gtk-greeter

 

Sean Davis has proposed merging lp:~smd-seandavis/lightdm-gtk-greeter/ui-refresh into lp:lightdm-gtk-greeter.

Requested reviews:
  Lionel Le Folgoc (mrpouit)

For more details, see:
https://code.launchpad.net/~smd-seandavis/lightdm-gtk-greeter/ui-refresh/+merge/153647

This branch incorporates the changes in ochosi's branch that include a visual overhaul and better theming capabilities.
-- 
https://code.launchpad.net/~smd-seandavis/lightdm-gtk-greeter/ui-refresh/+merge/153647
Your team LightDM Gtk+ Greeter Development Team is subscribed to branch lp:lightdm-gtk-greeter.
=== removed file 'TODO'
--- TODO	2013-03-13 23:52:10 +0000
+++ TODO	1970-01-01 00:00:00 +0000
@@ -1,5 +0,0 @@
- * merge UI changes from lp:~ochosi/+junk/lightdm-gtk-greeter
- * clean up missing widgets
- * fix session- and language-menu callbacks
- * ensure Gtk2 compatibility (GtkTable)
- * consider symbolic icon for language-menu

=== modified file 'data/lightdm-gtk-greeter.conf'
--- data/lightdm-gtk-greeter.conf	2013-02-10 13:53:17 +0000
+++ data/lightdm-gtk-greeter.conf	2013-03-16 01:44:22 +0000
@@ -9,15 +9,18 @@
 # xft-rgba = Type of subpixel antialiasing (none, rgb, bgr, vrgb or vbgr)
 # show-language-selector (true or false)
 # show-indicators = semi-colon ";" separated list of allowed indicator modules (e.g. indicator-sound.so)
+# show-clock (true or false)
+# clock-format = strftime-format string, e.g. %H:%M
 #
 [greeter]
-#background=
-#theme-name=
-#icon-theme-name=
-#font-name=
-#xft-antialias=
-#xft-dpi=
-#xft-hintstyle=
-#xft-rgba=
-#show-language-selector=
-#show-indicators=
+background=/lib/plymouth/themes/xubuntu-logo/xubuntu-greybird.png
+theme-name=Greybird
+icon-theme-name=elementary-xfce-dark
+font-name=Droid Sans 10
+xft-antialias=true
+xft-dpi=96
+xft-hintstyle=slight
+xft-rgba=rgb
+show-language-selector=true
+show-clock=true
+clock-format=%a, %I:%M %p

=== modified file 'src/Makefile.am'
--- src/Makefile.am	2013-01-29 10:39:16 +0000
+++ src/Makefile.am	2013-03-16 01:44:22 +0000
@@ -20,6 +20,7 @@
 lightdm_gtk_greeter_CFLAGS = \
 	$(GTK_CFLAGS) \
 	$(GMODULE_CFLAGS) \
+	$(GTHREAD_CFLAGS) \
 	$(LIGHTDMGOBJECT_CFLAGS) \
 	$(LIBX11_CFLAGS) \
 	$(LIBINDICATOR_CFLAGS)
@@ -27,6 +28,7 @@
 lightdm_gtk_greeter_LDADD = \
 	$(GTK_LIBS) \
 	$(GMODULE_LIBS) \
+	$(GTHREAD_LIBS) \
 	$(LIGHTDMGOBJECT_LIBS) \
 	$(LIBX11_LIBS) \
 	$(LIBINDICATOR_LIBS)

=== modified file 'src/lightdm-gtk-greeter.c'
--- src/lightdm-gtk-greeter.c	2013-03-01 15:48:26 +0000
+++ src/lightdm-gtk-greeter.c	2013-03-16 01:44:22 +0000
@@ -37,14 +37,14 @@
 static gchar *state_filename;
 static GtkWindow *login_window, *panel_window;
 static GtkButton *login_button, *cancel_button;
-static GtkLabel *message_label, *prompt_label;
-static GtkWidget *login_box, *prompt_box;
-static GtkImage *user_avatar;
-static GtkEntry *prompt_entry;
+static GtkLabel *message_label;
+static GtkImage *logo;
+static GtkEntry *prompt_entry, *username_entry;
 static GtkComboBox *user_combo;
-static GtkComboBox *session_combo;
-static GtkComboBox *language_combo;
+static GtkMenu *session_menu, *language_menu;
 static gchar *default_font_name, *default_theme_name, *default_icon_theme_name;
+static GtkWidget *clock_label;
+static gchar *clock_format;
 static GdkPixbuf *default_background_pixbuf = NULL;
 #if GTK_CHECK_VERSION (3, 0, 0)
 static GdkRGBA *default_background_color = NULL;
@@ -52,7 +52,11 @@
 static GdkColor *default_background_color = NULL;
 #endif
 static gboolean cancelling = FALSE, prompted = FALSE;
+#if GTK_CHECK_VERSION (3, 0, 0)
 static cairo_region_t *window_region = NULL;
+#else
+static GdkRegion *window_region = NULL;
+#endif
 
 
 #ifdef HAVE_LIBINDICATOR
@@ -244,42 +248,47 @@
 static gchar *
 get_session ()
 {
-    GtkTreeIter iter;
-    gchar *session;
-
-    if (!gtk_combo_box_get_active_iter (session_combo, &iter))
-        return g_strdup (lightdm_greeter_get_default_session_hint (greeter));
-
-    gtk_tree_model_get (gtk_combo_box_get_model (session_combo), &iter, 1, &session, -1);
-
-    return session;
+    GList *menu_items, *menu_iter;
+    
+    menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
+    
+    for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
+	{
+		if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_iter->data)))
+        {
+            return g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
+        }
+	}
+
+    return g_strdup (lightdm_greeter_get_default_session_hint (greeter));
 }
 
 static void
 set_session (const gchar *session)
 {
-    GtkTreeModel *model = gtk_combo_box_get_model (session_combo);
-    GtkTreeIter iter;
     const gchar *default_session;
     gchar *last_session;
-
-    if (session && gtk_tree_model_get_iter_first (model, &iter))
+    GList *menu_items, *menu_iter;
+    
+    menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
+    
+    if (session)
     {
-        do
-        {
-            gchar *s;
+        for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
+	    {
+		    gchar *s;
             gboolean matched;
-            gtk_tree_model_get (model, &iter, 1, &s, -1);
+            s = g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
             matched = strcmp (s, session) == 0;
             g_free (s);
             if (matched)
             {
-                gtk_combo_box_set_active_iter (session_combo, &iter);
+                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
                 return;
             }
-        } while (gtk_tree_model_iter_next (model, &iter));
+	    }
     }
-
+    
     /* If failed to find this session, then try the previous, then the default */
     last_session = g_key_file_get_value (state, "greeter", "last-session", NULL);
     if (last_session && g_strcmp0 (session, last_session) != 0)
@@ -289,53 +298,59 @@
         return;
     }
     g_free (last_session);
+    
     default_session = lightdm_greeter_get_default_session_hint (greeter);
     if (default_session && g_strcmp0 (session, default_session) != 0)
     {
         set_session (lightdm_greeter_get_default_session_hint (greeter));
         return;
     }
-
     /* Otherwise just pick the first session */
-    gtk_combo_box_set_active (session_combo, 0);
+    menu_iter = g_list_first(menu_items);
+    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
+    return;
 }
 
 static gchar *
 get_language ()
 {
-    GtkTreeIter iter;
-    gchar *language;
-
-    if (!gtk_combo_box_get_active_iter (language_combo, &iter))
-        return NULL;
-
-    gtk_tree_model_get (gtk_combo_box_get_model (language_combo), &iter, 1, &language, -1);
-
-    return language;
+    GList *menu_items, *menu_iter;
+    
+    menu_items = gtk_container_get_children(GTK_CONTAINER(language_menu));    
+    for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
+	{
+		if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_iter->data)))
+        {
+            return g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "language-code"));
+        }
+	}
+
+    return NULL;
 }
 
 static void
 set_language (const gchar *language)
 {
-    GtkTreeModel *model = gtk_combo_box_get_model (language_combo);
-    GtkTreeIter iter;
-    const gchar *default_language = NULL;
+    const gchar *default_language = NULL;    
+    GList *menu_items, *menu_iter;
 
-    if (language && gtk_tree_model_get_iter_first (model, &iter))
+    menu_items = gtk_container_get_children(GTK_CONTAINER(language_menu));
+    
+    if (language)
     {
-        do
-        {
-            gchar *s;
+        for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
+	    {
+		    gchar *s;
             gboolean matched;
-            gtk_tree_model_get (model, &iter, 1, &s, -1);
+            s = g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "language-code"));
             matched = strcmp (s, language) == 0;
             g_free (s);
             if (matched)
             {
-                gtk_combo_box_set_active_iter (language_combo, &iter);
+                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
                 return;
             }
-        } while (gtk_tree_model_iter_next (model, &iter));
+	    }
     }
 
     /* If failed to find this language, then try the default */
@@ -366,8 +381,8 @@
         else
             gtk_button_set_label (login_button, _("Log In"));
         /* and disable the session and language comboboxes */
-        gtk_widget_set_sensitive (GTK_WIDGET (session_combo), !logged_in);
-        gtk_widget_set_sensitive (GTK_WIDGET (language_combo), !logged_in);
+        gtk_widget_set_sensitive (GTK_WIDGET (session_menu), !logged_in);
+        gtk_widget_set_sensitive (GTK_WIDGET (language_menu), !logged_in);
 }
 
 static void set_background (GdkPixbuf *new_bg);
@@ -414,39 +429,55 @@
         path = lightdm_user_get_image (user);
         if (path)
         {
-            image = gdk_pixbuf_new_from_file_at_scale (path, 64, 64, FALSE, &error);
+            image = gdk_pixbuf_new_from_file_at_scale (path, 80, 80, FALSE, &error);
             if (image)
             {
-                gtk_image_set_from_pixbuf (GTK_IMAGE (user_avatar), image);
+                gtk_image_set_from_pixbuf (GTK_IMAGE (logo), image);
                 g_object_unref (image);
                 return;
             }
             else
             {
-                g_warning ("Failed to load user image: %s", error->message);
+	            g_warning ("Failed to load user image: %s", error->message);
                 g_clear_error (&error);
-            }
+	        }
         }
     }
-    /* otherwise, show the default avatar instead */
-    gtk_image_set_from_icon_name (GTK_IMAGE (user_avatar), "avatar-default", GTK_ICON_SIZE_DIALOG);
+
+    gtk_image_set_from_icon_name (GTK_IMAGE (logo), "avatar-default", GTK_ICON_SIZE_DIALOG);
 }
 
-static cairo_region_t * xfce_region_from_rectangle (gint width, gint height, gint radius)
+#if GTK_CHECK_VERSION (3, 0, 0)
+static cairo_region_t * 
+#else
+static GdkRegion *
+#endif
+xfce_region_from_rectangle (gint width, gint height, gint radius)
 {
+#if GTK_CHECK_VERSION (3, 0, 0)
   cairo_region_t *region;
+#else
+  GdkRegion *region;
+#endif
   gint x = radius, y = 0;
   gint xChange = 1 - (radius << 1);
   gint yChange = 0;
   gint radiusError = 0;
+#if GTK_CHECK_VERSION (3, 0, 0)
   cairo_rectangle_int_t rect;
+#else
+  GdkRectangle rect;
+#endif
   rect.x = radius;
   rect.y = radius;
   rect.width = width - radius * 2;
   rect.height = height - radius * 2;
 
+#if GTK_CHECK_VERSION (3, 0, 0)
   region = cairo_region_create_rectangle (&rect);
-   
+#else
+  region = gdk_region_rectangle (&rect);
+#endif   
 
   while(x >= y)
   {
@@ -456,14 +487,22 @@
     rect.width = x - radius + width - rect.x;
     rect.height =  y - radius + height - rect.y;
 
+#if GTK_CHECK_VERSION (3, 0, 0)
     cairo_region_union_rectangle (region, &rect);
+#else
+    gdk_region_union_with_rect(region, &rect);
+#endif
 
     rect.x = -y + radius;
     rect.y = -x + radius;
     rect.width = y - radius + width - rect.x;
     rect.height =  x - radius + height - rect.y;
 
+#if GTK_CHECK_VERSION (3, 0, 0)
     cairo_region_union_rectangle (region, &rect);
+#else
+    gdk_region_union_with_rect(region, &rect);
+#endif
 
     y++;
     radiusError += yChange;
@@ -486,7 +525,12 @@
 
     GdkWindow *window = gtk_widget_get_window (widget);
 
+#if GTK_CHECK_VERSION (3, 0, 0)
     cairo_region_destroy(window_region);
+#else
+    if (window_region)
+        gdk_region_destroy(window_region);
+#endif
     window_region = xfce_region_from_rectangle (allocation->width, allocation->height, radius);
     if (window) {
         gdk_window_shape_combine_region(window, window_region, 0, 0);
@@ -522,6 +566,7 @@
 
     if (strcmp (username, "*other") == 0)
     {
+        gtk_widget_show (GTK_WIDGET (username_entry));
         gtk_widget_show (GTK_WIDGET (cancel_button));
         lightdm_greeter_authenticate (greeter, NULL);
     }
@@ -624,6 +669,17 @@
     g_free (session);
 }
 
+gboolean
+username_focus_out_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data);
+G_MODULE_EXPORT
+gboolean
+username_focus_out_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
+{
+    if (!g_strcmp0(gtk_entry_get_text(username_entry), "") == 0)
+        start_authentication(gtk_entry_get_text(username_entry));
+    return FALSE;
+}
+
 void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter);
 G_MODULE_EXPORT
 void
@@ -641,9 +697,15 @@
         gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1);
 
         if (strcmp (user, "*other") == 0)
+        {
+            gtk_widget_show (GTK_WIDGET (username_entry));
             gtk_widget_show (GTK_WIDGET (cancel_button));
+        }
         else
+        {
+            gtk_widget_hide (GTK_WIDGET (username_entry));
             gtk_widget_hide (GTK_WIDGET (cancel_button));
+        }
 
         set_login_button_label (user);
         set_user_background (user);
@@ -658,6 +720,7 @@
 void
 login_cb (GtkWidget *widget)
 {
+    gtk_widget_set_sensitive (GTK_WIDGET (username_entry), FALSE);
     gtk_widget_set_sensitive (GTK_WIDGET (prompt_entry), FALSE);
     set_message_label ("");
 
@@ -682,13 +745,21 @@
 {
     prompted = TRUE;
 
-    gtk_widget_show (GTK_WIDGET (login_box));
-    gtk_label_set_text (prompt_label, dgettext ("Linux-PAM", text));
+    gtk_widget_set_sensitive (GTK_WIDGET (username_entry), TRUE);
     gtk_widget_set_sensitive (GTK_WIDGET (prompt_entry), TRUE);
     gtk_entry_set_text (prompt_entry, "");
-    gtk_entry_set_visibility (prompt_entry, type != LIGHTDM_PROMPT_TYPE_SECRET);
-    gtk_widget_show (GTK_WIDGET (prompt_box));
-    gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
+    gtk_entry_set_visibility (prompt_entry, FALSE);
+    if (type == LIGHTDM_PROMPT_TYPE_SECRET) // Password
+    {
+        gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
+    }
+    else
+    {
+        if (gtk_widget_get_visible ((GTK_WIDGET (username_entry))))
+            gtk_widget_grab_focus (GTK_WIDGET (username_entry));
+        else
+            gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
+    }
 }
 
 static void
@@ -708,9 +779,6 @@
         return;
     }
 
-    gtk_widget_hide (prompt_box);
-    gtk_widget_show (login_box);
-
     if (lightdm_greeter_get_is_authenticated (greeter))
     {
         if (prompted)
@@ -989,25 +1057,41 @@
     else
         selected_user = NULL;
 
-    if (selected_user && gtk_tree_model_get_iter_first (model, &iter))
+    if (gtk_tree_model_get_iter_first (model, &iter))
     {
-        do
-        {
-            gchar *name;
-            gboolean matched;
+        gchar *name;
+        gboolean matched = FALSE;
+        
+        if (selected_user)
+        {
+            do
+            {
+                gtk_tree_model_get (model, &iter, 0, &name, -1);
+                matched = strcmp (name, selected_user) == 0;
+                g_free (name);
+                if (matched)
+                {
+                    gtk_combo_box_set_active_iter (user_combo, &iter);
+                    set_login_button_label (selected_user);
+                    set_user_background (selected_user);
+                    set_user_image (selected_user);
+                    start_authentication (selected_user);
+                    break;
+                }
+            } while (gtk_tree_model_iter_next (model, &iter));
+        }
+        if (!matched)
+        {
+            gtk_tree_model_get_iter_first (model, &iter);
             gtk_tree_model_get (model, &iter, 0, &name, -1);
-            matched = strcmp (name, selected_user) == 0;
-            g_free (name);
-            if (matched)
-            {
-                gtk_combo_box_set_active_iter (user_combo, &iter);
-                set_login_button_label (selected_user);
-                set_user_background (selected_user);
-                set_user_image (selected_user);
-                start_authentication (selected_user);
-                break;
-            }
-        } while (gtk_tree_model_iter_next (model, &iter));
+            gtk_combo_box_set_active_iter (user_combo, &iter);
+            set_login_button_label (name);
+            set_user_background (name);
+            set_user_image (name);
+            start_authentication (name);
+            g_free(name);
+        }
+        
     }
 
     g_free (last_user);
@@ -1084,8 +1168,8 @@
             {
                 GdkPixbuf *p = gdk_pixbuf_scale_simple (bg, monitor_geometry.width,
                                                         monitor_geometry.height, GDK_INTERP_BILINEAR);
-                if (!gdk_pixbuf_get_has_alpha (p))
-                    p = gdk_pixbuf_add_alpha (p, FALSE, 255, 255, 255);
+		if (!gdk_pixbuf_get_has_alpha (p))
+			p = gdk_pixbuf_add_alpha (p, FALSE, 255, 255, 255);
                 gdk_cairo_set_source_pixbuf (c, p, monitor_geometry.x, monitor_geometry.y);
                 g_object_unref (p);
             }
@@ -1106,17 +1190,31 @@
     }
 }
 
+static gboolean
+clock_timeout_thread ()
+{
+    time_t rawtime;
+    struct tm * timeinfo;
+    gchar time_str[25];
+    
+    time ( &rawtime );
+    timeinfo = localtime ( &rawtime );
+    
+    strftime(time_str, 25, clock_format, timeinfo);
+    gtk_label_set_markup( GTK_LABEL(clock_label), g_strdup_printf("<b>%s</b>", time_str) );
+    
+    return TRUE;
+}
+
 int
 main (int argc, char **argv)
 {
     GKeyFile *config;
     GdkRectangle monitor_geometry;
     GtkBuilder *builder;
-    GtkTreeModel *model;
     const GList *items, *item;
-    GtkTreeIter iter;
     GtkCellRenderer *renderer;
-    GtkWidget *menuitem, *hbox, *image;
+    GtkWidget *menuitem, *image;
     gchar *value, *state_dir;
 #if GTK_CHECK_VERSION (3, 0, 0)
     GdkRGBA background_color;
@@ -1142,6 +1240,13 @@
 
     signal (SIGTERM, sigterm_cb);
 
+#if GTK_CHECK_VERSION (3, 0, 0)
+#else
+    /* init threads */
+    gdk_threads_init();
+#endif
+
+    /* init gtk */
     gtk_init (&argc, &argv);
 
     config = g_key_file_new ();
@@ -1193,7 +1298,7 @@
         g_debug ("Loading background %s", path);
         default_background_pixbuf = gdk_pixbuf_new_from_file (path, &error);
         if (!default_background_pixbuf)
-           g_warning ("Failed to load background: %s", error->message);
+            g_warning ("Failed to load background: %s", error->message);
         g_clear_error (&error);
         g_free (path);
     }
@@ -1263,23 +1368,37 @@
         return EXIT_FAILURE;
     }
     g_clear_error (&error);
+    
+    /* Panel */
+    panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
+    gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
+    session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu"));
+    language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu"));
+    clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label"));
 
+    /* Login window */
     login_window = GTK_WINDOW (gtk_builder_get_object (builder, "login_window"));
-    g_signal_connect (G_OBJECT (login_window), "size-allocate", G_CALLBACK (login_window_size_allocate), NULL);
-    login_box = GTK_WIDGET (gtk_builder_get_object (builder, "login_box"));
-    login_button = GTK_BUTTON (gtk_builder_get_object (builder, "login_button"));
-    cancel_button = GTK_BUTTON (gtk_builder_get_object (builder, "cancel_button"));
-    prompt_box = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_box"));
-    prompt_label = GTK_LABEL (gtk_builder_get_object (builder, "prompt_label"));
+    logo = GTK_IMAGE (gtk_builder_get_object (builder, "logo"));
+    user_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "user_combobox"));
+    username_entry = GTK_ENTRY (gtk_builder_get_object (builder, "username_entry"));
     prompt_entry = GTK_ENTRY (gtk_builder_get_object (builder, "prompt_entry"));
     message_label = GTK_LABEL (gtk_builder_get_object (builder, "message_label"));
-    user_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "user_combobox"));
-    session_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "session_combobox"));
-    language_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "language_combobox"));  
-    panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
-    user_avatar = GTK_IMAGE (gtk_builder_get_object (builder, "user_avatar"));
+    cancel_button = GTK_BUTTON (gtk_builder_get_object (builder, "cancel_button"));
+    login_button = GTK_BUTTON (gtk_builder_get_object (builder, "login_button"));
 
-    gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
+    g_signal_connect (G_OBJECT (login_window), "size-allocate", G_CALLBACK (login_window_size_allocate), NULL);
+    
+    /* To maintain compatability with GTK+2, set special properties here */
+#if GTK_CHECK_VERSION (3, 0, 0)
+    gtk_widget_set_margin_top(GTK_WIDGET(user_combo), 12);
+    gtk_widget_set_margin_bottom(GTK_WIDGET(prompt_entry), 12);
+    gtk_entry_set_placeholder_text(prompt_entry, _("Enter your password"));
+    gtk_entry_set_placeholder_text(username_entry, _("Enter your username"));
+    
+#else
+    gtk_widget_set_tooltip_text(GTK_WIDGET(prompt_entry), _("Enter your password"));
+    gtk_widget_set_tooltip_text(GTK_WIDGET(username_entry), _("Enter your username"));
+#endif
 
     /* Glade can't handle custom menuitems, so set them up manually */
 #ifdef HAVE_LIBINDICATOR
@@ -1322,77 +1441,58 @@
     }
 #endif
 
-    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
-#if GTK_CHECK_VERSION (3, 0, 0)
-    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-#else
-    hbox = gtk_hbox_new (FALSE, 0);
-#endif
-    gtk_widget_show (hbox);
-    gtk_container_add (GTK_CONTAINER (menuitem), hbox);
-    image = gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_MENU);
-    gtk_widget_show (image);
-    gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
-
-    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
-#if GTK_CHECK_VERSION (3, 0, 0)
-    hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
-#else
-    hbox = gtk_hbox_new (FALSE, 0);
-#endif
-    gtk_widget_show (hbox);
-    gtk_container_add (GTK_CONTAINER (menuitem), hbox);
-    image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility", GTK_ICON_SIZE_MENU);
-    gtk_widget_show (image);
-    gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
-
-    if (!lightdm_get_can_suspend ())
-        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
-    if (!lightdm_get_can_hibernate ())
-        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem")));
-    if (!lightdm_get_can_restart ())
-        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem")));
-    if (!lightdm_get_can_shutdown ())
-        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem")));
-
-    renderer = gtk_cell_renderer_text_new();
-    gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
-    gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (session_combo), renderer, "text", 0);
-    model = gtk_combo_box_get_model (session_combo);
+    /* Clock */
+    gtk_widget_set_visible(GTK_WIDGET(clock_label),
+                           g_key_file_get_boolean (config, "greeter", "show-clock", NULL));
+    clock_format = g_key_file_get_value (config, "greeter", "clock-format", NULL);
+    if (!clock_format)
+        clock_format = "%a, %H:%M";
+
+    /* Session menu */
+    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "session_menuitem"));
+    image = gtk_image_new_from_icon_name ("document-properties-symbolic", GTK_ICON_SIZE_MENU);
+    gtk_widget_show (image);
+    gtk_container_add (GTK_CONTAINER (menuitem), image);
+    gtk_widget_show (GTK_WIDGET (menuitem));
+    
     items = lightdm_get_sessions ();
+    GSList *sessions = NULL;
     for (item = items; item; item = item->next)
     {
         LightDMSession *session = item->data;
-
-        gtk_widget_show (GTK_WIDGET (session_combo));
-        gtk_list_store_append (GTK_LIST_STORE (model), &iter);
-        gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-                            0, lightdm_session_get_name (session),
-                            1, lightdm_session_get_key (session),
-                            -1);
+        GtkWidget *radiomenuitem;
+        
+        radiomenuitem = gtk_radio_menu_item_new_with_label (sessions, lightdm_session_get_name (session));
+        g_object_set_data (G_OBJECT (radiomenuitem), "session-key", (gpointer) lightdm_session_get_key (session));
+        sessions = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radiomenuitem));
+        gtk_menu_shell_append (GTK_MENU_SHELL(session_menu), radiomenuitem);
+        gtk_widget_show (GTK_WIDGET (radiomenuitem));
     }
     set_session (NULL);
 
+    /* Language menu */
     if (g_key_file_get_boolean (config, "greeter", "show-language-selector", NULL))
     {
-        gtk_widget_show (GTK_WIDGET (language_combo));
-
-        renderer = gtk_cell_renderer_text_new();
-        gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (language_combo), renderer, TRUE);
-        gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (language_combo), renderer, "text", 0);
-        model = gtk_combo_box_get_model (language_combo);
+	    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem"));
+	    image = gtk_image_new_from_icon_name ("preferences-desktop-locale", GTK_ICON_SIZE_MENU);
+	    gtk_widget_show (image);
+	    gtk_container_add (GTK_CONTAINER (menuitem), image);
+	    
         items = lightdm_get_languages ();
+        GSList *languages = NULL;
         for (item = items; item; item = item->next)
         {
             LightDMLanguage *language = item->data;
             const gchar *country, *code;
             gchar *label;
+            GtkWidget *radiomenuitem;
 
             country = lightdm_language_get_territory (language);
             if (country)
                 label = g_strdup_printf ("%s - %s", lightdm_language_get_name (language), country);
             else
                 label = g_strdup (lightdm_language_get_name (language));
+                
             code = lightdm_language_get_code (language);
             gchar *modifier = strchr (code, '@');
             if (modifier != NULL)
@@ -1402,17 +1502,38 @@
                 label = label_new;
             }
 
-            gtk_widget_show (GTK_WIDGET (language_combo));
-            gtk_list_store_append (GTK_LIST_STORE (model), &iter);
-            gtk_list_store_set (GTK_LIST_STORE (model), &iter,
-                                0, label,
-                                1, code,
-                                -1);
-            g_free (label);
+            gtk_widget_show (GTK_WIDGET (menuitem));
+            radiomenuitem = gtk_radio_menu_item_new_with_label (languages, label);
+            g_object_set_data (G_OBJECT (radiomenuitem), "language-code", (gpointer) code);
+            languages = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radiomenuitem));
+            gtk_menu_shell_append (GTK_MENU_SHELL(language_menu), radiomenuitem);
+            gtk_widget_show (GTK_WIDGET (radiomenuitem));
         }
         set_language (NULL);
     }
+    
+    /* a11y menu */
+    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
+    image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility-panel", GTK_ICON_SIZE_MENU);
+    gtk_widget_show (image);
+    gtk_container_add (GTK_CONTAINER (menuitem), image);
+    
+    /* Power menu */
+    menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
+    image = gtk_image_new_from_icon_name ("system-shutdown-panel", GTK_ICON_SIZE_MENU);
+    gtk_widget_show (image);
+    gtk_container_add (GTK_CONTAINER (menuitem), image);
+    
+    if (!lightdm_get_can_suspend ())
+        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
+    if (!lightdm_get_can_hibernate ())
+        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem")));
+    if (!lightdm_get_can_restart ())
+        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem")));
+    if (!lightdm_get_can_shutdown ())
+        gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem")));
 
+    /* Users combobox */
     renderer = gtk_cell_renderer_text_new();
     gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (user_combo), renderer, TRUE);
     gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (user_combo), renderer, "text", 1);
@@ -1442,8 +1563,18 @@
 
     gtk_widget_show (GTK_WIDGET (login_window));
     gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (login_window)), GDK_CURRENT_TIME);
+    
+    gdk_threads_add_timeout( 100, clock_timeout_thread, NULL );
 
+#if GTK_CHECK_VERSION (3, 0, 0)
+#else
+    gdk_threads_enter();
+#endif
     gtk_main ();
+#if GTK_CHECK_VERSION (3, 0, 0)
+#else
+    gdk_threads_leave();
+#endif
 
     if (default_background_pixbuf)
         g_object_unref (default_background_pixbuf);

=== modified file 'src/lightdm-gtk-greeter.glade'
--- src/lightdm-gtk-greeter.glade	2013-02-10 13:53:17 +0000
+++ src/lightdm-gtk-greeter.glade	2013-03-16 01:44:22 +0000
@@ -1,214 +1,141 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <object class="GtkListStore" id="language_liststore">
-    <columns>
-      <!-- column-name label -->
-      <column type="gchararray"/>
-      <!-- column-name key -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
+  <!-- interface-requires gtk+ 3.0 -->
   <object class="GtkWindow" id="login_window">
     <property name="name">login_window</property>
     <property name="can_focus">False</property>
     <property name="resizable">False</property>
     <property name="decorated">False</property>
-    <property name="has_resize_grip">False</property>
     <child>
-      <object class="GtkNotebook" id="login_notebook">
-        <property name="name">login_notebook</property>
-        <property name="width_request">400</property>
+      <object class="GtkTable" id="table1">
         <property name="visible">True</property>
-        <property name="can_focus">True</property>
-        <property name="show_tabs">False</property>
-        <child>
-          <object class="GtkVBox" id="vbox2">
-            <property name="name">vbox2</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="border_width">12</property>
-            <property name="spacing">6</property>
+        <property name="can_focus">False</property>
+        <property name="border_width">26</property>
+        <property name="n_rows">5</property>
+        <property name="n_columns">2</property>
+        <property name="column_spacing">18</property>
+        <property name="row_spacing">6</property>
+        <child>
+          <object class="GtkComboBox" id="user_combobox">
+            <property name="name">user_combobox</property>
+            <property name="width_request">200</property>
+            <property name="can_focus">True</property>
+            <property name="model">user_liststore</property>
+            <signal name="changed" handler="user_combobox_active_changed_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="y_options"/>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkEntry" id="prompt_entry">
+            <property name="name">prompt_entry</property>
+            <property name="width_request">200</property>
+            <property name="visible">True</property>
+            <property name="can_focus">True</property>
+            <property name="invisible_char">•</property>
+            <property name="invisible_char_set">True</property>
+            <property name="primary_icon_activatable">False</property>
+            <property name="secondary_icon_activatable">False</property>
+            <signal name="activate" handler="login_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">2</property>
+            <property name="bottom_attach">3</property>
+            <property name="y_options"/>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkImage" id="logo">
+            <property name="name">logo</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="pixel_size">80</property>
+            <property name="icon_name">avatar-default</property>
+          </object>
+          <packing>
+            <property name="bottom_attach">3</property>
+            <property name="x_options"/>
+            <property name="y_options"/>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="message_label">
+            <property name="name">message_label</property>
+            <property name="can_focus">False</property>
+            <property name="label" comments="This is a placeholder string and will be replaced with a message from PAM">[message]</property>
+          </object>
+          <packing>
+            <property name="right_attach">2</property>
+            <property name="top_attach">3</property>
+            <property name="bottom_attach">4</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkHBox" id="hbox2">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
-              <object class="GtkImage" id="user_avatar">
-                <property name="name">user_avatar</property>
+              <object class="GtkButton" id="login_button">
+                <property name="name">login_button</property>
+                <property name="label" translatable="yes">Log In</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="pixel_size">64</property>
-                <property name="icon_name">avatar-default</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="login_cb" swapped="no"/>
               </object>
               <packing>
                 <property name="expand">False</property>
                 <property name="fill">True</property>
+                <property name="pack_type">end</property>
                 <property name="position">0</property>
               </packing>
             </child>
             <child>
-              <object class="GtkLabel" id="hostname_label">
-                <property name="name">hostname_label</property>
+              <object class="GtkButton" id="cancel_button">
+                <property name="name">cancel_button</property>
+                <property name="label" translatable="yes">Cancel</property>
                 <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <property name="label" comments="This is a placeholder string and will be replaced with the hostname of the system">[hostname]</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+                <signal name="clicked" handler="cancel_cb" swapped="no"/>
               </object>
               <packing>
-                <property name="expand">True</property>
+                <property name="expand">False</property>
                 <property name="fill">True</property>
                 <property name="position">1</property>
               </packing>
             </child>
-            <child>
-              <object class="GtkComboBox" id="user_combobox">
-                <property name="name">user_combobox</property>
-                <property name="can_focus">True</property>
-                <property name="model">user_liststore</property>
-                <signal name="changed" handler="user_combobox_active_changed_cb" swapped="no"/>
-              </object>
-              <packing>
-                <property name="expand">True</property>
-                <property name="fill">True</property>
-                <property name="position">2</property>
-              </packing>
-            </child>
-            <child>
-              <object class="GtkVBox" id="login_box">
-                <property name="name">login_box</property>
-                <property name="can_focus">False</property>
-                <property name="spacing">6</property>
-                <child>
-                  <object class="GtkHBox" id="prompt_box">
-                    <property name="name">prompt_box</property>
-                    <property name="can_focus">False</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <object class="GtkLabel" id="prompt_label">
-                        <property name="name">prompt_label</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">False</property>
-                        <property name="label" comments="This is a placeholder string and will be replaced by the greeter with a prompt string from PAM.">[prompt]</property>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkEntry" id="prompt_entry">
-                        <property name="name">prompt_entry</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="invisible_char">•</property>
-                        <property name="primary_icon_activatable">False</property>
-                        <property name="secondary_icon_activatable">False</property>
-                        <signal name="activate" handler="login_cb" swapped="no"/>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">0</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkLabel" id="message_label">
-                    <property name="name">message_label</property>
-                    <property name="can_focus">False</property>
-                    <property name="label" comments="This is a placeholder string and will be replaced with a message from PAM">[message]</property>
-                  </object>
-                  <packing>
-                    <property name="expand">False</property>
-                    <property name="fill">True</property>
-                    <property name="position">1</property>
-                  </packing>
-                </child>
-                <child>
-                  <object class="GtkHBox" id="hbox2">
-                    <property name="name">hbox2</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="spacing">6</property>
-                    <child>
-                      <object class="GtkComboBox" id="session_combobox">
-                        <property name="name">session_combobox</property>
-                        <property name="can_focus">False</property>
-                        <property name="model">session_liststore</property>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">0</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkComboBox" id="language_combobox">
-                        <property name="name">language_combobox</property>
-                        <property name="can_focus">False</property>
-                        <property name="model">language_liststore</property>
-                      </object>
-                      <packing>
-                        <property name="expand">True</property>
-                        <property name="fill">True</property>
-                        <property name="position">1</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="login_button">
-                        <property name="name">login_button</property>
-                        <property name="label" translatable="yes">Log In</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_action_appearance">False</property>
-                        <signal name="clicked" handler="login_cb" swapped="no"/>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="pack_type">end</property>
-                        <property name="position">2</property>
-                      </packing>
-                    </child>
-                    <child>
-                      <object class="GtkButton" id="cancel_button">
-                        <property name="name">cancel_button</property>
-                        <property name="label" translatable="yes">Cancel</property>
-                        <property name="visible">True</property>
-                        <property name="can_focus">True</property>
-                        <property name="receives_default">True</property>
-                        <property name="use_action_appearance">False</property>
-                        <signal name="clicked" handler="cancel_cb" swapped="no"/>
-                      </object>
-                      <packing>
-                        <property name="expand">False</property>
-                        <property name="fill">True</property>
-                        <property name="pack_type">end</property>
-                        <property name="position">3</property>
-                      </packing>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="expand">True</property>
-                    <property name="fill">True</property>
-                    <property name="position">2</property>
-                  </packing>
-                </child>
-              </object>
-              <packing>
-                <property name="expand">False</property>
-                <property name="fill">True</property>
-                <property name="position">3</property>
-              </packing>
-            </child>
           </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">4</property>
+            <property name="bottom_attach">5</property>
+          </packing>
         </child>
-        <child type="tab">
+        <child>
           <placeholder/>
         </child>
+        <child>
+          <object class="GtkEntry" id="username_entry">
+            <property name="name">prompt_entry</property>
+            <property name="can_focus">True</property>
+            <property name="no_show_all">True</property>
+            <property name="invisible_char">•</property>
+            <signal name="focus-out-event" handler="username_focus_out_cb" swapped="no"/>
+          </object>
+          <packing>
+            <property name="left_attach">1</property>
+            <property name="right_attach">2</property>
+            <property name="top_attach">1</property>
+            <property name="bottom_attach">2</property>
+          </packing>
+        </child>
       </object>
     </child>
   </object>
@@ -216,114 +143,150 @@
     <property name="name">panel_window</property>
     <property name="can_focus">False</property>
     <property name="decorated">False</property>
-    <property name="has_resize_grip">False</property>
     <child>
-      <object class="GtkMenuBar" id="menubar">
-        <property name="name">menubar</property>
+      <object class="GtkHButtonBox" id="buttonbox1">
         <property name="visible">True</property>
         <property name="can_focus">False</property>
-        <property name="pack_direction">rtl</property>
-        <child>
-          <object class="GtkMenuItem" id="power_menuitem">
-            <property name="name">power_menuitem</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="use_action_appearance">False</property>
-            <child type="submenu">
-              <object class="GtkMenu" id="power_menu">
-                <property name="name">power_menu</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkMenuItem" id="suspend_menuitem">
-                    <property name="name">suspend_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">Suspend</property>
-                    <signal name="activate" handler="suspend_cb" swapped="no"/>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkMenuItem" id="hibernate_menuitem">
-                    <property name="name">hibernate_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">Hibernate</property>
-                    <signal name="activate" handler="hibernate_cb" swapped="no"/>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkMenuItem" id="restart_menuitem">
-                    <property name="name">restart_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">Restart...</property>
-                    <signal name="activate" handler="restart_cb" swapped="no"/>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkMenuItem" id="shutdown_menuitem">
-                    <property name="name">shutdown_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">Shutdown...</property>
-                    <signal name="activate" handler="shutdown_cb" swapped="no"/>
-                  </object>
-                </child>
-              </object>
-            </child>
-          </object>
-        </child>
-        <child>
-          <object class="GtkMenuItem" id="a11y_menuitem">
-            <property name="name">a11y_menuitem</property>
-            <property name="visible">True</property>
-            <property name="can_focus">False</property>
-            <property name="use_action_appearance">False</property>
-            <child type="submenu">
-              <object class="GtkMenu" id="a11y_menu">
-                <property name="name">a11y_menu</property>
-                <property name="visible">True</property>
-                <property name="can_focus">False</property>
-                <child>
-                  <object class="GtkCheckMenuItem" id="large_font_menuitem">
-                    <property name="name">large_font_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">Large Font</property>
-                    <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
-                  </object>
-                </child>
-                <child>
-                  <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
-                    <property name="name">high_contrast_menuitem</property>
-                    <property name="visible">True</property>
-                    <property name="can_focus">False</property>
-                    <property name="use_action_appearance">False</property>
-                    <property name="label" translatable="yes">High Contrast</property>
-                    <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
-                  </object>
-                </child>
-              </object>
-            </child>
-          </object>
+        <child>
+          <object class="GtkLabel" id="hostname_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="xalign">0</property>
+            <property name="xpad">6</property>
+            <property name="label">[hostname]</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="clock_label">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="label" translatable="yes">label</property>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkMenuBar" id="menubar">
+            <property name="name">menubar</property>
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="pack_direction">rtl</property>
+            <child>
+              <object class="GtkMenuItem" id="power_menuitem">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="power_menu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkMenuItem" id="suspend_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Suspend</property>
+                        <signal name="activate" handler="suspend_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="hibernate_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Hibernate</property>
+                        <signal name="activate" handler="hibernate_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="restart_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Restart...</property>
+                        <signal name="activate" handler="restart_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkMenuItem" id="shutdown_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Shutdown...</property>
+                        <signal name="activate" handler="shutdown_cb" swapped="no"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="a11y_menuitem">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="a11y_menu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <child>
+                      <object class="GtkCheckMenuItem" id="large_font_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">Large Font</property>
+                        <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="label" translatable="yes">High Contrast</property>
+                        <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
+                      </object>
+                    </child>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="language_menuitem">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="language_menu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child>
+              <object class="GtkMenuItem" id="session_menuitem">
+                <property name="visible">True</property>
+                <property name="can_focus">False</property>
+                <child type="submenu">
+                  <object class="GtkMenu" id="session_menu">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="pack_type">end</property>
+            <property name="position">2</property>
+          </packing>
         </child>
       </object>
     </child>
   </object>
-  <object class="GtkListStore" id="session_liststore">
-    <columns>
-      <!-- column-name label -->
-      <column type="gchararray"/>
-      <!-- column-name key -->
-      <column type="gchararray"/>
-    </columns>
-  </object>
   <object class="GtkListStore" id="user_liststore">
     <columns>
       <!-- column-name username -->


Follow ups