mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
macos: new terminal view new tab/window
This commit is contained in:
@ -233,8 +233,7 @@ class AppDelegate: NSObject, ObservableObject, NSApplicationDelegate, GhosttyApp
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func focusedSurface() -> ghostty_surface_t? {
|
private func focusedSurface() -> ghostty_surface_t? {
|
||||||
guard let window = NSApp.keyWindow as? PrimaryWindow else { return nil }
|
return terminalManager.focusedSurface?.surface
|
||||||
return window.focusedSurfaceWrapper.surface
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func splitMoveFocus(direction: Ghostty.SplitFocusDirection) {
|
private func splitMoveFocus(direction: Ghostty.SplitFocusDirection) {
|
||||||
|
@ -9,6 +9,9 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele
|
|||||||
/// The app instance that this terminal view will represent.
|
/// The app instance that this terminal view will represent.
|
||||||
let ghostty: Ghostty.AppState
|
let ghostty: Ghostty.AppState
|
||||||
|
|
||||||
|
/// The currently focused surface.
|
||||||
|
var focusedSurface: Ghostty.SurfaceView? = nil
|
||||||
|
|
||||||
init(_ ghostty: Ghostty.AppState) {
|
init(_ ghostty: Ghostty.AppState) {
|
||||||
self.ghostty = ghostty
|
self.ghostty = ghostty
|
||||||
super.init(window: nil)
|
super.init(window: nil)
|
||||||
@ -49,6 +52,13 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele
|
|||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Shows the "+" button in the tab bar, responds to that click.
|
||||||
|
override func newWindowForTab(_ sender: Any?) {
|
||||||
|
// Trigger the ghostty core event logic for a new tab.
|
||||||
|
guard let surface = self.focusedSurface?.surface else { return }
|
||||||
|
ghostty.newTab(surface: surface)
|
||||||
|
}
|
||||||
|
|
||||||
//MARK: - NSWindowDelegate
|
//MARK: - NSWindowDelegate
|
||||||
|
|
||||||
func windowWillClose(_ notification: Notification) {
|
func windowWillClose(_ notification: Notification) {
|
||||||
@ -56,6 +66,10 @@ class TerminalController: NSWindowController, NSWindowDelegate, TerminalViewDele
|
|||||||
|
|
||||||
//MARK: - TerminalViewDelegate
|
//MARK: - TerminalViewDelegate
|
||||||
|
|
||||||
|
func focusedSurfaceDidChange(to: Ghostty.SurfaceView?) {
|
||||||
|
self.focusedSurface = to
|
||||||
|
}
|
||||||
|
|
||||||
func titleDidChange(to: String) {
|
func titleDidChange(to: String) {
|
||||||
self.window?.title = to
|
self.window?.title = to
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import Cocoa
|
import Cocoa
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
/// Manages a set of terminal windows.
|
/// Manages a set of terminal windows.
|
||||||
class TerminalManager {
|
class TerminalManager {
|
||||||
@ -8,6 +9,9 @@ class TerminalManager {
|
|||||||
|
|
||||||
let ghostty: Ghostty.AppState
|
let ghostty: Ghostty.AppState
|
||||||
|
|
||||||
|
/// The currently focused surface of the main window.
|
||||||
|
var focusedSurface: Ghostty.SurfaceView? { mainWindow?.controller.focusedSurface }
|
||||||
|
|
||||||
/// The set of windows we currently have.
|
/// The set of windows we currently have.
|
||||||
private var windows: [Window] = []
|
private var windows: [Window] = []
|
||||||
|
|
||||||
@ -26,6 +30,30 @@ class TerminalManager {
|
|||||||
|
|
||||||
init(_ ghostty: Ghostty.AppState) {
|
init(_ ghostty: Ghostty.AppState) {
|
||||||
self.ghostty = ghostty
|
self.ghostty = ghostty
|
||||||
|
|
||||||
|
let center = NotificationCenter.default
|
||||||
|
center.addObserver(
|
||||||
|
self,
|
||||||
|
selector: #selector(onNewTab),
|
||||||
|
name: Ghostty.Notification.ghosttyNewTab,
|
||||||
|
object: nil)
|
||||||
|
center.addObserver(
|
||||||
|
self,
|
||||||
|
selector: #selector(onNewWindow),
|
||||||
|
name: Ghostty.Notification.ghosttyNewWindow,
|
||||||
|
object: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
let center = NotificationCenter.default;
|
||||||
|
center.removeObserver(
|
||||||
|
self,
|
||||||
|
name: Ghostty.Notification.ghosttyNewTab,
|
||||||
|
object: nil)
|
||||||
|
center.removeObserver(
|
||||||
|
self,
|
||||||
|
name: Ghostty.Notification.ghosttyNewWindow,
|
||||||
|
object: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new terminal window.
|
/// Create a new terminal window.
|
||||||
@ -43,6 +71,11 @@ class TerminalManager {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new window and add it to the parent
|
||||||
|
newTab(to: parent, withBaseConfig: base)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func newTab(to parent: NSWindow, withBaseConfig base: Ghostty.SurfaceConfiguration?) {
|
||||||
// Create a new window and add it to the parent
|
// Create a new window and add it to the parent
|
||||||
let window = createWindow(withBaseConfig: base).window!
|
let window = createWindow(withBaseConfig: base).window!
|
||||||
parent.addTabbedWindow(window, ordered: .above)
|
parent.addTabbedWindow(window, ordered: .above)
|
||||||
@ -50,7 +83,7 @@ class TerminalManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a window controller, adds it to our managed list, and returns it.
|
/// Creates a window controller, adds it to our managed list, and returns it.
|
||||||
func createWindow(withBaseConfig: Ghostty.SurfaceConfiguration?) -> TerminalController {
|
private func createWindow(withBaseConfig: Ghostty.SurfaceConfiguration?) -> TerminalController {
|
||||||
// Initialize our controller to load the window
|
// Initialize our controller to load the window
|
||||||
let c = TerminalController(ghostty)
|
let c = TerminalController(ghostty)
|
||||||
|
|
||||||
@ -59,4 +92,20 @@ class TerminalManager {
|
|||||||
|
|
||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc private func onNewWindow(notification: SwiftUI.Notification) {
|
||||||
|
let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey]
|
||||||
|
let config = configAny as? Ghostty.SurfaceConfiguration
|
||||||
|
self.newWindow(withBaseConfig: config)
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc private func onNewTab(notification: SwiftUI.Notification) {
|
||||||
|
guard let surfaceView = notification.object as? Ghostty.SurfaceView else { return }
|
||||||
|
guard let window = surfaceView.window else { return }
|
||||||
|
|
||||||
|
let configAny = notification.userInfo?[Ghostty.Notification.NewSurfaceConfigKey]
|
||||||
|
let config = configAny as? Ghostty.SurfaceConfiguration
|
||||||
|
|
||||||
|
self.newTab(to: window, withBaseConfig: config)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user