[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] GSoC #05 Menu entry class attribute
From: |
Vesa Jääskeläinen |
Subject: |
Re: [PATCH] GSoC #05 Menu entry class attribute |
Date: |
Sun, 05 Oct 2008 13:07:32 +0300 |
User-agent: |
Thunderbird 2.0.0.17 (Windows/20080914) |
Colin D Bennett wrote:
> This patch adds support for a 'class' attribute on menu entries. It is
> somewhat of a kludge, however since currently you just append
> "|class=this,that" to the menu entry title to specify the classes.
>
> Classes are used to provide a simple and flexible way for the best
> available icon to be used in a graphical menu, but there are other
> possible uses for them as well. The idea originates from the CSS
> (cascading style sheets) and HTML 'class' concept.
Here is the patch snipped for using menuentry --class foo "title" { }.
Please try it out and see if it fits.
Index: normal/parser.y
===================================================================
--- normal/parser.y (revision 1885)
+++ normal/parser.y (working copy)
@@ -204,7 +204,7 @@
;
/* A menu entry. Carefully save the memory that is allocated. */
-menuentry: "menuentry" argument
+menuentry: "menuentry" arguments
{
grub_script_lexer_ref (state->lexerstate);
} newlines '{'
Index: normal/main.c
===================================================================
--- normal/main.c (revision 1885)
+++ normal/main.c (working copy)
@@ -148,13 +148,15 @@
}
grub_err_t
-grub_normal_menu_addentry (const char *title, struct grub_script *script,
+grub_normal_menu_addentry (int argc, char **args, struct grub_script *script,
const char *sourcecode)
{
- const char *menutitle;
+ const char *menutitle = 0;
const char *menusourcecode;
grub_menu_t menu;
grub_menu_entry_t *last;
+ int failed = 0;
+ int i;
menu = grub_env_get_data_slot("menu");
if (! menu)
@@ -166,10 +168,59 @@
if (! menusourcecode)
return grub_errno;
- menutitle = grub_strdup (title);
- if (! menutitle)
+ /* Parse menu arguments. */
+ for (i = 0; i < argc; i++)
{
- grub_free ((void *) menusourcecode);
+ /* Capture arguments. */
+ if (grub_strncmp ("--", args[i], 2) == 0)
+ {
+ char *arg = &args[i][2];
+ char *value = 0;
+
+ /* Handle menu class. */
+ if (grub_strcmp(arg, "class") == 0)
+ {
+ i++;
+ value = args[i];
+ continue;
+ }
+ else
+ {
+ /* Handle invalid argument. */
+ failed = 1;
+ grub_error (GRUB_ERR_MENU, "invalid argument for menuentry: %s",
args[i]);
+ break;
+ }
+
+ }
+
+ /* Capture title. */
+ if (! menutitle)
+ {
+ menutitle = grub_strdup (args[i]);
+ }
+ else
+ {
+ failed = 1;
+ grub_error (GRUB_ERR_MENU, "too many titles for menuentry: %s",
args[i]);
+ break;
+ }
+ }
+
+ /* Validate arguments. */
+ if ((! failed) && (! menutitle))
+ {
+ grub_error (GRUB_ERR_MENU, "menuentry is missing title");
+ failed = 1;
+ }
+
+ /* If argument parsing failed, free any allocated resources. */
+ if (failed)
+ {
+ grub_free ((void *)menutitle);
+ grub_free ((void *)menusourcecode);
+
+ /* Here we assume that grub_error has been used to specify failure
details. */
return grub_errno;
}
Index: normal/script.c
===================================================================
--- normal/script.c (revision 1885)
+++ normal/script.c (working copy)
@@ -206,7 +206,7 @@
The options for this entry are passed in OPTIONS. */
struct grub_script_cmd *
grub_script_create_cmdmenu (struct grub_parser_param *state,
- struct grub_script_arg *title,
+ struct grub_script_arglist *arglist,
char *sourcecode,
int options)
{
@@ -232,9 +232,9 @@
cmd->cmd.next = 0;
/* XXX: Check if this memory is properly freed. */
cmd->sourcecode = sourcecode;
- cmd->title = title;
+ cmd->arglist = arglist;
cmd->options = options;
-
+
return (struct grub_script_cmd *) cmd;
}
Index: normal/execute.c
===================================================================
--- normal/execute.c (revision 1885)
+++ normal/execute.c (working copy)
@@ -216,16 +216,33 @@
grub_script_execute_menuentry (struct grub_script_cmd *cmd)
{
struct grub_script_cmd_menuentry *cmd_menuentry;
- char *title;
+ struct grub_script_arglist *arglist;
struct grub_script *script;
+ char **args = 0;
+ int argcount = 0;
+ int i = 0;
cmd_menuentry = (struct grub_script_cmd_menuentry *) cmd;
- /* The title can contain variables, parse them and generate a string
- from it. */
- title = grub_script_execute_argument_to_string (cmd_menuentry->title);
- if (! title)
- return grub_errno;
+ if (cmd_menuentry->arglist)
+ {
+ argcount = cmd_menuentry->arglist->argcount;
+
+ /* Create argv from the arguments. */
+ args = grub_malloc (sizeof (char *) * argcount);
+
+ if (! args)
+ {
+ return grub_errno;
+ }
+
+ for (arglist = cmd_menuentry->arglist; arglist; arglist = arglist->next)
+ {
+ char *str;
+ str = grub_script_execute_argument_to_string (arglist->arg);
+ args[i++] = str;
+ }
+ }
/* Parse the menu entry *again*. */
script = grub_script_parse ((char *) cmd_menuentry->sourcecode, 0);
@@ -230,15 +247,19 @@
/* Parse the menu entry *again*. */
script = grub_script_parse ((char *) cmd_menuentry->sourcecode, 0);
- if (! script)
+ /* Add new menu entry. */
+ if (script)
{
- grub_free (title);
- return grub_errno;
+ grub_normal_menu_addentry (argcount, args,
+ script, cmd_menuentry->sourcecode);
}
- /* XXX: When this fails, the memory should be freed? */
- return grub_normal_menu_addentry (title, script,
- cmd_menuentry->sourcecode);
+ /* Free arguments. */
+ for (i = 0; i < argcount; i++)
+ grub_free (args[i]);
+ grub_free (args);
+
+ return grub_errno;
}
Index: include/grub/script.h
===================================================================
--- include/grub/script.h (revision 1885)
+++ include/grub/script.h (working copy)
@@ -113,8 +113,8 @@
{
struct grub_script_cmd cmd;
- /* The title of the menu entry. */
- struct grub_script_arg *title;
+ /* The arguments for this menu entry. */
+ struct grub_script_arglist *arglist;
/* The sourcecode the entry will be generated from. */
const char *sourcecode;
@@ -204,7 +204,7 @@
struct grub_script_cmd *
grub_script_create_cmdmenu (struct grub_parser_param *state,
- struct grub_script_arg *title,
+ struct grub_script_arglist *arglist,
char *sourcecode,
int options);
Index: include/grub/normal.h
===================================================================
--- include/grub/normal.h (revision 1885)
+++ include/grub/normal.h (working copy)
@@ -152,7 +152,7 @@
char *grub_normal_do_completion (char *buf, int *restore,
void (*hook) (const char *item,
grub_completion_type_t type, int count));
grub_err_t grub_normal_print_device_info (const char *name);
-grub_err_t grub_normal_menu_addentry (const char *title,
+grub_err_t grub_normal_menu_addentry (int argc, char **args,
struct grub_script *script,
const char *sourcecode);
char *grub_env_write_color_normal (struct grub_env_var *var, const char *val);
- Re: [PATCH] GSoC #05 Menu entry class attribute,
Vesa Jääskeläinen <=