1
# Description: Support a desktop.<localename>.cache file in e. g. /usr/share/applications/ to speed up menu loading. Those are generated with update-gnome-menus-cache <dir>.
2
Index: gnome-menus-2.30.0/libmenu/desktop-entries.c
3
===================================================================
4
--- gnome-menus-2.30.0.orig/libmenu/desktop-entries.c 2010-04-08 16:06:20.323460889 +0200
5
+++ gnome-menus-2.30.0/libmenu/desktop-entries.c 2010-04-08 16:06:20.353459954 +0200
10
+desktop_entry_load_from_keyfile (DesktopEntry*, GKeyFile*, const char *, gboolean);
12
+static DesktopEntry *
13
desktop_entry_load (DesktopEntry *entry)
15
DesktopEntry *retval = NULL;
18
const char *desktop_entry_group;
22
key_file = g_key_file_new ();
28
+ retval = desktop_entry_load_from_keyfile (entry, key_file, desktop_entry_group, TRUE);
31
+ g_key_file_free (key_file);
34
+ desktop_entry_unref (entry);
40
+static DesktopEntry *
41
+desktop_entry_load_from_keyfile (DesktopEntry *entry,
43
+ const char *desktop_entry_group,
48
+ DesktopEntry *retval = NULL;
50
if (!g_key_file_has_key (key_file, desktop_entry_group, "Name", NULL))
52
menu_verbose ("\"%s\" contains no \"Name\" key\n", entry->path);
56
#define GET_LOCALE_STRING(n) g_key_file_get_locale_string (key_file, desktop_entry_group, (n), NULL, NULL)
57
+#define GET_STRING(n) g_key_file_get_string (key_file, desktop_entry_group, (n), NULL)
59
- retval->name = GET_LOCALE_STRING ("Name");
60
- retval->generic_name = GET_LOCALE_STRING ("GenericName");
61
- retval->full_name = GET_LOCALE_STRING ("X-GNOME-FullName");
62
- retval->comment = GET_LOCALE_STRING ("Comment");
63
- retval->icon = GET_LOCALE_STRING ("Icon");
66
+ retval->name = GET_LOCALE_STRING ("Name");
67
+ retval->generic_name = GET_LOCALE_STRING ("GenericName");
68
+ retval->full_name = GET_LOCALE_STRING ("X-GNOME-FullName");
69
+ retval->comment = GET_LOCALE_STRING ("Comment");
70
+ retval->icon = GET_LOCALE_STRING ("Icon");
74
+ retval->name = GET_STRING ("Name");
75
+ retval->generic_name = GET_STRING ("GenericName");
76
+ retval->full_name = GET_STRING ("X-GNOME-FullName");
77
+ retval->comment = GET_STRING ("Comment");
78
+ retval->icon = GET_STRING ("Icon");
80
retval->flags = get_flags_from_key_file (retval, key_file, desktop_entry_group);
81
retval->categories = get_categories_from_key_file (retval, key_file, desktop_entry_group);
84
retval->flags & DESKTOP_ENTRY_TRYEXEC_FAILED ? "(true)" : "(false)");
87
- g_key_file_free (key_file);
90
- desktop_entry_unref (entry);
99
+desktop_entry_new_from_keyfile (GKeyFile *key_file,
101
+ const char *directory)
103
+ DesktopEntry *retval;
105
+ menu_verbose ("Generating desktop entry from key file group \"%s\"\n", group);
107
+ retval = g_new0 (DesktopEntry, 1);
109
+ retval->refcount = 1;
110
+ retval->type = DESKTOP_ENTRY_DESKTOP;
111
+ retval->path = g_strdup_printf ("%s/%s.desktop", directory, group);
112
+ retval->basename = g_path_get_basename (retval->path);
114
+ retval = desktop_entry_load_from_keyfile (retval, key_file, group, FALSE);
120
desktop_entry_reload (DesktopEntry *entry)
122
g_return_val_if_fail (entry != NULL, NULL);
123
Index: gnome-menus-2.30.0/libmenu/desktop-entries.h
124
===================================================================
125
--- gnome-menus-2.30.0.orig/libmenu/desktop-entries.h 2010-01-14 04:03:53.000000000 +0100
126
+++ gnome-menus-2.30.0/libmenu/desktop-entries.h 2010-04-08 16:06:20.353459954 +0200
128
typedef struct DesktopEntry DesktopEntry;
130
DesktopEntry *desktop_entry_new (const char *path);
131
+DesktopEntry *desktop_entry_new_from_keyfile (GKeyFile *key, const char *group, const char *directory);
133
DesktopEntry *desktop_entry_ref (DesktopEntry *entry);
134
DesktopEntry *desktop_entry_copy (DesktopEntry *entry);
135
Index: gnome-menus-2.30.0/libmenu/entry-directories.c
136
===================================================================
137
--- gnome-menus-2.30.0.orig/libmenu/entry-directories.c 2010-01-14 04:03:53.000000000 +0100
138
+++ gnome-menus-2.30.0/libmenu/entry-directories.c 2010-04-08 16:06:23.163462272 +0200
141
#include <sys/types.h>
145
#include "menu-util.h"
146
#include "menu-monitor.h"
151
+cached_dir_add_keyfile_entry (CachedDir *dir,
156
+ DesktopEntry *entry;
159
+ entry = desktop_entry_new_from_keyfile (keyfile, group, path);
163
+ /* subdirectory? */
164
+ dirsplit = g_strsplit (group, "/", 2);
165
+ if (dirsplit[1] == NULL)
166
+ dir->entries = g_slist_prepend (dir->entries, entry);
170
+ subdir = find_subdir (dir, dirsplit[0]);
171
+ if (subdir == NULL)
173
+ subdir = cached_dir_new(dirsplit[0]);
174
+ subdir->parent = dir;
175
+ dir->subdirs = g_slist_prepend (dir->subdirs, subdir);
178
+ subdir->entries = g_slist_prepend (subdir->entries, entry);
181
+ g_strfreev (dirsplit);
187
cached_dir_update_entry (CachedDir *dir,
188
const char *basename,
194
+cached_dir_load_entries_from_cache_file (CachedDir *dir,
195
+ const char *dirname)
197
+ gchar cache_file[PATH_MAX];
203
+ /* ignore cache if we have $LANGUAGE */
204
+ locale = g_getenv ("LANGUAGE");
205
+ if (locale != NULL && *locale != '\0')
207
+ menu_verbose ("cached_dir_load_entries_from_cache_file(): $LANGUAGE present, not using cache\n");
211
+ locale = g_strdup (setlocale (LC_MESSAGES, NULL));
212
+ if (locale == NULL)
214
+ menu_verbose ("cached_dir_load_entries_from_cache_file(): setlocale() failed, aborting\n");
218
+ /* canonicalize .UTF-8 to .utf8 (only happens at end of string) */
219
+ s = strstr (locale, ".UTF-8");
221
+ strcpy (s, ".utf8");
223
+ g_snprintf (cache_file, sizeof(cache_file), "%s/desktop.%s.cache", dirname, locale);
226
+ menu_verbose ("Attempting to read entries from cache file %s\n",
229
+ kf = g_key_file_new ();
230
+ if (!g_key_file_load_from_file (kf, cache_file, G_KEY_FILE_NONE, NULL))
233
+ names = g_key_file_get_groups(kf, NULL);
234
+ for (i = names; *i != NULL; ++i)
235
+ cached_dir_add_keyfile_entry (dir, kf, *i, dirname);
237
+ g_strfreev (names);
238
+ g_key_file_free (kf);
244
cached_dir_load_entries_recursive (CachedDir *dir,
248
menu_verbose ("Attempting to read entries from %s (full path %s)\n",
251
+ if (cached_dir_load_entries_from_cache_file (dir, dirname))
253
+ menu_verbose ("Got from file cache\n");
254
+ cached_dir_ensure_monitor (dir, dirname);
255
+ dir->have_read_entries = TRUE;
259
dp = opendir (dirname);