Merge lp:~kalgasnik/lightdm-gtk-greeter/lp-1445420-greeter-show-manual-login-fixed into lp:~lightdm-gtk-greeter-team/lightdm-gtk-greeter/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
Reviewer Review Type Date Requested Status
Sean Davis Needs Fixing
Review via email: mp+263830@code.launchpad.net

Description of the change

1. Support of "greeter-show-manual-login" option.
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
Andrew P. (kalgasnik) wrote :

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

Unmerged revisions

334. By Andrew P.

Support "greeter-show-manual-login" option (LP: #1445420)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/greeterbackground.c'
--- src/greeterbackground.c 2015-06-26 06:00:10 +0000
+++ src/greeterbackground.c 2015-07-04 17:20:19 +0000
@@ -299,7 +299,7 @@
299299
300/* Implemented in lightdm-gtk-greeter.c */300/* Implemented in lightdm-gtk-greeter.c */
301gpointer greeter_save_focus(GtkWidget* widget);301gpointer greeter_save_focus(GtkWidget* widget);
302void greeter_restore_focus(const gpointer saved_data);302void greeter_restore_focus(gpointer* saved_data);
303303
304static const MonitorConfig DEFAULT_MONITOR_CONFIG =304static const MonitorConfig DEFAULT_MONITOR_CONFIG =
305{305{
@@ -650,11 +650,7 @@
650 if(!priv->active_monitor)650 if(!priv->active_monitor)
651 greeter_background_set_active_monitor(background, NULL);651 greeter_background_set_active_monitor(background, NULL);
652652
653 if(saved_focus)653 greeter_restore_focus(&saved_focus);
654 {
655 greeter_restore_focus(saved_focus);
656 g_free(saved_focus);
657 }
658654
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",
660 G_CALLBACK(greeter_background_monitors_changed_cb),656 G_CALLBACK(greeter_background_monitors_changed_cb),
@@ -802,8 +798,7 @@
802 gtk_container_add(GTK_CONTAINER(active->window), priv->child);798 gtk_container_add(GTK_CONTAINER(active->window), priv->child);
803799
804 gtk_window_present(active->window);800 gtk_window_present(active->window);
805 greeter_restore_focus(focus);801 greeter_restore_focus(&focus);
806 g_free(focus);
807 }802 }
808 else803 else
809 g_warning("[Background] Child widget is destroyed or not defined");804 g_warning("[Background] Child widget is destroyed or not defined");
810805
=== modified file 'src/lightdm-gtk-greeter.c'
--- src/lightdm-gtk-greeter.c 2015-05-18 03:25:42 +0000
+++ src/lightdm-gtk-greeter.c 2015-07-04 17:20:19 +0000
@@ -214,6 +214,27 @@
214static void process_prompts (LightDMGreeter *greeter);214static void process_prompts (LightDMGreeter *greeter);
215static void show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type);215static void show_prompt_cb (LightDMGreeter *greeter, const gchar *text, LightDMPromptType type);
216216
217/* Users list */
218
219typedef enum
220{
221 USERS_MODEL_TYPE,
222 USERS_MODEL_NAME,
223 USERS_MODEL_DISPLAY_NAME,
224 USERS_MODEL_FONT_WEIGHT
225} UsersModelColumn;
226
227typedef enum
228{
229 USER_TYPE_REGULAR,
230 USER_TYPE_GUEST,
231 USER_TYPE_OTHER,
232 USER_TYPE_INVALID
233} UserType;
234
235static const gchar *OTHER_USER_NAME = "*other";
236static const gchar *GUEST_USER_NAME = "*guest";
237
217/* Panel and indicators */238/* Panel and indicators */
218239
219typedef enum240typedef enum
@@ -290,14 +311,28 @@
290311
291static void read_monitor_configuration (const gchar *group, const gchar *name);312static void read_monitor_configuration (const gchar *group, const gchar *name);
292313
293struct SavedFocusData314static gboolean get_iter_by_str (GtkTreeModel *model, GtkTreeIter *iter, gint column, const gchar *value);
315static gint get_iter_by_intr (GtkTreeModel *model, GtkTreeIter *iter, gint column, gint value, gint search_length);
316
317typedef struct
294{318{
295 GtkWidget *widget;319 GtkWidget *widget;
296 gint editable_pos;320 gint editable_pos;
297};321} SavedFocusData;
298322
299gpointer greeter_save_focus(GtkWidget* widget);323SavedFocusData* greeter_save_focus (GtkWidget* widget);
300void greeter_restore_focus(const gpointer saved_data);324/* Restore focus, "focus" will be freed */
325void greeter_restore_focus (SavedFocusData** focus);
326
327typedef struct
328{
329 GtkTreePath *path;
330 UserType type;
331} SavedUserSelectionData;
332
333static SavedUserSelectionData* save_user_selection (void);
334/* Restore saved user selection, saved_data will be freed */
335static void restore_user_selection (SavedUserSelectionData** saved_data, gboolean override_current);
301336
302337
303static void338static void
@@ -318,31 +353,127 @@
318 g_free (background);353 g_free (background);
319}354}
320355
321gpointer356
322greeter_save_focus(GtkWidget* widget)357static gboolean
323{358get_iter_by_str (GtkTreeModel *model, GtkTreeIter *iter, gint column, const gchar *value)
324 GtkWidget *window = gtk_widget_get_toplevel(widget);359{
325 if (!GTK_IS_WINDOW (window))360 if (gtk_tree_model_get_iter_first (model, iter))
361 do
362 {
363 gchar *iter_value;
364 gboolean matched;
365
366 gtk_tree_model_get (model, iter, column, &iter_value, -1);
367 matched = g_strcmp0 (iter_value, value) == 0;
368 g_free (iter_value);
369 if (matched)
370 return TRUE;
371 } while (gtk_tree_model_iter_next (model, iter));
372
373 return FALSE;
374}
375
376static gint
377get_iter_by_intr (GtkTreeModel *model, GtkTreeIter *iter, gint column, gint value, gint search_length)
378{
379 gint length = gtk_tree_model_iter_n_children (model, NULL);
380 GtkTreePath *path = length ? gtk_tree_path_new_from_indices (length - 1, -1) : NULL;
381 gboolean found = FALSE;
382 gint iter_value;
383
384 if (path && gtk_tree_model_get_iter (model, iter, path))
385 {
386 do
387 {
388 gtk_tree_model_get (model, iter, column, &iter_value, -1);
389 found = iter_value == value;
390 } while (!found && --search_length != 0 && gtk_tree_model_iter_previous (model, iter));
391 }
392
393 if (path)
394 gtk_tree_path_free (path);
395 return found;
396}
397
398SavedFocusData*
399greeter_save_focus (GtkWidget *widget)
400{
401 GtkWidget *window = gtk_widget_get_toplevel (widget);
402 if(!GTK_IS_WINDOW (window))
326 return NULL;403 return NULL;
327404 SavedFocusData* focus = g_new0 (SavedFocusData, 1);
328 struct SavedFocusData *data = g_new0 (struct SavedFocusData, 1);405 focus->widget = gtk_window_get_focus (GTK_WINDOW (window));
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;
330 data->editable_pos = GTK_IS_EDITABLE(data->widget) ? gtk_editable_get_position (GTK_EDITABLE (data->widget)) : -1;407 return focus;
408}
409
410void
411greeter_restore_focus (SavedFocusData** pfocus)
412{
413 g_return_if_fail (pfocus != NULL);
414
415 SavedFocusData *focus = *pfocus;
416 if(focus && GTK_IS_WIDGET (focus->widget))
417 {
418 gtk_widget_grab_focus (focus->widget);
419 if (GTK_IS_EDITABLE (focus->widget) && focus->editable_pos > -1)
420 gtk_editable_set_position (GTK_EDITABLE (focus->widget), focus->editable_pos);
421 }
422 g_free (focus);
423 *pfocus = NULL;
424}
425
426static SavedUserSelectionData*
427save_user_selection (void)
428{
429 SavedUserSelectionData *data = g_new0 (SavedUserSelectionData, 1);
430
431 GtkTreeIter active_iter;
432 if (gtk_combo_box_get_active_iter (user_combo, &active_iter))
433 {
434 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
435 data->path = gtk_tree_model_get_path (model, &active_iter);
436 gtk_tree_model_get (model, &active_iter, USERS_MODEL_TYPE, &data->type, -1);
437 }
331438
332 return data;439 return data;
333}440}
334441
335void442static void
336greeter_restore_focus(const gpointer saved_data)443restore_user_selection (SavedUserSelectionData** pdata, gboolean override_current)
337{444{
338 struct SavedFocusData *data = saved_data;445 g_return_if_fail(pdata != NULL);
339446
340 if (!saved_data || !GTK_IS_WIDGET (data->widget))447 SavedUserSelectionData* data = *pdata;
341 return;448 GtkTreeIter active_iter;
342449
343 gtk_widget_grab_focus (data->widget);450 if (override_current || !gtk_combo_box_get_active_iter (user_combo, &active_iter))
344 if (GTK_IS_EDITABLE(data->widget) && data->editable_pos > -1)451 {
345 gtk_editable_set_position(GTK_EDITABLE(data->widget), data->editable_pos);452 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
453 UserType new_active_type;
454 gboolean iter_is_valid = FALSE;
455
456 if (data->path)
457 {
458 iter_is_valid = gtk_tree_model_get_iter (model, &active_iter, data->path);
459 if (iter_is_valid)
460 gtk_tree_model_get (model, &active_iter, USERS_MODEL_TYPE, &new_active_type, -1);
461
462 GtkTreeIter iter;
463 if ((!iter_is_valid || data->type != new_active_type) &&
464 get_iter_by_intr (model, &iter, USERS_MODEL_TYPE, data->type, 2))
465 {
466 iter_is_valid = TRUE;
467 active_iter = iter;
468 }
469 }
470
471 if (iter_is_valid || gtk_tree_model_get_iter_first (model, &active_iter))
472 gtk_combo_box_set_active_iter (user_combo, &active_iter);
473 }
474
475 gtk_tree_path_free (data->path);
476 g_clear_pointer (pdata, g_free);
346}477}
347478
348static void479static void
@@ -1856,24 +1987,6 @@
1856 lightdm_shutdown (NULL);1987 lightdm_shutdown (NULL);
1857}1988}
18581989
1859static void
1860set_login_button_label (LightDMGreeter *greeter, const gchar *username)
1861{
1862 LightDMUser *user;
1863 gboolean logged_in = FALSE;
1864
1865 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
1866 if (user)
1867 logged_in = lightdm_user_get_logged_in (user);
1868 if (logged_in)
1869 gtk_button_set_label (login_button, _("Unlock"));
1870 else
1871 gtk_button_set_label (login_button, _("Log In"));
1872 /* and disable the session and language widgets */
1873 gtk_widget_set_sensitive (GTK_WIDGET (session_menuitem), !logged_in);
1874 gtk_widget_set_sensitive (GTK_WIDGET (language_menuitem), !logged_in);
1875}
1876
1877static guint set_user_background_delayed_id = 0;1990static guint set_user_background_delayed_id = 0;
18781991
1879static gboolean1992static gboolean
@@ -1928,13 +2041,13 @@
19282041
1929 config_set_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, username);2042 config_set_string (STATE_SECTION_GREETER, STATE_KEY_LAST_USER, username);
19302043
1931 if (g_strcmp0 (username, "*other") == 0)2044 if (g_strcmp0 (username, OTHER_USER_NAME) == 0)
1932 {2045 {
1933 gtk_widget_show (GTK_WIDGET (username_entry));2046 gtk_widget_show (GTK_WIDGET (username_entry));
1934 gtk_widget_show (GTK_WIDGET (cancel_button));2047 gtk_widget_show (GTK_WIDGET (cancel_button));
1935 lightdm_greeter_authenticate (greeter, NULL);2048 lightdm_greeter_authenticate (greeter, NULL);
1936 }2049 }
1937 else if (g_strcmp0 (username, "*guest") == 0)2050 else if (g_strcmp0 (username, GUEST_USER_NAME) == 0)
1938 {2051 {
1939 lightdm_greeter_authenticate_as_guest (greeter);2052 lightdm_greeter_authenticate_as_guest (greeter);
1940 }2053 }
@@ -1963,10 +2076,6 @@
1963static void2076static void
1964cancel_authentication (void)2077cancel_authentication (void)
1965{2078{
1966 GtkTreeModel *model;
1967 GtkTreeIter iter;
1968 gboolean other = FALSE;
1969
1970 if (pending_questions)2079 if (pending_questions)
1971 {2080 {
1972 g_slist_free_full (pending_questions, (GDestroyNotify) pam_message_finalize);2081 g_slist_free_full (pending_questions, (GDestroyNotify) pam_message_finalize);
@@ -1974,10 +2083,9 @@
1974 }2083 }
19752084
1976 /* If in authentication then stop that first */2085 /* If in authentication then stop that first */
1977 cancelling = FALSE;2086 cancelling = lightdm_greeter_get_in_authentication (greeter);
1978 if (lightdm_greeter_get_in_authentication (greeter))2087 if (cancelling)
1979 {2088 {
1980 cancelling = TRUE;
1981 lightdm_greeter_cancel_authentication (greeter);2089 lightdm_greeter_cancel_authentication (greeter);
1982 set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);2090 set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);
1983 }2091 }
@@ -1985,22 +2093,19 @@
1985 /* Make sure password entry is back to normal */2093 /* Make sure password entry is back to normal */
1986 gtk_entry_set_visibility (password_entry, FALSE);2094 gtk_entry_set_visibility (password_entry, FALSE);
19872095
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;
1989 model = gtk_combo_box_get_model (user_combo);2097 if (user_type == USER_TYPE_INVALID)
1990
1991 if (gtk_combo_box_get_active_iter (user_combo, &iter))
1992 {2098 {
1993 gchar *user;2099 GtkTreeIter iter;
19942100 if (gtk_combo_box_get_active_iter (user_combo, &iter))
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);
1996 other = (g_strcmp0 (user, "*other") == 0);
1997 g_free (user);
1998 }2102 }
19992103
2000 /* Start a new login or return to the user list */2104 if (user_type == USER_TYPE_OTHER)
2001 if (other || lightdm_greeter_get_hide_users_hint (greeter))2105 /* Force refreshing the prompt_box for "Other" */
2002 start_authentication ("*other");2106 start_authentication (OTHER_USER_NAME);
2003 else2107 else
2108 /* Return to the user list */
2004 gtk_widget_grab_focus (GTK_WIDGET (user_combo));2109 gtk_widget_grab_focus (GTK_WIDGET (user_combo));
2005}2110}
20062111
@@ -2145,51 +2250,51 @@
2145}2250}
21462251
2147static void2252static void
2148set_displayed_user (LightDMGreeter *greeter, const gchar *username)2253set_displayed_user (LightDMGreeter *greeter, const gchar *user_name)
2149{2254{
2150 gchar *user_tooltip;2255 UserType user_type = g_strcmp0 (user_name, OTHER_USER_NAME) == 0 ? USER_TYPE_OTHER :
2151 LightDMUser *user;2256 g_strcmp0 (user_name, GUEST_USER_NAME) == 0 ? USER_TYPE_GUEST : USER_TYPE_REGULAR;
21522257 LightDMUser *user = NULL;
2153 if (g_strcmp0 (username, "*other") == 0)2258 const gchar *user_tooltip = user_name;
2154 {2259 gboolean logged_in = FALSE;
2155 gtk_widget_show (GTK_WIDGET (username_entry));2260
2156 gtk_widget_show (GTK_WIDGET (cancel_button));2261 gtk_widget_set_visible (GTK_WIDGET (username_entry), user_type == USER_TYPE_OTHER);
2157 user_tooltip = g_strdup (_("Other"));2262 gtk_widget_set_visible (GTK_WIDGET (cancel_button), user_type == USER_TYPE_OTHER);
2158 }2263
2159 else2264 if (user_type == USER_TYPE_REGULAR)
2160 {2265 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), user_name);
2161 gtk_widget_hide (GTK_WIDGET (username_entry));2266 else if (user_type == USER_TYPE_OTHER)
2162 gtk_widget_hide (GTK_WIDGET (cancel_button));2267 user_tooltip = _("Other");
2163 user_tooltip = g_strdup (username);2268 else if (user_type == USER_TYPE_GUEST)
2164 }2269 {
21652270 user_tooltip = _("Guest Session");
2166 /* At this moment we do not have information about possible prompts2271 /* At this moment we do not have information about possible prompts
2167 * for current user (except *guest). So, password_entry.visible changed in:2272 * for current user (except *guest). So, password_entry.visible changed in:
2168 * auth_complete_cb2273 * auth_complete_cb
2169 * process_prompts2274 * process_prompts
2170 * and here - for *guest */2275 * and here - for *guest */
2171
2172 if (g_strcmp0 (username, "*guest") == 0)
2173 {
2174 user_tooltip = g_strdup (_("Guest Session"));
2175 gtk_widget_hide (GTK_WIDGET (password_entry));2276 gtk_widget_hide (GTK_WIDGET (password_entry));
2176 gtk_widget_grab_focus (GTK_WIDGET (user_combo));2277 gtk_widget_grab_focus (GTK_WIDGET (user_combo));
2177 }2278 }
21782279
2179 set_login_button_label (greeter, username);
2180 set_user_background (username);
2181 set_user_image (username);
2182 user = lightdm_user_list_get_user_by_name (lightdm_user_list_get_instance (), username);
2183 if (user)2280 if (user)
2184 {2281 {
2282 logged_in = lightdm_user_get_logged_in (user);
2185 set_language (lightdm_user_get_language (user));2283 set_language (lightdm_user_get_language (user));
2186 set_session (lightdm_user_get_session (user));2284 set_session (lightdm_user_get_session (user));
2187 }2285 }
2188 else2286 else
2189 set_language (lightdm_language_get_code (lightdm_get_language ()));2287 set_language (lightdm_language_get_code (lightdm_get_language ()));
2288
2190 gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip);2289 gtk_widget_set_tooltip_text (GTK_WIDGET (user_combo), user_tooltip);
2191 start_authentication (username);2290 gtk_widget_set_sensitive (GTK_WIDGET (session_menuitem), !logged_in);
2192 g_free (user_tooltip);2291 gtk_widget_set_sensitive (GTK_WIDGET (language_menuitem), !logged_in);
2292 gtk_button_set_label (login_button, logged_in ? _("Unlock") : _("Log In"));
2293
2294 set_user_background (user_name);
2295 set_user_image (user_name);
2296
2297 start_authentication (user_name);
2193}2298}
21942299
2195void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter);2300void user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter);
@@ -2197,19 +2302,14 @@
2197void2302void
2198user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter)2303user_combobox_active_changed_cb (GtkComboBox *widget, LightDMGreeter *greeter)
2199{2304{
2200 GtkTreeModel *model;2305 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
2201 GtkTreeIter iter;2306 GtkTreeIter iter;
22022307
2203 model = gtk_combo_box_get_model (user_combo);
2204
2205 if (gtk_combo_box_get_active_iter (user_combo, &iter))2308 if (gtk_combo_box_get_active_iter (user_combo, &iter))
2206 {2309 {
2207 gchar *user;2310 gchar *user;
22082311 gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, USERS_MODEL_NAME, &user, -1);
2209 gtk_tree_model_get (GTK_TREE_MODEL (model), &iter, 0, &user, -1);
2210
2211 set_displayed_user (greeter, user);2312 set_displayed_user (greeter, user);
2212
2213 g_free (user);2313 g_free (user);
2214 }2314 }
2215 set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);2315 set_message_label (LIGHTDM_MESSAGE_TYPE_INFO, NULL);
@@ -2380,164 +2480,185 @@
2380 }2480 }
2381}2481}
23822482
2383static void2483/* Controls visibility of "other" user.
2384user_added_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter)2484 Must be called after any change of users list. */
2385{2485static void
2386 GtkTreeModel *model;2486update_manual_login_item (void)
2387 GtkTreeIter iter;2487{
2388 gboolean logged_in = FALSE;2488 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
23892489 GtkTreeIter other_iter;
2390 model = gtk_combo_box_get_model (user_combo);2490 /* "other" user must be the last, no need to check more than one */
23912491 gboolean other_iter_is_valid = get_iter_by_intr (model, &other_iter, USERS_MODEL_TYPE, USER_TYPE_OTHER, 1);
2392 logged_in = lightdm_user_get_logged_in (user);2492
23932493 gboolean show_manual_login = lightdm_greeter_get_show_manual_login_hint (greeter);
2394 gtk_list_store_append (GTK_LIST_STORE (model), &iter);2494 if (!show_manual_login)
2495 {
2496 GtkTreeIter iter = other_iter;
2497 if (other_iter_is_valid)
2498 /* Force to show if "Other" is the only entry we have */
2499 show_manual_login = !gtk_tree_model_iter_previous (model, &iter);
2500 else
2501 /* Or there are no other entries */
2502 show_manual_login = !gtk_tree_model_get_iter_first (model, &iter);
2503 }
2504
2505 if (show_manual_login && !other_iter_is_valid)
2506 {
2507 gtk_list_store_append (GTK_LIST_STORE (model), &other_iter);
2508 gtk_list_store_set (GTK_LIST_STORE (model), &other_iter,
2509 USERS_MODEL_TYPE, USER_TYPE_OTHER,
2510 USERS_MODEL_NAME, OTHER_USER_NAME,
2511 USERS_MODEL_DISPLAY_NAME, _("Other..."),
2512 USERS_MODEL_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
2513 -1);
2514 }
2515 else if (!show_manual_login && other_iter_is_valid)
2516 {
2517 gtk_list_store_remove (GTK_LIST_STORE (model), &other_iter);
2518 }
2519}
2520
2521static void
2522user_added_cb (LightDMUserList *user_list, LightDMUser *user)
2523{
2524 if (!gtk_widget_get_visible (GTK_WIDGET (user_combo)))
2525 return;
2526
2527 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
2528 GtkTreeIter iter, last_user_iter;
2529 gboolean logged_in = lightdm_user_get_logged_in (user);
2530
2531 /* Insert item before "guest" and "other" accounts */
2532 if (get_iter_by_intr (model, &last_user_iter, USERS_MODEL_TYPE, USER_TYPE_REGULAR, -1))
2533 gtk_list_store_insert_after (GTK_LIST_STORE (model), &iter, &last_user_iter);
2534 else
2535 gtk_list_store_insert_after (GTK_LIST_STORE (model), &iter, NULL);
2536
2537 SavedUserSelectionData* user_selection = save_user_selection ();
2395 gtk_list_store_set (GTK_LIST_STORE (model), &iter,2538 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
2396 0, lightdm_user_get_name (user),2539 USERS_MODEL_TYPE, USER_TYPE_REGULAR,
2397 1, lightdm_user_get_display_name (user),2540 USERS_MODEL_NAME, lightdm_user_get_name (user),
2398 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,2541 USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user),
2542 USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
2399 -1);2543 -1);
2400}2544 update_manual_login_item ();
24012545 restore_user_selection (&user_selection, TRUE);
2402static gboolean
2403get_user_iter (const gchar *username, GtkTreeIter *iter)
2404{
2405 GtkTreeModel *model;
2406
2407 model = gtk_combo_box_get_model (user_combo);
2408
2409 if (!gtk_tree_model_get_iter_first (model, iter))
2410 return FALSE;
2411 do
2412 {
2413 gchar *name;
2414 gboolean matched;
2415
2416 gtk_tree_model_get (model, iter, 0, &name, -1);
2417 matched = g_strcmp0 (name, username) == 0;
2418 g_free (name);
2419 if (matched)
2420 return TRUE;
2421 } while (gtk_tree_model_iter_next (model, iter));
2422
2423 return FALSE;
2424}2546}
24252547
2426static void2548static void
2427user_changed_cb (LightDMUserList *user_list, LightDMUser *user, LightDMGreeter *greeter)2549user_changed_cb (LightDMUserList *user_list, LightDMUser *user)
2428{2550{
2429 GtkTreeModel *model;2551 if (!gtk_widget_get_visible (GTK_WIDGET (user_combo)))
2552 return;
2553
2554 const gchar *name = lightdm_user_get_name (user);
2555 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
2430 GtkTreeIter iter;2556 GtkTreeIter iter;
2431 gboolean logged_in = FALSE;
24322557
2433 if (!get_user_iter (lightdm_user_get_name (user), &iter))2558 if (!get_iter_by_str (model, &iter, USERS_MODEL_NAME, name))
2559 {
2560 g_warning ("%s: model doesn't contain user '%s'", G_STRFUNC, name);
2434 return;2561 return;
2435 logged_in = lightdm_user_get_logged_in (user);2562 }
24362563
2437 model = gtk_combo_box_get_model (user_combo);2564 gboolean logged_in = lightdm_user_get_logged_in (user);
2438
2439 gtk_list_store_set (GTK_LIST_STORE (model), &iter,2565 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
2440 0, lightdm_user_get_name (user),2566 USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user),
2441 1, lightdm_user_get_display_name (user),2567 USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
2442 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
2443 -1);2568 -1);
2444}2569}
24452570
2446static void2571static void
2447user_removed_cb (LightDMUserList *user_list, LightDMUser *user)2572user_removed_cb (LightDMUserList *user_list, LightDMUser *user)
2448{2573{
2449 GtkTreeModel *model;2574 if (!gtk_widget_get_visible (GTK_WIDGET (user_combo)))
2575 return;
2576
2577 const gchar *name = lightdm_user_get_name (user);
2578 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
2450 GtkTreeIter iter;2579 GtkTreeIter iter;
24512580
2452 if (!get_user_iter (lightdm_user_get_name (user), &iter))2581 if (!get_iter_by_str (model, &iter, USERS_MODEL_NAME, name))
2582 {
2583 g_warning ("%s: model doesn't contain user '%s'", G_STRFUNC, name);
2453 return;2584 return;
2585 }
24542586
2455 model = gtk_combo_box_get_model (user_combo);2587 SavedUserSelectionData* user_selection = save_user_selection ();
2456 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);2588 gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
2589 update_manual_login_item ();
2590 restore_user_selection (&user_selection, TRUE);
2457}2591}
24582592
2459static void2593static void
2460load_user_list (void)2594load_user_list (void)
2461{2595{
2462 const GList *items, *item;2596 LightDMUserList *lightdm_users = lightdm_user_list_get_instance ();
2463 GtkTreeModel *model;2597
2464 GtkTreeIter iter;2598 g_signal_connect (lightdm_users, "user-added", G_CALLBACK (user_added_cb), NULL);
2599 g_signal_connect (lightdm_users, "user-changed", G_CALLBACK (user_changed_cb), NULL);
2600 g_signal_connect (lightdm_users, "user-removed", G_CALLBACK (user_removed_cb), NULL);
2601
2602 if (!gtk_widget_get_visible (GTK_WIDGET (user_combo)))
2603 return;
2604
2605 const GList *users = lightdm_user_list_get_users (lightdm_users);
2606 const GList *users_iter;
2607 GtkTreeModel *model = gtk_combo_box_get_model (user_combo);
2608 GtkTreeIter model_iter;
2609
2610 for (users_iter = users; users_iter; users_iter = users_iter->next)
2611 {
2612 LightDMUser *user = users_iter->data;
2613 gboolean logged_in = lightdm_user_get_logged_in (user);
2614
2615 gtk_list_store_append (GTK_LIST_STORE (model), &model_iter);
2616 gtk_list_store_set (GTK_LIST_STORE (model), &model_iter,
2617 USERS_MODEL_TYPE, USER_TYPE_REGULAR,
2618 USERS_MODEL_NAME, lightdm_user_get_name (user),
2619 USERS_MODEL_DISPLAY_NAME, lightdm_user_get_display_name (user),
2620 USERS_MODEL_FONT_WEIGHT, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
2621 -1);
2622 }
2623
2624 if (lightdm_greeter_get_has_guest_account_hint (greeter))
2625 {
2626 gtk_list_store_append (GTK_LIST_STORE (model), &model_iter);
2627 gtk_list_store_set (GTK_LIST_STORE (model), &model_iter,
2628 USERS_MODEL_TYPE, USER_TYPE_GUEST,
2629 USERS_MODEL_NAME, GUEST_USER_NAME,
2630 USERS_MODEL_DISPLAY_NAME, _("Guest Session"),
2631 USERS_MODEL_FONT_WEIGHT, PANGO_WEIGHT_NORMAL,
2632 -1);
2633 }
2634
2635 update_manual_login_item ();
2636
2637 /* Initial user selection */
2465 const gchar *selected_user;2638 const gchar *selected_user;
2466 gboolean logged_in = FALSE;
2467
2468 g_signal_connect (lightdm_user_list_get_instance (), "user-added", G_CALLBACK (user_added_cb), greeter);
2469 g_signal_connect (lightdm_user_list_get_instance (), "user-changed", G_CALLBACK (user_changed_cb), greeter);
2470 g_signal_connect (lightdm_user_list_get_instance (), "user-removed", G_CALLBACK (user_removed_cb), NULL);
2471 model = gtk_combo_box_get_model (user_combo);
2472 items = lightdm_user_list_get_users (lightdm_user_list_get_instance ());
2473 for (item = items; item; item = item->next)
2474 {
2475 LightDMUser *user = item->data;
2476 logged_in = lightdm_user_get_logged_in (user);
2477
2478 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
2479 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
2480 0, lightdm_user_get_name (user),
2481 1, lightdm_user_get_display_name (user),
2482 2, logged_in ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL,
2483 -1);
2484 }
2485 if (lightdm_greeter_get_has_guest_account_hint (greeter))
2486 {
2487 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
2488 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
2489 0, "*guest",
2490 1, _("Guest Session"),
2491 2, PANGO_WEIGHT_NORMAL,
2492 -1);
2493 }
2494
2495 gtk_list_store_append (GTK_LIST_STORE (model), &iter);
2496 gtk_list_store_set (GTK_LIST_STORE (model), &iter,
2497 0, "*other",
2498 1, _("Other..."),
2499 2, PANGO_WEIGHT_NORMAL,
2500 -1);
2501
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);
25032640
2504 if (lightdm_greeter_get_select_user_hint (greeter))2641 if (lightdm_greeter_get_select_user_hint (greeter))
2505 selected_user = lightdm_greeter_get_select_user_hint (greeter);2642 selected_user = lightdm_greeter_get_select_user_hint (greeter);
2506 else if (lightdm_greeter_get_select_guest_hint (greeter))2643 else if (lightdm_greeter_get_select_guest_hint (greeter))
2507 selected_user = "*guest";2644 selected_user = GUEST_USER_NAME;
2508 else if (last_user)2645 else if (last_user)
2509 selected_user = last_user;2646 selected_user = last_user;
2510 else2647 else
2511 selected_user = NULL;2648 selected_user = NULL;
25122649
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))
2651 {
2652 gtk_combo_box_set_active_iter (user_combo, &model_iter);
2653 set_displayed_user (greeter, selected_user);
2654 }
2655 else if (gtk_tree_model_get_iter_first (model, &model_iter))
2514 {2656 {
2515 gchar *name;2657 gchar *name;
2516 gboolean matched = FALSE;2658 gtk_tree_model_get (model, &model_iter, USERS_MODEL_NAME, &name, -1);
25172659 gtk_combo_box_set_active_iter (user_combo, &model_iter);
2518 if (selected_user)2660 set_displayed_user (greeter, name);
2519 {2661 g_free (name);
2520 do
2521 {
2522 gtk_tree_model_get (model, &iter, 0, &name, -1);
2523 matched = g_strcmp0 (name, selected_user) == 0;
2524 g_free (name);
2525 if (matched)
2526 {
2527 gtk_combo_box_set_active_iter (user_combo, &iter);
2528 set_displayed_user (greeter, selected_user);
2529 break;
2530 }
2531 } while (gtk_tree_model_iter_next (model, &iter));
2532 }
2533 if (!matched)
2534 {
2535 gtk_tree_model_get_iter_first (model, &iter);
2536 gtk_tree_model_get (model, &iter, 0, &name, -1);
2537 gtk_combo_box_set_active_iter (user_combo, &iter);
2538 set_displayed_user (greeter, name);
2539 g_free (name);
2540 }
2541 }2662 }
25422663
2543 g_free (last_user);2664 g_free (last_user);
@@ -3059,7 +3180,7 @@
3059 if (lightdm_greeter_get_hide_users_hint (greeter))3180 if (lightdm_greeter_get_hide_users_hint (greeter))
3060 {3181 {
3061 set_user_image (NULL);3182 set_user_image (NULL);
3062 start_authentication ("*other");3183 start_authentication (OTHER_USER_NAME);
3063 }3184 }
3064 else3185 else
3065 {3186 {
30663187
=== modified file 'src/lightdm-gtk-greeter.glade'
--- src/lightdm-gtk-greeter.glade 2015-06-29 15:11:04 +0000
+++ src/lightdm-gtk-greeter.glade 2015-07-04 17:20:19 +0000
@@ -343,11 +343,13 @@
343 </object>343 </object>
344 <object class="GtkListStore" id="user_liststore">344 <object class="GtkListStore" id="user_liststore">
345 <columns>345 <columns>
346 <!-- column-name username -->346 <!-- column-name type -->
347 <column type="gchararray"/>347 <column type="gint"/>
348 <!-- column-name label -->348 <!-- column-name name -->
349 <column type="gchararray"/>349 <column type="gchararray"/>
350 <!-- column-name weight -->350 <!-- column-name display-name -->
351 <column type="gchararray"/>
352 <!-- column-name font-weight -->
351 <column type="gint"/>353 <column type="gint"/>
352 </columns>354 </columns>
353 </object>355 </object>
@@ -418,8 +420,8 @@
418 <child>420 <child>
419 <object class="GtkCellRendererText" id="cellrenderertext1"/>421 <object class="GtkCellRendererText" id="cellrenderertext1"/>
420 <attributes>422 <attributes>
421 <attribute name="text">1</attribute>423 <attribute name="text">2</attribute>
422 <attribute name="weight">2</attribute>424 <attribute name="weight">3</attribute>
423 </attributes>425 </attributes>
424 </child>426 </child>
425 </object>427 </object>

Subscribers

People subscribed via source and target branches