--- grub-1.98/normal/menu_text.c.menu-beep 2010-03-06 21:51:37.000000000 +0100 +++ grub-1.98/normal/menu_text.c 2011-01-10 14:24:59.157904538 +0100 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -418,6 +419,88 @@ data->term); } grub_term_refresh (data->term); + { + // make grub menu a bit more blind-friendly + char *beep_dir; + int beep_position = 0, beep_class = 0; + struct grub_menu_entry_class *c; + grub_menu_entry_t menu_entry = grub_menu_get_entry (data->menu, entry); + if (!menu_entry) + return; + + for (c = menu_entry->classes->next; c; c = c->next) { + if (grub_strcmp(c->name, "beep_position") == 0) + beep_position = 1; + if (grub_strcmp(c->name, "beep_class") == 0) + beep_class = 1; + } + + if (!beep_position && !beep_class) + return; + + beep_dir = grub_env_get ("beep_dir"); + if (beep_dir == NULL) { + grub_dprintf ("beep", "beep_dir variable is not set up.\n"); + return; + } + + // beep according position of selected menu entry + if (beep_position) { + char *cmd; + cmd = grub_malloc (grub_strlen ("play ") + + grub_strlen (beep_dir) + + grub_strlen ("beep") + 3); + if (cmd) { + int l, i = 0; + grub_strcpy (cmd, "play "); + grub_strcat (cmd, beep_dir); + l = grub_strlen (cmd); + if (cmd[l-1] != '/') { + cmd[l] = '/'; + cmd[l+1] = 0; + } + grub_strcat (cmd, "beep"); + while (i <= entry) { + grub_parser_execute(cmd); + i++; + } + grub_free (cmd); + } + } + + // play beeps from file according selected menu entry classes + if (beep_class) { + int l; + grub_file_t file; + + for (c = menu_entry->classes->next; c; c = c->next) { + char *class_name, *cmd, *filename; + class_name = c->name; + cmd = grub_malloc (grub_strlen ("play ") + + grub_strlen (beep_dir) + + grub_strlen (class_name) + 3); + if (!cmd) + continue; + grub_strcpy (cmd, "play "); + grub_strcat (cmd, beep_dir); + l = grub_strlen (cmd); + if (cmd[l-1] != '/') { + cmd[l] = '/'; + cmd[l+1] = 0; + } + grub_strcat (cmd, class_name); + filename = cmd+5; + file = grub_file_open (filename); + if (file) { + grub_file_close (file); + grub_parser_execute(cmd); + grub_free (cmd); + return; + } + grub_free (cmd); + } + } + } } static void