docfx/docs/menus.md
Terminal.Gui provides a comprehensive, hierarchical menu system built on top of the xref:Terminal.Gui.Views.Shortcut and xref:Terminal.Gui.Views.Bar classes. This deep dive covers the architecture, class relationships, command routing, and interactions between the menu components.
The menu system in Terminal.Gui consists of the following key components:
| Component | Description |
|---|---|
| xref:Terminal.Gui.Views.Shortcut | Base class for displaying a command, help text, and key binding |
| xref:Terminal.Gui.Views.Bar | Container for xref:Terminal.Gui.Views.Shortcut items, supports horizontal/vertical orientation |
| xref:Terminal.Gui.Views.MenuItem | A xref:Terminal.Gui.Views.Shortcut-derived item for use in menus, supports submenus |
| xref:Terminal.Gui.Views.Menu | A vertically-oriented xref:Terminal.Gui.Views.Bar that contains xref:Terminal.Gui.Views.MenuItem items |
| xref:Terminal.Gui.Views.MenuBarItem | A xref:Terminal.Gui.Views.MenuItem that holds a xref:Terminal.Gui.Views.PopoverMenu instead of a SubMenu |
| xref:Terminal.Gui.Views.MenuBar | A horizontal xref:Terminal.Gui.Views.Menu that contains xref:Terminal.Gui.Views.MenuBarItem items |
| xref:Terminal.Gui.Views.PopoverMenu | A Popover<Menu, MenuItem>-derived view that hosts cascading menus |
The menu system builds upon a layered class hierarchy:
View
├── Shortcut // Command + HelpText + Key display
│ └── MenuItem // Menu-specific Shortcut with SubMenu support
│ └── MenuBarItem // MenuItem that uses PopoverMenu instead of SubMenu
│
├── Bar // Container for Shortcuts (horizontal/vertical)
│ └── Menu // Vertical Bar for MenuItems
│ └── MenuBar // Horizontal Menu for MenuBarItems
│
└── PopoverImpl // Base for popover views
└── Popover<TView, TResult> // Generic popover with content view + result extraction
└── PopoverMenu // Cascading menu popover (Popover<Menu, MenuItem>)
Shortcut → MenuItem → MenuBarItem:
SubMenu support for nested menusSubMenu with xref:Terminal.Gui.Views.PopoverMenuBar → Menu → MenuBar:
For completeness, here's how xref:Terminal.Gui.Views.StatusBar fits in:
Bar → StatusBar:
xref:Terminal.Gui.Views.Shortcut is the foundational building block. It displays three elements:
Shortcut shortcut = new ()
{
Title = "_Save", // CommandView text with hotkey
HelpText = "Save the file",
Key = Key.S.WithCtrl,
Action = () => SaveFile ()
};
IMPORTANT: The CommandView, HelpView, and KeyView are subviews of the shortcut. But how they are managed is an implementation detail and shortcut.SubViews should not be used to try to access them.
Key features:
Action for direct invocationBindKeyToApplication enables application-wide key bindingsAlignmentModes controls element ordering (start-to-end or end-to-start)CommandView can be replaced with custom views (e.g., xref:Terminal.Gui.Views.CheckBox)ConsumeDispatch=false): commands dispatched to CommandView complete normally, then xref:Terminal.Gui.Views.Shortcut is notified via a deferred callbackxref:Terminal.Gui.Views.Bar is a container that arranges xref:Terminal.Gui.Views.Shortcut items either horizontally or vertically:
Bar statusBar = new ()
{
Orientation = Orientation.Horizontal,
Y = Pos.AnchorEnd ()
};
statusBar.Add (new Shortcut { Title = "_Help", Key = Key.F1 });
statusBar.Add (new Shortcut { Title = "_Quit", Key = Key.Q.WithCtrl });
Key features:
Orientation property controls layout directionAlignmentModes property controls item alignmentxref:Terminal.Gui.Views.MenuItem extends xref:Terminal.Gui.Views.Shortcut for use in menus:
MenuItem menuItem = new ()
{
Title = "_Open...",
HelpText = "Open a file",
Key = Key.O.WithCtrl,
Action = () => OpenFile ()
};
// Or bind to a command on a target view
MenuItem boundItem = new (myView, Command.Save);
Key features:
SubMenu property holds nested xref:Terminal.Gui.Views.Menu for cascading menusTargetView and Command enable command binding to other viewsSubMenu is set, a CommandBridge connects the SubMenu back to this MenuItem (bridging xref:Terminal.Gui.Input.Command.Activate and xref:Terminal.Gui.Input.Command.Accept commands across the non-containment boundary)xref:Terminal.Gui.Views.Menu is a vertical xref:Terminal.Gui.Views.Bar specialized for menu items:
Menu fileMenu = new ([
new MenuItem ("_New", Key.N.WithCtrl, () => NewFile ()),
new MenuItem ("_Open...", Key.O.WithCtrl, () => OpenFile ()),
new Line (), // Separator
new MenuItem ("_Save", Key.S.WithCtrl, () => SaveFile ()),
new MenuItem ("Save _As...", () => SaveAs ())
]);
Key features:
SuperMenuItem property links back to parent xref:Terminal.Gui.Views.MenuItemSelectedMenuItem tracks current selectionLine separators between itemsSchemes.Menu color scheme by defaultOnActivating to dispatch xref:Terminal.Gui.Input.Command.Activate to the focused xref:Terminal.Gui.Views.MenuItem (manual dispatch, not the GetDispatchTarget pattern)ShowMenu() / HideMenu() control visibility and handle initialization; HideMenu cascades to visible SubMenusGetAllSubMenus() performs depth-first traversal of the SubMenu hierarchyGetMenuItemsOfAllSubMenus() collects all xref:Terminal.Gui.Views.MenuItems across the hierarchy, with optional predicateOnSelectedMenuItemChanged() handles SubMenu display: hides peer SubMenus, shows the selected item's SubMenu, and performs basic positioningxref:Terminal.Gui.Views.MenuBarItem extends xref:Terminal.Gui.Views.MenuItem for use in xref:Terminal.Gui.Views.MenuBar:
MenuBarItem fileMenuBarItem = new ("_File", [
new MenuItem ("_New", Key.N.WithCtrl, () => NewFile ()),
new MenuItem ("_Open...", Key.O.WithCtrl, () => OpenFile ()),
new Line (),
new MenuItem ("_Quit", Application.GetDefaultKey (Command.Quit), () => Application.RequestStop ())
]);
Important: xref:Terminal.Gui.Views.MenuBarItem uses xref:Terminal.Gui.Views.PopoverMenu instead of SubMenu. Attempting to set SubMenu will throw InvalidOperationException.
Key features:
PopoverMenu property holds the dropdown menu and sets Target/Anchor on the popover for command bridging and positioningPopoverMenuOpen delegates to PopoverMenu.IsOpen and raises PopoverMenuOpenChanged (relayed from PopoverMenu.IsOpenChanged)PopoverMenu is set, the base Popover<TView, TResult>.Target property creates a CommandBridge connecting the PopoverMenu back to this MenuBarItem, bridging xref:Terminal.Gui.Input.Command.Activate commands across the non-containment boundaryOnActivating to toggle PopoverMenuOpen, with a guard that ignores Bridged commands (which are notifications from PopoverMenu internals, not toggle requests)xref:Terminal.Gui.Views.MenuBar is a horizontal menu bar typically placed at the top of a window:
MenuBar menuBar = new ([
new MenuBarItem ("_File", [
new MenuItem ("_New", Key.N.WithCtrl, () => NewFile ()),
new MenuItem ("_Open...", Key.O.WithCtrl, () => OpenFile ()),
new Line (),
new MenuItem ("E_xit", Application.GetDefaultKey (Command.Quit), () => Application.RequestStop ())
]),
new MenuBarItem ("_Edit", [
new MenuItem ("_Cut", Key.X.WithCtrl, () => Cut ()),
new MenuItem ("_Copy", Key.C.WithCtrl, () => Copy ()),
new MenuItem ("_Paste", Key.V.WithCtrl, () => Paste ())
]),
new MenuBarItem ("_Help", [
new MenuItem ("_About...", () => ShowAbout ())
])
]);
// Add to window
window.Add (menuBar);
Key features:
Key property defines the activation key (default: F10)Active property controls whether the MenuBar is active — when Active changes, it drives xref:Terminal.Gui.ViewBase.View.CanFocus and hides any open PopoverMenus on deactivationIsOpen() returns whether any popover menu is visibleDefaultBorderStyle configurable via themesWidth = Dim.Fill ()ConsumeDispatch=true, GetDispatchTarget => Focused) — the MenuBar owns activation state for its MenuBarItems!Visible || !EnabledCommand.Quit, Command.Right, and Command.Leftxref:Terminal.Gui.Views.PopoverMenu extends Popover<Menu, MenuItem> and hosts cascading menus:
// Create a context menu
PopoverMenu contextMenu = new ([
new MenuItem (targetView, Command.Cut),
new MenuItem (targetView, Command.Copy),
new MenuItem (targetView, Command.Paste),
new Line (),
new MenuItem (targetView, Command.SelectAll)
]);
// Register with application (required!)
Application.Popover?.Register (contextMenu);
// Show at mouse position
contextMenu.MakeVisible ();
// Or show at specific position
contextMenu.MakeVisible (new Point (10, 5));
Key features:
Popover<Menu, MenuItem>, which provides ContentView, MakeVisible, SetPosition, Target, Anchor, Result, and ResultExtractorRoot property aliases ContentView and holds the top-level xref:Terminal.Gui.Views.MenuKey property for activation (default: Shift+F10)Application.Popover before calling MakeVisibleTarget (inherited from PopoverImpl) establishes a CommandBridge so that commands from the menu hierarchy bridge to the target viewSetPosition and GetAdjustedPositionMenu.OnSelectedMenuItemChanged(); PopoverMenu's subscriber only adjusts positioning for screen boundaries via GetMostVisibleLocationForSubMenu()Command.Right (enter submenu), Command.Left (leave submenu), and Command.Quit (close menu)Important: See the Popovers Deep Dive for complete details on popover lifecycle and requirements.
┌─────────────────────────────────────────────────────────────────────┐
│ Window │
│ ┌───────────────────────────────────────────────────────────────┐ │
│ │ MenuBar │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ MenuBarItem │ │ MenuBarItem │ │ MenuBarItem │ ... │ │
│ │ │ "File" │ │ "Edit" │ │ "Help" │ │ │
│ │ └──────┬──────┘ └─────────────┘ └─────────────┘ │ │
│ └─────────│─────────────────────────────────────────────────────┘ │
│ │ │
│ │ owns (+ CommandBridge) │
│ ▼ │
│ ┌──────────────────┐ │
│ │ PopoverMenu │ ◄─── Registered with Application.Popover │
│ │ ┌────────────┐ │ │
│ │ │ Menu │ │ ◄─── Root Menu │
│ │ │ (Root) │ │ │
│ │ │ ┌────────┐ │ │ │
│ │ │ │MenuItem│─┼──┼──► SubMenu ──► Menu ──► MenuItem ──► SubMenu │
│ │ │ │MenuItem│ │ │ ▲ (CommandBridge) │
│ │ │ │ Line │ │ │ │ │
│ │ │ │MenuItem│ │ │ Cascading │
│ │ │ └────────┘ │ │ Hierarchy │
│ │ └────────────┘ │ │
│ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
MenuBar contains MenuBarItems:
MenuBarItem owns PopoverMenu (cross-boundary):
MenuBarItem.PopoverMenu property holds the dropdownCommandBridge connects PopoverMenu back to MenuBarItem, bridging xref:Terminal.Gui.Input.Command.Activate commandsPopoverMenuOpenChanged event fires when visibility changesPopoverMenu contains Root Menu (via ContentView):
PopoverMenu.Root aliases Popover<Menu, MenuItem>.ContentView, which is the top-level xref:Terminal.Gui.Views.MenuCommandBridge (created by the ContentView setter in Popover<TView, TResult>) bridges xref:Terminal.Gui.Input.Command.Activate from the Root Menu to the PopoverMenuOnSelectedMenuItemChanged()Menu contains MenuItems:
Menu.SubViews contains xref:Terminal.Gui.Views.MenuItem instancesMenu.SelectedMenuItem tracks the focused itemMenu.CommandsToBubbleUp = [Command.Accept, Command.Activate] enables propagationMenuItem may contain SubMenu (cross-boundary):
MenuItem.SubMenu holds a nested xref:Terminal.Gui.Views.Menu for cascadingMenu.SuperMenuItem links back to the parent xref:Terminal.Gui.Views.MenuItemCommandBridge connects SubMenu back to its MenuItem, bridging xref:Terminal.Gui.Input.Command.Activate and xref:Terminal.Gui.Input.Command.AcceptThe menu system uses the Command Deep Dive infrastructure extensively. Understanding command routing is essential for working with menus.
Each menu component uses a specific command dispatch pattern:
| Component | GetDispatchTarget | ConsumeDispatch | Pattern |
|---|---|---|---|
| MenuBar | Focused (the focused MenuBarItem) | true | Consume: MenuBar owns activation state |
| Menu | Not overridden (manual dispatch in OnActivating) | Not overridden | Dispatches Activate to focused MenuItem directly |
| MenuItem | Inherited from Shortcut (CommandView) | false | Relay: CommandView completes normally, then MenuItem is notified |
| MenuBarItem | Inherited from MenuItem/Shortcut | false | Relay (inherited), plus custom OnActivating for PopoverMenu toggle |
The menu system has two non-containment boundaries that require CommandBridge:
MenuBarItem ↔ PopoverMenu: xref:Terminal.Gui.Views.PopoverMenu is not a SubView of xref:Terminal.Gui.Views.MenuBarItem — it is registered with Application.Popover and lives outside the view hierarchy. The bridge brings xref:Terminal.Gui.Input.Command.Activate events from the PopoverMenu back to the MenuBarItem so they can bubble up through the MenuBar.
MenuItem ↔ SubMenu: SubMenu is not a SubView of xref:Terminal.Gui.Views.MenuItem — it is managed by the PopoverMenu's cascading infrastructure. The bridge brings xref:Terminal.Gui.Input.Command.Activate and xref:Terminal.Gui.Input.Command.Accept events from the SubMenu back to the MenuItem so they can bubble up through the Menu.
| Mode | When It Occurs | Effect |
|---|---|---|
| Direct | User presses F10, or programmatic InvokeCommand | MenuBar toggles Active on/off |
| BubblingUp | MenuBarItem activation bubbles to MenuBar | MenuBar identifies the source MenuBarItem and shows/hides its PopoverMenu |
| Bridged | MenuItem activation inside PopoverMenu bridges to MenuBarItem | MenuBarItem ignores the command (notification only — no PopoverMenu toggle) |
xref:Terminal.Gui.Views.Menu sets xref:Terminal.Gui.ViewBase.View.CommandsToBubbleUp = [xref:Terminal.Gui.Input.Command.Accept, xref:Terminal.Gui.Input.Command.Activate]. This means:
CommandBridge on MenuBarItem detects the xref:Terminal.Gui.Input.Command.Activate event on PopoverMenu and relays it to MenuBarItemF10 (default) or clicks on xref:Terminal.Gui.Views.MenuBarMenuBar.OnActivating runs:
!Visible || !Enabled: activation is blockedActive: toggles off (Active = false)Active = true and calls ShowItem on the first MenuBarItem with a PopoverMenuActive = true sets xref:Terminal.Gui.ViewBase.View.CanFocus = trueShowItem focuses the MenuBarItem and sets PopoverMenuOpen = truePopoverMenuOpen setter calls PopoverMenu.MakeVisible with the calculated screen positionWhen a MenuBarItem's HotKey (e.g., Alt+F for "_File") is pressed:
MenuBarItem.OnActivating toggles PopoverMenuOpenMenuBar.OnActivating with BubblingUp routingWhen the MenuBar is active and a PopoverMenu is open:
Command.Right/Command.Left advance focus to the next/previous MenuBarItem. The OnSelectedMenuItemChanged callback detects the focus change and, while in popover browsing mode, calls ShowItem on the newly focused item.OnMouseEnter, which sets focus. If in browsing mode, the new item's PopoverMenu opens automatically.The _isSwitchingItem guard prevents premature deactivation during the brief interval when the old popover closes before the new one opens. The _popoverBrowsingMode flag tracks whether any popover is open, enabling auto-open behavior during navigation.
MakeVisible() is called (optionally with a position) — inherited from Popover<TView, TResult>Popover<TView, TResult>.SetPosition() calculates a visible location on screen (PopoverMenu overrides with new SetPosition for menu-specific positioning)Application.Popover.Show() is invoked, setting Visible = truePopoverMenu.OnVisibleChanged() runs — calls Root.ShowMenu() (setting Visible = true and Enabled = true on the root Menu) before base.OnVisibleChanged() to ensure the Menu is enabled for focusPopover<TView, TResult>.OnVisibleChanged() syncs ContentView.VisiblePrerequisite: The xref:Terminal.Gui.Views.PopoverMenu must be registered with Application.Popover before MakeVisible is called. For xref:Terminal.Gui.Views.MenuBarItem, registration happens automatically in EndInit. For standalone context menus, call Application.Popover?.Register (contextMenu) explicitly.
Menu.Focused changes to new xref:Terminal.Gui.Views.MenuItemMenu.OnSelectedMenuItemChanged() runs: hides peer SubMenus, shows selected item's SubMenu with basic positioningMenu.SelectedMenuItemChanged event firesWhen a user presses Enter or clicks a xref:Terminal.Gui.Views.MenuItem:
MenuItem.RaiseAccepting fires the cancellable xref:Terminal.Gui.ViewBase.View.Accepting eventShortcut.OnAccepted runs:
TargetView and Command are set: invokes the command on the target viewAction is set: invokes the actionMenu.CommandsToBubbleUp includes xref:Terminal.Gui.Input.Command.Accept, the command bubbles up:
CommandBridge on MenuBarItem brings the event into the containment hierarchy| Key | Action |
|---|---|
F10 | Toggle MenuBar activation |
Shift+F10 | Show context PopoverMenu |
↑ / ↓ | Navigate within Menu |
← / → | Navigate MenuBar items / Expand-collapse submenus |
Enter | Accept selected MenuItem |
Space | Activate selected MenuItem (e.g., toggle a CheckBox CommandView) |
Escape / Application.GetDefaultKey (Command.Quit) | Close menu / Deactivate MenuBar |
Hotkey (e.g., Alt+F) | Activate/toggle specific MenuBarItem |
| Hotkey in Menu | Jump to MenuItem with matching hotkey |
using Terminal.Gui;
Application.Init ();
Window mainWindow = new () { Title = "Menu Demo" };
MenuBar menuBar = new ([
new MenuBarItem ("_File", [
new MenuItem ("_New", "", () => MessageBox.Query ("New", "Create new file?", "OK", "Cancel")),
new MenuItem ("_Open...", "", () => MessageBox.Query ("Open", "Open file dialog", "OK")),
new Line (),
new MenuItem ("E_xit", Application.GetDefaultKey (Command.Quit), () => Application.RequestStop ())
]),
new MenuBarItem ("_Edit", [
new MenuItem ("_Undo", Key.Z.WithCtrl, () => { }),
new Line (),
new MenuItem ("Cu_t", Key.X.WithCtrl, () => { }),
new MenuItem ("_Copy", Key.C.WithCtrl, () => { }),
new MenuItem ("_Paste", Key.V.WithCtrl, () => { })
])
]);
mainWindow.Add (menuBar);
Application.Run (mainWindow);
Application.Shutdown ();
MenuBarItem optionsMenu = new ("_Options", [
new MenuItem
{
Title = "_Preferences",
SubMenu = new Menu ([
new MenuItem { Title = "_General", Action = () => ShowGeneralPrefs () },
new MenuItem { Title = "_Editor", Action = () => ShowEditorPrefs () },
new MenuItem
{
Title = "_Advanced",
SubMenu = new Menu ([
new MenuItem { Title = "_Debug Mode", Action = () => ToggleDebug () },
new MenuItem { Title = "_Experimental", Action = () => ToggleExperimental () }
])
}
])
},
new Line (),
new MenuItem { Title = "_Reset to Defaults", Action = () => ResetDefaults () }
]);
// Bind menu items to commands on a target view
TextView editor = new () { X = 0, Y = 1, Width = Dim.Fill (), Height = Dim.Fill () };
MenuBar menuBar = new ([
new MenuBarItem ("_Edit", [
new MenuItem (editor, Command.Cut), // Uses editor's Cut command
new MenuItem (editor, Command.Copy), // Uses editor's Copy command
new MenuItem (editor, Command.Paste), // Uses editor's Paste command
new Line (),
new MenuItem (editor, Command.SelectAll)
])
]);
// Set CommandView.CanFocus = false to ensure the MenuItem receives activation for the CheckBox
CheckBox wordWrapCheckBox = new () { Title = "_Word Wrap", CanFocus = false };
wordWrapCheckBox.CheckedStateChanging += (_, e) =>
{
editor.WordWrap = e.NewValue == CheckState.Checked;
};
MenuBarItem viewMenu = new ("_View", [
new MenuItem { CommandView = wordWrapCheckBox },
new MenuItem
{
CommandView = new CheckBox { Title = "_Line Numbers" },
Key = Key.L.WithCtrl
}
]);
PopoverMenu contextMenu = new ([
new MenuItem (editor, Command.Cut),
new MenuItem (editor, Command.Copy),
new MenuItem (editor, Command.Paste),
new Line (),
new MenuItem { Title = "_Properties...", Action = () => ShowProperties () }
]);
Application.Popover?.Register (contextMenu);
// Show on right-click
editor.MouseClick += (_, e) =>
{
if (e.Flags.HasFlag (MouseFlags.RightButtonClicked))
{
contextMenu.MakeVisible (e.ScreenPosition);
e.Handled = true;
}
};
When a xref:Terminal.Gui.Views.MenuItem is activated or accepted, commands propagate through the hierarchy using two mechanisms: command bubbling (within the containment hierarchy) and CommandBridge (across non-containment boundaries).
MenuItem
├─ Accepting event (cancellable)
├─ Accepted event
↓ (bubbles via CommandsToBubbleUp)
Menu (Root)
├─ Accepting event
├─ Accepted event
↓ (PopoverMenu receives via containment)
PopoverMenu
├─ Closes (Visible = false)
↓ (CommandBridge bridges to MenuBarItem)
MenuBarItem
├─ PopoverMenuOpen = false (via VisibleChanged)
↓ (bubbles to SuperView)
MenuBar
├─ Active = false
└─ Deactivates
MenuItem's CommandView (e.g., CheckBox)
├─ Activating / Activated events
↓ (relay dispatch from Shortcut)
MenuItem
├─ Activating / Activated events
↓ (bubbles via CommandsToBubbleUp)
Menu (Root / ContentView)
├─ Activated event
↓ (ContentView CommandBridge bridges to PopoverMenu)
PopoverMenu
├─ OnActivating hides popover for non-HotKey bridged commands
├─ Activated event
↓ (Target CommandBridge bridges to MenuBarItem)
MenuBarItem
├─ OnActivating sees Bridged routing → ignores (no toggle)
↓ (bubbles to SuperView)
MenuBar
├─ OnActivating sees BubblingUp routing → notification only
User navigates → Menu.Focused changes
↓
Menu.OnFocusedChanged ()
↓
SelectedMenuItem updated
↓
Menu.OnSelectedMenuItemChanged ()
├─ Hides peer SubMenus
├─ Shows selected SubMenu (with basic positioning)
↓
SelectedMenuItemChanged event
↓
PopoverMenu adjusts SubMenu positioning (screen boundaries)
Key events are processed depth-first through the view hierarchy:
NewKeyDownEvent (key)
├─ If has Focused SubView → recurse into Focused
├─ RaiseKeyDown (key) — OnKeyDown + KeyDown event
├─ InvokeCommandsBoundToKey (key) — KeyBindings lookup
├─ InvokeCommandsBoundToHotKey (key) — HotKeyBindings (this + SubViews)
└─ RaiseKeyDownNotHandled (key) — OnKeyDownNotHandled + event
For menus specifically:
F10 to xref:Terminal.Gui.Input.Command.HotKey (via HotKeyBindings)F10 and Application.GetDefaultKey (Command.Quit) to Command.Quit (via KeyBindings)Command.Right/Command.LeftCommand.Right/Command.Left for submenu navigationEscape/quit key to Command.QuitMenu appearance can be customized via themes:
// Set default border style for menus
Menu.DefaultBorderStyle = LineStyle.Single;
// Set default border style for menu bars
MenuBar.DefaultBorderStyle = LineStyle.None;
// Set default activation key for menu bars
MenuBar.DefaultKey = Key.F10;
// Set default activation key for popover menus
PopoverMenu.DefaultKey = Key.F10.WithShift;
These can also be configured in config.json:
{
"Themes": {
"Default": {
"Menu.DefaultBorderStyle": "Single",
"MenuBar.DefaultBorderStyle": "None"
}
},
"Settings": {
"MenuBar.DefaultKey": "F10",
"PopoverMenu.DefaultKey": "Shift+F10"
}
}