[134] | 1 | # |
---|
| 2 | # Description: Cache the result of ck-history so greeter shows user list immediately after login |
---|
| 3 | # Ubuntu: https://bugs.edge.launchpad.net/ubuntu/karmic/+source/gdm/+bug/400863 |
---|
| 4 | # Upstream: http://bugzilla.gnome.org/show_bug.cgi?id=594344 |
---|
| 5 | # |
---|
| 6 | diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am |
---|
| 7 | index b36aa28..901a71b 100644 |
---|
| 8 | --- a/gui/simple-greeter/Makefile.am |
---|
| 9 | +++ b/gui/simple-greeter/Makefile.am |
---|
| 10 | @@ -10,6 +10,7 @@ AM_CPPFLAGS = \ |
---|
| 11 | -DDMCONFDIR=\""$(dmconfdir)"\" \ |
---|
| 12 | -DGDMCONFDIR=\"$(gdmconfdir)\" \ |
---|
| 13 | -DDATADIR=\""$(datadir)"\" \ |
---|
| 14 | + -DCACHEDIR=\""$(GDM_WORKING_DIR)/.cache"\" \ |
---|
| 15 | -DSYSCONFDIR=\""$(sysconfdir)"\" \ |
---|
| 16 | -DLIBLOCALEDIR=\""$(prefix)/lib/locale"\" \ |
---|
| 17 | -DGNOMELOCALEDIR=\""$(datadir)/locale"\" \ |
---|
| 18 | diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c |
---|
| 19 | index 6c91b3b..3fb8423 100644 |
---|
| 20 | --- a/gui/simple-greeter/gdm-user-manager.c |
---|
| 21 | +++ b/gui/simple-greeter/gdm-user-manager.c |
---|
| 22 | @@ -99,6 +99,8 @@ |
---|
| 23 | "pcap", \ |
---|
| 24 | NULL } |
---|
| 25 | |
---|
| 26 | +#define LOGIN_CACHE_FILE CACHEDIR "/login_frequency.cache" |
---|
| 27 | + |
---|
| 28 | struct GdmUserManagerPrivate |
---|
| 29 | { |
---|
| 30 | GHashTable *users; |
---|
| 31 | @@ -116,6 +118,8 @@ struct GdmUserManagerPrivate |
---|
| 32 | guint ck_history_id; |
---|
| 33 | |
---|
| 34 | guint8 users_dirty : 1; |
---|
| 35 | + guint8 loaded_cache : 1; |
---|
| 36 | + guint8 loading_users : 1; |
---|
| 37 | }; |
---|
| 38 | |
---|
| 39 | enum { |
---|
| 40 | @@ -1274,7 +1278,30 @@ ck_history_watch (GIOChannel *source, |
---|
| 41 | } |
---|
| 42 | |
---|
| 43 | if (done) { |
---|
| 44 | - g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0); |
---|
| 45 | + FILE *fp; |
---|
| 46 | + |
---|
| 47 | + /* Cache login counts */ |
---|
| 48 | + fp = fopen (LOGIN_CACHE_FILE, "w"); |
---|
| 49 | + if (fp != NULL) { |
---|
| 50 | + GHashTableIter iter; |
---|
| 51 | + gpointer value; |
---|
| 52 | + |
---|
| 53 | + g_hash_table_iter_init (&iter, manager->priv->users); |
---|
| 54 | + while (g_hash_table_iter_next (&iter, NULL, &value)) { |
---|
| 55 | + GdmUser *user = (GdmUser *) value; |
---|
| 56 | + fprintf (fp, "%s %lu\n", |
---|
| 57 | + gdm_user_get_user_name (user), |
---|
| 58 | + gdm_user_get_login_frequency (user)); |
---|
| 59 | + } |
---|
| 60 | + fclose (fp); |
---|
| 61 | + } |
---|
| 62 | + else |
---|
| 63 | + g_warning ("Unable to write to login cache file: %s", LOGIN_CACHE_FILE); |
---|
| 64 | + |
---|
| 65 | + if (manager->priv->loading_users) { |
---|
| 66 | + g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0); |
---|
| 67 | + manager->priv->loading_users = FALSE; |
---|
| 68 | + } |
---|
| 69 | |
---|
| 70 | manager->priv->ck_history_id = 0; |
---|
| 71 | return FALSE; |
---|
| 72 | @@ -1472,8 +1499,35 @@ reload_passwd (GdmUserManager *manager) |
---|
| 73 | } |
---|
| 74 | |
---|
| 75 | static void |
---|
| 76 | +load_login_frequency_cache (GdmUserManager *manager) |
---|
| 77 | +{ |
---|
| 78 | + GIOChannel *channel; |
---|
| 79 | + gchar *line; |
---|
| 80 | + |
---|
| 81 | + channel = g_io_channel_new_file (LOGIN_CACHE_FILE, "r", NULL); |
---|
| 82 | + if (channel == NULL) |
---|
| 83 | + return; |
---|
| 84 | + |
---|
| 85 | + while (g_io_channel_read_line (channel, &line, NULL, NULL, NULL) == G_IO_STATUS_NORMAL) { |
---|
| 86 | + process_ck_history_line (manager, line); |
---|
| 87 | + g_free (line); |
---|
| 88 | + } |
---|
| 89 | + |
---|
| 90 | + g_io_channel_close (channel); |
---|
| 91 | + |
---|
| 92 | + if (manager->priv->loading_users) { |
---|
| 93 | + g_signal_emit (G_OBJECT (manager), signals[USERS_LOADED], 0); |
---|
| 94 | + manager->priv->loading_users = FALSE; |
---|
| 95 | + } |
---|
| 96 | +} |
---|
| 97 | + |
---|
| 98 | +static void |
---|
| 99 | reload_users (GdmUserManager *manager) |
---|
| 100 | { |
---|
| 101 | + if (!manager->priv->loaded_cache) { |
---|
| 102 | + load_login_frequency_cache (manager); |
---|
| 103 | + manager->priv->loaded_cache = TRUE; |
---|
| 104 | + } |
---|
| 105 | reload_ck_history (manager); |
---|
| 106 | reload_passwd (manager); |
---|
| 107 | } |
---|
| 108 | @@ -1495,6 +1549,7 @@ queue_reload_users (GdmUserManager *manager) |
---|
| 109 | } |
---|
| 110 | |
---|
| 111 | g_signal_emit (G_OBJECT (manager), signals[LOADING_USERS], 0); |
---|
| 112 | + manager->priv->loading_users = TRUE; |
---|
| 113 | manager->priv->reload_id = g_idle_add ((GSourceFunc)reload_users_timeout, manager); |
---|
| 114 | } |
---|
| 115 | |
---|
| 116 | -- |
---|
| 117 | 1.6.3.3 |
---|
| 118 | |
---|