lightdm-gtk-greeter-team team mailing list archive
-
lightdm-gtk-greeter-team team
-
Mailing list archive
-
Message #00074
[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