From e1099e1e5b964a95fb5f38cc92f0acd928802b18 Mon Sep 17 00:00:00 2001 From: longpanda Date: Sun, 25 Apr 2021 10:31:03 +0800 Subject: [PATCH] Add parent option in menu_class plugin. --- .../grub-2.04/grub-core/ventoy/ventoy.c | 4 +- .../grub-2.04/grub-core/ventoy/ventoy_def.h | 3 +- .../grub-core/ventoy/ventoy_plugin.c | 57 +++++++++++++++---- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c index 0422ced5..e10985e8 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy.c @@ -1436,7 +1436,7 @@ static int ventoy_collect_img_files(const char *filename, const struct grub_dirh g_ventoy_img_count++; img->alias = ventoy_plugin_get_menu_alias(vtoy_alias_image_file, img->path); - img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name); + img->class = ventoy_plugin_get_menu_class(vtoy_class_image_file, img->name, img->path); if (!img->class) { img->class = g_menu_class[type]; @@ -1695,7 +1695,7 @@ static int ventoy_dynamic_tree_menu(img_iterator_node *node) else { node->dir[node->dirlen - 1] = 0; - dir_class = ventoy_plugin_get_menu_class(vtoy_class_directory, node->dir); + dir_class = ventoy_plugin_get_menu_class(vtoy_class_directory, node->dir, node->dir); if (!dir_class) { dir_class = "vtoydir"; diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h index beb9530f..45f823f9 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_def.h @@ -830,6 +830,7 @@ typedef struct menu_class { int type; int patlen; + int parent; char pattern[256]; char class[64]; @@ -960,7 +961,7 @@ int ventoy_fill_windows_rtdata(void *buf, char *isopath); int ventoy_plugin_get_persistent_chunklist(const char *isopath, int index, ventoy_img_chunk_list *chunk_list); const char * ventoy_plugin_get_injection(const char *isopath); const char * ventoy_plugin_get_menu_alias(int type, const char *isopath); -const char * ventoy_plugin_get_menu_class(int type, const char *name); +const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path); int ventoy_plugin_check_memdisk(const char *isopath); int ventoy_plugin_get_image_list_index(int type, const char *name); conf_replace * ventoy_plugin_find_conf_replace(const char *iso); diff --git a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c index cd1d1e38..7069b599 100644 --- a/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c +++ b/GRUB2/MOD_SRC/grub-2.04/grub-core/ventoy/ventoy_plugin.c @@ -1305,6 +1305,7 @@ static int ventoy_plugin_injection_entry(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk) { int type; + int parent = 0; const char *key = NULL; const char *class = NULL; VTOY_JSON *pNode = NULL; @@ -1333,12 +1334,21 @@ static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk) for (pNode = json->pstChild; pNode; pNode = pNode->pstNext) { + parent = 0; type = vtoy_class_image_file; key = vtoy_json_get_string_ex(pNode->pstChild, "key"); if (!key) { - key = vtoy_json_get_string_ex(pNode->pstChild, "dir"); - type = vtoy_class_directory; + key = vtoy_json_get_string_ex(pNode->pstChild, "parent"); + if (key) + { + parent = 1; + } + else + { + key = vtoy_json_get_string_ex(pNode->pstChild, "dir"); + type = vtoy_class_directory; + } } class = vtoy_json_get_string_ex(pNode->pstChild, "class"); @@ -1348,6 +1358,7 @@ static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk) if (node) { node->type = type; + node->parent = parent; node->patlen = grub_snprintf(node->pattern, sizeof(node->pattern), "%s", key); grub_snprintf(node->class, sizeof(node->class), "%s", class); @@ -1369,7 +1380,7 @@ static int ventoy_plugin_menuclass_entry(VTOY_JSON *json, const char *isodisk) static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk) { - int type; + const char *name = NULL; const char *key = NULL; const char *class = NULL; VTOY_JSON *pNode = NULL; @@ -1384,18 +1395,23 @@ static int ventoy_plugin_menuclass_check(VTOY_JSON *json, const char *isodisk) for (pNode = json->pstChild; pNode; pNode = pNode->pstNext) { - type = vtoy_class_image_file; + name = "key"; key = vtoy_json_get_string_ex(pNode->pstChild, "key"); if (!key) { - key = vtoy_json_get_string_ex(pNode->pstChild, "dir"); - type = vtoy_class_directory; + name = "parent"; + key = vtoy_json_get_string_ex(pNode->pstChild, "parent"); + if (!key) + { + name = "dir"; + key = vtoy_json_get_string_ex(pNode->pstChild, "dir"); + } } class = vtoy_json_get_string_ex(pNode->pstChild, "class"); if (key && class) { - grub_printf("%s: <%s>\n", (type == vtoy_class_directory) ? "dir" : "key", key); + grub_printf("%s: <%s>\n", name, key); grub_printf("class: <%s>\n\n", class); } } @@ -2182,7 +2198,7 @@ const char * ventoy_plugin_get_menu_alias(int type, const char *isopath) return NULL; } -const char * ventoy_plugin_get_menu_class(int type, const char *name) +const char * ventoy_plugin_get_menu_class(int type, const char *name, const char *path) { int len; menu_class *node = NULL; @@ -2191,21 +2207,38 @@ const char * ventoy_plugin_get_menu_class(int type, const char *name) { return NULL; } - - len = (int)grub_strlen(name); if (vtoy_class_image_file == type) { for (node = g_menu_class_head; node; node = node->next) { - if (node->type == type && node->patlen <= len && grub_strstr(name, node->pattern)) + if (node->type != type) { - return node->class; + continue; + } + + if (node->parent) + { + len = (int)grub_strlen(path); + if ((node->patlen < len) && (path[node->patlen] == '/') && + (grub_strncmp(path, node->pattern, node->patlen) == 0)) + { + return node->class; + } + } + else + { + len = (int)grub_strlen(name); + if ((node->patlen < len) && grub_strstr(name, node->pattern)) + { + return node->class; + } } } } else { + len = (int)grub_strlen(name); for (node = g_menu_class_head; node; node = node->next) { if (node->type == type && node->patlen == len && grub_strncmp(name, node->pattern, len) == 0)