Index: stand/lua/menu.lua =================================================================== --- stand/lua/menu.lua +++ stand/lua/menu.lua @@ -257,6 +257,7 @@ menu_entries.zpool_checkpoints, menu_entries.boot_envs, menu_entries.chainload, + menu_entries.vendor, } end, all_entries = { @@ -400,6 +401,10 @@ end, alias = {"l", "L"}, }, + vendor = { + entry_type = core.MENU_ENTRY, + visible = false, + }, }, } Index: stand/lua/menu.lua.8 =================================================================== --- stand/lua/menu.lua.8 +++ stand/lua/menu.lua.8 @@ -197,26 +197,91 @@ }, } .Ed -.Pp -To add another option to the welcome menu: +.\"The following example doesn't work. Retained for the +.\"moment... +.\".Pp +.\"To add another option to the welcome menu: +.\".Pp +.\".Bd -literal -offset indent -compact +.\"local core = require("core") +.\"local menu = require("menu") +.\" +.\"local welcome_entries = menu.welcome.all_entries +.\"welcome_entries[#welcome_entries + 1] = { +.\" entry_type = core.MENU_CAROUSEL_ENTRY, +.\" carousel_id = "unique_boot_entry_name", +.\" items = {"NO", "YES"}, +.\" name = function(_, choice, _) +.\" return "Option: " .. choice +.\" end, +.\" func = function(_, _, _) +.\" loader.setenv("some_envvar", "some_value") +.\" end, +.\"} +.\".Ed +.\".Pp +To create a vendor submenu or other vendor menu option, +override +.Ic menu.welcome.all_entires.vendor +like so: .Pp .Bd -literal -offset indent -compact local core = require("core") local menu = require("menu") +-- Fill in with vendor specific entries +local vendor_options = { + entries = { + ... + }, +} + local welcome_entries = menu.welcome.all_entries -welcome_entries[#welcome_entries + 1] = { - entry_type = core.MENU_CAROUSEL_ENTRY, - carousel_id = "unique_boot_entry_name", - items = {"NO", "YES"}, - name = function(_, choice, _) - return "Option: " .. choice +welcome_entries.vendor = { + entry_type = core.MENU_SUBMENU, + name = color.highlight("V") .. "endor Options", + submenu = vendor_options, + alias = {"v", "V"}, +} +.Ed +In the above example, +.Ic vendor_options +is a local variable that defines the vendor submenu. +.Pp +To add an additional option, change the +.Ic menu.boot_options.entries +array. +The following illustrates this concept: +.Pp +.Bd -literal -offset indent -compact +-- This is a silly example that rotates local_option through the values +-- 0 to 4. local_option would still need to be used elsewhere. +local local_option = 0 + +-- The `entries` of a menu may either be a table or a function. In this +-- example we're augmenting a menu that just has a static table, but if we +-- wanted to be more robust then we would need to instead check the type +-- of `stock_options` here to determine our next move. +-- +-- If `entries` is a table, then the stock menu system won't be changing it +-- so we can just add our menu option as we do below. +-- +-- If `entries` is a function, then we would need to provide a new function to +-- replace `entries` that does a core.deepCopyTable() of the result and adds +-- the below item to it. The deep copy is necessary to avoid duplicating our +-- new menu item and allowing the menu to alter its behavior however it pleases. +local stock_options = menu.boot_options.entries +stock_options[#stock_options + 1] = { + entry_type = core.MENU_ENTRY, + name = function() + return color.highlight('L') .. + "ocal Option : " .. local_option end, - func = function(_, _, _) - loader.setenv("some_envvar", "some_value") + func = function() + local_option = (local_option + 1) % 5 end, + alias= {"l", "L"} } -.Ed .Sh SEE ALSO .Xr loader.conf 5 , .Xr core.lua 8 ,