aboutsummaryrefslogtreecommitdiff
path: root/x11-toolkits/gtk30/files/patch-gtk_gtkiconcache.c
blob: f875c2e799b5f2baf749f30f3ebd5dac348b54ae (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
--- gtk/gtkiconcache.c.orig	Mon Aug 29 07:05:13 2005
+++ gtk/gtkiconcache.c	Sat Nov 19 19:14:10 2005
@@ -75,6 +75,37 @@
     }
 }
 
+static gboolean
+is_uptodate (const char *dirname, time_t cache_mtime)
+{
+  GDir *dir;
+  const char *filename;
+  gboolean uptodate = TRUE;
+
+  dir = g_dir_open (dirname, 0, NULL);
+  if (! dir)
+    return TRUE;
+
+  while (uptodate && (filename = g_dir_read_name (dir)))
+    if (filename[0] != '.')
+      {
+	char *pathname;
+	struct stat st;
+
+	pathname = g_build_filename (dirname, filename, NULL);
+	if (g_stat (pathname, &st) >= 0
+	    && (cache_mtime < st.st_mtime
+		|| (S_ISDIR (st.st_mode)
+		    && ! is_uptodate (pathname, cache_mtime))))
+	    uptodate = FALSE;
+	g_free(pathname);
+      }
+
+  g_dir_close(dir);
+
+  return uptodate;
+}
+
 GtkIconCache *
 _gtk_icon_cache_new_for_path (const gchar *path)
 {
@@ -106,7 +137,7 @@
     goto done;
 
   /* Verify cache is uptodate */
-  if (st.st_mtime < path_st.st_mtime)
+  if (st.st_mtime < path_st.st_mtime || ! is_uptodate(path, st.st_mtime))
     {
       GTK_NOTE (ICONTHEME, 
 		g_print ("cache outdated\n"));