macos: sync many more menu items

This commit is contained in:
Mitchell Hashimoto
2023-08-31 11:33:58 -07:00
parent c7071a1da2
commit 22b925223a
2 changed files with 43 additions and 18 deletions

View File

@ -17,6 +17,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
/// Various menu items so that we can programmatically sync the keyboard shortcut with the Ghostty config. /// Various menu items so that we can programmatically sync the keyboard shortcut with the Ghostty config.
@IBOutlet private var menuPreviousSplit: NSMenuItem? @IBOutlet private var menuPreviousSplit: NSMenuItem?
@IBOutlet private var menuNextSplit: NSMenuItem? @IBOutlet private var menuNextSplit: NSMenuItem?
@IBOutlet private var menuSelectSplitAbove: NSMenuItem?
@IBOutlet private var menuSelectSplitBelow: NSMenuItem?
@IBOutlet private var menuSelectSplitLeft: NSMenuItem?
@IBOutlet private var menuSelectSplitRight: NSMenuItem?
/// The ghostty global state. Only one per process. /// The ghostty global state. Only one per process.
private var ghostty: Ghostty.AppState = Ghostty.AppState() private var ghostty: Ghostty.AppState = Ghostty.AppState()
@ -83,17 +87,32 @@ class AppDelegate: NSObject, NSApplicationDelegate, ObservableObject {
return .terminateLater return .terminateLater
} }
/// Sync all of our menu item keyboard shortcuts with the Ghostty configuration.
private func syncMenuShortcuts() { private func syncMenuShortcuts() {
guard let cfg = ghostty.config else { return } guard ghostty.config != nil else { return }
if let menu = self.menuPreviousSplit { syncMenuShortcut(action: "goto_split:previous", menuItem: self.menuPreviousSplit)
let action = "goto_split:previous" syncMenuShortcut(action: "goto_split:next", menuItem: self.menuNextSplit)
let trigger = ghostty_config_trigger(cfg, action, UInt(action.count)) syncMenuShortcut(action: "goto_split:top", menuItem: self.menuSelectSplitAbove)
if let equiv = Ghostty.keyEquivalent(key: trigger.key) { syncMenuShortcut(action: "goto_split:bottom", menuItem: self.menuSelectSplitBelow)
menu.keyEquivalent = equiv syncMenuShortcut(action: "goto_split:left", menuItem: self.menuSelectSplitLeft)
menu.keyEquivalentModifierMask = Ghostty.eventModifierFlags(mods: trigger.mods) syncMenuShortcut(action: "goto_split:right", menuItem: self.menuSelectSplitRight)
} }
/// Syncs a single menu shortcut for the given action. The action string is the same
/// action string used for the Ghostty configuration.
private func syncMenuShortcut(action: String, menuItem: NSMenuItem?) {
guard let cfg = ghostty.config else { return }
guard let menu = menuItem else { return }
let trigger = ghostty_config_trigger(cfg, action, UInt(action.count))
guard let equiv = Ghostty.keyEquivalent(key: trigger.key) else {
Self.logger.debug("no keyboard shorcut set for action=\(action)")
return
} }
menu.keyEquivalent = equiv
menu.keyEquivalentModifierMask = Ghostty.eventModifierFlags(mods: trigger.mods)
} }
private func focusedSurface() -> ghostty_surface_t? { private func focusedSurface() -> ghostty_surface_t? {

View File

@ -16,6 +16,10 @@
<connections> <connections>
<outlet property="menuNextSplit" destination="bD7-ei-wKU" id="LeT-xw-eh4"/> <outlet property="menuNextSplit" destination="bD7-ei-wKU" id="LeT-xw-eh4"/>
<outlet property="menuPreviousSplit" destination="Lic-px-1wg" id="Rto-CG-yRe"/> <outlet property="menuPreviousSplit" destination="Lic-px-1wg" id="Rto-CG-yRe"/>
<outlet property="menuSelectSplitAbove" destination="0yU-hC-8xF" id="aPc-lS-own"/>
<outlet property="menuSelectSplitBelow" destination="QDz-d9-CBr" id="FsH-Dq-jij"/>
<outlet property="menuSelectSplitLeft" destination="cTK-oy-KuV" id="Jpr-5q-dqz"/>
<outlet property="menuSelectSplitRight" destination="upj-mc-L7X" id="nLY-o1-lky"/>
</connections> </connections>
</customObject> </customObject>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/> <customObject id="YLy-65-1bz" customClass="NSFontManager"/>
@ -146,12 +150,14 @@
</connections> </connections>
</menuItem> </menuItem>
<menuItem isSeparatorItem="YES" id="rlu-tP-x0P"/> <menuItem isSeparatorItem="YES" id="rlu-tP-x0P"/>
<menuItem title="Select Previous Split" keyEquivalent="[" id="Lic-px-1wg"> <menuItem title="Select Previous Split" id="Lic-px-1wg">
<modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusPrevious:" target="bbz-4X-AYv" id="mOs-gG-dAC"/> <action selector="splitMoveFocusPrevious:" target="bbz-4X-AYv" id="mOs-gG-dAC"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Select Next Split" keyEquivalent="]" id="bD7-ei-wKU"> <menuItem title="Select Next Split" id="bD7-ei-wKU">
<modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusNext:" target="bbz-4X-AYv" id="rU6-Vw-DoW"/> <action selector="splitMoveFocusNext:" target="bbz-4X-AYv" id="rU6-Vw-DoW"/>
</connections> </connections>
@ -160,26 +166,26 @@
<modifierMask key="keyEquivalentModifierMask"/> <modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Select Split" id="8tg-60-ZSU"> <menu key="submenu" title="Select Split" id="8tg-60-ZSU">
<items> <items>
<menuItem title="Select Split Above" keyEquivalent="" id="0yU-hC-8xF"> <menuItem title="Select Split Above" id="0yU-hC-8xF">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusAbove:" target="bbz-4X-AYv" id="HDw-f2-RJY"/> <action selector="splitMoveFocusAbove:" target="bbz-4X-AYv" id="HDw-f2-RJY"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Select Split Below" keyEquivalent="" id="QDz-d9-CBr"> <menuItem title="Select Split Below" id="QDz-d9-CBr">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusBelow:" target="bbz-4X-AYv" id="fmW-hZ-uOA"/> <action selector="splitMoveFocusBelow:" target="bbz-4X-AYv" id="fmW-hZ-uOA"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Select Split Left" keyEquivalent="" id="cTK-oy-KuV"> <menuItem title="Select Split Left" id="cTK-oy-KuV">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusLeft:" target="bbz-4X-AYv" id="N1i-a2-7N5"/> <action selector="splitMoveFocusLeft:" target="bbz-4X-AYv" id="N1i-a2-7N5"/>
</connections> </connections>
</menuItem> </menuItem>
<menuItem title="Select Split Right" keyEquivalent="" id="upj-mc-L7X"> <menuItem title="Select Split Right" id="upj-mc-L7X">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/> <modifierMask key="keyEquivalentModifierMask"/>
<connections> <connections>
<action selector="splitMoveFocusRight:" target="bbz-4X-AYv" id="Pgi-df-84r"/> <action selector="splitMoveFocusRight:" target="bbz-4X-AYv" id="Pgi-df-84r"/>
</connections> </connections>