Merge lp:~kalgasnik/lightdm-gtk-greeter/lp-1445420-greeter-show-manual-login-fixed into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk
- lp-1445420-greeter-show-manual-login-fixed
- Merge into trunk
Proposed by
Andrew P.
Status: | Needs review |
---|---|
Proposed branch: | lp:~kalgasnik/lightdm-gtk-greeter/lp-1445420-greeter-show-manual-login-fixed |
Merge into: | lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/trunk |
Diff against target: |
799 lines (+355/-237) 3 files modified
src/greeterbackground.c (+3/-8) src/lightdm-gtk-greeter.c (+343/-222) src/lightdm-gtk-greeter.glade (+9/-7) |
To merge this branch: | bzr merge lp:~kalgasnik/lightdm-gtk-greeter/lp-1445420-greeter-show-manual-login-fixed |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Sean Davis | Needs Fixing | ||
Review via email: mp+263830@code.launchpad.net |
Commit message
Description of the change
1. Support of "greeter-
2. "Other" item is displayed dynamically.
3. Replacing literals with named constants (other, guest, model columns).
4. New column in users model - type. Will be used later for #1379710.
To post a comment you must log in.
Revision history for this message
Sean Davis (bluesabre) wrote : | # |
From a quick overview, this looks like a reasonable patch. If it works for you, I'd say go ahead and merge it.
review:
Approve
Revision history for this message
Sean Davis (bluesabre) wrote : | # |
Just tested this. When I lock my session, there are no available options and I cannot unlock.
review:
Needs Fixing
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/greeterbackground.c' | |||
2 | --- src/greeterbackground.c 2015-06-26 06:00:10 +0000 | |||
3 | +++ src/greeterbackground.c 2015-07-04 17:20:19 +0000 | |||
4 | @@ -299,7 +299,7 @@ | |||
5 | 299 | 299 | ||
6 | 300 | /* Implemented in lightdm-gtk-greeter.c */ | 300 | /* Implemented in lightdm-gtk-greeter.c */ |
7 | 301 | gpointer greeter_save_focus(GtkWidget* widget); | 301 | gpointer greeter_save_focus(GtkWidget* widget); |
9 | 302 | void greeter_restore_focus(const gpointer saved_data); | 302 | void greeter_restore_focus(gpointer* saved_data); |
10 | 303 | 303 | ||
11 | 304 | static const MonitorConfig DEFAULT_MONITOR_CONFIG = | 304 | static const MonitorConfig DEFAULT_MONITOR_CONFIG = |
12 | 305 | { | 305 | { |
13 | @@ -650,11 +650,7 @@ | |||
14 | 650 | if(!priv->active_monitor) | 650 | if(!priv->active_monitor) |
15 | 651 | greeter_background_set_active_monitor(background, NULL); | 651 | greeter_background_set_active_monitor(background, NULL); |
16 | 652 | 652 | ||
22 | 653 | if(saved_focus) | 653 | greeter_restore_focus(&saved_focus); |
18 | 654 | { | ||
19 | 655 | greeter_restore_focus(saved_focus); | ||
20 | 656 | g_free(saved_focus); | ||
21 | 657 | } | ||
23 | 658 | 654 | ||
24 | 659 | priv->screen_monitors_changed_handler_id = g_signal_connect(G_OBJECT(screen), "monitors-changed", | 655 | priv->screen_monitors_changed_handler_id = g_signal_connect(G_OBJECT(screen), "monitors-changed", |
25 | 660 | G_CALLBACK(greeter_background_monitors_changed_cb), | 656 | G_CALLBACK(greeter_background_monitors_changed_cb), |
26 | @@ -802,8 +798,7 @@ | |||
27 | 802 | gtk_container_add(GTK_CONTAINER(active->window), priv->child); | 798 | gtk_container_add(GTK_CONTAINER(active->window), priv->child); |
28 | 803 | 799 | ||
29 | 804 | gtk_window_present(active->window); | 800 | gtk_window_present(active->window); |
32 | 805 | greeter_restore_focus(focus); | 801 | greeter_restore_focus(&focus); |
31 | 806 | g_free(focus); | ||
33 | 807 | } | 802 | } |
34 | 808 | else | 803 | else |
35 | 809 | g_warning("[Background] Child widget is destroyed or not defined"); | 804 | g_warning("[Background] Child widget is destroyed or not defined"); |
36 | 810 | 805 | ||
37 | === modified file 'src/lightdm-gtk-greeter.c' | |||
38 | --- src/lightdm-gtk-greeter.c 2015-05-18 03:25:42 +0000 | |||
39 | +++ src/lightdm-gtk-greeter.c 2015-07-04 17:20:19 +0000 | |||
40 | @@ -214,6 +214,27 @@ | |||
41 | 214 | static void process_prompts (LightDMGreeter *greeter); | 214 | static void process_prompts (LightDMGreeter *greeter); |
42 | 215 | static void show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type); | 215 | static void show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type); |
43 | 216 | 216 | ||
44 | 217 | /* Users list */ | ||
45 | 218 | |||
46 | 219 | typedef enum | ||
47 | 220 | { | ||
48 | 221 | USERS_MODEL_TYPE, | ||
49 | 222 | USERS_MODEL_NAME, | ||
50 | 223 | USERS_MODEL_DISPLAY_NAME, | ||
51 | 224 | USERS_MODEL_FONT_WEIGHT | ||
52 | 225 | } UsersModelColumn; | ||
53 | 226 | |||
54 | 227 | typedef enum | ||
55 | 228 | { | ||
56 | 229 | USER_TYPE_REGULAR, | ||
57 | 230 | USER_TYPE_GUEST, | ||
58 | 231 | USER_TYPE_OTHER, | ||
59 | 232 | USER_TYPE_INVALID | ||
60 | 233 | } UserType; | ||
61 | 234 | |||
62 | 235 | static const gchar *OTHER_USER_NAME = "*other"; | ||
63 | 236 | static const gchar *GUEST_USER_NAME = "*guest"; | ||
64 | 237 | |||
65 | 217 | /* Panel and indicators */ | 238 | /* Panel and indicators */ |
66 | 218 | 239 | ||
67 | 219 | typedef enum | 240 | typedef enum |
68 | @@ -290,14 +311,28 @@ | |||
69 | 290 | 311 | ||
70 | 291 | static void read_monitor_configuration (const gchar *group, const gchar *name); | 312 | static void read_monitor_configuration (const gchar *group, const gchar *name); |
71 | 292 | 313 | ||
73 | 293 | struct SavedFocusData | 314 | static gboolean get_iter_by_str (GtkTreeModel *model, GtkTreeIter *iter, gint column, const gchar *value); |
74 | 315 | static gint get_iter_by_intr (GtkTreeModel *model, GtkTreeIter *iter, gint column, gint value, gint search_length); | ||
75 | 316 | |||
76 | 317 | typedef struct | ||
77 | 294 | { | 318 | { |
78 | 295 | GtkWidget *widget; | 319 | GtkWidget *widget; |
79 | 296 | gint editable_pos; | 320 | gint editable_pos; |
84 | 297 | }; | 321 | } SavedFocusData; |
85 | 298 | 322 | ||
86 | 299 | gpointer greeter_save_focus(GtkWidget* widget); | 323 | SavedFocusData* greeter_save_focus (GtkWidget* widget); |
87 | 300 | void greeter_restore_focus(const gpointer saved_data); | 324 | /* Restore focus, "focus" will be freed */ |
88 | 325 | void greeter_restore_focus (SavedFocusData** focus); | ||
89 | 326 | |||
90 | 327 | typedef struct | ||
91 | 328 | { | ||
92 | 329 | GtkTreePath *path; | ||
93 | 330 | UserType type; | ||
94 | 331 | } SavedUserSelectionData; | ||
95 | 332 | |||
96 | 333 | static SavedUserSelectionData* save_user_selection (void); | ||
97 | 334 | /* Restore saved user selection, saved_data will be freed */ | ||
98 | 335 | static void restore_user_selection (SavedUserSelectionData** saved_data, gboolean override_current); | ||
99 | 301 | 336 | ||
100 | 302 | 337 | ||
101 | 303 | static void | 338 | static void |
102 | @@ -318,31 +353,127 @@ | |||
103 | 318 | g_free (background); | 353 | g_free (background); |
104 | 319 | } | 354 | } |
105 | 320 | 355 | ||
111 | 321 | gpointer | 356 | |
112 | 322 | greeter_save_focus(GtkWidget* widget) | 357 | static gboolean |
113 | 323 | { | 358 | get_iter_by_str (GtkTreeModel *model, GtkTreeIter *iter, gint column, const gchar *value) |
114 | 324 | GtkWidget *window = gtk_widget_get_toplevel(widget); | 359 | { |
115 | 325 | if (!GTK_IS_WINDOW (window)) | 360 | if (gtk_tree_model_get_iter_first (model, iter)) |
116 | 361 | do | ||
117 | 362 | { | ||
118 | 363 | gchar *iter_value; | ||
119 | 364 | gboolean matched; | ||
120 | 365 | |||
121 | 366 | gtk_tree_model_get (model, iter, column, &iter_value, -1); | ||
122 | 367 | matched = g_strcmp0 (iter_value, value) == 0; | ||
123 | 368 | g_free (iter_value); | ||
124 | 369 | if (matched) | ||
125 | 370 | return TRUE; | ||
126 | 371 | } while (gtk_tree_model_iter_next (model, iter)); | ||
127 | 372 | |||
128 | 373 | return FALSE; | ||
129 | 374 | } | ||
130 | 375 | |||
131 | 376 | static gint | ||
132 | 377 | get_iter_by_intr (GtkTreeModel *model, GtkTreeIter *iter, gint column, gint value, gint search_length) | ||
133 | 378 | { | ||
134 | 379 | gint length = gtk_tree_model_iter_n_children (model, NULL); | ||
135 | 380 | GtkTreePath *path = length ? gtk_tree_path_new_from_indices (length - 1, -1) : NULL; | ||
136 | 381 | gboolean found = FALSE; | ||
137 | 382 | gint iter_value; | ||
138 | 383 | |||
139 | 384 | if (path && gtk_tree_model_get_iter (model, iter, path)) | ||
140 | 385 | { | ||
141 | 386 | do | ||
142 | 387 | { | ||
143 | 388 | gtk_tree_model_get (model, iter, column, &iter_value, -1); | ||
144 | 389 | found = iter_value == value; | ||
145 | 390 | } while (!found && --search_length != 0 && gtk_tree_model_iter_previous (model, iter)); | ||
146 | 391 | } | ||
147 | 392 | |||
148 | 393 | if (path) | ||
149 | 394 | gtk_tree_path_free (path); | ||
150 | 395 | return found; | ||
151 | 396 | } | ||
152 | 397 | |||
153 | 398 | SavedFocusData* | ||
154 | 399 | greeter_save_focus (GtkWidget *widget) | ||
155 | 400 | { | ||
156 | 401 | GtkWidget *window = gtk_widget_get_toplevel (widget); | ||
157 | 402 | if(!GTK_IS_WINDOW (window)) | ||
158 | 326 | return NULL; | 403 | return NULL; |
163 | 327 | 404 | SavedFocusData* focus = g_new0 (SavedFocusData, 1); | |
164 | 328 | struct SavedFocusData *data = g_new0 (struct SavedFocusData, 1); | 405 | focus->widget = gtk_window_get_focus (GTK_WINDOW (window)); |
165 | 329 | data->widget = gtk_window_get_focus (GTK_WINDOW (window)); | 406 | focus->editable_pos = GTK_IS_EDITABLE (focus->widget) ? gtk_editable_get_position (GTK_EDITABLE (focus->widget)) : -1; |
166 | 330 | data->editable_pos = GTK_IS_EDITABLE(data->widget) ? gtk_editable_get_position (GTK_EDITABLE (data->widget)) : -1; | 407 | return focus; |
167 | 408 | } | ||
168 | 409 | |||
169 | 410 | void | ||
170 | 411 | greeter_restore_focus (SavedFocusData** pfocus) | ||
171 | 412 | { | ||
172 | 413 | g_return_if_fail (pfocus != NULL); | ||
173 | 414 | |||
174 | 415 | SavedFocusData *focus = *pfocus; | ||
175 | 416 | if(focus && GTK_IS_WIDGET (focus->widget)) | ||
176 | 417 | { | ||
177 | 418 | gtk_widget_grab_focus (focus->widget); | ||
178 | 419 | if (GTK_IS_EDITABLE (focus->widget) && focus->editable_pos > -1) | ||
179 | 420 | gtk_editable_set_position (GTK_EDITABLE (focus->widget), focus->editable_pos); | ||
180 | 421 | } | ||
181 | 422 | g_free (focus); | ||
182 | 423 | *pfocus = NULL; | ||
183 | 424 | } | ||
184 | 425 | |||
185 | 426 | static SavedUserSelectionData* | ||
186 | 427 | save_user_selection (void) | ||
187 | 428 | { | ||
188 | 429 | SavedUserSelectionData *data = g_new0 (SavedUserSelectionData, 1); | ||
189 | 430 | |||
190 | 431 | GtkTreeIter active_iter; | ||
191 | 432 | if (gtk_combo_box_get_active_iter (user_combo, &active_iter)) | ||
192 | 433 | { | ||
193 | 434 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); | ||
194 | 435 | data->path = gtk_tree_model_get_path (model, &active_iter); | ||
195 | 436 | gtk_tree_model_get (model, &active_iter, USERS_MODEL_TYPE, &data->type, -1); | ||
196 | 437 | } | ||
197 | 331 | 438 | ||
198 | 332 | return data; | 439 | return data; |
199 | 333 | } | 440 | } |
200 | 334 | 441 | ||
203 | 335 | void | 442 | static void |
204 | 336 | greeter_restore_focus(const gpointer saved_data) | 443 | restore_user_selection (SavedUserSelectionData** pdata, gboolean override_current) |
205 | 337 | { | 444 | { |
214 | 338 | struct SavedFocusData *data = saved_data; | 445 | g_return_if_fail(pdata != NULL); |
215 | 339 | 446 | ||
216 | 340 | if (!saved_data || !GTK_IS_WIDGET (data->widget)) | 447 | SavedUserSelectionData* data = *pdata; |
217 | 341 | return; | 448 | GtkTreeIter active_iter; |
218 | 342 | 449 | ||
219 | 343 | gtk_widget_grab_focus (data->widget); | 450 | if (override_current || !gtk_combo_box_get_active_iter (user_combo, &active_iter)) |
220 | 344 | if (GTK_IS_EDITABLE(data->widget) && data->editable_pos > -1) | 451 | { |
221 | 345 | gtk_editable_set_position(GTK_EDITABLE(data->widget), data->editable_pos); | 452 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); |
222 | 453 | UserType new_active_type; | ||
223 | 454 | gboolean iter_is_valid = FALSE; | ||
224 | 455 | |||
225 | 456 | if (data->path) | ||
226 | 457 | { | ||
227 | 458 | iter_is_valid = gtk_tree_model_get_iter (model, &active_iter, data->path); | ||
228 | 459 | if (iter_is_valid) | ||
229 | 460 | gtk_tree_model_get (model, &active_iter, USERS_MODEL_TYPE, &new_active_type, -1); | ||
230 | 461 | |||
231 | 462 | GtkTreeIter iter; | ||
232 | 463 | if ((!iter_is_valid || data->type != new_active_type) && | ||
233 | 464 | get_iter_by_intr (model, &iter, USERS_MODEL_TYPE, data->type, 2)) | ||
234 | 465 | { | ||
235 | 466 | iter_is_valid = TRUE; | ||
236 | 467 | active_iter = iter; | ||
237 | 468 | } | ||
238 | 469 | } | ||
239 | 470 | |||
240 | 471 | if (iter_is_valid || gtk_tree_model_get_iter_first (model, &active_iter)) | ||
241 | 472 | gtk_combo_box_set_active_iter (user_combo, &active_iter); | ||
242 | 473 | } | ||
243 | 474 | |||
244 | 475 | gtk_tree_path_free (data->path); | ||
245 | 476 | g_clear_pointer (pdata, g_free); | ||
246 | 346 | } | 477 | } |
247 | 347 | 478 | ||
248 | 348 | static void | 479 | static void |
249 | @@ -1856,24 +1987,6 @@ | |||
250 | 1856 | lightdm_shutdown (NULL); | 1987 | lightdm_shutdown (NULL); |
251 | 1857 | } | 1988 | } |
252 | 1858 | 1989 | ||
253 | 1859 | static void | ||
254 | 1860 | set_login_button_label (LightDMGreeter *greeter, const gchar *username) | ||
255 | 1861 | { | ||
256 | 1862 | LightDMUser *user; | ||
257 | 1863 | gboolean logged_in = FALSE; | ||
258 | 1864 | |||
259 | 1865 | user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username); | ||
260 | 1866 | if (user) | ||
261 | 1867 | logged_in = lightdm_user_get_logged_in (user); | ||
262 | 1868 | if (logged_in) | ||
263 | 1869 | gtk_button_set_label (login_button, _("Unlock")); | ||
264 | 1870 | else | ||
265 | 1871 | gtk_button_set_label (login_button, _("Log In")); | ||
266 | 1872 | /* and disable the session and language widgets */ | ||
267 | 1873 | gtk_widget_set_sensitive (GTK_WIDGET (session_menuitem), !logged_in); | ||
268 | 1874 | gtk_widget_set_sensitive (GTK_WIDGET (language_menuitem), !logged_in); | ||
269 | 1875 | } | ||
270 | 1876 | |||
271 | 1877 | static guint set_user_background_delayed_id = 0; | 1990 | static guint set_user_background_delayed_id = 0; |
272 | 1878 | 1991 | ||
273 | 1879 | static gboolean | 1992 | static gboolean |
274 | @@ -1928,13 +2041,13 @@ | |||
275 | 1928 | 2041 | ||
276 | 1929 | config_set_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, username); | 2042 | config_set_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, username); |
277 | 1930 | 2043 | ||
279 | 1931 | if (g_strcmp0 (username, "*other") == 0) | 2044 | if (g_strcmp0 (username, OTHER_USER_NAME) == 0) |
280 | 1932 | { | 2045 | { |
281 | 1933 | gtk_widget_show (GTK_WIDGET (username_entry)); | 2046 | gtk_widget_show (GTK_WIDGET (username_entry)); |
282 | 1934 | gtk_widget_show (GTK_WIDGET (cancel_button)); | 2047 | gtk_widget_show (GTK_WIDGET (cancel_button)); |
283 | 1935 | lightdm_greeter_authenticate (greeter, NULL); | 2048 | lightdm_greeter_authenticate (greeter, NULL); |
284 | 1936 | } | 2049 | } |
286 | 1937 | else if (g_strcmp0 (username, "*guest") == 0) | 2050 | else if (g_strcmp0 (username, GUEST_USER_NAME) == 0) |
287 | 1938 | { | 2051 | { |
288 | 1939 | lightdm_greeter_authenticate_as_guest (greeter); | 2052 | lightdm_greeter_authenticate_as_guest (greeter); |
289 | 1940 | } | 2053 | } |
290 | @@ -1963,10 +2076,6 @@ | |||
291 | 1963 | static void | 2076 | static void |
292 | 1964 | cancel_authentication (void) | 2077 | cancel_authentication (void) |
293 | 1965 | { | 2078 | { |
294 | 1966 | GtkTreeModel *model; | ||
295 | 1967 | GtkTreeIter iter; | ||
296 | 1968 | gboolean other = FALSE; | ||
297 | 1969 | |||
298 | 1970 | if (pending_questions) | 2079 | if (pending_questions) |
299 | 1971 | { | 2080 | { |
300 | 1972 | g_slist_free_full (pending_questions, (GDestroyNotify) pam_message_finalize); | 2081 | g_slist_free_full (pending_questions, (GDestroyNotify) pam_message_finalize); |
301 | @@ -1974,10 +2083,9 @@ | |||
302 | 1974 | } | 2083 | } |
303 | 1975 | 2084 | ||
304 | 1976 | /* If in authentication then stop that first */ | 2085 | /* If in authentication then stop that first */ |
307 | 1977 | cancelling = FALSE; | 2086 | cancelling = lightdm_greeter_get_in_authentication (greeter); |
308 | 1978 | if (lightdm_greeter_get_in_authentication (greeter)) | 2087 | if (cancelling) |
309 | 1979 | { | 2088 | { |
310 | 1980 | cancelling = TRUE; | ||
311 | 1981 | lightdm_greeter_cancel_authentication (greeter); | 2089 | lightdm_greeter_cancel_authentication (greeter); |
312 | 1982 | set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL); | 2090 | set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL); |
313 | 1983 | } | 2091 | } |
314 | @@ -1985,22 +2093,19 @@ | |||
315 | 1985 | /* Make sure password entry is back to normal */ | 2093 | /* Make sure password entry is back to normal */ |
316 | 1986 | gtk_entry_set_visibility (password_entry, FALSE); | 2094 | gtk_entry_set_visibility (password_entry, FALSE); |
317 | 1987 | 2095 | ||
322 | 1988 | /* Force refreshing the prompt_box for "Other" */ | 2096 | UserType user_type = gtk_widget_get_visible (GTK_WIDGET (user_combo)) ? USER_TYPE_INVALID : USER_TYPE_OTHER; |
323 | 1989 | model = gtk_combo_box_get_model (user_combo); | 2097 | if (user_type == USER_TYPE_INVALID) |
320 | 1990 | |||
321 | 1991 | if (gtk_combo_box_get_active_iter (user_combo, &iter)) | ||
324 | 1992 | { | 2098 | { |
330 | 1993 | gchar *user; | 2099 | GtkTreeIter iter; |
331 | 1994 | 2100 | if (gtk_combo_box_get_active_iter (user_combo, &iter)) | |
332 | 1995 | gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1); | 2101 | gtk_tree_model_get (gtk_combo_box_get_model (user_combo), &iter, USERS_MODEL_TYPE, &user_type, -1); |
328 | 1996 | other = (g_strcmp0 (user, "*other") == 0); | ||
329 | 1997 | g_free (user); | ||
333 | 1998 | } | 2102 | } |
334 | 1999 | 2103 | ||
338 | 2000 | /* Start a new login or return to the user list */ | 2104 | if (user_type == USER_TYPE_OTHER) |
339 | 2001 | if (other || lightdm_greeter_get_hide_users_hint (greeter)) | 2105 | /* Force refreshing the prompt_box for "Other" */ |
340 | 2002 | start_authentication ("*other"); | 2106 | start_authentication (OTHER_USER_NAME); |
341 | 2003 | else | 2107 | else |
342 | 2108 | /* Return to the user list */ | ||
343 | 2004 | gtk_widget_grab_focus (GTK_WIDGET (user_combo)); | 2109 | gtk_widget_grab_focus (GTK_WIDGET (user_combo)); |
344 | 2005 | } | 2110 | } |
345 | 2006 | 2111 | ||
346 | @@ -2145,51 +2250,51 @@ | |||
347 | 2145 | } | 2250 | } |
348 | 2146 | 2251 | ||
349 | 2147 | static void | 2252 | static void |
351 | 2148 | set_displayed_user (LightDMGreeter *greeter, const gchar *username) | 2253 | set_displayed_user (LightDMGreeter *greeter, const gchar *user_name) |
352 | 2149 | { | 2254 | { |
378 | 2150 | gchar *user_tooltip; | 2255 | UserType user_type = g_strcmp0 (user_name, OTHER_USER_NAME) == 0 ? USER_TYPE_OTHER : |
379 | 2151 | LightDMUser *user; | 2256 | g_strcmp0 (user_name, GUEST_USER_NAME) == 0 ? USER_TYPE_GUEST : USER_TYPE_REGULAR; |
380 | 2152 | 2257 | LightDMUser *user = NULL; | |
381 | 2153 | if (g_strcmp0 (username, "*other") == 0) | 2258 | const gchar *user_tooltip = user_name; |
382 | 2154 | { | 2259 | gboolean logged_in = FALSE; |
383 | 2155 | gtk_widget_show (GTK_WIDGET (username_entry)); | 2260 | |
384 | 2156 | gtk_widget_show (GTK_WIDGET (cancel_button)); | 2261 | gtk_widget_set_visible (GTK_WIDGET (username_entry), user_type == USER_TYPE_OTHER); |
385 | 2157 | user_tooltip = g_strdup (_("Other")); | 2262 | gtk_widget_set_visible (GTK_WIDGET (cancel_button), user_type == USER_TYPE_OTHER); |
386 | 2158 | } | 2263 | |
387 | 2159 | else | 2264 | if (user_type == USER_TYPE_REGULAR) |
388 | 2160 | { | 2265 | user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), user_name); |
389 | 2161 | gtk_widget_hide (GTK_WIDGET (username_entry)); | 2266 | else if (user_type == USER_TYPE_OTHER) |
390 | 2162 | gtk_widget_hide (GTK_WIDGET (cancel_button)); | 2267 | user_tooltip = _("Other"); |
391 | 2163 | user_tooltip = g_strdup (username); | 2268 | else if (user_type == USER_TYPE_GUEST) |
392 | 2164 | } | 2269 | { |
393 | 2165 | 2270 | user_tooltip = _("Guest Session"); | |
394 | 2166 | /* At this moment we do not have information about possible prompts | 2271 | /* At this moment we do not have information about possible prompts |
395 | 2167 | * for current user (except *guest). So, password_entry.visible changed in: | 2272 | * for current user (except *guest). So, password_entry.visible changed in: |
396 | 2168 | * auth_complete_cb | 2273 | * auth_complete_cb |
397 | 2169 | * process_prompts | 2274 | * process_prompts |
398 | 2170 | * and here - for *guest */ | 2275 | * and here - for *guest */ |
374 | 2171 | |||
375 | 2172 | if (g_strcmp0 (username, "*guest") == 0) | ||
376 | 2173 | { | ||
377 | 2174 | user_tooltip = g_strdup (_("Guest Session")); | ||
399 | 2175 | gtk_widget_hide (GTK_WIDGET (password_entry)); | 2276 | gtk_widget_hide (GTK_WIDGET (password_entry)); |
400 | 2176 | gtk_widget_grab_focus (GTK_WIDGET (user_combo)); | 2277 | gtk_widget_grab_focus (GTK_WIDGET (user_combo)); |
401 | 2177 | } | 2278 | } |
402 | 2178 | 2279 | ||
403 | 2179 | set_login_button_label (greeter, username); | ||
404 | 2180 | set_user_background (username); | ||
405 | 2181 | set_user_image (username); | ||
406 | 2182 | user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username); | ||
407 | 2183 | if (user) | 2280 | if (user) |
408 | 2184 | { | 2281 | { |
409 | 2282 | logged_in = lightdm_user_get_logged_in (user); | ||
410 | 2185 | set_language (lightdm_user_get_language (user)); | 2283 | set_language (lightdm_user_get_language (user)); |
411 | 2186 | set_session (lightdm_user_get_session (user)); | 2284 | set_session (lightdm_user_get_session (user)); |
412 | 2187 | } | 2285 | } |
413 | 2188 | else | 2286 | else |
414 | 2189 | set_language (lightdm_language_get_code (lightdm_get_language ())); | 2287 | set_language (lightdm_language_get_code (lightdm_get_language ())); |
415 | 2288 | |||
416 | 2190 | gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip); | 2289 | gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip); |
419 | 2191 | start_authentication (username); | 2290 | gtk_widget_set_sensitive (GTK_WIDGET (session_menuitem), !logged_in); |
420 | 2192 | g_free (user_tooltip); | 2291 | gtk_widget_set_sensitive (GTK_WIDGET (language_menuitem), !logged_in); |
421 | 2292 | gtk_button_set_label (login_button, logged_in ? _("Unlock") : _("Log In")); | ||
422 | 2293 | |||
423 | 2294 | set_user_background (user_name); | ||
424 | 2295 | set_user_image (user_name); | ||
425 | 2296 | |||
426 | 2297 | start_authentication (user_name); | ||
427 | 2193 | } | 2298 | } |
428 | 2194 | 2299 | ||
429 | 2195 | void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter); | 2300 | void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter); |
430 | @@ -2197,19 +2302,14 @@ | |||
431 | 2197 | void | 2302 | void |
432 | 2198 | user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter) | 2303 | user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter) |
433 | 2199 | { | 2304 | { |
435 | 2200 | GtkTreeModel *model; | 2305 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); |
436 | 2201 | GtkTreeIter iter; | 2306 | GtkTreeIter iter; |
437 | 2202 | 2307 | ||
438 | 2203 | model = gtk_combo_box_get_model (user_combo); | ||
439 | 2204 | |||
440 | 2205 | if (gtk_combo_box_get_active_iter (user_combo, &iter)) | 2308 | if (gtk_combo_box_get_active_iter (user_combo, &iter)) |
441 | 2206 | { | 2309 | { |
442 | 2207 | gchar *user; | 2310 | gchar *user; |
446 | 2208 | 2311 | gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, USERS_MODEL_NAME, &user, -1); | |
444 | 2209 | gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1); | ||
445 | 2210 | |||
447 | 2211 | set_displayed_user (greeter, user); | 2312 | set_displayed_user (greeter, user); |
448 | 2212 | |||
449 | 2213 | g_free (user); | 2313 | g_free (user); |
450 | 2214 | } | 2314 | } |
451 | 2215 | set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL); | 2315 | set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL); |
452 | @@ -2380,164 +2480,185 @@ | |||
453 | 2380 | } | 2480 | } |
454 | 2381 | } | 2481 | } |
455 | 2382 | 2482 | ||
468 | 2383 | static void | 2483 | /* Controls visibility of "other" user. |
469 | 2384 | user_added_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter) | 2484 | Must be called after any change of users list. */ |
470 | 2385 | { | 2485 | static void |
471 | 2386 | GtkTreeModel *model; | 2486 | update_manual_login_item (void) |
472 | 2387 | GtkTreeIter iter; | 2487 | { |
473 | 2388 | gboolean logged_in = FALSE; | 2488 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); |
474 | 2389 | 2489 | GtkTreeIter other_iter; | |
475 | 2390 | model = gtk_combo_box_get_model (user_combo); | 2490 | /* "other" user must be the last, no need to check more than one */ |
476 | 2391 | 2491 | gboolean other_iter_is_valid = get_iter_by_intr (model, &other_iter, USERS_MODEL_TYPE, USER_TYPE_OTHER, 1); | |
477 | 2392 | logged_in = lightdm_user_get_logged_in (user); | 2492 | |
478 | 2393 | 2493 | gboolean show_manual_login = lightdm_greeter_get_show_manual_login_hint (greeter); | |
479 | 2394 | gtk_list_store_append (GTK_LIST_STORE (model), &iter); | 2494 | if (!show_manual_login) |
480 | 2495 | { | ||
481 | 2496 | GtkTreeIter iter = other_iter; | ||
482 | 2497 | if (other_iter_is_valid) | ||
483 | 2498 | /* Force to show if "Other" is the only entry we have */ | ||
484 | 2499 | show_manual_login = !gtk_tree_model_iter_previous (model, &iter); | ||
485 | 2500 | else | ||
486 | 2501 | /* Or there are no other entries */ | ||
487 | 2502 | show_manual_login = !gtk_tree_model_get_iter_first (model, &iter); | ||
488 | 2503 | } | ||
489 | 2504 | |||
490 | 2505 | if (show_manual_login && !other_iter_is_valid) | ||
491 | 2506 | { | ||
492 | 2507 | gtk_list_store_append (GTK_LIST_STORE (model), &other_iter); | ||
493 | 2508 | gtk_list_store_set (GTK_LIST_STORE (model), &other_iter, | ||
494 | 2509 | USERS_MODEL_TYPE, USER_TYPE_OTHER, | ||
495 | 2510 | USERS_MODEL_NAME, OTHER_USER_NAME, | ||
496 | 2511 | USERS_MODEL_DISPLAY_NAME, _("Other..."), | ||
497 | 2512 | USERS_MODEL_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, | ||
498 | 2513 | -1); | ||
499 | 2514 | } | ||
500 | 2515 | else if (!show_manual_login && other_iter_is_valid) | ||
501 | 2516 | { | ||
502 | 2517 | gtk_list_store_remove (GTK_LIST_STORE (model), &other_iter); | ||
503 | 2518 | } | ||
504 | 2519 | } | ||
505 | 2520 | |||
506 | 2521 | static void | ||
507 | 2522 | user_added_cb (LightDMUserList *user_list, LightDMUser *user) | ||
508 | 2523 | { | ||
509 | 2524 | if (!gtk_widget_get_visible (GTK_WIDGET (user_combo))) | ||
510 | 2525 | return; | ||
511 | 2526 | |||
512 | 2527 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); | ||
513 | 2528 | GtkTreeIter iter, last_user_iter; | ||
514 | 2529 | gboolean logged_in = lightdm_user_get_logged_in (user); | ||
515 | 2530 | |||
516 | 2531 | /* Insert item before "guest" and "other" accounts */ | ||
517 | 2532 | if (get_iter_by_intr (model, &last_user_iter, USERS_MODEL_TYPE, USER_TYPE_REGULAR, -1)) | ||
518 | 2533 | gtk_list_store_insert_after (GTK_LIST_STORE (model), &iter, &last_user_iter); | ||
519 | 2534 | else | ||
520 | 2535 | gtk_list_store_insert_after (GTK_LIST_STORE (model), &iter, NULL); | ||
521 | 2536 | |||
522 | 2537 | SavedUserSelectionData* user_selection = save_user_selection (); | ||
523 | 2395 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, | 2538 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
527 | 2396 | 0, lightdm_user_get_name (user), | 2539 | USERS_MODEL_TYPE, USER_TYPE_REGULAR, |
528 | 2397 | 1, lightdm_user_get_display_name (user), | 2540 | USERS_MODEL_NAME, lightdm_user_get_name (user), |
529 | 2398 | 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, | 2541 | USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user), |
530 | 2542 | USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, | ||
531 | 2399 | -1); | 2543 | -1); |
556 | 2400 | } | 2544 | update_manual_login_item (); |
557 | 2401 | 2545 | restore_user_selection (&user_selection, TRUE); | |
534 | 2402 | static gboolean | ||
535 | 2403 | get_user_iter (const gchar *username, GtkTreeIter *iter) | ||
536 | 2404 | { | ||
537 | 2405 | GtkTreeModel *model; | ||
538 | 2406 | |||
539 | 2407 | model = gtk_combo_box_get_model (user_combo); | ||
540 | 2408 | |||
541 | 2409 | if (!gtk_tree_model_get_iter_first (model, iter)) | ||
542 | 2410 | return FALSE; | ||
543 | 2411 | do | ||
544 | 2412 | { | ||
545 | 2413 | gchar *name; | ||
546 | 2414 | gboolean matched; | ||
547 | 2415 | |||
548 | 2416 | gtk_tree_model_get (model, iter, 0, &name, -1); | ||
549 | 2417 | matched = g_strcmp0 (name, username) == 0; | ||
550 | 2418 | g_free (name); | ||
551 | 2419 | if (matched) | ||
552 | 2420 | return TRUE; | ||
553 | 2421 | } while (gtk_tree_model_iter_next (model, iter)); | ||
554 | 2422 | |||
555 | 2423 | return FALSE; | ||
558 | 2424 | } | 2546 | } |
559 | 2425 | 2547 | ||
560 | 2426 | static void | 2548 | static void |
562 | 2427 | user_changed_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter) | 2549 | user_changed_cb (LightDMUserList *user_list, LightDMUser *user) |
563 | 2428 | { | 2550 | { |
565 | 2429 | GtkTreeModel *model; | 2551 | if (!gtk_widget_get_visible (GTK_WIDGET (user_combo))) |
566 | 2552 | return; | ||
567 | 2553 | |||
568 | 2554 | const gchar *name = lightdm_user_get_name (user); | ||
569 | 2555 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); | ||
570 | 2430 | GtkTreeIter iter; | 2556 | GtkTreeIter iter; |
571 | 2431 | gboolean logged_in = FALSE; | ||
572 | 2432 | 2557 | ||
574 | 2433 | if (!get_user_iter (lightdm_user_get_name (user), &iter)) | 2558 | if (!get_iter_by_str (model, &iter, USERS_MODEL_NAME, name)) |
575 | 2559 | { | ||
576 | 2560 | g_warning ("%s: model doesn't contain user '%s'", G_STRFUNC, name); | ||
577 | 2434 | return; | 2561 | return; |
582 | 2435 | logged_in = lightdm_user_get_logged_in (user); | 2562 | } |
583 | 2436 | 2563 | ||
584 | 2437 | model = gtk_combo_box_get_model (user_combo); | 2564 | gboolean logged_in = lightdm_user_get_logged_in (user); |
581 | 2438 | |||
585 | 2439 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, | 2565 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, |
589 | 2440 | 0, lightdm_user_get_name (user), | 2566 | USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user), |
590 | 2441 | 1, lightdm_user_get_display_name (user), | 2567 | USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, |
588 | 2442 | 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, | ||
591 | 2443 | -1); | 2568 | -1); |
592 | 2444 | } | 2569 | } |
593 | 2445 | 2570 | ||
594 | 2446 | static void | 2571 | static void |
595 | 2447 | user_removed_cb (LightDMUserList *user_list, LightDMUser *user) | 2572 | user_removed_cb (LightDMUserList *user_list, LightDMUser *user) |
596 | 2448 | { | 2573 | { |
598 | 2449 | GtkTreeModel *model; | 2574 | if (!gtk_widget_get_visible (GTK_WIDGET (user_combo))) |
599 | 2575 | return; | ||
600 | 2576 | |||
601 | 2577 | const gchar *name = lightdm_user_get_name (user); | ||
602 | 2578 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); | ||
603 | 2450 | GtkTreeIter iter; | 2579 | GtkTreeIter iter; |
604 | 2451 | 2580 | ||
606 | 2452 | if (!get_user_iter (lightdm_user_get_name (user), &iter)) | 2581 | if (!get_iter_by_str (model, &iter, USERS_MODEL_NAME, name)) |
607 | 2582 | { | ||
608 | 2583 | g_warning ("%s: model doesn't contain user '%s'", G_STRFUNC, name); | ||
609 | 2453 | return; | 2584 | return; |
610 | 2585 | } | ||
611 | 2454 | 2586 | ||
613 | 2455 | model = gtk_combo_box_get_model (user_combo); | 2587 | SavedUserSelectionData* user_selection = save_user_selection (); |
614 | 2456 | gtk_list_store_remove (GTK_LIST_STORE (model), &iter); | 2588 | gtk_list_store_remove (GTK_LIST_STORE (model), &iter); |
615 | 2589 | update_manual_login_item (); | ||
616 | 2590 | restore_user_selection (&user_selection, TRUE); | ||
617 | 2457 | } | 2591 | } |
618 | 2458 | 2592 | ||
619 | 2459 | static void | 2593 | static void |
620 | 2460 | load_user_list (void) | 2594 | load_user_list (void) |
621 | 2461 | { | 2595 | { |
625 | 2462 | const GList *items, *item; | 2596 | LightDMUserList *lightdm_users = lightdm_user_list_get_instance (); |
626 | 2463 | GtkTreeModel *model; | 2597 | |
627 | 2464 | GtkTreeIter iter; | 2598 | g_signal_connect (lightdm_users, "user-added", G_CALLBACK (user_added_cb), NULL); |
628 | 2599 | g_signal_connect (lightdm_users, "user-changed", G_CALLBACK (user_changed_cb), NULL); | ||
629 | 2600 | g_signal_connect (lightdm_users, "user-removed", G_CALLBACK (user_removed_cb), NULL); | ||
630 | 2601 | |||
631 | 2602 | if (!gtk_widget_get_visible (GTK_WIDGET (user_combo))) | ||
632 | 2603 | return; | ||
633 | 2604 | |||
634 | 2605 | const GList *users = lightdm_user_list_get_users (lightdm_users); | ||
635 | 2606 | const GList *users_iter; | ||
636 | 2607 | GtkTreeModel *model = gtk_combo_box_get_model (user_combo); | ||
637 | 2608 | GtkTreeIter model_iter; | ||
638 | 2609 | |||
639 | 2610 | for (users_iter = users; users_iter; users_iter = users_iter->next) | ||
640 | 2611 | { | ||
641 | 2612 | LightDMUser *user = users_iter->data; | ||
642 | 2613 | gboolean logged_in = lightdm_user_get_logged_in (user); | ||
643 | 2614 | |||
644 | 2615 | gtk_list_store_append (GTK_LIST_STORE (model), &model_iter); | ||
645 | 2616 | gtk_list_store_set (GTK_LIST_STORE (model), &model_iter, | ||
646 | 2617 | USERS_MODEL_TYPE, USER_TYPE_REGULAR, | ||
647 | 2618 | USERS_MODEL_NAME, lightdm_user_get_name (user), | ||
648 | 2619 | USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user), | ||
649 | 2620 | USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, | ||
650 | 2621 | -1); | ||
651 | 2622 | } | ||
652 | 2623 | |||
653 | 2624 | if (lightdm_greeter_get_has_guest_account_hint (greeter)) | ||
654 | 2625 | { | ||
655 | 2626 | gtk_list_store_append (GTK_LIST_STORE (model), &model_iter); | ||
656 | 2627 | gtk_list_store_set (GTK_LIST_STORE (model), &model_iter, | ||
657 | 2628 | USERS_MODEL_TYPE, USER_TYPE_GUEST, | ||
658 | 2629 | USERS_MODEL_NAME, GUEST_USER_NAME, | ||
659 | 2630 | USERS_MODEL_DISPLAY_NAME, _("Guest Session"), | ||
660 | 2631 | USERS_MODEL_FONT_WEIGHT, PANGO_WEIGHT_NORMAL, | ||
661 | 2632 | -1); | ||
662 | 2633 | } | ||
663 | 2634 | |||
664 | 2635 | update_manual_login_item (); | ||
665 | 2636 | |||
666 | 2637 | /* Initial user selection */ | ||
667 | 2465 | const gchar *selected_user; | 2638 | const gchar *selected_user; |
668 | 2466 | gboolean logged_in = FALSE; | ||
669 | 2467 | |||
670 | 2468 | g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), greeter); | ||
671 | 2469 | g_signal_connect (lightdm_user_list_get_instance (), "user-changed", G_CALLBACK (user_changed_cb), greeter); | ||
672 | 2470 | g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL); | ||
673 | 2471 | model = gtk_combo_box_get_model (user_combo); | ||
674 | 2472 | items = lightdm_user_list_get_users (lightdm_user_list_get_instance ()); | ||
675 | 2473 | for (item = items; item; item = item->next) | ||
676 | 2474 | { | ||
677 | 2475 | LightDMUser *user = item->data; | ||
678 | 2476 | logged_in = lightdm_user_get_logged_in (user); | ||
679 | 2477 | |||
680 | 2478 | gtk_list_store_append (GTK_LIST_STORE (model), &iter); | ||
681 | 2479 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, | ||
682 | 2480 | 0, lightdm_user_get_name (user), | ||
683 | 2481 | 1, lightdm_user_get_display_name (user), | ||
684 | 2482 | 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL, | ||
685 | 2483 | -1); | ||
686 | 2484 | } | ||
687 | 2485 | if (lightdm_greeter_get_has_guest_account_hint (greeter)) | ||
688 | 2486 | { | ||
689 | 2487 | gtk_list_store_append (GTK_LIST_STORE (model), &iter); | ||
690 | 2488 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, | ||
691 | 2489 | 0, "*guest", | ||
692 | 2490 | 1, _("Guest Session"), | ||
693 | 2491 | 2, PANGO_WEIGHT_NORMAL, | ||
694 | 2492 | -1); | ||
695 | 2493 | } | ||
696 | 2494 | |||
697 | 2495 | gtk_list_store_append (GTK_LIST_STORE (model), &iter); | ||
698 | 2496 | gtk_list_store_set (GTK_LIST_STORE (model), &iter, | ||
699 | 2497 | 0, "*other", | ||
700 | 2498 | 1, _("Other..."), | ||
701 | 2499 | 2, PANGO_WEIGHT_NORMAL, | ||
702 | 2500 | -1); | ||
703 | 2501 | |||
704 | 2502 | gchar *last_user = config_get_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, NULL); | 2639 | gchar *last_user = config_get_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, NULL); |
705 | 2503 | 2640 | ||
706 | 2504 | if (lightdm_greeter_get_select_user_hint (greeter)) | 2641 | if (lightdm_greeter_get_select_user_hint (greeter)) |
707 | 2505 | selected_user = lightdm_greeter_get_select_user_hint (greeter); | 2642 | selected_user = lightdm_greeter_get_select_user_hint (greeter); |
708 | 2506 | else if (lightdm_greeter_get_select_guest_hint (greeter)) | 2643 | else if (lightdm_greeter_get_select_guest_hint (greeter)) |
710 | 2507 | selected_user = "*guest"; | 2644 | selected_user = GUEST_USER_NAME; |
711 | 2508 | else if (last_user) | 2645 | else if (last_user) |
712 | 2509 | selected_user = last_user; | 2646 | selected_user = last_user; |
713 | 2510 | else | 2647 | else |
714 | 2511 | selected_user = NULL; | 2648 | selected_user = NULL; |
715 | 2512 | 2649 | ||
717 | 2513 | if (gtk_tree_model_get_iter_first (model, &iter)) | 2650 | if (selected_user && get_iter_by_str (model, &model_iter, USERS_MODEL_NAME, selected_user)) |
718 | 2651 | { | ||
719 | 2652 | gtk_combo_box_set_active_iter (user_combo, &model_iter); | ||
720 | 2653 | set_displayed_user (greeter, selected_user); | ||
721 | 2654 | } | ||
722 | 2655 | else if (gtk_tree_model_get_iter_first (model, &model_iter)) | ||
723 | 2514 | { | 2656 | { |
724 | 2515 | gchar *name; | 2657 | gchar *name; |
750 | 2516 | gboolean matched = FALSE; | 2658 | gtk_tree_model_get (model, &model_iter, USERS_MODEL_NAME, &name, -1); |
751 | 2517 | 2659 | gtk_combo_box_set_active_iter (user_combo, &model_iter); | |
752 | 2518 | if (selected_user) | 2660 | set_displayed_user (greeter, name); |
753 | 2519 | { | 2661 | g_free (name); |
729 | 2520 | do | ||
730 | 2521 | { | ||
731 | 2522 | gtk_tree_model_get (model, &iter, 0, &name, -1); | ||
732 | 2523 | matched = g_strcmp0 (name, selected_user) == 0; | ||
733 | 2524 | g_free (name); | ||
734 | 2525 | if (matched) | ||
735 | 2526 | { | ||
736 | 2527 | gtk_combo_box_set_active_iter (user_combo, &iter); | ||
737 | 2528 | set_displayed_user (greeter, selected_user); | ||
738 | 2529 | break; | ||
739 | 2530 | } | ||
740 | 2531 | } while (gtk_tree_model_iter_next (model, &iter)); | ||
741 | 2532 | } | ||
742 | 2533 | if (!matched) | ||
743 | 2534 | { | ||
744 | 2535 | gtk_tree_model_get_iter_first (model, &iter); | ||
745 | 2536 | gtk_tree_model_get (model, &iter, 0, &name, -1); | ||
746 | 2537 | gtk_combo_box_set_active_iter (user_combo, &iter); | ||
747 | 2538 | set_displayed_user (greeter, name); | ||
748 | 2539 | g_free (name); | ||
749 | 2540 | } | ||
754 | 2541 | } | 2662 | } |
755 | 2542 | 2663 | ||
756 | 2543 | g_free (last_user); | 2664 | g_free (last_user); |
757 | @@ -3059,7 +3180,7 @@ | |||
758 | 3059 | if (lightdm_greeter_get_hide_users_hint (greeter)) | 3180 | if (lightdm_greeter_get_hide_users_hint (greeter)) |
759 | 3060 | { | 3181 | { |
760 | 3061 | set_user_image (NULL); | 3182 | set_user_image (NULL); |
762 | 3062 | start_authentication ("*other"); | 3183 | start_authentication (OTHER_USER_NAME); |
763 | 3063 | } | 3184 | } |
764 | 3064 | else | 3185 | else |
765 | 3065 | { | 3186 | { |
766 | 3066 | 3187 | ||
767 | === modified file 'src/lightdm-gtk-greeter.glade' | |||
768 | --- src/lightdm-gtk-greeter.glade 2015-06-29 15:11:04 +0000 | |||
769 | +++ src/lightdm-gtk-greeter.glade 2015-07-04 17:20:19 +0000 | |||
770 | @@ -343,11 +343,13 @@ | |||
771 | 343 | </object> | 343 | </object> |
772 | 344 | <object class="GtkListStore" id="user_liststore"> | 344 | <object class="GtkListStore" id="user_liststore"> |
773 | 345 | <columns> | 345 | <columns> |
779 | 346 | <!-- column-name username --> | 346 | <!-- column-name type --> |
780 | 347 | <column type="gchararray"/> | 347 | <column type="gint"/> |
781 | 348 | <!-- column-name label --> | 348 | <!-- column-name name --> |
782 | 349 | <column type="gchararray"/> | 349 | <column type="gchararray"/> |
783 | 350 | <!-- column-name weight --> | 350 | <!-- column-name display-name --> |
784 | 351 | <column type="gchararray"/> | ||
785 | 352 | <!-- column-name font-weight --> | ||
786 | 351 | <column type="gint"/> | 353 | <column type="gint"/> |
787 | 352 | </columns> | 354 | </columns> |
788 | 353 | </object> | 355 | </object> |
789 | @@ -418,8 +420,8 @@ | |||
790 | 418 | <child> | 420 | <child> |
791 | 419 | <object class="GtkCellRendererText" id="cellrenderertext1"/> | 421 | <object class="GtkCellRendererText" id="cellrenderertext1"/> |
792 | 420 | <attributes> | 422 | <attributes> |
795 | 421 | <attribute name="text">1</attribute> | 423 | <attribute name="text">2</attribute> |
796 | 422 | <attribute name="weight">2</attribute> | 424 | <attribute name="weight">3</attribute> |
797 | 423 | </attributes> | 425 | </attributes> |
798 | 424 | </child> | 426 | </child> |
799 | 425 | </object> | 427 | </object> |