Codebase list cinnamon-menus / 44ee2de
desktop-entries.c: Refactor to eliminate double-loading of desktop file. Use g_key_file_load_from_file, followed by g_desktop_app_info_new_from_keyfile. Michael Webster 7 years ago
1 changed file(s) with 45 addition(s) and 36 deletion(s). Raw diff Collapse all Expand all
265265 static DesktopEntryResultCode
266266 desktop_entry_load (DesktopEntry *entry)
267267 {
268 DesktopEntryResultCode rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER;
269
268270 if (strstr (entry->path, "/menu-xdg/"))
269 return DESKTOP_ENTRY_LOAD_FAIL_OTHER;
271 return rescode;
272
270273 if (entry->type == DESKTOP_ENTRY_DESKTOP)
271274 {
272275 GKeyFile *key_file = NULL;
273276 DesktopEntryDesktop *entry_desktop = (DesktopEntryDesktop*)entry;
274 const char *categories_str;
275
276 entry_desktop->appinfo = g_desktop_app_info_new_from_filename (entry->path);
277 if (!entry_desktop->appinfo ||
278 !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) ||
279 !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo)))
277
278 key_file = g_key_file_new ();
279
280 if (g_key_file_load_from_file (key_file, entry->path, 0, NULL))
280281 {
281 menu_verbose ("Failed to load \"%s\"\n", entry->path);
282 return DESKTOP_ENTRY_LOAD_FAIL_APPINFO;
282 entry_desktop->appinfo = g_desktop_app_info_new_from_keyfile (key_file);
283
284 if (!entry_desktop->appinfo ||
285 !g_app_info_get_name (G_APP_INFO (entry_desktop->appinfo)) ||
286 !g_app_info_get_executable (G_APP_INFO (entry_desktop->appinfo)))
287 {
288 menu_verbose ("Failed to load appinfo for \"%s\"\n", entry->path);
289 rescode = DESKTOP_ENTRY_LOAD_FAIL_APPINFO;
290 }
291 else
292 {
293 const char *categories_str;
294 categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo);
295
296 if (categories_str)
297 {
298 char **categories;
299 int i;
300
301 categories = g_strsplit (categories_str, ";", -1);
302 entry_desktop->categories = g_new0 (GQuark, g_strv_length (categories) + 1);
303
304 for (i = 0; categories[i]; i++)
305 entry_desktop->categories[i] = g_quark_from_string (categories[i]);
306
307 g_strfreev (categories);
308 }
309
310 entry_desktop->showin = key_file_get_show_in (key_file);
311
312 rescode = DESKTOP_ENTRY_LOAD_SUCCESS;
313 }
283314 }
284
285 categories_str = g_desktop_app_info_get_categories (entry_desktop->appinfo);
286 if (categories_str)
315 else
287316 {
288 char **categories;
289 int i;
290
291 categories = g_strsplit (categories_str, ";", -1);
292 entry_desktop->categories = g_new0 (GQuark, g_strv_length (categories) + 1);
293
294 for (i = 0; categories[i]; i++)
295 entry_desktop->categories[i] = g_quark_from_string (categories[i]);
296
297 g_strfreev (categories);
317 menu_verbose ("Failed to read contents of \"%s\"\n", entry->path);
318 rescode = DESKTOP_ENTRY_LOAD_FAIL_OTHER;
298319 }
299
300 key_file = g_key_file_new ();
301
302 if (!g_key_file_load_from_file (key_file, entry->path, 0, NULL))
303 entry_desktop->showin = TRUE;
304 else
305 entry_desktop->showin = key_file_get_show_in (key_file);
306
307320 g_key_file_free (key_file);
308
309 return DESKTOP_ENTRY_LOAD_SUCCESS;
310321 }
311322 else if (entry->type == DESKTOP_ENTRY_DIRECTORY)
312323 {
313324 GKeyFile *key_file = NULL;
314325 GError *error = NULL;
315 DesktopEntryResultCode rescode = DESKTOP_ENTRY_LOAD_SUCCESS;
326 rescode = DESKTOP_ENTRY_LOAD_SUCCESS;
316327
317328 key_file = g_key_file_new ();
318329
343354 else
344355 menu_verbose ("Failed to load \"%s\"\n", entry->path);
345356 }
346
347 return rescode;
348357 }
349358 else
350359 g_assert_not_reached ();
351360
352 return DESKTOP_ENTRY_LOAD_FAIL_OTHER;
361 return rescode;
353362 }
354363
355364 static gboolean