Changeset View
Changeset View
Standalone View
Standalone View
stand/lua/menu.lua.8
Show All 20 Lines | |||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
.\" SUCH DAMAGE. | .\" SUCH DAMAGE. | ||||
.\" | .\" | ||||
.\" $FreeBSD$ | .\" $FreeBSD$ | ||||
.\" | .\" | ||||
.Dd February 23, 2018 | .Dd March 31, 2021 | ||||
.Dt MENU.LUA 8 | .Dt MENU.LUA 8 | ||||
.Os | .Os | ||||
.Sh NAME | .Sh NAME | ||||
.Nm menu.lua | .Nm menu.lua | ||||
.Nd FreeBSD dynamic menu boot module | .Nd FreeBSD dynamic menu boot module | ||||
.Sh DESCRIPTION | .Sh DESCRIPTION | ||||
.Nm | .Nm | ||||
contains the main functionality required to build a dynamic menu system. | contains the main functionality required to build a dynamic menu system. | ||||
▲ Show 20 Lines • Show All 158 Lines • ▼ Show 20 Lines | entries = { | ||||
}, | }, | ||||
}, | }, | ||||
} | } | ||||
.Ed | .Ed | ||||
.Pp | .Pp | ||||
To add another option to the welcome menu: | To add another option to the welcome menu: | ||||
.Pp | .Pp | ||||
.Bd -literal -offset indent -compact | .Bd -literal -offset indent -compact | ||||
local core = require("core") | local core = require("core") | ||||
imp: Kyle pointed out in email something that makes me want to retract this entire paragraph.
It's… | |||||
local menu = require("menu") | local menu = require("menu") | ||||
local my_entry = { | |||||
entry_type = core.MENU_ENTRY, | |||||
name = "Fancy Boot", | |||||
func = core.boot, | |||||
}, | |||||
local stock_entries = menu.welcome.entries | |||||
function menu.welcome.entries() | |||||
local ents = stock_entries() | |||||
ents[#ents + 1] = my_entry | |||||
return ents | |||||
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 | local welcome_entries = menu.welcome.all_entries | ||||
welcome_entries[#welcome_entries + 1] = { | welcome_entries.vendor = { | ||||
entry_type = core.MENU_CAROUSEL_ENTRY, | entry_type = core.MENU_SUBMENU, | ||||
carousel_id = "unique_boot_entry_name", | name = color.highlight("V") .. "endor Options", | ||||
items = {"NO", "YES"}, | submenu = vendor_options, | ||||
name = function(_, choice, _) | alias = {"v", "V"}, | ||||
return "Option: " .. choice | } | ||||
.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, | end, | ||||
func = function(_, _, _) | func = function() | ||||
loader.setenv("some_envvar", "some_value") | local_option = (local_option + 1) % 5 | ||||
end, | end, | ||||
alias= {"l", "L"} | |||||
} | } | ||||
.Ed | |||||
.Sh SEE ALSO | .Sh SEE ALSO | ||||
.Xr loader.conf 5 , | .Xr loader.conf 5 , | ||||
.Xr core.lua 8 , | .Xr core.lua 8 , | ||||
.Xr loader 8 | .Xr loader 8 | ||||
.Sh HISTORY | .Sh HISTORY | ||||
The | The | ||||
.Nm | .Nm | ||||
file first appeared in | file first appeared in | ||||
.Fx 12.0 . | .Fx 12.0 . | ||||
.Sh AUTHORS | .Sh AUTHORS | ||||
The | The | ||||
.Nm | .Nm | ||||
file was originally written by | file was originally written by | ||||
.An Pedro Souza Aq Mt pedrosouza@FreeBSD.org . | .An Pedro Souza Aq Mt pedrosouza@FreeBSD.org . | ||||
Later work and this manual page was done by | Later work and this manual page was done by | ||||
.An Kyle Evans Aq Mt kevans@FreeBSD.org . | .An Kyle Evans Aq Mt kevans@FreeBSD.org . |
Kyle pointed out in email something that makes me want to retract this entire paragraph.
It's possible, and we should document it.