Merge lp:~bluesabre/lightdm-gtk-greeter/ui-refresh into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
- ui-refresh
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Lionel Le Folgoc | Pending | ||
Review via email: mp+153647@code.launchpad.net |
Commit message
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 --> |