* [PATCH 1/3] Customization of GRUB menu title
2025-05-26 17:50 [PATCH 0/3] Allow script-configurable GRUB menu title Jiří 'bindiff' Wolker via Grub-devel
@ 2025-05-26 17:53 ` Jiří 'bindiff' Wolker via Grub-devel
2025-05-26 18:16 ` Jiří Wolker via Grub-devel
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: Jiří 'bindiff' Wolker via Grub-devel @ 2025-05-26 17:53 UTC (permalink / raw)
To: grub-devel; +Cc: Jiří 'bindiff' Wolker
Since these changes, the module ‘normal’ initializes environment variable
‘grub_menu_title’ with the previously hardcoded text. The variable is
automatically exported, so it applies also to submenus.
Scripts may change this variable to change the title of the menu.
---
grub-core/normal/main.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
index 96abfda2f..a2f7baffa 100644
--- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c
@@ -203,19 +203,18 @@ grub_normal_init_page (struct grub_term_output *term,
{
grub_ssize_t msg_len;
int posx;
- char *msg_formatted;
+ const char *msg_title;
grub_uint32_t *unicode_msg;
grub_uint32_t *last_position;
grub_term_cls (term);
- msg_formatted = grub_xasprintf (_("GNU GRUB version %s"),
PACKAGE_VERSION);
- if (!msg_formatted)
+ msg_title = grub_env_get ("grub_menu_title");
+ if (!msg_title)
return;
- msg_len = grub_utf8_to_ucs4_alloc (msg_formatted,
+ msg_len = grub_utf8_to_ucs4_alloc (msg_title,
&unicode_msg, &last_position);
- grub_free (msg_formatted);
if (msg_len < 0)
{
@@ -315,6 +314,16 @@ static grub_err_t
grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
+ if (grub_env_get ("grub_menu_title") == NULL)
+ {
+ /* Initialize the menu title with a GRUB version information. */
+ char *title;
+ title = grub_xasprintf (_("GNU GRUB version %s"), PACKAGE_VERSION);
+ grub_env_set ("grub_menu_title", title);
+ grub_free (title);
+ grub_env_export ("grub_menu_title");
+ }
+
if (argc == 0)
{
/* Guess the config filename. It is necessary to make CONFIG static,
--
2.45.3
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 1/3] Customization of GRUB menu title
2025-05-26 17:50 [PATCH 0/3] Allow script-configurable GRUB menu title Jiří 'bindiff' Wolker via Grub-devel
2025-05-26 17:53 ` [PATCH 1/3] Customization of " Jiří 'bindiff' Wolker via Grub-devel
@ 2025-05-26 18:16 ` Jiří Wolker via Grub-devel
2025-05-26 18:18 ` [PATCH 2/3] Option to set title of submenus Jiří Wolker via Grub-devel
2025-05-26 18:19 ` [PATCH 3/3] Documentation for the --menutitle option Jiří Wolker via Grub-devel
3 siblings, 0 replies; 8+ messages in thread
From: Jiří Wolker via Grub-devel @ 2025-05-26 18:16 UTC (permalink / raw)
To: grub-devel; +Cc: Jiří Wolker
Since these changes, the module ‘normal’ initializes environment variable
‘grub_menu_title’ with the previously hardcoded text. The variable is
automatically exported, so it applies also to submenus.
Scripts may change this variable to change the title of the menu.
---
grub-core/normal/main.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
index 96abfda2f..a2f7baffa 100644
--- a/grub-core/normal/main.c
+++ b/grub-core/normal/main.c
@@ -203,19 +203,18 @@ grub_normal_init_page (struct grub_term_output *term,
{
grub_ssize_t msg_len;
int posx;
- char *msg_formatted;
+ const char *msg_title;
grub_uint32_t *unicode_msg;
grub_uint32_t *last_position;
grub_term_cls (term);
- msg_formatted = grub_xasprintf (_("GNU GRUB version %s"), PACKAGE_VERSION);
- if (!msg_formatted)
+ msg_title = grub_env_get ("grub_menu_title");
+ if (!msg_title)
return;
- msg_len = grub_utf8_to_ucs4_alloc (msg_formatted,
+ msg_len = grub_utf8_to_ucs4_alloc (msg_title,
&unicode_msg, &last_position);
- grub_free (msg_formatted);
if (msg_len < 0)
{
@@ -315,6 +314,16 @@ static grub_err_t
grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
int argc, char *argv[])
{
+ if (grub_env_get ("grub_menu_title") == NULL)
+ {
+ /* Initialize the menu title with a GRUB version information. */
+ char *title;
+ title = grub_xasprintf (_("GNU GRUB version %s"), PACKAGE_VERSION);
+ grub_env_set ("grub_menu_title", title);
+ grub_free (title);
+ grub_env_export ("grub_menu_title");
+ }
+
if (argc == 0)
{
/* Guess the config filename. It is necessary to make CONFIG static,
2.45.3
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/3] Option to set title of submenus
2025-05-26 17:50 [PATCH 0/3] Allow script-configurable GRUB menu title Jiří 'bindiff' Wolker via Grub-devel
2025-05-26 17:53 ` [PATCH 1/3] Customization of " Jiří 'bindiff' Wolker via Grub-devel
2025-05-26 18:16 ` Jiří Wolker via Grub-devel
@ 2025-05-26 18:18 ` Jiří Wolker via Grub-devel
2025-05-27 10:43 ` sudhakar
2025-05-26 18:19 ` [PATCH 3/3] Documentation for the --menutitle option Jiří Wolker via Grub-devel
3 siblings, 1 reply; 8+ messages in thread
From: Jiří Wolker via Grub-devel @ 2025-05-26 18:18 UTC (permalink / raw)
To: grub-devel; +Cc: Jiří Wolker
---
grub-core/commands/menuentry.c | 50 ++++++++++++++++++++++++++++++++++
1 file changed, 50 insertions(+)
diff --git a/grub-core/commands/menuentry.c b/grub-core/commands/menuentry.c
index 720e6d8ea..c40b27d8b 100644
--- a/grub-core/commands/menuentry.c
+++ b/grub-core/commands/menuentry.c
@@ -43,6 +43,9 @@ static const struct grub_arg_option options[] =
anyone can boot it. */
{"unrestricted", 0, 0, N_("This entry can be booted by any user."),
0, ARG_TYPE_NONE},
+ {"menutitle", 0, 0,
+ N_("Use STRING as menu title. When omitted, use the entry label."),
+ N_("TITLE"), ARG_TYPE_STRING},
{0, 0, 0, 0, 0, 0}
};
@@ -252,12 +255,46 @@ setparams_prefix (int argc, char **args)
return result;
}
+static char *
+menutitle_prefix (char *old_prefix, const char *title)
+{
+ const char *t;
+ char *p;
+ char *result;
+ grub_size_t len = 22;
+ grub_size_t old_len = grub_strlen (old_prefix);
+
+ /* Count resulting string length. */
+ for (t = title; *t; t++)
+ {
+ len += (*t++ == '\'' ? 4 : 1);
+ }
+
+ result = grub_malloc (old_len + len + 2);
+ if (! result)
+ return 0;
+
+ p = result;
+ grub_strcpy (p, old_prefix);
+ p = result + old_len;
+ grub_strcpy (p, "set grub_menu_title='");
+ p += 21;
+
+ p = grub_strchrsub (p, title, '\'', "'\\''");
+ *p++ = '\'';
+ *p++ = '\n';
+ *p = '\0';
+
+ return result;
+}
+
static grub_err_t
grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
{
char ch;
char *src;
char *prefix;
+ char *old_prefix;
unsigned len;
grub_err_t r;
const char *users;
@@ -299,6 +336,19 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
if (! prefix)
return grub_errno;
+ /* Prepend the menu title line. */
+ if (ctxt->state[6].arg)
+ {
+ old_prefix = prefix;
+ prefix = menutitle_prefix (old_prefix,
+ (ctxt->state[6].arg
+ && grub_strlen(ctxt->state[6].arg) > 0)
+ ? ctxt->state[6].arg : args[0]);
+ if (! prefix)
+ return grub_errno;
+ grub_free(old_prefix);
+ }
+
r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
ctxt->state[0].args, ctxt->state[4].arg,
users,
--
2.45.3
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 2/3] Option to set title of submenus
2025-05-26 18:18 ` [PATCH 2/3] Option to set title of submenus Jiří Wolker via Grub-devel
@ 2025-05-27 10:43 ` sudhakar
0 siblings, 0 replies; 8+ messages in thread
From: sudhakar @ 2025-05-27 10:43 UTC (permalink / raw)
To: The development of GNU GRUB; +Cc: Jiří Wolker
On 2025-05-26 23:48, Jiří Wolker via Grub-devel wrote:
> ---
> grub-core/commands/menuentry.c | 50 ++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/grub-core/commands/menuentry.c
> b/grub-core/commands/menuentry.c
> index 720e6d8ea..c40b27d8b 100644
> --- a/grub-core/commands/menuentry.c
> +++ b/grub-core/commands/menuentry.c
> @@ -43,6 +43,9 @@ static const struct grub_arg_option options[] =
> anyone can boot it. */
> {"unrestricted", 0, 0, N_("This entry can be booted by any
> user."),
> 0, ARG_TYPE_NONE},
> + {"menutitle", 0, 0,
> + N_("Use STRING as menu title. When omitted, use the entry
> label."),
> + N_("TITLE"), ARG_TYPE_STRING},
> {0, 0, 0, 0, 0, 0}
> };
>
> @@ -252,12 +255,46 @@ setparams_prefix (int argc, char **args)
> return result;
> }
>
> +static char *
> +menutitle_prefix (char *old_prefix, const char *title)
> +{
> + const char *t;
> + char *p;
> + char *result;
> + grub_size_t len = 22;
> + grub_size_t old_len = grub_strlen (old_prefix);
> +
> + /* Count resulting string length. */
> + for (t = title; *t; t++)
> + {
> + len += (*t++ == '\'' ? 4 : 1);
> + }
> +
remove the brackets in one liner For loop
> + result = grub_malloc (old_len + len + 2);
> + if (! result)
s/! result/!result
> + return 0;
> +
> + p = result;
> + grub_strcpy (p, old_prefix);
> + p = result + old_len;
> + grub_strcpy (p, "set grub_menu_title='");
> + p += 21;
> +
> + p = grub_strchrsub (p, title, '\'', "'\\''");
> + *p++ = '\'';
> + *p++ = '\n';
> + *p = '\0';
> +
> + return result;
> +}
> +
> static grub_err_t
> grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
> {
> char ch;
> char *src;
> char *prefix;
> + char *old_prefix;
> unsigned len;
> grub_err_t r;
> const char *users;
> @@ -299,6 +336,19 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt,
> int argc, char **args)
> if (! prefix)
> return grub_errno;
>
s/! prefix/!prefix
> + /* Prepend the menu title line. */
> + if (ctxt->state[6].arg)
> + {
> + old_prefix = prefix;
> + prefix = menutitle_prefix (old_prefix,
> + (ctxt->state[6].arg
> + && grub_strlen(ctxt->state[6].arg) > 0)
> + ? ctxt->state[6].arg : args[0]);
> + if (! prefix)
ditto
> + return grub_errno;
> + grub_free(old_prefix);
> + }
> +
> r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
> ctxt->state[0].args, ctxt->state[4].arg,
> users,
Indentation looks off in couple of places. Please fix it.
Thanks,
Sudhakar
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] Documentation for the --menutitle option
2025-05-26 17:50 [PATCH 0/3] Allow script-configurable GRUB menu title Jiří 'bindiff' Wolker via Grub-devel
` (2 preceding siblings ...)
2025-05-26 18:18 ` [PATCH 2/3] Option to set title of submenus Jiří Wolker via Grub-devel
@ 2025-05-26 18:19 ` Jiří Wolker via Grub-devel
3 siblings, 0 replies; 8+ messages in thread
From: Jiří Wolker via Grub-devel @ 2025-05-26 18:19 UTC (permalink / raw)
To: grub-devel; +Cc: Jiří Wolker
---
docs/grub.texi | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/docs/grub.texi b/docs/grub.texi
index 34b3484dc..5b5e40c49 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -1845,7 +1845,7 @@ definitions do not affect the exit status in @code{$?}. When executed, the
exit status of a function is the exit status of the last command executed in
the body.
-@item menuentry @var{title} [@option{--class=class} @dots{}] [@option{--users=users}] [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @{ @var{command}; @dots{} @}
+@item menuentry @var{title} [@option{--class=class} @dots{}] [@option{--users=users}] [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] [@option{--menutitle=text}] @{ @var{command}; @dots{} @}
@xref{menuentry}.
@end table
@@ -6034,7 +6034,7 @@ These commands can only be used in the menu:
@deffn Command menuentry @var{title} @
[@option{--class=class} @dots{}] [@option{--users=users}] @
- [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @
+ [@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] [@option{--menutitle=text}] @
[@var{arg} @dots{}] @{ @var{command}; @dots{} @}
This defines a GRUB menu entry named @var{title}. When this entry is
selected from the menu, GRUB will set the @var{chosen} environment variable
@@ -6060,6 +6060,13 @@ The @option{--id} may be used to associate unique identifier with a menu entry.
@var{id} is string of ASCII aphanumeric characters, underscore and hyphen
and should not start with a digit.
+The @option{--menutitle} can override the text displayed above the
+frame in which the menu is shown. This is useful especially for the
+@command{submenu}, which shares options with
+@command{menuentry}. Nested menus will inherit the menu title, unless
+explicitly replaces. Using an empty string causes the @var{title} of
+the option to be used as the menu title.
+
All other arguments including @var{title} are passed as positional parameters
when list of commands is executed with @var{title} always assigned to @code{$1}.
@end deffn
@@ -6071,7 +6078,7 @@ when list of commands is executed with @var{title} always assigned to @code{$1}.
@deffn Command submenu @var{title} @
[@option{--class=class} @dots{}] [@option{--users=users}] @
[@option{--unrestricted}] [@option{--hotkey=key}] [@option{--id=id}] @
- @{ @var{menu entries} @dots{} @}
+ [@option{--menutitle=text}] @{ @var{menu entries} @dots{} @}
This defines a submenu. An entry called @var{title} will be added to the
menu; when that entry is selected, a new menu will be displayed showing all
the entries within this submenu.
--
2.45.3
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/3] Option to set title of submenus
[not found] <mailman.5394.1748289237.3672.grub-devel@gnu.org>
@ 2025-05-27 11:00 ` Avnish Chouhan
2025-05-27 12:01 ` Jiří 'bindiff' Wolker via Grub-devel
0 siblings, 1 reply; 8+ messages in thread
From: Avnish Chouhan @ 2025-05-27 11:00 UTC (permalink / raw)
To: projects; +Cc: grub-devel-request, grub-devel
> Message: 2
> Date: Mon, 26 May 2025 20:18:26 +0200
> From: Jiří Wolker <projects@jwo.cz>
> To: grub-devel@gnu.org
> Cc: Jiří 'bindiff' Wolker <projects@jwo.cz>
> Subject: [PATCH 2/3] Option to set title of submenus
> Message-ID: <87cybvdyml.fsf@gnat.mail-host-address-is-not-set>
> Content-Type: text/plain; charset=utf-8
>
> ---
> grub-core/commands/menuentry.c | 50 ++++++++++++++++++++++++++++++++++
> 1 file changed, 50 insertions(+)
>
> diff --git a/grub-core/commands/menuentry.c
> b/grub-core/commands/menuentry.c
> index 720e6d8ea..c40b27d8b 100644
> --- a/grub-core/commands/menuentry.c
> +++ b/grub-core/commands/menuentry.c
> @@ -43,6 +43,9 @@ static const struct grub_arg_option options[] =
> anyone can boot it. */
> {"unrestricted", 0, 0, N_("This entry can be booted by any
> user."),
> 0, ARG_TYPE_NONE},
> + {"menutitle", 0, 0,
> + N_("Use STRING as menu title. When omitted, use the entry
> label."),
> + N_("TITLE"), ARG_TYPE_STRING},
> {0, 0, 0, 0, 0, 0}
> };
>
> @@ -252,12 +255,46 @@ setparams_prefix (int argc, char **args)
> return result;
> }
>
> +static char *
> +menutitle_prefix (char *old_prefix, const char *title)
> +{
> + const char *t;
> + char *p;
> + char *result;
> + grub_size_t len = 22;
> + grub_size_t old_len = grub_strlen (old_prefix);
> +
> + /* Count resulting string length. */
> + for (t = title; *t; t++)
> + {
> + len += (*t++ == '\'' ? 4 : 1);
> + }
> +
> + result = grub_malloc (old_len + len + 2);
> + if (! result)
> + return 0;
> +
> + p = result;
> + grub_strcpy (p, old_prefix);
> + p = result + old_len;
> + grub_strcpy (p, "set grub_menu_title='");
> + p += 21;
> +
> + p = grub_strchrsub (p, title, '\'', "'\\''");
> + *p++ = '\'';
> + *p++ = '\n';
> + *p = '\0';
> +
> + return result;
> +}
> +
> static grub_err_t
> grub_cmd_menuentry (grub_extcmd_context_t ctxt, int argc, char **args)
> {
> char ch;
> char *src;
> char *prefix;
> + char *old_prefix;
> unsigned len;
> grub_err_t r;
> const char *users;
> @@ -299,6 +336,19 @@ grub_cmd_menuentry (grub_extcmd_context_t ctxt,
> int argc, char **args)
> if (! prefix)
> return grub_errno;
>
> + /* Prepend the menu title line. */
> + if (ctxt->state[6].arg)
> + {
> + old_prefix = prefix;
> + prefix = menutitle_prefix (old_prefix,
> + (ctxt->state[6].arg
> + && grub_strlen(ctxt->state[6].arg) > 0)
> + ? ctxt->state[6].arg : args[0]);
Hi Jiří,
Something like this below might be better here!
prefix = menutitle_prefix (old_prefix, (ctxt->state[6].arg
&& grub_strlen(ctxt->state[6].arg) > 0)
? ctxt->state[6].arg : args[0]);
> + if (! prefix)
> + return grub_errno;
Indention seems off!
> + grub_free(old_prefix);
grub_free (old_prefix);
Thank you,
Regards,
Avnish Chouhan
> + }
> +
> r = grub_normal_add_menu_entry (argc - 1, (const char **) args,
> ctxt->state[0].args, ctxt->state[4].arg,
> users,
> --
> 2.45.3
>
>
>
>
> ------------------------------
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
^ permalink raw reply [flat|nested] 8+ messages in thread