Phase 9, MA1: crates/ghostty-macos (AppKit via objc2; empty stub on non-Apple targets) ports the foundation of Ghostty 1.3.1's Swift macOS app (ghostty/macos): main, AppDelegate (+Ghostty) with lifecycle, dock menu, open-file, notifications, shortcut sync and quit/reopen paths; MainMenu.xib as generated menu tables built into NSMenus; the Ghostty.App/Config/Surface wrappers driving libghostty in-process via ghostty-lib; the generic helpers; scripts/macos-bundle.sh to assemble Ghostty.app (dry-run on Linux). Feature areas are stubbed for MA2-MA5. Design and type mapping: docs/rewrite/notes/macos-app-design.md (App Intents is a Swift-only framework and cannot be ported). Compile-checked only (no macOS here): just check-macos passes for aarch64/x86_64-apple-darwin with -D warnings; 125 platform-independent tests run on Linux. Test Plan: - just check-macos - cargo test -p ghostty-macos
917 lines
40 KiB
Rust
917 lines
40 KiB
Rust
//! GENERATED by scripts/gen-macos-menu-spec.py from MainMenu.xib; do not edit.
|
|
//!
|
|
//! Every menu item of the xib: title, key equivalent, modifier mask, action
|
|
//! selector + target (`-1` first responder / the AppDelegate) and the AppDelegate
|
|
//! outlet it is connected to.
|
|
|
|
use super::{Action, Item, ItemSpec, MenuSpec, Mods, Outlet, SystemMenu, Target};
|
|
|
|
/// The main menu (`systemMenu="main"`).
|
|
pub const MAIN_MENU: MenuSpec = MenuSpec {
|
|
title: "Main Menu",
|
|
system_menu: Some(SystemMenu::Main),
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Ghostty",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Ghostty",
|
|
system_menu: Some(SystemMenu::Apple),
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "About Ghostty",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "showAbout:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuAbout),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Check for Updates...",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "checkForUpdates:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuCheckForUpdates),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Preferences…",
|
|
key_equivalent: ",",
|
|
modifiers: None,
|
|
action: Some(Action {
|
|
selector: "openConfig:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuOpenConfig),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Reload Configuration",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "reloadConfig:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuReloadConfig),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Secure Keyboard Entry",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleSecureInput:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuSecureInput),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Make Ghostty the Default Terminal",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "setAsDefaultTerminal:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuSetAsDefaultTerminal),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Services",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Services",
|
|
system_menu: None,
|
|
outlet: Some(Outlet::MenuServices),
|
|
items: &[],
|
|
}),
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Hide Ghostty",
|
|
key_equivalent: "h",
|
|
modifiers: None,
|
|
action: Some(Action {
|
|
selector: "hide:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Hide Others",
|
|
key_equivalent: "h",
|
|
modifiers: Some(Mods(Mods::OPTION.0 | Mods::COMMAND.0)),
|
|
action: Some(Action {
|
|
selector: "hideOtherApplications:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Show All",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "unhideAllApplications:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Quit Ghostty",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "terminate:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuQuit),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "File",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "File",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "New Window",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "newWindow:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuNewWindow),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "New Tab",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "newTab:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuNewTab),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Split Right",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitRight:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSplitRight),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Split Left",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitLeft:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSplitLeft),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Split Down",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitDown:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSplitDown),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Split Up",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitUp:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSplitUp),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Close",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "close:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuClose),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Close Tab",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "closeTab:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuCloseTab),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Close Window",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "closeWindow:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuCloseWindow),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Close All Windows",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "closeAllWindows:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuCloseAllWindows),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Edit",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Edit",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Undo",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "undo:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuUndo),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Redo",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "redo:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuRedo),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Copy",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "copy:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuCopy),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Paste",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "paste:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuPaste),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Paste Selection",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "pasteSelection:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuPasteSelection),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select All",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "selectAll:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectAll),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Find",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: Some(Outlet::MenuFindParent),
|
|
submenu: Some(&MenuSpec {
|
|
title: "Find",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Find...",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "find:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuFind),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Find Next",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "findNext:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuFindNext),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Find Previous",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "findPrevious:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuFindPrevious),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Hide Find Bar",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "findHide:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuHideFindBar),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Use Selection for Find",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "selectionForFind:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectionForSearch),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Jump to Selection",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "scrollToSelection:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Separator,
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "View",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "View",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Reset Font Size",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "resetFontSize:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuResetFontSize),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Increase Font Size",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "increaseFontSize:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuIncreaseFontSize),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Decrease Font Size",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "decreaseFontSize:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuDecreaseFontSize),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Command Palette",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleCommandPalette:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuCommandPalette),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Change Tab Title...",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "changeTabTitle:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuChangeTabTitle),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Change Terminal Title...",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "changeTitle:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuChangeTitle),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Terminal Read-only",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleReadonly:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuReadonly),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Quick Terminal",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleQuickTerminal:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuQuickTerminal),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Terminal Inspector",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleTerminalInspector:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuTerminalInspector),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Window",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Window",
|
|
system_menu: Some(SystemMenu::Window),
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Minimize",
|
|
key_equivalent: "m",
|
|
modifiers: None,
|
|
action: Some(Action {
|
|
selector: "performMiniaturize:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Zoom",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "performZoom:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Toggle Full Screen",
|
|
key_equivalent: "f",
|
|
modifiers: Some(Mods(Mods::CONTROL.0 | Mods::COMMAND.0)),
|
|
action: Some(Action {
|
|
selector: "toggleGhosttyFullScreen:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuToggleFullScreen),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Show/Hide All Terminals",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "toggleVisibility:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuToggleVisibility),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Zoom Split",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitZoom:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuZoomSplit),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Previous Split",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusPrevious:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuPreviousSplit),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Next Split",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusNext:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuNextSplit),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Split",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Select Split",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Select Split Above",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusAbove:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectSplitAbove),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Split Below",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusBelow:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectSplitBelow),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Split Left",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusLeft:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectSplitLeft),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Select Split Right",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "splitMoveFocusRight:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuSelectSplitRight),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Resize Split",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Resize Split",
|
|
system_menu: None,
|
|
outlet: None,
|
|
items: &[
|
|
ItemSpec::Item(Item {
|
|
title: "Equalize Splits",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "equalizeSplits:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuEqualizeSplits),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Move Divider Up",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "moveSplitDividerUp:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuMoveSplitDividerUp),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Move Divider Down",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "moveSplitDividerDown:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuMoveSplitDividerDown),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Move Divider Left",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "moveSplitDividerLeft:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuMoveSplitDividerLeft),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Move Divider Right",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "moveSplitDividerRight:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuMoveSplitDividerRight),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Return To Default Size",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "returnToDefaultSize:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuReturnToDefaultSize),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Float on Top",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "floatOnTop:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuFloatOnTop),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Use as Default",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "useAsDefault:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: Some(Outlet::MenuUseAsDefault),
|
|
submenu: None,
|
|
}),
|
|
ItemSpec::Separator,
|
|
ItemSpec::Item(Item {
|
|
title: "Bring All to Front",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: Some(Action {
|
|
selector: "arrangeInFront:",
|
|
target: Target::FirstResponder,
|
|
}),
|
|
outlet: Some(Outlet::MenuBringAllToFront),
|
|
submenu: None,
|
|
}),
|
|
],
|
|
}),
|
|
}),
|
|
ItemSpec::Item(Item {
|
|
title: "Help",
|
|
key_equivalent: "",
|
|
modifiers: Some(Mods::NONE),
|
|
action: None,
|
|
outlet: None,
|
|
submenu: Some(&MenuSpec {
|
|
title: "Help",
|
|
system_menu: Some(SystemMenu::Help),
|
|
outlet: None,
|
|
items: &[ItemSpec::Item(Item {
|
|
title: "Ghostty Help",
|
|
key_equivalent: "?",
|
|
modifiers: None,
|
|
action: Some(Action {
|
|
selector: "showHelp:",
|
|
target: Target::AppDelegate,
|
|
}),
|
|
outlet: None,
|
|
submenu: None,
|
|
})],
|
|
}),
|
|
}),
|
|
],
|
|
};
|
|
|
|
/// All outlets connected in the xib (the Swift names).
|
|
pub const CONNECTED_OUTLETS: &[Outlet] = &[
|
|
Outlet::MenuAbout,
|
|
Outlet::MenuBringAllToFront,
|
|
Outlet::MenuChangeTabTitle,
|
|
Outlet::MenuChangeTitle,
|
|
Outlet::MenuCheckForUpdates,
|
|
Outlet::MenuClose,
|
|
Outlet::MenuCloseAllWindows,
|
|
Outlet::MenuCloseTab,
|
|
Outlet::MenuCloseWindow,
|
|
Outlet::MenuCommandPalette,
|
|
Outlet::MenuCopy,
|
|
Outlet::MenuDecreaseFontSize,
|
|
Outlet::MenuEqualizeSplits,
|
|
Outlet::MenuFind,
|
|
Outlet::MenuFindNext,
|
|
Outlet::MenuFindParent,
|
|
Outlet::MenuFindPrevious,
|
|
Outlet::MenuFloatOnTop,
|
|
Outlet::MenuHideFindBar,
|
|
Outlet::MenuIncreaseFontSize,
|
|
Outlet::MenuMoveSplitDividerDown,
|
|
Outlet::MenuMoveSplitDividerLeft,
|
|
Outlet::MenuMoveSplitDividerRight,
|
|
Outlet::MenuMoveSplitDividerUp,
|
|
Outlet::MenuNewTab,
|
|
Outlet::MenuNewWindow,
|
|
Outlet::MenuNextSplit,
|
|
Outlet::MenuOpenConfig,
|
|
Outlet::MenuPaste,
|
|
Outlet::MenuPasteSelection,
|
|
Outlet::MenuPreviousSplit,
|
|
Outlet::MenuQuickTerminal,
|
|
Outlet::MenuQuit,
|
|
Outlet::MenuReadonly,
|
|
Outlet::MenuRedo,
|
|
Outlet::MenuReloadConfig,
|
|
Outlet::MenuResetFontSize,
|
|
Outlet::MenuReturnToDefaultSize,
|
|
Outlet::MenuSecureInput,
|
|
Outlet::MenuSelectAll,
|
|
Outlet::MenuSelectSplitAbove,
|
|
Outlet::MenuSelectSplitBelow,
|
|
Outlet::MenuSelectSplitLeft,
|
|
Outlet::MenuSelectSplitRight,
|
|
Outlet::MenuSelectionForSearch,
|
|
Outlet::MenuServices,
|
|
Outlet::MenuSetAsDefaultTerminal,
|
|
Outlet::MenuSplitDown,
|
|
Outlet::MenuSplitLeft,
|
|
Outlet::MenuSplitRight,
|
|
Outlet::MenuSplitUp,
|
|
Outlet::MenuTerminalInspector,
|
|
Outlet::MenuToggleFullScreen,
|
|
Outlet::MenuToggleVisibility,
|
|
Outlet::MenuUndo,
|
|
Outlet::MenuUseAsDefault,
|
|
Outlet::MenuZoomSplit,
|
|
];
|