mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-07-16 00:36:07 +03:00
Merge pull request #413 from mitchellh/macos-dock-menu
macos: dock menu
This commit is contained in:
@ -34,6 +34,9 @@ class AppDelegate: NSObject, ObservableObject, NSApplicationDelegate, GhosttyApp
|
|||||||
@IBOutlet private var menuSelectSplitLeft: NSMenuItem?
|
@IBOutlet private var menuSelectSplitLeft: NSMenuItem?
|
||||||
@IBOutlet private var menuSelectSplitRight: NSMenuItem?
|
@IBOutlet private var menuSelectSplitRight: NSMenuItem?
|
||||||
|
|
||||||
|
/// The dock menu
|
||||||
|
private var dockMenu: NSMenu = NSMenu()
|
||||||
|
|
||||||
/// 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()
|
||||||
|
|
||||||
@ -114,6 +117,11 @@ class AppDelegate: NSObject, ObservableObject, NSApplicationDelegate, GhosttyApp
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// This is called for the dock right-click menu.
|
||||||
|
func applicationDockMenu(_ sender: NSApplication) -> NSMenu? {
|
||||||
|
return dockMenu
|
||||||
|
}
|
||||||
|
|
||||||
/// Sync all of our menu item keyboard shortcuts with the Ghostty configuration.
|
/// Sync all of our menu item keyboard shortcuts with the Ghostty configuration.
|
||||||
private func syncMenuShortcuts() {
|
private func syncMenuShortcuts() {
|
||||||
guard ghostty.config != nil else { return }
|
guard ghostty.config != nil else { return }
|
||||||
@ -136,6 +144,9 @@ class AppDelegate: NSObject, ObservableObject, NSApplicationDelegate, GhosttyApp
|
|||||||
syncMenuShortcut(action: "goto_split:bottom", menuItem: self.menuSelectSplitBelow)
|
syncMenuShortcut(action: "goto_split:bottom", menuItem: self.menuSelectSplitBelow)
|
||||||
syncMenuShortcut(action: "goto_split:left", menuItem: self.menuSelectSplitLeft)
|
syncMenuShortcut(action: "goto_split:left", menuItem: self.menuSelectSplitLeft)
|
||||||
syncMenuShortcut(action: "goto_split:right", menuItem: self.menuSelectSplitRight)
|
syncMenuShortcut(action: "goto_split:right", menuItem: self.menuSelectSplitRight)
|
||||||
|
|
||||||
|
// Dock menu
|
||||||
|
reloadDockMenu()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Syncs a single menu shortcut for the given action. The action string is the same
|
/// Syncs a single menu shortcut for the given action. The action string is the same
|
||||||
@ -170,14 +181,33 @@ class AppDelegate: NSObject, ObservableObject, NSApplicationDelegate, GhosttyApp
|
|||||||
syncMenuShortcuts()
|
syncMenuShortcuts()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MARK: - Dock Menu
|
||||||
|
|
||||||
|
private func reloadDockMenu() {
|
||||||
|
let newWindow = NSMenuItem(title: "New Window", action: #selector(newWindow), keyEquivalent: "")
|
||||||
|
let newTab = NSMenuItem(title: "New Tab", action: #selector(newTab), keyEquivalent: "")
|
||||||
|
|
||||||
|
dockMenu.removeAllItems()
|
||||||
|
dockMenu.addItem(newWindow)
|
||||||
|
dockMenu.addItem(newTab)
|
||||||
|
}
|
||||||
|
|
||||||
//MARK: - IB Actions
|
//MARK: - IB Actions
|
||||||
|
|
||||||
@IBAction func newWindow(_ sender: Any?) {
|
@IBAction func newWindow(_ sender: Any?) {
|
||||||
windowManager.newWindow()
|
windowManager.newWindow()
|
||||||
|
|
||||||
|
// We also activate our app so that it becomes front. This may be
|
||||||
|
// necessary for the dock menu.
|
||||||
|
NSApp.activate(ignoringOtherApps: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func newTab(_ sender: Any?) {
|
@IBAction func newTab(_ sender: Any?) {
|
||||||
windowManager.newTab()
|
windowManager.newTab()
|
||||||
|
|
||||||
|
// We also activate our app so that it becomes front. This may be
|
||||||
|
// necessary for the dock menu.
|
||||||
|
NSApp.activate(ignoringOtherApps: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
@IBAction func closeWindow(_ sender: Any) {
|
@IBAction func closeWindow(_ sender: Any) {
|
||||||
|
@ -34,7 +34,7 @@ class PrimaryWindowManager {
|
|||||||
|
|
||||||
// In case we run into the inconsistency, let it crash in debug mode so we
|
// In case we run into the inconsistency, let it crash in debug mode so we
|
||||||
// can fix our window management setup to prevent this from happening.
|
// can fix our window management setup to prevent this from happening.
|
||||||
assert(mainManagedWindow != nil || managedWindows.isEmpty)
|
assert(mainManagedWindow != nil || !managedWindows.isEmpty)
|
||||||
|
|
||||||
return (mainManagedWindow ?? managedWindows.first)
|
return (mainManagedWindow ?? managedWindows.first)
|
||||||
.map { $0.window }
|
.map { $0.window }
|
||||||
@ -100,6 +100,7 @@ class PrimaryWindowManager {
|
|||||||
|
|
||||||
func addNewWindow(withBaseConfig config: ghostty_surface_config_s? = nil) {
|
func addNewWindow(withBaseConfig config: ghostty_surface_config_s? = nil) {
|
||||||
guard let controller = createWindowController(withBaseConfig: config) else { return }
|
guard let controller = createWindowController(withBaseConfig: config) else { return }
|
||||||
|
controller.showWindow(self)
|
||||||
guard let newWindow = addManagedWindow(windowController: controller)?.window else { return }
|
guard let newWindow = addManagedWindow(windowController: controller)?.window else { return }
|
||||||
newWindow.makeKeyAndOrderFront(nil)
|
newWindow.makeKeyAndOrderFront(nil)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user