source: proiecte/PPPP/gdm/debian/patches/13_cache_ck_history.patch @ 134

Last change on this file since 134 was 134, checked in by (none), 14 years ago

gdm sources with the modifications for webcam

File size: 4.1 KB
RevLine 
[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#
6diff --git a/gui/simple-greeter/Makefile.am b/gui/simple-greeter/Makefile.am
7index 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"\"        \
18diff --git a/gui/simple-greeter/gdm-user-manager.c b/gui/simple-greeter/gdm-user-manager.c
19index 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--
1171.6.3.3
118
Note: See TracBrowser for help on using the repository browser.