Since the introduction of the new advanced boot menu (r222417), options like

"boot verbose", "single user mode", "ACPI" and more are now stateful boolean
menuitems rather than direct action-items.

A short-coming in this new menu system is that when a user sets a non-default
value in loader.conf(5), this non-default state is not reflected in the menu
-- leading to confusion as to whether the option was taking effect or not.

This patch adds dynamic menuitem constructors _and_ the necessary Forth
callbacks to initialize these stateful menuitems -- causing the aforementioned
menuitems to adhere to loader.conf(5) settings.

PR:		bin/172529
Approved by:	adrian (co-mentor)
MFC after:	21 days
This commit is contained in:
Devin Teske 2012-10-14 06:52:49 +00:00
parent d14cfe6e65
commit 55f9ff659d
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=241523
3 changed files with 113 additions and 0 deletions

View File

@ -26,6 +26,9 @@
marker task-menu-commands.4th
variable kernel_state
variable root_state
: acpi_enable ( -- )
s" set acpi_load=YES" evaluate \ XXX deprecated but harmless
s" set hint.acpi.0.disabled=0" evaluate
@ -53,6 +56,13 @@ marker task-menu-commands.4th
TRUE \ loop menu again
;
: init_safemode ( N -- N )
s" kern.smp.disabled" getenv -1 <> if
drop ( n c-addr -- n ) \ unused
toggle_menuitem ( n -- n )
then
;
: toggle_safemode ( N -- N TRUE )
toggle_menuitem
@ -84,6 +94,13 @@ marker task-menu-commands.4th
TRUE \ loop menu again
;
: init_singleuser ( N -- N )
s" boot_single" getenv -1 <> if
drop ( n c-addr -- n ) \ unused
toggle_menuitem ( n -- n )
then
;
: toggle_singleuser ( N -- N TRUE )
toggle_menuitem
menu-redraw
@ -102,6 +119,13 @@ marker task-menu-commands.4th
TRUE \ loop menu again
;
: init_verbose ( N -- N )
s" boot_verbose" getenv -1 <> if
drop ( n c-addr -- n ) \ unused
toggle_menuitem ( n -- n )
then
;
: toggle_verbose ( N -- N TRUE )
toggle_menuitem
menu-redraw
@ -132,6 +156,27 @@ marker task-menu-commands.4th
FALSE \ exit the menu
;
: init_cyclestate ( N K -- N )
over ( n k -- n k n )
s" cycle_stateN" ( n k n -- n k n c-addr u )
-rot tuck 11 + c! swap ( n k n c-addr u -- n k c-addr u )
evaluate ( n k c-addr u -- n k addr )
begin
tuck @ ( n k addr -- n addr k c )
over <> ( n addr k c -- n addr k 0|-1 )
while
rot ( n addr k -- addr k n )
cycle_menuitem
swap rot ( addr k n -- n k addr )
repeat
2drop ( n k addr -- n )
;
: init_kernel ( N -- N )
kernel_state @ ( n -- n k )
init_cyclestate ( n k -- n )
;
: cycle_kernel ( N -- N TRUE )
cycle_menuitem
menu-redraw
@ -142,6 +187,7 @@ marker task-menu-commands.4th
-rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral
evaluate \ translate name into address
@ \ dereference address into value
dup kernel_state ! \ save a copy for re-initialization
48 + \ convert to ASCII numeral
s" set kernel=${kernel_prefix}${kernel[N]}${kernel_suffix}"
@ -152,6 +198,11 @@ marker task-menu-commands.4th
TRUE \ loop menu again
;
: init_root ( N -- N )
root_state @ ( n -- n k )
init_cyclestate ( n k -- n )
;
: cycle_root ( N -- N TRUE )
cycle_menuitem
menu-redraw
@ -162,6 +213,7 @@ marker task-menu-commands.4th
-rot 2dup 11 + c! rot \ replace 'N' with ASCII numeral
evaluate \ translate name into address
@ \ dereference address into value
dup root_state ! \ save a copy for re-initialization
48 + \ convert to ASCII numeral
s" set root=${root_prefix}${root[N]}${root_suffix}"

View File

@ -76,6 +76,16 @@ variable menu_timeout \ determined configurable delay duration
variable menu_timeout_x \ column position of timeout message
variable menu_timeout_y \ row position of timeout message
\ Menu initialization status variables
variable init_state1
variable init_state2
variable init_state3
variable init_state4
variable init_state5
variable init_state6
variable init_state7
variable init_state8
\ Boolean option status variables
variable toggle_state1
variable toggle_state2
@ -421,6 +431,16 @@ create init_text8 255 allot
then
24 over 2 / - 9 at-xy type
\ If $menu_init is set, evaluate it (allowing for whole menus to be
\ constructed dynamically -- as this function could conceivably set
\ the remaining environment variables to construct the menu entirely).
\
s" menu_init" getenv dup -1 <> if
evaluate
else
drop
then
\ Print our menu options with respective key/variable associations.
\ `printmenuitem' ends by adding the decimal ASCII value for the
\ numerical prefix to the stack. We store the value left on the stack
@ -499,6 +519,24 @@ create init_text8 255 allot
dup menuacpi @ = if
acpimenuitem ( -- C-Addr/U | -1 )
else
\ make sure we have not already initialized this item
s" init_stateN"
-rot 2dup 10 + c! rot \ repace 'N'
evaluate dup @ 0= if
1 swap !
\ If this menuitem has an initializer, run it
s" menu_init[x]"
-rot 2dup 10 + c! rot \ replace 'x'
getenv dup -1 <> if
evaluate
else
drop
then
else
drop
then
loader_color? if
s" ansi_caption[x]"
else
@ -917,6 +955,10 @@ create init_text8 255 allot
-rot 2dup 13 + c! rot \ replace 'x'
unsetenv
s" menu_init[x]" \ initializer basename
-rot 2dup 10 + c! rot \ replace 'x'
unsetenv
s" menu_keycode[x]" \ keycode basename
-rot 2dup 13 + c! rot \ replace 'x'
unsetenv
@ -959,6 +1001,10 @@ create init_text8 255 allot
-rot 2dup 9 + c! rot \ replace 'N' with current iteration
evaluate \ assign zero (0) to key assoc. var
s" 0 init_stateN !" \ used by menu-create
-rot 2dup 12 + c! rot \ replace 'N'
evaluate
1+ dup 56 > \ increment, continue if less than 57
until
drop \ iterator
@ -979,6 +1025,8 @@ create init_text8 255 allot
s" menu_optionstext" unsetenv
0 menuoptions !
\ clear the menu initializer
s" menu_init" unsetenv
;
\ This function both unsets menu variables and visually erases the menu area
@ -994,6 +1042,16 @@ bullet menubllt !
10 menuY !
5 menuX !
\ Initialize our menu initialization state variables
0 init_state1 !
0 init_state2 !
0 init_state3 !
0 init_state4 !
0 init_state5 !
0 init_state6 !
0 init_state7 !
0 init_state8 !
\ Initialize our boolean state variables
0 toggle_state1 !
0 toggle_state2 !

View File

@ -48,6 +48,7 @@ set toggled_ansi[4]="ACPI Support On"
set menu_caption[5]="Safe [M]ode... off"
set toggled_text[5]="Safe [M]ode... On"
set menu_init[5]="init_safemode"
set menu_command[5]="toggle_safemode"
set menu_keycode[5]="109"
set ansi_caption[5]="Safe Mode... Off"
@ -55,6 +56,7 @@ set toggled_ansi[5]="Safe Mode... On"
set menu_caption[6]="[S]ingle User. off"
set toggled_text[6]="[S]ingle User. On"
set menu_init[6]="init_singleuser"
set menu_command[6]="toggle_singleuser"
set menu_keycode[6]="115"
set ansi_caption[6]="Single User. Off"
@ -62,6 +64,7 @@ set toggled_ansi[6]="Single User. On"
set menu_caption[7]="[V]erbose..... off"
set toggled_text[7]="[V]erbose..... On"
set menu_init[7]="init_verbose"
set menu_command[7]="toggle_verbose"
set menu_keycode[7]="118"
set ansi_caption[7]="Verbose..... Off"