Merge lp:~bluesabre/lightdm-gtk-greeter/ui-refresh into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk

Proposed by Sean Davis
Status: Merged
Merged at revision: 90
Proposed branch: lp:~bluesabre/lightdm-gtk-greeter/ui-refresh
Merge into: lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
Diff against target: 1527 lines (+687/-447)
5 files modified
TODO (+0/-5)
data/lightdm-gtk-greeter.conf (+7/-3)
src/Makefile.am (+2/-0)
src/lightdm-gtk-greeter.c (+428/-157)
src/lightdm-gtk-greeter.glade (+250/-282)
To merge this branch: bzr merge lp:~bluesabre/lightdm-gtk-greeter/ui-refresh
Reviewer Review Type Date Requested Status
Lionel Le Folgoc Pending
Review via email: mp+153647@code.launchpad.net

Description of the change

This branch incorporates the changes in ochosi's branch that include a visual overhaul and better theming capabilities.

To post a comment you must log in.
109. By Sean Davis

Use symbolic icons, hide resize grip on panel window.

110. By Sean Davis

Use menubar styling across panel by default

111. By Sean Davis

Fix tab order, include panel menubar in tab order

112. By Sean Davis

Clean up theme template

113. By Sean Davis

Add default clock settings.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== removed file 'TODO'
2--- TODO 2013-03-13 23:52:10 +0000
3+++ TODO 1970-01-01 00:00:00 +0000
4@@ -1,5 +0,0 @@
5- * merge UI changes from lp:~ochosi/+junk/lightdm-gtk-greeter
6- * clean up missing widgets
7- * fix session- and language-menu callbacks
8- * ensure Gtk2 compatibility (GtkTable)
9- * consider symbolic icon for language-menu
10
11=== modified file 'data/lightdm-gtk-greeter.conf'
12--- data/lightdm-gtk-greeter.conf 2013-02-10 13:53:17 +0000
13+++ data/lightdm-gtk-greeter.conf 2013-03-17 19:35:23 +0000
14@@ -5,10 +5,12 @@
15 # font-name = Font to use
16 # xft-antialias = Whether to antialias Xft fonts (true or false)
17 # xft-dpi = Resolution for Xft in dots per inch (e.g. 96)
18-# xft-hintstyle = What degree of hinting to use (hintnone, hintslight, hintmedium, or hintfull)
19+# xft-hintstyle = What degree of hinting to use (none, slight, medium, or full)
20 # xft-rgba = Type of subpixel antialiasing (none, rgb, bgr, vrgb or vbgr)
21 # show-language-selector (true or false)
22-# show-indicators = semi-colon ";" separated list of allowed indicator modules (e.g. indicator-sound.so)
23+# show-indicators = semi-colon ";" separated list of allowed indicator modules (e.g. libsoundmenu.so)
24+# show-clock (true or false)
25+# clock-format = strftime-format string, e.g. %H:%M
26 #
27 [greeter]
28 #background=
29@@ -19,5 +21,7 @@
30 #xft-dpi=
31 #xft-hintstyle=
32 #xft-rgba=
33+#show-indicators=
34 #show-language-selector=
35-#show-indicators=
36+show-clock=true
37+clock-format=%a, %I:%M %p
38
39=== modified file 'src/Makefile.am'
40--- src/Makefile.am 2013-01-29 10:39:16 +0000
41+++ src/Makefile.am 2013-03-17 19:35:23 +0000
42@@ -20,6 +20,7 @@
43 lightdm_gtk_greeter_CFLAGS = \
44 $(GTK_CFLAGS) \
45 $(GMODULE_CFLAGS) \
46+ $(GTHREAD_CFLAGS) \
47 $(LIGHTDMGOBJECT_CFLAGS) \
48 $(LIBX11_CFLAGS) \
49 $(LIBINDICATOR_CFLAGS)
50@@ -27,6 +28,7 @@
51 lightdm_gtk_greeter_LDADD = \
52 $(GTK_LIBS) \
53 $(GMODULE_LIBS) \
54+ $(GTHREAD_LIBS) \
55 $(LIGHTDMGOBJECT_LIBS) \
56 $(LIBX11_LIBS) \
57 $(LIBINDICATOR_LIBS)
58
59=== modified file 'src/lightdm-gtk-greeter.c'
60--- src/lightdm-gtk-greeter.c 2013-03-01 15:48:26 +0000
61+++ src/lightdm-gtk-greeter.c 2013-03-17 19:35:23 +0000
62@@ -23,6 +23,10 @@
63 #include <cairo-xlib.h>
64 #include <gdk-pixbuf/gdk-pixbuf.h>
65 #include <gdk/gdkx.h>
66+#if GTK_CHECK_VERSION (3, 0, 0)
67+#else
68+#include <gdk/gdkkeysyms.h>
69+#endif
70
71 #ifdef HAVE_LIBINDICATOR
72 #include <libindicator/indicator-object.h>
73@@ -37,22 +41,27 @@
74 static gchar *state_filename;
75 static GtkWindow *login_window, *panel_window;
76 static GtkButton *login_button, *cancel_button;
77-static GtkLabel *message_label, *prompt_label;
78-static GtkWidget *login_box, *prompt_box;
79-static GtkImage *user_avatar;
80-static GtkEntry *prompt_entry;
81+static GtkLabel *message_label;
82+static GtkImage *logo;
83+static GtkEntry *prompt_entry, *username_entry;
84 static GtkComboBox *user_combo;
85-static GtkComboBox *session_combo;
86-static GtkComboBox *language_combo;
87+static GtkMenu *session_menu, *language_menu;
88 static gchar *default_font_name, *default_theme_name, *default_icon_theme_name;
89+static GtkWidget *clock_label;
90+static gchar *clock_format;
91 static GdkPixbuf *default_background_pixbuf = NULL;
92+static GtkWidget *menubar;
93 #if GTK_CHECK_VERSION (3, 0, 0)
94 static GdkRGBA *default_background_color = NULL;
95 #else
96 static GdkColor *default_background_color = NULL;
97 #endif
98 static gboolean cancelling = FALSE, prompted = FALSE;
99+#if GTK_CHECK_VERSION (3, 0, 0)
100 static cairo_region_t *window_region = NULL;
101+#else
102+static GdkRegion *window_region = NULL;
103+#endif
104
105
106 #ifdef HAVE_LIBINDICATOR
107@@ -244,42 +253,47 @@
108 static gchar *
109 get_session ()
110 {
111- GtkTreeIter iter;
112- gchar *session;
113-
114- if (!gtk_combo_box_get_active_iter (session_combo, &iter))
115- return g_strdup (lightdm_greeter_get_default_session_hint (greeter));
116-
117- gtk_tree_model_get (gtk_combo_box_get_model (session_combo), &iter, 1, &session, -1);
118-
119- return session;
120+ GList *menu_items, *menu_iter;
121+
122+ menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
123+
124+ for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
125+ {
126+ if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_iter->data)))
127+ {
128+ return g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
129+ }
130+ }
131+
132+ return g_strdup (lightdm_greeter_get_default_session_hint (greeter));
133 }
134
135 static void
136 set_session (const gchar *session)
137 {
138- GtkTreeModel *model = gtk_combo_box_get_model (session_combo);
139- GtkTreeIter iter;
140 const gchar *default_session;
141 gchar *last_session;
142-
143- if (session && gtk_tree_model_get_iter_first (model, &iter))
144+ GList *menu_items, *menu_iter;
145+
146+ menu_items = gtk_container_get_children(GTK_CONTAINER(session_menu));
147+
148+ if (session)
149 {
150- do
151- {
152- gchar *s;
153+ for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
154+ {
155+ gchar *s;
156 gboolean matched;
157- gtk_tree_model_get (model, &iter, 1, &s, -1);
158+ s = g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "session-key"));
159 matched = strcmp (s, session) == 0;
160 g_free (s);
161 if (matched)
162 {
163- gtk_combo_box_set_active_iter (session_combo, &iter);
164+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
165 return;
166 }
167- } while (gtk_tree_model_iter_next (model, &iter));
168+ }
169 }
170-
171+
172 /* If failed to find this session, then try the previous, then the default */
173 last_session = g_key_file_get_value (state, "greeter", "last-session", NULL);
174 if (last_session && g_strcmp0 (session, last_session) != 0)
175@@ -289,53 +303,59 @@
176 return;
177 }
178 g_free (last_session);
179+
180 default_session = lightdm_greeter_get_default_session_hint (greeter);
181 if (default_session && g_strcmp0 (session, default_session) != 0)
182 {
183 set_session (lightdm_greeter_get_default_session_hint (greeter));
184 return;
185 }
186-
187 /* Otherwise just pick the first session */
188- gtk_combo_box_set_active (session_combo, 0);
189+ menu_iter = g_list_first(menu_items);
190+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
191+ return;
192 }
193
194 static gchar *
195 get_language ()
196 {
197- GtkTreeIter iter;
198- gchar *language;
199-
200- if (!gtk_combo_box_get_active_iter (language_combo, &iter))
201- return NULL;
202-
203- gtk_tree_model_get (gtk_combo_box_get_model (language_combo), &iter, 1, &language, -1);
204-
205- return language;
206+ GList *menu_items, *menu_iter;
207+
208+ menu_items = gtk_container_get_children(GTK_CONTAINER(language_menu));
209+ for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
210+ {
211+ if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_iter->data)))
212+ {
213+ return g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "language-code"));
214+ }
215+ }
216+
217+ return NULL;
218 }
219
220 static void
221 set_language (const gchar *language)
222 {
223- GtkTreeModel *model = gtk_combo_box_get_model (language_combo);
224- GtkTreeIter iter;
225- const gchar *default_language = NULL;
226+ const gchar *default_language = NULL;
227+ GList *menu_items, *menu_iter;
228
229- if (language && gtk_tree_model_get_iter_first (model, &iter))
230+ menu_items = gtk_container_get_children(GTK_CONTAINER(language_menu));
231+
232+ if (language)
233 {
234- do
235- {
236- gchar *s;
237+ for (menu_iter = menu_items; menu_iter != NULL; menu_iter = g_list_next(menu_iter))
238+ {
239+ gchar *s;
240 gboolean matched;
241- gtk_tree_model_get (model, &iter, 1, &s, -1);
242+ s = g_strdup(g_object_get_data (G_OBJECT (menu_iter->data), "language-code"));
243 matched = strcmp (s, language) == 0;
244 g_free (s);
245 if (matched)
246 {
247- gtk_combo_box_set_active_iter (language_combo, &iter);
248+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu_iter->data), TRUE);
249 return;
250 }
251- } while (gtk_tree_model_iter_next (model, &iter));
252+ }
253 }
254
255 /* If failed to find this language, then try the default */
256@@ -366,8 +386,8 @@
257 else
258 gtk_button_set_label (login_button, _("Log In"));
259 /* and disable the session and language comboboxes */
260- gtk_widget_set_sensitive (GTK_WIDGET (session_combo), !logged_in);
261- gtk_widget_set_sensitive (GTK_WIDGET (language_combo), !logged_in);
262+ gtk_widget_set_sensitive (GTK_WIDGET (session_menu), !logged_in);
263+ gtk_widget_set_sensitive (GTK_WIDGET (language_menu), !logged_in);
264 }
265
266 static void set_background (GdkPixbuf *new_bg);
267@@ -414,39 +434,55 @@
268 path = lightdm_user_get_image (user);
269 if (path)
270 {
271- image = gdk_pixbuf_new_from_file_at_scale (path, 64, 64, FALSE, &error);
272+ image = gdk_pixbuf_new_from_file_at_scale (path, 80, 80, FALSE, &error);
273 if (image)
274 {
275- gtk_image_set_from_pixbuf (GTK_IMAGE (user_avatar), image);
276+ gtk_image_set_from_pixbuf (GTK_IMAGE (logo), image);
277 g_object_unref (image);
278 return;
279 }
280 else
281 {
282- g_warning ("Failed to load user image: %s", error->message);
283+ g_warning ("Failed to load user image: %s", error->message);
284 g_clear_error (&error);
285- }
286+ }
287 }
288 }
289- /* otherwise, show the default avatar instead */
290- gtk_image_set_from_icon_name (GTK_IMAGE (user_avatar), "avatar-default", GTK_ICON_SIZE_DIALOG);
291+
292+ gtk_image_set_from_icon_name (GTK_IMAGE (logo), "avatar-default", GTK_ICON_SIZE_DIALOG);
293 }
294
295-static cairo_region_t * xfce_region_from_rectangle (gint width, gint height, gint radius)
296+#if GTK_CHECK_VERSION (3, 0, 0)
297+static cairo_region_t *
298+#else
299+static GdkRegion *
300+#endif
301+xfce_region_from_rectangle (gint width, gint height, gint radius)
302 {
303+#if GTK_CHECK_VERSION (3, 0, 0)
304 cairo_region_t *region;
305+#else
306+ GdkRegion *region;
307+#endif
308 gint x = radius, y = 0;
309 gint xChange = 1 - (radius << 1);
310 gint yChange = 0;
311 gint radiusError = 0;
312+#if GTK_CHECK_VERSION (3, 0, 0)
313 cairo_rectangle_int_t rect;
314+#else
315+ GdkRectangle rect;
316+#endif
317 rect.x = radius;
318 rect.y = radius;
319 rect.width = width - radius * 2;
320 rect.height = height - radius * 2;
321
322+#if GTK_CHECK_VERSION (3, 0, 0)
323 region = cairo_region_create_rectangle (&rect);
324-
325+#else
326+ region = gdk_region_rectangle (&rect);
327+#endif
328
329 while(x >= y)
330 {
331@@ -456,14 +492,22 @@
332 rect.width = x - radius + width - rect.x;
333 rect.height = y - radius + height - rect.y;
334
335+#if GTK_CHECK_VERSION (3, 0, 0)
336 cairo_region_union_rectangle (region, &rect);
337+#else
338+ gdk_region_union_with_rect(region, &rect);
339+#endif
340
341 rect.x = -y + radius;
342 rect.y = -x + radius;
343 rect.width = y - radius + width - rect.x;
344 rect.height = x - radius + height - rect.y;
345
346+#if GTK_CHECK_VERSION (3, 0, 0)
347 cairo_region_union_rectangle (region, &rect);
348+#else
349+ gdk_region_union_with_rect(region, &rect);
350+#endif
351
352 y++;
353 radiusError += yChange;
354@@ -486,7 +530,12 @@
355
356 GdkWindow *window = gtk_widget_get_window (widget);
357
358+#if GTK_CHECK_VERSION (3, 0, 0)
359 cairo_region_destroy(window_region);
360+#else
361+ if (window_region)
362+ gdk_region_destroy(window_region);
363+#endif
364 window_region = xfce_region_from_rectangle (allocation->width, allocation->height, radius);
365 if (window) {
366 gdk_window_shape_combine_region(window, window_region, 0, 0);
367@@ -522,6 +571,7 @@
368
369 if (strcmp (username, "*other") == 0)
370 {
371+ gtk_widget_show (GTK_WIDGET (username_entry));
372 gtk_widget_show (GTK_WIDGET (cancel_button));
373 lightdm_greeter_authenticate (greeter, NULL);
374 }
375@@ -624,6 +674,117 @@
376 g_free (session);
377 }
378
379+gboolean
380+username_focus_out_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data);
381+G_MODULE_EXPORT
382+gboolean
383+username_focus_out_cb (GtkWidget *widget, GdkEvent *event, gpointer user_data)
384+{
385+ if (!g_strcmp0(gtk_entry_get_text(username_entry), "") == 0)
386+ start_authentication(gtk_entry_get_text(username_entry));
387+ return FALSE;
388+}
389+
390+gboolean
391+username_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
392+G_MODULE_EXPORT
393+gboolean
394+username_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
395+{
396+ if (gtk_widget_get_visible(GTK_WIDGET(user_combo)))
397+ {
398+#if GTK_CHECK_VERSION (3, 0, 0)
399+ if (event->keyval == GDK_KEY_Tab)
400+#else
401+ if (event->keyval == GDK_Tab)
402+#endif
403+ {
404+ if (event->state & GDK_SHIFT_MASK)
405+ {
406+ gtk_window_present(panel_window);
407+ gtk_widget_grab_focus(GTK_WIDGET(menubar));
408+ }
409+ else
410+ {
411+ gtk_widget_grab_focus(GTK_WIDGET(prompt_entry));
412+ }
413+ return TRUE;
414+ }
415+ }
416+ return FALSE;
417+}
418+
419+gboolean
420+login_button_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
421+G_MODULE_EXPORT
422+gboolean
423+login_button_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
424+{
425+#if GTK_CHECK_VERSION (3, 0, 0)
426+ if (event->keyval == GDK_KEY_Tab)
427+#else
428+ if (event->keyval == GDK_Tab)
429+#endif
430+ {
431+ if (event->state & GDK_SHIFT_MASK)
432+ return FALSE;
433+ gtk_window_present(panel_window);
434+ gtk_widget_grab_focus(GTK_WIDGET(menubar));
435+
436+ return TRUE;
437+ }
438+ return FALSE;
439+}
440+
441+gboolean
442+menubar_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
443+G_MODULE_EXPORT
444+gboolean
445+menubar_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
446+{
447+#if GTK_CHECK_VERSION (3, 0, 0)
448+ if (event->keyval == GDK_KEY_Tab || event->keyval == GDK_KEY_Escape)
449+#else
450+ if (event->keyval == GDK_Tab || event->keyval == GDK_Escape)
451+#endif
452+ {
453+ gtk_menu_shell_cancel(GTK_MENU_SHELL(menubar));
454+ gtk_widget_grab_focus(GTK_WIDGET(user_combo));
455+ gtk_window_present(login_window);
456+ return TRUE;
457+ }
458+ return FALSE;
459+}
460+
461+gboolean
462+user_combobox_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data);
463+G_MODULE_EXPORT
464+gboolean
465+user_combobox_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
466+{
467+#if GTK_CHECK_VERSION (3, 0, 0)
468+ if (event->keyval == GDK_KEY_Tab)
469+#else
470+ if (event->keyval == GDK_Tab)
471+#endif
472+ {
473+ if (event->state & GDK_SHIFT_MASK)
474+ {
475+ gtk_window_present(panel_window);
476+ gtk_widget_grab_focus(GTK_WIDGET(menubar));
477+ }
478+ else
479+ {
480+ if (gtk_widget_get_visible(GTK_WIDGET(username_entry)))
481+ gtk_widget_grab_focus(GTK_WIDGET(username_entry));
482+ else
483+ gtk_widget_grab_focus(GTK_WIDGET(prompt_entry));
484+ }
485+ return TRUE;
486+ }
487+ return FALSE;
488+}
489+
490 void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter);
491 G_MODULE_EXPORT
492 void
493@@ -641,9 +802,15 @@
494 gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1);
495
496 if (strcmp (user, "*other") == 0)
497+ {
498+ gtk_widget_show (GTK_WIDGET (username_entry));
499 gtk_widget_show (GTK_WIDGET (cancel_button));
500+ }
501 else
502+ {
503+ gtk_widget_hide (GTK_WIDGET (username_entry));
504 gtk_widget_hide (GTK_WIDGET (cancel_button));
505+ }
506
507 set_login_button_label (user);
508 set_user_background (user);
509@@ -658,6 +825,7 @@
510 void
511 login_cb (GtkWidget *widget)
512 {
513+ gtk_widget_set_sensitive (GTK_WIDGET (username_entry), FALSE);
514 gtk_widget_set_sensitive (GTK_WIDGET (prompt_entry), FALSE);
515 set_message_label ("");
516
517@@ -682,13 +850,21 @@
518 {
519 prompted = TRUE;
520
521- gtk_widget_show (GTK_WIDGET (login_box));
522- gtk_label_set_text (prompt_label, dgettext ("Linux-PAM", text));
523+ gtk_widget_set_sensitive (GTK_WIDGET (username_entry), TRUE);
524 gtk_widget_set_sensitive (GTK_WIDGET (prompt_entry), TRUE);
525 gtk_entry_set_text (prompt_entry, "");
526- gtk_entry_set_visibility (prompt_entry, type != LIGHTDM_PROMPT_TYPE_SECRET);
527- gtk_widget_show (GTK_WIDGET (prompt_box));
528- gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
529+ gtk_entry_set_visibility (prompt_entry, FALSE);
530+ if (type == LIGHTDM_PROMPT_TYPE_SECRET) // Password
531+ {
532+ gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
533+ }
534+ else
535+ {
536+ if (gtk_widget_get_visible ((GTK_WIDGET (username_entry))))
537+ gtk_widget_grab_focus (GTK_WIDGET (username_entry));
538+ else
539+ gtk_widget_grab_focus (GTK_WIDGET (prompt_entry));
540+ }
541 }
542
543 static void
544@@ -708,9 +884,6 @@
545 return;
546 }
547
548- gtk_widget_hide (prompt_box);
549- gtk_widget_show (login_box);
550-
551 if (lightdm_greeter_get_is_authenticated (greeter))
552 {
553 if (prompted)
554@@ -989,25 +1162,41 @@
555 else
556 selected_user = NULL;
557
558- if (selected_user && gtk_tree_model_get_iter_first (model, &iter))
559+ if (gtk_tree_model_get_iter_first (model, &iter))
560 {
561- do
562- {
563- gchar *name;
564- gboolean matched;
565+ gchar *name;
566+ gboolean matched = FALSE;
567+
568+ if (selected_user)
569+ {
570+ do
571+ {
572+ gtk_tree_model_get (model, &iter, 0, &name, -1);
573+ matched = strcmp (name, selected_user) == 0;
574+ g_free (name);
575+ if (matched)
576+ {
577+ gtk_combo_box_set_active_iter (user_combo, &iter);
578+ set_login_button_label (selected_user);
579+ set_user_background (selected_user);
580+ set_user_image (selected_user);
581+ start_authentication (selected_user);
582+ break;
583+ }
584+ } while (gtk_tree_model_iter_next (model, &iter));
585+ }
586+ if (!matched)
587+ {
588+ gtk_tree_model_get_iter_first (model, &iter);
589 gtk_tree_model_get (model, &iter, 0, &name, -1);
590- matched = strcmp (name, selected_user) == 0;
591- g_free (name);
592- if (matched)
593- {
594- gtk_combo_box_set_active_iter (user_combo, &iter);
595- set_login_button_label (selected_user);
596- set_user_background (selected_user);
597- set_user_image (selected_user);
598- start_authentication (selected_user);
599- break;
600- }
601- } while (gtk_tree_model_iter_next (model, &iter));
602+ gtk_combo_box_set_active_iter (user_combo, &iter);
603+ set_login_button_label (name);
604+ set_user_background (name);
605+ set_user_image (name);
606+ start_authentication (name);
607+ g_free(name);
608+ }
609+
610 }
611
612 g_free (last_user);
613@@ -1084,8 +1273,8 @@
614 {
615 GdkPixbuf *p = gdk_pixbuf_scale_simple (bg, monitor_geometry.width,
616 monitor_geometry.height, GDK_INTERP_BILINEAR);
617- if (!gdk_pixbuf_get_has_alpha (p))
618- p = gdk_pixbuf_add_alpha (p, FALSE, 255, 255, 255);
619+ if (!gdk_pixbuf_get_has_alpha (p))
620+ p = gdk_pixbuf_add_alpha (p, FALSE, 255, 255, 255);
621 gdk_cairo_set_source_pixbuf (c, p, monitor_geometry.x, monitor_geometry.y);
622 g_object_unref (p);
623 }
624@@ -1106,20 +1295,35 @@
625 }
626 }
627
628+static gboolean
629+clock_timeout_thread ()
630+{
631+ time_t rawtime;
632+ struct tm * timeinfo;
633+ gchar time_str[25];
634+
635+ time ( &rawtime );
636+ timeinfo = localtime ( &rawtime );
637+
638+ strftime(time_str, 25, clock_format, timeinfo);
639+ gtk_label_set_markup( GTK_LABEL(clock_label), g_strdup_printf("<b>%s</b>", time_str) );
640+
641+ return TRUE;
642+}
643+
644 int
645 main (int argc, char **argv)
646 {
647 GKeyFile *config;
648 GdkRectangle monitor_geometry;
649 GtkBuilder *builder;
650- GtkTreeModel *model;
651 const GList *items, *item;
652- GtkTreeIter iter;
653 GtkCellRenderer *renderer;
654- GtkWidget *menuitem, *hbox, *image;
655+ GtkWidget *menuitem, *image;
656 gchar *value, *state_dir;
657 #if GTK_CHECK_VERSION (3, 0, 0)
658 GdkRGBA background_color;
659+ GtkIconTheme *icon_theme;
660 #else
661 GdkColor background_color;
662 #endif
663@@ -1142,6 +1346,13 @@
664
665 signal (SIGTERM, sigterm_cb);
666
667+#if GTK_CHECK_VERSION (3, 0, 0)
668+#else
669+ /* init threads */
670+ gdk_threads_init();
671+#endif
672+
673+ /* init gtk */
674 gtk_init (&argc, &argv);
675
676 config = g_key_file_new ();
677@@ -1193,7 +1404,7 @@
678 g_debug ("Loading background %s", path);
679 default_background_pixbuf = gdk_pixbuf_new_from_file (path, &error);
680 if (!default_background_pixbuf)
681- g_warning ("Failed to load background: %s", error->message);
682+ g_warning ("Failed to load background: %s", error->message);
683 g_clear_error (&error);
684 g_free (path);
685 }
686@@ -1263,23 +1474,43 @@
687 return EXIT_FAILURE;
688 }
689 g_clear_error (&error);
690+
691+ /* Panel */
692+ panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
693+#if GTK_CHECK_VERSION (3, 0, 0)
694+ gtk_style_context_add_class( GTK_STYLE_CONTEXT(gtk_widget_get_style_context(GTK_WIDGET(panel_window))), GTK_STYLE_CLASS_MENUBAR);
695+#endif
696+ gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
697+ session_menu = GTK_MENU(gtk_builder_get_object (builder, "session_menu"));
698+ language_menu = GTK_MENU(gtk_builder_get_object (builder, "language_menu"));
699+ clock_label = GTK_WIDGET(gtk_builder_get_object (builder, "clock_label"));
700+ menubar = GTK_WIDGET (gtk_builder_get_object (builder, "menubar"));
701
702+ /* Login window */
703 login_window = GTK_WINDOW (gtk_builder_get_object (builder, "login_window"));
704- g_signal_connect (G_OBJECT (login_window), "size-allocate", G_CALLBACK (login_window_size_allocate), NULL);
705- login_box = GTK_WIDGET (gtk_builder_get_object (builder, "login_box"));
706- login_button = GTK_BUTTON (gtk_builder_get_object (builder, "login_button"));
707- cancel_button = GTK_BUTTON (gtk_builder_get_object (builder, "cancel_button"));
708- prompt_box = GTK_WIDGET (gtk_builder_get_object (builder, "prompt_box"));
709- prompt_label = GTK_LABEL (gtk_builder_get_object (builder, "prompt_label"));
710+ logo = GTK_IMAGE (gtk_builder_get_object (builder, "logo"));
711+ user_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "user_combobox"));
712+ username_entry = GTK_ENTRY (gtk_builder_get_object (builder, "username_entry"));
713 prompt_entry = GTK_ENTRY (gtk_builder_get_object (builder, "prompt_entry"));
714 message_label = GTK_LABEL (gtk_builder_get_object (builder, "message_label"));
715- user_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "user_combobox"));
716- session_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "session_combobox"));
717- language_combo = GTK_COMBO_BOX (gtk_builder_get_object (builder, "language_combobox"));
718- panel_window = GTK_WINDOW (gtk_builder_get_object (builder, "panel_window"));
719- user_avatar = GTK_IMAGE (gtk_builder_get_object (builder, "user_avatar"));
720+ cancel_button = GTK_BUTTON (gtk_builder_get_object (builder, "cancel_button"));
721+ login_button = GTK_BUTTON (gtk_builder_get_object (builder, "login_button"));
722
723- gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "hostname_label")), lightdm_get_hostname ());
724+ g_signal_connect (G_OBJECT (login_window), "size-allocate", G_CALLBACK (login_window_size_allocate), NULL);
725+
726+ /* To maintain compatability with GTK+2, set special properties here */
727+#if GTK_CHECK_VERSION (3, 0, 0)
728+ gtk_window_set_has_resize_grip(GTK_WINDOW(panel_window), FALSE);
729+ gtk_widget_set_margin_top(GTK_WIDGET(user_combo), 12);
730+ gtk_widget_set_margin_bottom(GTK_WIDGET(prompt_entry), 12);
731+ gtk_entry_set_placeholder_text(prompt_entry, _("Enter your password"));
732+ gtk_entry_set_placeholder_text(username_entry, _("Enter your username"));
733+ icon_theme = gtk_icon_theme_get_default();
734+
735+#else
736+ gtk_widget_set_tooltip_text(GTK_WIDGET(prompt_entry), _("Enter your password"));
737+ gtk_widget_set_tooltip_text(GTK_WIDGET(username_entry), _("Enter your username"));
738+#endif
739
740 /* Glade can't handle custom menuitems, so set them up manually */
741 #ifdef HAVE_LIBINDICATOR
742@@ -1322,77 +1553,72 @@
743 }
744 #endif
745
746- menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
747-#if GTK_CHECK_VERSION (3, 0, 0)
748- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
749-#else
750- hbox = gtk_hbox_new (FALSE, 0);
751-#endif
752- gtk_widget_show (hbox);
753- gtk_container_add (GTK_CONTAINER (menuitem), hbox);
754- image = gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_MENU);
755- gtk_widget_show (image);
756- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
757-
758- menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
759-#if GTK_CHECK_VERSION (3, 0, 0)
760- hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
761-#else
762- hbox = gtk_hbox_new (FALSE, 0);
763-#endif
764- gtk_widget_show (hbox);
765- gtk_container_add (GTK_CONTAINER (menuitem), hbox);
766- image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility", GTK_ICON_SIZE_MENU);
767- gtk_widget_show (image);
768- gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, TRUE, 0);
769-
770- if (!lightdm_get_can_suspend ())
771- gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
772- if (!lightdm_get_can_hibernate ())
773- gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem")));
774- if (!lightdm_get_can_restart ())
775- gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem")));
776- if (!lightdm_get_can_shutdown ())
777- gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem")));
778-
779- renderer = gtk_cell_renderer_text_new();
780- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (session_combo), renderer, TRUE);
781- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (session_combo), renderer, "text", 0);
782- model = gtk_combo_box_get_model (session_combo);
783+ /* Clock */
784+ gtk_widget_set_visible(GTK_WIDGET(clock_label),
785+ g_key_file_get_boolean (config, "greeter", "show-clock", NULL));
786+ clock_format = g_key_file_get_value (config, "greeter", "clock-format", NULL);
787+ if (!clock_format)
788+ clock_format = "%a, %H:%M";
789+
790+ /* Session menu */
791+ menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "session_menuitem"));
792+#if GTK_CHECK_VERSION (3, 0, 0)
793+ if (gtk_icon_theme_has_icon(icon_theme, "document-properties-symbolic"))
794+ image = gtk_image_new_from_icon_name ("document-properties-symbolic", GTK_ICON_SIZE_MENU);
795+ else
796+ image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_MENU);
797+#else
798+ image = gtk_image_new_from_icon_name ("document-properties", GTK_ICON_SIZE_MENU);
799+#endif
800+ gtk_widget_show (image);
801+ gtk_container_add (GTK_CONTAINER (menuitem), image);
802+ gtk_widget_show (GTK_WIDGET (menuitem));
803+
804 items = lightdm_get_sessions ();
805+ GSList *sessions = NULL;
806 for (item = items; item; item = item->next)
807 {
808 LightDMSession *session = item->data;
809-
810- gtk_widget_show (GTK_WIDGET (session_combo));
811- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
812- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
813- 0, lightdm_session_get_name (session),
814- 1, lightdm_session_get_key (session),
815- -1);
816+ GtkWidget *radiomenuitem;
817+
818+ radiomenuitem = gtk_radio_menu_item_new_with_label (sessions, lightdm_session_get_name (session));
819+ g_object_set_data (G_OBJECT (radiomenuitem), "session-key", (gpointer) lightdm_session_get_key (session));
820+ sessions = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radiomenuitem));
821+ gtk_menu_shell_append (GTK_MENU_SHELL(session_menu), radiomenuitem);
822+ gtk_widget_show (GTK_WIDGET (radiomenuitem));
823 }
824 set_session (NULL);
825
826+ /* Language menu */
827 if (g_key_file_get_boolean (config, "greeter", "show-language-selector", NULL))
828 {
829- gtk_widget_show (GTK_WIDGET (language_combo));
830-
831- renderer = gtk_cell_renderer_text_new();
832- gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (language_combo), renderer, TRUE);
833- gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (language_combo), renderer, "text", 0);
834- model = gtk_combo_box_get_model (language_combo);
835+ menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "language_menuitem"));
836+#if GTK_CHECK_VERSION (3, 0, 0)
837+ if (gtk_icon_theme_has_icon(icon_theme, "preferences-desktop-locale-symbolic"))
838+ image = gtk_image_new_from_icon_name ("preferences-desktop-locale-symbolic", GTK_ICON_SIZE_MENU);
839+ else
840+ image = gtk_image_new_from_icon_name ("preferences-desktop-locale", GTK_ICON_SIZE_MENU);
841+#else
842+ image = gtk_image_new_from_icon_name ("preferences-desktop-locale", GTK_ICON_SIZE_MENU);
843+#endif
844+ gtk_widget_show (image);
845+ gtk_container_add (GTK_CONTAINER (menuitem), image);
846+
847 items = lightdm_get_languages ();
848+ GSList *languages = NULL;
849 for (item = items; item; item = item->next)
850 {
851 LightDMLanguage *language = item->data;
852 const gchar *country, *code;
853 gchar *label;
854+ GtkWidget *radiomenuitem;
855
856 country = lightdm_language_get_territory (language);
857 if (country)
858 label = g_strdup_printf ("%s - %s", lightdm_language_get_name (language), country);
859 else
860 label = g_strdup (lightdm_language_get_name (language));
861+
862 code = lightdm_language_get_code (language);
863 gchar *modifier = strchr (code, '@');
864 if (modifier != NULL)
865@@ -1402,17 +1628,52 @@
866 label = label_new;
867 }
868
869- gtk_widget_show (GTK_WIDGET (language_combo));
870- gtk_list_store_append (GTK_LIST_STORE (model), &iter);
871- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
872- 0, label,
873- 1, code,
874- -1);
875- g_free (label);
876+ gtk_widget_show (GTK_WIDGET (menuitem));
877+ radiomenuitem = gtk_radio_menu_item_new_with_label (languages, label);
878+ g_object_set_data (G_OBJECT (radiomenuitem), "language-code", (gpointer) code);
879+ languages = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (radiomenuitem));
880+ gtk_menu_shell_append (GTK_MENU_SHELL(language_menu), radiomenuitem);
881+ gtk_widget_show (GTK_WIDGET (radiomenuitem));
882 }
883 set_language (NULL);
884 }
885+
886+ /* a11y menu */
887+ menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "a11y_menuitem"));
888+#if GTK_CHECK_VERSION (3, 0, 0)
889+ if (gtk_icon_theme_has_icon(icon_theme, "preferences-desktop-accessibility-symbolic"))
890+ image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility-symbolic", GTK_ICON_SIZE_MENU);
891+ else
892+ image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility", GTK_ICON_SIZE_MENU);
893+#else
894+ image = gtk_image_new_from_icon_name ("preferences-desktop-accessibility", GTK_ICON_SIZE_MENU);
895+#endif
896+ gtk_widget_show (image);
897+ gtk_container_add (GTK_CONTAINER (menuitem), image);
898+
899+ /* Power menu */
900+ menuitem = GTK_WIDGET (gtk_builder_get_object (builder, "power_menuitem"));
901+#if GTK_CHECK_VERSION (3, 0, 0)
902+ if (gtk_icon_theme_has_icon(icon_theme, "system-shutdown-symbolic"))
903+ image = gtk_image_new_from_icon_name ("system-shutdown-symbolic", GTK_ICON_SIZE_MENU);
904+ else
905+ image = gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_MENU);
906+#else
907+ image = gtk_image_new_from_icon_name ("system-shutdown", GTK_ICON_SIZE_MENU);
908+#endif
909+ gtk_widget_show (image);
910+ gtk_container_add (GTK_CONTAINER (menuitem), image);
911+
912+ if (!lightdm_get_can_suspend ())
913+ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "suspend_menuitem")));
914+ if (!lightdm_get_can_hibernate ())
915+ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "hibernate_menuitem")));
916+ if (!lightdm_get_can_restart ())
917+ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "restart_menuitem")));
918+ if (!lightdm_get_can_shutdown ())
919+ gtk_widget_hide (GTK_WIDGET (gtk_builder_get_object (builder, "shutdown_menuitem")));
920
921+ /* Users combobox */
922 renderer = gtk_cell_renderer_text_new();
923 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (user_combo), renderer, TRUE);
924 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (user_combo), renderer, "text", 1);
925@@ -1442,8 +1703,18 @@
926
927 gtk_widget_show (GTK_WIDGET (login_window));
928 gdk_window_focus (gtk_widget_get_window (GTK_WIDGET (login_window)), GDK_CURRENT_TIME);
929+
930+ gdk_threads_add_timeout( 100, clock_timeout_thread, NULL );
931
932+#if GTK_CHECK_VERSION (3, 0, 0)
933+#else
934+ gdk_threads_enter();
935+#endif
936 gtk_main ();
937+#if GTK_CHECK_VERSION (3, 0, 0)
938+#else
939+ gdk_threads_leave();
940+#endif
941
942 if (default_background_pixbuf)
943 g_object_unref (default_background_pixbuf);
944
945=== modified file 'src/lightdm-gtk-greeter.glade'
946--- src/lightdm-gtk-greeter.glade 2013-02-10 13:53:17 +0000
947+++ src/lightdm-gtk-greeter.glade 2013-03-17 19:35:23 +0000
948@@ -1,214 +1,144 @@
949 <?xml version="1.0" encoding="UTF-8"?>
950 <interface>
951- <object class="GtkListStore" id="language_liststore">
952- <columns>
953- <!-- column-name label -->
954- <column type="gchararray"/>
955- <!-- column-name key -->
956- <column type="gchararray"/>
957- </columns>
958- </object>
959+ <!-- interface-requires gtk+ 3.0 -->
960 <object class="GtkWindow" id="login_window">
961 <property name="name">login_window</property>
962 <property name="can_focus">False</property>
963 <property name="resizable">False</property>
964 <property name="decorated">False</property>
965- <property name="has_resize_grip">False</property>
966 <child>
967- <object class="GtkNotebook" id="login_notebook">
968- <property name="name">login_notebook</property>
969- <property name="width_request">400</property>
970+ <object class="GtkTable" id="table1">
971 <property name="visible">True</property>
972- <property name="can_focus">True</property>
973- <property name="show_tabs">False</property>
974- <child>
975- <object class="GtkVBox" id="vbox2">
976- <property name="name">vbox2</property>
977- <property name="visible">True</property>
978- <property name="can_focus">False</property>
979- <property name="border_width">12</property>
980- <property name="spacing">6</property>
981+ <property name="can_focus">False</property>
982+ <property name="border_width">26</property>
983+ <property name="n_rows">5</property>
984+ <property name="n_columns">2</property>
985+ <property name="column_spacing">18</property>
986+ <property name="row_spacing">6</property>
987+ <child>
988+ <object class="GtkComboBox" id="user_combobox">
989+ <property name="name">user_combobox</property>
990+ <property name="width_request">200</property>
991+ <property name="can_focus">True</property>
992+ <property name="model">user_liststore</property>
993+ <signal name="changed" handler="user_combobox_active_changed_cb" swapped="no"/>
994+ <signal name="key-press-event" handler="user_combobox_key_press_cb" swapped="no"/>
995+ </object>
996+ <packing>
997+ <property name="left_attach">1</property>
998+ <property name="right_attach">2</property>
999+ <property name="y_options"/>
1000+ </packing>
1001+ </child>
1002+ <child>
1003+ <object class="GtkEntry" id="prompt_entry">
1004+ <property name="name">prompt_entry</property>
1005+ <property name="width_request">200</property>
1006+ <property name="visible">True</property>
1007+ <property name="can_focus">True</property>
1008+ <property name="invisible_char">•</property>
1009+ <property name="invisible_char_set">True</property>
1010+ <property name="primary_icon_activatable">False</property>
1011+ <property name="secondary_icon_activatable">False</property>
1012+ <signal name="activate" handler="login_cb" swapped="no"/>
1013+ </object>
1014+ <packing>
1015+ <property name="left_attach">1</property>
1016+ <property name="right_attach">2</property>
1017+ <property name="top_attach">2</property>
1018+ <property name="bottom_attach">3</property>
1019+ <property name="y_options"/>
1020+ </packing>
1021+ </child>
1022+ <child>
1023+ <object class="GtkImage" id="logo">
1024+ <property name="name">logo</property>
1025+ <property name="visible">True</property>
1026+ <property name="can_focus">False</property>
1027+ <property name="pixel_size">80</property>
1028+ <property name="icon_name">avatar-default</property>
1029+ </object>
1030+ <packing>
1031+ <property name="bottom_attach">3</property>
1032+ <property name="x_options"/>
1033+ <property name="y_options"/>
1034+ </packing>
1035+ </child>
1036+ <child>
1037+ <object class="GtkLabel" id="message_label">
1038+ <property name="name">message_label</property>
1039+ <property name="can_focus">False</property>
1040+ <property name="label" comments="This is a placeholder string and will be replaced with a message from PAM">[message]</property>
1041+ </object>
1042+ <packing>
1043+ <property name="right_attach">2</property>
1044+ <property name="top_attach">3</property>
1045+ <property name="bottom_attach">4</property>
1046+ </packing>
1047+ </child>
1048+ <child>
1049+ <object class="GtkHBox" id="hbox2">
1050+ <property name="visible">True</property>
1051+ <property name="can_focus">False</property>
1052 <child>
1053- <object class="GtkImage" id="user_avatar">
1054- <property name="name">user_avatar</property>
1055+ <object class="GtkButton" id="login_button">
1056+ <property name="name">login_button</property>
1057+ <property name="label" translatable="yes">Log In</property>
1058 <property name="visible">True</property>
1059- <property name="can_focus">False</property>
1060- <property name="pixel_size">64</property>
1061- <property name="icon_name">avatar-default</property>
1062+ <property name="can_focus">True</property>
1063+ <property name="receives_default">True</property>
1064+ <signal name="clicked" handler="login_cb" swapped="no"/>
1065+ <signal name="key-press-event" handler="login_button_key_press_cb" swapped="no"/>
1066 </object>
1067 <packing>
1068 <property name="expand">False</property>
1069 <property name="fill">True</property>
1070+ <property name="pack_type">end</property>
1071 <property name="position">0</property>
1072 </packing>
1073 </child>
1074 <child>
1075- <object class="GtkLabel" id="hostname_label">
1076- <property name="name">hostname_label</property>
1077+ <object class="GtkButton" id="cancel_button">
1078+ <property name="name">cancel_button</property>
1079+ <property name="label" translatable="yes">Cancel</property>
1080 <property name="visible">True</property>
1081- <property name="can_focus">False</property>
1082- <property name="label" comments="This is a placeholder string and will be replaced with the hostname of the system">[hostname]</property>
1083+ <property name="can_focus">True</property>
1084+ <property name="receives_default">True</property>
1085+ <signal name="clicked" handler="cancel_cb" swapped="no"/>
1086 </object>
1087 <packing>
1088- <property name="expand">True</property>
1089+ <property name="expand">False</property>
1090 <property name="fill">True</property>
1091 <property name="position">1</property>
1092 </packing>
1093 </child>
1094- <child>
1095- <object class="GtkComboBox" id="user_combobox">
1096- <property name="name">user_combobox</property>
1097- <property name="can_focus">True</property>
1098- <property name="model">user_liststore</property>
1099- <signal name="changed" handler="user_combobox_active_changed_cb" swapped="no"/>
1100- </object>
1101- <packing>
1102- <property name="expand">True</property>
1103- <property name="fill">True</property>
1104- <property name="position">2</property>
1105- </packing>
1106- </child>
1107- <child>
1108- <object class="GtkVBox" id="login_box">
1109- <property name="name">login_box</property>
1110- <property name="can_focus">False</property>
1111- <property name="spacing">6</property>
1112- <child>
1113- <object class="GtkHBox" id="prompt_box">
1114- <property name="name">prompt_box</property>
1115- <property name="can_focus">False</property>
1116- <property name="spacing">6</property>
1117- <child>
1118- <object class="GtkLabel" id="prompt_label">
1119- <property name="name">prompt_label</property>
1120- <property name="visible">True</property>
1121- <property name="can_focus">False</property>
1122- <property name="label" comments="This is a placeholder string and will be replaced by the greeter with a prompt string from PAM.">[prompt]</property>
1123- </object>
1124- <packing>
1125- <property name="expand">False</property>
1126- <property name="fill">True</property>
1127- <property name="position">0</property>
1128- </packing>
1129- </child>
1130- <child>
1131- <object class="GtkEntry" id="prompt_entry">
1132- <property name="name">prompt_entry</property>
1133- <property name="visible">True</property>
1134- <property name="can_focus">True</property>
1135- <property name="invisible_char">•</property>
1136- <property name="primary_icon_activatable">False</property>
1137- <property name="secondary_icon_activatable">False</property>
1138- <signal name="activate" handler="login_cb" swapped="no"/>
1139- </object>
1140- <packing>
1141- <property name="expand">True</property>
1142- <property name="fill">True</property>
1143- <property name="position">1</property>
1144- </packing>
1145- </child>
1146- </object>
1147- <packing>
1148- <property name="expand">True</property>
1149- <property name="fill">True</property>
1150- <property name="position">0</property>
1151- </packing>
1152- </child>
1153- <child>
1154- <object class="GtkLabel" id="message_label">
1155- <property name="name">message_label</property>
1156- <property name="can_focus">False</property>
1157- <property name="label" comments="This is a placeholder string and will be replaced with a message from PAM">[message]</property>
1158- </object>
1159- <packing>
1160- <property name="expand">False</property>
1161- <property name="fill">True</property>
1162- <property name="position">1</property>
1163- </packing>
1164- </child>
1165- <child>
1166- <object class="GtkHBox" id="hbox2">
1167- <property name="name">hbox2</property>
1168- <property name="visible">True</property>
1169- <property name="can_focus">False</property>
1170- <property name="spacing">6</property>
1171- <child>
1172- <object class="GtkComboBox" id="session_combobox">
1173- <property name="name">session_combobox</property>
1174- <property name="can_focus">False</property>
1175- <property name="model">session_liststore</property>
1176- </object>
1177- <packing>
1178- <property name="expand">True</property>
1179- <property name="fill">True</property>
1180- <property name="position">0</property>
1181- </packing>
1182- </child>
1183- <child>
1184- <object class="GtkComboBox" id="language_combobox">
1185- <property name="name">language_combobox</property>
1186- <property name="can_focus">False</property>
1187- <property name="model">language_liststore</property>
1188- </object>
1189- <packing>
1190- <property name="expand">True</property>
1191- <property name="fill">True</property>
1192- <property name="position">1</property>
1193- </packing>
1194- </child>
1195- <child>
1196- <object class="GtkButton" id="login_button">
1197- <property name="name">login_button</property>
1198- <property name="label" translatable="yes">Log In</property>
1199- <property name="visible">True</property>
1200- <property name="can_focus">True</property>
1201- <property name="receives_default">True</property>
1202- <property name="use_action_appearance">False</property>
1203- <signal name="clicked" handler="login_cb" swapped="no"/>
1204- </object>
1205- <packing>
1206- <property name="expand">False</property>
1207- <property name="fill">True</property>
1208- <property name="pack_type">end</property>
1209- <property name="position">2</property>
1210- </packing>
1211- </child>
1212- <child>
1213- <object class="GtkButton" id="cancel_button">
1214- <property name="name">cancel_button</property>
1215- <property name="label" translatable="yes">Cancel</property>
1216- <property name="visible">True</property>
1217- <property name="can_focus">True</property>
1218- <property name="receives_default">True</property>
1219- <property name="use_action_appearance">False</property>
1220- <signal name="clicked" handler="cancel_cb" swapped="no"/>
1221- </object>
1222- <packing>
1223- <property name="expand">False</property>
1224- <property name="fill">True</property>
1225- <property name="pack_type">end</property>
1226- <property name="position">3</property>
1227- </packing>
1228- </child>
1229- </object>
1230- <packing>
1231- <property name="expand">True</property>
1232- <property name="fill">True</property>
1233- <property name="position">2</property>
1234- </packing>
1235- </child>
1236- </object>
1237- <packing>
1238- <property name="expand">False</property>
1239- <property name="fill">True</property>
1240- <property name="position">3</property>
1241- </packing>
1242- </child>
1243 </object>
1244+ <packing>
1245+ <property name="left_attach">1</property>
1246+ <property name="right_attach">2</property>
1247+ <property name="top_attach">4</property>
1248+ <property name="bottom_attach">5</property>
1249+ </packing>
1250 </child>
1251- <child type="tab">
1252+ <child>
1253 <placeholder/>
1254 </child>
1255+ <child>
1256+ <object class="GtkEntry" id="username_entry">
1257+ <property name="name">prompt_entry</property>
1258+ <property name="can_focus">True</property>
1259+ <property name="no_show_all">True</property>
1260+ <property name="invisible_char">•</property>
1261+ <signal name="focus-out-event" handler="username_focus_out_cb" swapped="no"/>
1262+ <signal name="key-press-event" handler="username_key_press_cb" swapped="no"/>
1263+ </object>
1264+ <packing>
1265+ <property name="left_attach">1</property>
1266+ <property name="right_attach">2</property>
1267+ <property name="top_attach">1</property>
1268+ <property name="bottom_attach">2</property>
1269+ </packing>
1270+ </child>
1271 </object>
1272 </child>
1273 </object>
1274@@ -216,114 +146,152 @@
1275 <property name="name">panel_window</property>
1276 <property name="can_focus">False</property>
1277 <property name="decorated">False</property>
1278- <property name="has_resize_grip">False</property>
1279 <child>
1280- <object class="GtkMenuBar" id="menubar">
1281- <property name="name">menubar</property>
1282+ <object class="GtkHButtonBox" id="buttonbox1">
1283 <property name="visible">True</property>
1284 <property name="can_focus">False</property>
1285- <property name="pack_direction">rtl</property>
1286- <child>
1287- <object class="GtkMenuItem" id="power_menuitem">
1288- <property name="name">power_menuitem</property>
1289- <property name="visible">True</property>
1290- <property name="can_focus">False</property>
1291- <property name="use_action_appearance">False</property>
1292- <child type="submenu">
1293- <object class="GtkMenu" id="power_menu">
1294- <property name="name">power_menu</property>
1295- <property name="visible">True</property>
1296- <property name="can_focus">False</property>
1297- <child>
1298- <object class="GtkMenuItem" id="suspend_menuitem">
1299- <property name="name">suspend_menuitem</property>
1300- <property name="visible">True</property>
1301- <property name="can_focus">False</property>
1302- <property name="use_action_appearance">False</property>
1303- <property name="label" translatable="yes">Suspend</property>
1304- <signal name="activate" handler="suspend_cb" swapped="no"/>
1305- </object>
1306- </child>
1307- <child>
1308- <object class="GtkMenuItem" id="hibernate_menuitem">
1309- <property name="name">hibernate_menuitem</property>
1310- <property name="visible">True</property>
1311- <property name="can_focus">False</property>
1312- <property name="use_action_appearance">False</property>
1313- <property name="label" translatable="yes">Hibernate</property>
1314- <signal name="activate" handler="hibernate_cb" swapped="no"/>
1315- </object>
1316- </child>
1317- <child>
1318- <object class="GtkMenuItem" id="restart_menuitem">
1319- <property name="name">restart_menuitem</property>
1320- <property name="visible">True</property>
1321- <property name="can_focus">False</property>
1322- <property name="use_action_appearance">False</property>
1323- <property name="label" translatable="yes">Restart...</property>
1324- <signal name="activate" handler="restart_cb" swapped="no"/>
1325- </object>
1326- </child>
1327- <child>
1328- <object class="GtkMenuItem" id="shutdown_menuitem">
1329- <property name="name">shutdown_menuitem</property>
1330- <property name="visible">True</property>
1331- <property name="can_focus">False</property>
1332- <property name="use_action_appearance">False</property>
1333- <property name="label" translatable="yes">Shutdown...</property>
1334- <signal name="activate" handler="shutdown_cb" swapped="no"/>
1335- </object>
1336- </child>
1337- </object>
1338- </child>
1339- </object>
1340- </child>
1341- <child>
1342- <object class="GtkMenuItem" id="a11y_menuitem">
1343- <property name="name">a11y_menuitem</property>
1344- <property name="visible">True</property>
1345- <property name="can_focus">False</property>
1346- <property name="use_action_appearance">False</property>
1347- <child type="submenu">
1348- <object class="GtkMenu" id="a11y_menu">
1349- <property name="name">a11y_menu</property>
1350- <property name="visible">True</property>
1351- <property name="can_focus">False</property>
1352- <child>
1353- <object class="GtkCheckMenuItem" id="large_font_menuitem">
1354- <property name="name">large_font_menuitem</property>
1355- <property name="visible">True</property>
1356- <property name="can_focus">False</property>
1357- <property name="use_action_appearance">False</property>
1358- <property name="label" translatable="yes">Large Font</property>
1359- <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
1360- </object>
1361- </child>
1362- <child>
1363- <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
1364- <property name="name">high_contrast_menuitem</property>
1365- <property name="visible">True</property>
1366- <property name="can_focus">False</property>
1367- <property name="use_action_appearance">False</property>
1368- <property name="label" translatable="yes">High Contrast</property>
1369- <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
1370- </object>
1371- </child>
1372- </object>
1373- </child>
1374- </object>
1375+ <child>
1376+ <object class="GtkLabel" id="hostname_label">
1377+ <property name="visible">True</property>
1378+ <property name="can_focus">False</property>
1379+ <property name="xalign">0</property>
1380+ <property name="xpad">6</property>
1381+ <property name="label">[hostname]</property>
1382+ </object>
1383+ <packing>
1384+ <property name="expand">False</property>
1385+ <property name="fill">True</property>
1386+ <property name="position">0</property>
1387+ </packing>
1388+ </child>
1389+ <child>
1390+ <object class="GtkLabel" id="clock_label">
1391+ <property name="visible">True</property>
1392+ <property name="can_focus">False</property>
1393+ <property name="label" translatable="yes">label</property>
1394+ </object>
1395+ <packing>
1396+ <property name="expand">False</property>
1397+ <property name="fill">True</property>
1398+ <property name="pack_type">end</property>
1399+ <property name="position">1</property>
1400+ </packing>
1401+ </child>
1402+ <child>
1403+ <object class="GtkMenuBar" id="menubar">
1404+ <property name="name">menubar</property>
1405+ <property name="visible">True</property>
1406+ <property name="can_focus">True</property>
1407+ <property name="take_focus">True</property>
1408+ <property name="pack_direction">rtl</property>
1409+ <signal name="key-press-event" handler="menubar_key_press_cb" swapped="no"/>
1410+ <child>
1411+ <object class="GtkMenuItem" id="power_menuitem">
1412+ <property name="visible">True</property>
1413+ <property name="can_focus">True</property>
1414+ <child type="submenu">
1415+ <object class="GtkMenu" id="power_menu">
1416+ <property name="visible">True</property>
1417+ <property name="can_focus">False</property>
1418+ <child>
1419+ <object class="GtkMenuItem" id="suspend_menuitem">
1420+ <property name="visible">True</property>
1421+ <property name="can_focus">False</property>
1422+ <property name="label" translatable="yes">Suspend</property>
1423+ <signal name="activate" handler="suspend_cb" swapped="no"/>
1424+ </object>
1425+ </child>
1426+ <child>
1427+ <object class="GtkMenuItem" id="hibernate_menuitem">
1428+ <property name="visible">True</property>
1429+ <property name="can_focus">False</property>
1430+ <property name="label" translatable="yes">Hibernate</property>
1431+ <signal name="activate" handler="hibernate_cb" swapped="no"/>
1432+ </object>
1433+ </child>
1434+ <child>
1435+ <object class="GtkMenuItem" id="restart_menuitem">
1436+ <property name="visible">True</property>
1437+ <property name="can_focus">False</property>
1438+ <property name="label" translatable="yes">Restart...</property>
1439+ <signal name="activate" handler="restart_cb" swapped="no"/>
1440+ </object>
1441+ </child>
1442+ <child>
1443+ <object class="GtkMenuItem" id="shutdown_menuitem">
1444+ <property name="visible">True</property>
1445+ <property name="can_focus">False</property>
1446+ <property name="label" translatable="yes">Shutdown...</property>
1447+ <signal name="activate" handler="shutdown_cb" swapped="no"/>
1448+ </object>
1449+ </child>
1450+ </object>
1451+ </child>
1452+ </object>
1453+ </child>
1454+ <child>
1455+ <object class="GtkMenuItem" id="a11y_menuitem">
1456+ <property name="visible">True</property>
1457+ <property name="can_focus">True</property>
1458+ <child type="submenu">
1459+ <object class="GtkMenu" id="a11y_menu">
1460+ <property name="visible">True</property>
1461+ <property name="can_focus">False</property>
1462+ <child>
1463+ <object class="GtkCheckMenuItem" id="large_font_menuitem">
1464+ <property name="visible">True</property>
1465+ <property name="can_focus">False</property>
1466+ <property name="label" translatable="yes">Large Font</property>
1467+ <signal name="toggled" handler="a11y_font_cb" swapped="no"/>
1468+ </object>
1469+ </child>
1470+ <child>
1471+ <object class="GtkCheckMenuItem" id="high_contrast_menuitem">
1472+ <property name="visible">True</property>
1473+ <property name="can_focus">False</property>
1474+ <property name="label" translatable="yes">High Contrast</property>
1475+ <signal name="toggled" handler="a11y_contrast_cb" swapped="no"/>
1476+ </object>
1477+ </child>
1478+ </object>
1479+ </child>
1480+ </object>
1481+ </child>
1482+ <child>
1483+ <object class="GtkMenuItem" id="language_menuitem">
1484+ <property name="visible">True</property>
1485+ <property name="can_focus">True</property>
1486+ <child type="submenu">
1487+ <object class="GtkMenu" id="language_menu">
1488+ <property name="visible">True</property>
1489+ <property name="can_focus">False</property>
1490+ </object>
1491+ </child>
1492+ </object>
1493+ </child>
1494+ <child>
1495+ <object class="GtkMenuItem" id="session_menuitem">
1496+ <property name="visible">True</property>
1497+ <property name="can_focus">True</property>
1498+ <child type="submenu">
1499+ <object class="GtkMenu" id="session_menu">
1500+ <property name="visible">True</property>
1501+ <property name="can_focus">False</property>
1502+ </object>
1503+ </child>
1504+ </object>
1505+ </child>
1506+ </object>
1507+ <packing>
1508+ <property name="expand">False</property>
1509+ <property name="fill">True</property>
1510+ <property name="pack_type">end</property>
1511+ <property name="position">2</property>
1512+ </packing>
1513 </child>
1514 </object>
1515 </child>
1516 </object>
1517- <object class="GtkListStore" id="session_liststore">
1518- <columns>
1519- <!-- column-name label -->
1520- <column type="gchararray"/>
1521- <!-- column-name key -->
1522- <column type="gchararray"/>
1523- </columns>
1524- </object>
1525 <object class="GtkListStore" id="user_liststore">
1526 <columns>
1527 <!-- column-name username -->

Subscribers

People subscribed via source and target branches