2355 | 2355 |
}
|
2356 | 2356 |
|
2357 | 2357 |
static void
|
2358 | |
add_filename_include (const char *desktop_file_id,
|
2359 | |
DesktopEntry *entry,
|
2360 | |
MenuLayoutNode *include)
|
2361 | |
{
|
2362 | |
if (!desktop_entry_has_categories (entry))
|
2363 | |
{
|
2364 | |
MenuLayoutNode *node;
|
2365 | |
|
2366 | |
node = menu_layout_node_new (MENU_LAYOUT_NODE_FILENAME);
|
2367 | |
menu_layout_node_set_content (node, desktop_file_id);
|
2368 | |
|
2369 | |
menu_layout_node_append_child (include, node);
|
2370 | |
menu_layout_node_unref (node);
|
2371 | |
}
|
2372 | |
}
|
2373 | |
|
2374 | |
static void
|
2375 | |
is_dot_directory (const char *basename,
|
2376 | |
DesktopEntry *entry,
|
2377 | |
gboolean *has_dot_directory)
|
2378 | |
{
|
2379 | |
if (!strcmp (basename, ".directory"))
|
2380 | |
*has_dot_directory = TRUE;
|
2381 | |
}
|
2382 | |
|
2383 | |
static gboolean
|
2384 | |
add_menu_for_legacy_dir (MenuLayoutNode *parent,
|
2385 | |
const char *legacy_dir,
|
2386 | |
const char *relative_path,
|
2387 | |
const char *legacy_prefix,
|
2388 | |
const char *menu_name)
|
2389 | |
{
|
2390 | |
EntryDirectory *ed;
|
2391 | |
DesktopEntrySet *desktop_entries;
|
2392 | |
DesktopEntrySet *directory_entries;
|
2393 | |
GSList *subdirs;
|
2394 | |
gboolean menu_added;
|
2395 | |
gboolean has_dot_directory;
|
2396 | |
|
2397 | |
ed = entry_directory_new_legacy (DESKTOP_ENTRY_INVALID, legacy_dir, legacy_prefix);
|
2398 | |
if (!ed)
|
2399 | |
return FALSE;
|
2400 | |
|
2401 | |
subdirs = NULL;
|
2402 | |
desktop_entries = desktop_entry_set_new ();
|
2403 | |
directory_entries = desktop_entry_set_new ();
|
2404 | |
|
2405 | |
entry_directory_get_flat_contents (ed,
|
2406 | |
desktop_entries,
|
2407 | |
directory_entries,
|
2408 | |
&subdirs);
|
2409 | |
entry_directory_unref (ed);
|
2410 | |
|
2411 | |
has_dot_directory = FALSE;
|
2412 | |
desktop_entry_set_foreach (directory_entries,
|
2413 | |
(DesktopEntrySetForeachFunc) is_dot_directory,
|
2414 | |
&has_dot_directory);
|
2415 | |
desktop_entry_set_unref (directory_entries);
|
2416 | |
|
2417 | |
menu_added = FALSE;
|
2418 | |
if (desktop_entry_set_get_count (desktop_entries) > 0 || subdirs)
|
2419 | |
{
|
2420 | |
MenuLayoutNode *menu;
|
2421 | |
MenuLayoutNode *node;
|
2422 | |
GString *subdir_path;
|
2423 | |
GString *subdir_relative;
|
2424 | |
GSList *tmp;
|
2425 | |
int legacy_dir_len;
|
2426 | |
int relative_path_len;
|
2427 | |
|
2428 | |
menu = menu_layout_node_new (MENU_LAYOUT_NODE_MENU);
|
2429 | |
menu_layout_node_append_child (parent, menu);
|
2430 | |
|
2431 | |
menu_added = TRUE;
|
2432 | |
|
2433 | |
g_assert (menu_name != NULL);
|
2434 | |
|
2435 | |
node = menu_layout_node_new (MENU_LAYOUT_NODE_NAME);
|
2436 | |
menu_layout_node_set_content (node, menu_name);
|
2437 | |
menu_layout_node_append_child (menu, node);
|
2438 | |
menu_layout_node_unref (node);
|
2439 | |
|
2440 | |
if (has_dot_directory)
|
2441 | |
{
|
2442 | |
node = menu_layout_node_new (MENU_LAYOUT_NODE_DIRECTORY);
|
2443 | |
if (relative_path != NULL)
|
2444 | |
{
|
2445 | |
char *directory_entry_path;
|
2446 | |
|
2447 | |
directory_entry_path = g_strdup_printf ("%s/.directory", relative_path);
|
2448 | |
menu_layout_node_set_content (node, directory_entry_path);
|
2449 | |
g_free (directory_entry_path);
|
2450 | |
}
|
2451 | |
else
|
2452 | |
{
|
2453 | |
menu_layout_node_set_content (node, ".directory");
|
2454 | |
}
|
2455 | |
menu_layout_node_append_child (menu, node);
|
2456 | |
menu_layout_node_unref (node);
|
2457 | |
}
|
2458 | |
|
2459 | |
if (desktop_entry_set_get_count (desktop_entries) > 0)
|
2460 | |
{
|
2461 | |
MenuLayoutNode *include;
|
2462 | |
|
2463 | |
include = menu_layout_node_new (MENU_LAYOUT_NODE_INCLUDE);
|
2464 | |
menu_layout_node_append_child (menu, include);
|
2465 | |
|
2466 | |
desktop_entry_set_foreach (desktop_entries,
|
2467 | |
(DesktopEntrySetForeachFunc) add_filename_include,
|
2468 | |
include);
|
2469 | |
|
2470 | |
menu_layout_node_unref (include);
|
2471 | |
}
|
2472 | |
|
2473 | |
subdir_path = g_string_new (legacy_dir);
|
2474 | |
legacy_dir_len = strlen (legacy_dir);
|
2475 | |
|
2476 | |
subdir_relative = g_string_new (relative_path);
|
2477 | |
relative_path_len = relative_path ? strlen (relative_path) : 0;
|
2478 | |
|
2479 | |
tmp = subdirs;
|
2480 | |
while (tmp != NULL)
|
2481 | |
{
|
2482 | |
const char *subdir = tmp->data;
|
2483 | |
|
2484 | |
g_string_append_c (subdir_path, G_DIR_SEPARATOR);
|
2485 | |
g_string_append (subdir_path, subdir);
|
2486 | |
|
2487 | |
if (relative_path_len)
|
2488 | |
{
|
2489 | |
g_string_append_c (subdir_relative, G_DIR_SEPARATOR);
|
2490 | |
}
|
2491 | |
g_string_append (subdir_relative, subdir);
|
2492 | |
|
2493 | |
add_menu_for_legacy_dir (menu,
|
2494 | |
subdir_path->str,
|
2495 | |
subdir_relative->str,
|
2496 | |
legacy_prefix,
|
2497 | |
subdir);
|
2498 | |
|
2499 | |
g_string_truncate (subdir_relative, relative_path_len);
|
2500 | |
g_string_truncate (subdir_path, legacy_dir_len);
|
2501 | |
|
2502 | |
tmp = tmp->next;
|
2503 | |
}
|
2504 | |
|
2505 | |
g_string_free (subdir_path, TRUE);
|
2506 | |
g_string_free (subdir_relative, TRUE);
|
2507 | |
|
2508 | |
menu_layout_node_unref (menu);
|
2509 | |
}
|
2510 | |
|
2511 | |
desktop_entry_set_unref (desktop_entries);
|
2512 | |
|
2513 | |
g_slist_foreach (subdirs, (GFunc) g_free, NULL);
|
2514 | |
g_slist_free (subdirs);
|
2515 | |
|
2516 | |
return menu_added;
|
2517 | |
}
|
2518 | |
|
2519 | |
static void
|
2520 | |
resolve_legacy_dir (GMenuTree *tree,
|
2521 | |
GHashTable *loaded_menu_files,
|
2522 | |
MenuLayoutNode *legacy)
|
2523 | |
{
|
2524 | |
MenuLayoutNode *to_merge;
|
2525 | |
MenuLayoutNode *menu;
|
2526 | |
|
2527 | |
to_merge = menu_layout_node_new (MENU_LAYOUT_NODE_ROOT);
|
2528 | |
|
2529 | |
menu = menu_layout_node_get_parent (legacy);
|
2530 | |
g_assert (menu_layout_node_get_type (menu) == MENU_LAYOUT_NODE_MENU);
|
2531 | |
|
2532 | |
if (add_menu_for_legacy_dir (to_merge,
|
2533 | |
menu_layout_node_get_content (legacy),
|
2534 | |
NULL,
|
2535 | |
menu_layout_node_legacy_dir_get_prefix (legacy),
|
2536 | |
menu_layout_node_menu_get_name (menu)))
|
2537 | |
{
|
2538 | |
merge_resolved_children (tree, loaded_menu_files, legacy, to_merge);
|
2539 | |
}
|
2540 | |
|
2541 | |
menu_layout_node_unref (to_merge);
|
2542 | |
}
|
2543 | |
|
2544 | |
static MenuLayoutNode *
|
2545 | |
add_legacy_dir (GMenuTree *tree,
|
2546 | |
GHashTable *loaded_menu_files,
|
2547 | |
MenuLayoutNode *before,
|
2548 | |
const char *data_dir)
|
2549 | |
{
|
2550 | |
MenuLayoutNode *legacy;
|
2551 | |
char *dirname;
|
2552 | |
|
2553 | |
dirname = g_build_filename (data_dir, "applnk", NULL);
|
2554 | |
|
2555 | |
legacy = menu_layout_node_new (MENU_LAYOUT_NODE_LEGACY_DIR);
|
2556 | |
menu_layout_node_set_content (legacy, dirname);
|
2557 | |
menu_layout_node_legacy_dir_set_prefix (legacy, "kde");
|
2558 | |
menu_layout_node_insert_before (before, legacy);
|
2559 | |
menu_layout_node_unref (before);
|
2560 | |
|
2561 | |
menu_verbose ("Adding <LegacyDir>%s</LegacyDir> in <KDELegacyDirs/>\n",
|
2562 | |
dirname);
|
2563 | |
|
2564 | |
resolve_legacy_dir (tree, loaded_menu_files, legacy);
|
2565 | |
|
2566 | |
g_free (dirname);
|
2567 | |
|
2568 | |
return legacy;
|
2569 | |
}
|
2570 | |
|
2571 | |
static void
|
2572 | |
resolve_kde_legacy_dirs (GMenuTree *tree,
|
2573 | |
GHashTable *loaded_menu_files,
|
2574 | |
MenuLayoutNode *layout)
|
2575 | |
{
|
2576 | |
MenuLayoutNode *before;
|
2577 | |
const char * const *system_data_dirs;
|
2578 | |
int i;
|
2579 | |
|
2580 | |
system_data_dirs = g_get_system_data_dirs ();
|
2581 | |
|
2582 | |
before = add_legacy_dir (tree,
|
2583 | |
loaded_menu_files,
|
2584 | |
menu_layout_node_ref (layout),
|
2585 | |
g_get_user_data_dir ());
|
2586 | |
|
2587 | |
i = 0;
|
2588 | |
while (system_data_dirs[i] != NULL)
|
2589 | |
{
|
2590 | |
before = add_legacy_dir (tree, loaded_menu_files, before, system_data_dirs[i]);
|
2591 | |
|
2592 | |
++i;
|
2593 | |
}
|
2594 | |
|
2595 | |
menu_layout_node_unref (before);
|
2596 | |
|
2597 | |
/* remove the now-replaced node */
|
2598 | |
menu_layout_node_unlink (layout);
|
2599 | |
}
|
2600 | |
|
2601 | |
static void
|
2602 | 2358 |
gmenu_tree_resolve_files (GMenuTree *tree,
|
2603 | 2359 |
GHashTable *loaded_menu_files,
|
2604 | 2360 |
MenuLayoutNode *layout)
|
|
2631 | 2387 |
break;
|
2632 | 2388 |
|
2633 | 2389 |
case MENU_LAYOUT_NODE_LEGACY_DIR:
|
2634 | |
resolve_legacy_dir (tree, loaded_menu_files, layout);
|
|
2390 |
menu_verbose ("Ignoring obsolete legacy dir");
|
2635 | 2391 |
break;
|
2636 | 2392 |
|
2637 | 2393 |
case MENU_LAYOUT_NODE_KDE_LEGACY_DIRS:
|
2638 | |
resolve_kde_legacy_dirs (tree, loaded_menu_files, layout);
|
|
2394 |
menu_verbose ("Ignoring obsolete KDE legacy dirs");
|
2639 | 2395 |
break;
|
2640 | 2396 |
|
2641 | 2397 |
case MENU_LAYOUT_NODE_PASSTHROUGH:
|