|
Lines 67-113
parse_args() {
Link Here
|
| 67 |
[ $# -eq 0 ] || show_usage "Unrecognized arguments: '$*'" |
67 |
[ $# -eq 0 ] || show_usage "Unrecognized arguments: '$*'" |
| 68 |
} |
68 |
} |
| 69 |
|
69 |
|
|
|
70 |
get_menu_id() { |
| 71 |
echo "$1" | sed -ne " |
| 72 |
s/.*menuentry_id_option\s\+'\([^']*\)'.*/\1/p; |
| 73 |
t; |
| 74 |
s/.*menuentry_id_option\s\+\"\([^\"]*\)\".*/\1/p; |
| 75 |
" |
| 76 |
} |
| 77 |
|
| 70 |
show_menu() { |
78 |
show_menu() { |
| 71 |
local mode= title= number= prefix= entry=0 itemno=0 |
79 |
local mode= title= number= prefix= entry=0 itemno=0 |
|
|
80 |
local grubenv_file= saved_entry= next_entry= mark= |
| 81 |
local id_prefix= full_id= full_title= id= line= |
| 82 |
|
| 83 |
# Get current GRUB settings |
| 84 |
grubenv_file="${grubmenu%/*}/grubenv" |
| 85 |
if [ -f "$grubenv_file" ]; then |
| 86 |
saved_entry=$(grub-editenv "$grubenv_file" list | grep '^saved_entry=' | cut -d= -f2-) |
| 87 |
next_entry=$(grub-editenv "$grubenv_file" list | grep '^next_entry=' | cut -d= -f2-) |
| 88 |
fi |
| 89 |
|
| 90 |
# Process GRUB menu |
| 91 |
sed -n -re '/^\s*(menuentry\s+|submenu\s+|})/p' "$grubmenu" | |
| 92 |
while IFS= read -r line; do |
| 93 |
# Determine entry type |
| 94 |
if echo "$line" | grep -q '^\s*menuentry'; then |
| 95 |
mode="M" |
| 96 |
title=$(echo "$line" | sed -re " |
| 97 |
s/^\s*menuentry\s+'(([^']|\\\\')+)'.*/\1/; |
| 98 |
t; |
| 99 |
s/^\s*menuentry\s+\"(([^\"]|\\\\\")+)\".*/\1/; |
| 100 |
") |
| 101 |
id=$(get_menu_id "$line") |
| 102 |
full_title="${prefix}${title}" |
| 103 |
elif echo "$line" | grep -q '^\s*submenu'; then |
| 104 |
mode="S" |
| 105 |
title=$(echo "$line" | sed -re " |
| 106 |
s/^\s*submenu\s+'(([^']|\\\\')+)'.*/\1/; |
| 107 |
t; |
| 108 |
s/^\s*submenu\s+\"(([^\"]|\\\\\")+)\".*/\1/; |
| 109 |
") |
| 110 |
id=$(get_menu_id "$line") |
| 111 |
full_title="${prefix}${title}" |
| 112 |
elif echo "$line" | grep -q '^\s*}'; then |
| 113 |
mode="E" |
| 114 |
else |
| 115 |
mode="" |
| 116 |
fi |
| 72 |
|
117 |
|
| 73 |
cat "$grubmenu" | sed \ |
|
|
| 74 |
-re '/^\s*(menuentry\s+|submenu\s+|})/!d' \ |
| 75 |
-re "s/^\s*menuentry\s+'([^']+)'.*\$/M\t\1/g" \ |
| 76 |
-re 's/^\s*menuentry\s+"([^"]+)".*$/M\t\1/g' \ |
| 77 |
-re "s/^\s*submenu\s+'([^']+)'.*\$/S\t\1/g" \ |
| 78 |
-re 's/^\s*submenu\s+"([^"]+)".*$/S\t\1/g' \ |
| 79 |
-re "s/^\s*}\s*\$/E\t-/g" | |
| 80 |
while read mode title; do |
| 81 |
case "$mode" in |
118 |
case "$mode" in |
| 82 |
M) if [ $numbers_only -ne 0 ]; then |
119 |
M) # Menu entry |
| 83 |
echo -e "${number}${itemno}" |
120 |
# Build full ID path |
|
|
121 |
if [ -n "$id_prefix" ]; then |
| 122 |
full_id="${id_prefix}>${id}" |
| 123 |
else |
| 124 |
full_id="$id" |
| 125 |
fi |
| 126 |
|
| 127 |
# Set markers based on both ID and title |
| 128 |
mark="" |
| 129 |
if [ -n "$saved_entry" ]; then |
| 130 |
if [ "$full_id" = "$saved_entry" ] || [ "$full_title" = "$saved_entry" ]; then |
| 131 |
mark="*" |
| 132 |
fi |
| 133 |
fi |
| 134 |
if [ -n "$next_entry" ]; then |
| 135 |
if [ "$full_id" = "$next_entry" ] || [ "$full_title" = "$next_entry" ]; then |
| 136 |
mark="${mark}N" |
| 137 |
fi |
| 138 |
fi |
| 139 |
mark=$(printf '%-3s' "$mark") |
| 140 |
|
| 141 |
# Format output with proper alignment |
| 142 |
if [ $numbers_only -ne 0 ]; then |
| 143 |
echo "${number}${itemno}" |
| 84 |
elif [ $titles_only -ne 0 ]; then |
144 |
elif [ $titles_only -ne 0 ]; then |
| 85 |
echo -e "${prefix}${title}" |
145 |
echo "${full_title}" |
| 86 |
else |
146 |
else |
| 87 |
echo -e "${number}${itemno}\t${prefix}${title}" |
147 |
printf "%-6s%-4s%s\n" "${number}${itemno}" "${mark}" "${full_title}" |
| 88 |
fi |
148 |
fi |
| 89 |
itemno=$(($itemno + 1)) |
149 |
|
|
|
150 |
itemno=$((itemno + 1)) |
| 90 |
entry=1 |
151 |
entry=1 |
| 91 |
;; |
152 |
;; |
| 92 |
S) number="${number}${itemno}>" |
153 |
|
|
|
154 |
S) # Submenu entry |
| 155 |
# Update ID prefix |
| 156 |
if [ -n "$id_prefix" ]; then |
| 157 |
id_prefix="${id_prefix}>${id}" |
| 158 |
else |
| 159 |
id_prefix="$id" |
| 160 |
fi |
| 161 |
|
| 162 |
# Update numbering |
| 163 |
number="${number}${itemno}>" |
| 93 |
prefix="${prefix}${title}>" |
164 |
prefix="${prefix}${title}>" |
| 94 |
itemno=0 |
165 |
itemno=0 |
| 95 |
;; |
166 |
;; |
| 96 |
*) if [ $entry -ne 0 ]; then |
167 |
|
|
|
168 |
E) # End of menu |
| 169 |
if [ $entry -ne 0 ]; then |
| 97 |
entry=0 |
170 |
entry=0 |
| 98 |
elif [ -n "$number" ]; then |
171 |
elif [ -n "$number" ]; then |
|
|
172 |
# Handle menu closure |
| 99 |
number="${number%>}" |
173 |
number="${number%>}" |
| 100 |
prefix="${prefix%>}" |
174 |
prefix="${prefix%>}" |
|
|
175 |
id_prefix="${id_prefix%>*}" |
| 176 |
|
| 101 |
case "$number" in |
177 |
case "$number" in |
| 102 |
*">"*) itemno="${number##*>}" |
178 |
*">"*) # Submenu closed |
|
|
179 |
itemno="${number##*>}" |
| 103 |
number="${number%>*}>" |
180 |
number="${number%>*}>" |
| 104 |
prefix="${prefix%>*}>" |
181 |
prefix="${prefix%>*}>" |
| 105 |
itemno=$(($itemno + 1)) |
182 |
itemno=$((itemno + 1)) |
| 106 |
;; |
183 |
;; |
| 107 |
*) itemno=$number |
184 |
*) # Top-level closed |
| 108 |
itemno=$(($itemno + 1)) |
185 |
itemno=$number |
|
|
186 |
itemno=$((itemno + 1)) |
| 109 |
prefix= |
187 |
prefix= |
| 110 |
number= |
188 |
number= |
|
|
189 |
id_prefix= |
| 111 |
;; |
190 |
;; |
| 112 |
esac |
191 |
esac |
| 113 |
fi |
192 |
fi |
| 114 |
- |
|
|