cmux/Sources/cmuxApp.swift
2026-01-26 03:05:03 -08:00

118 lines
4.1 KiB
Swift

import AppKit
import SwiftUI
@main
struct cmuxApp: App {
@StateObject private var tabManager = TabManager()
@StateObject private var notificationStore = TerminalNotificationStore.shared
@NSApplicationDelegateAdaptor(AppDelegate.self) private var appDelegate
init() {
// Start the terminal controller for programmatic control
// This runs after TabManager is created via @StateObject
}
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(tabManager)
.environmentObject(notificationStore)
.onAppear {
// Start the Unix socket controller for programmatic access
TerminalController.shared.start(tabManager: tabManager)
appDelegate.configure(tabManager: tabManager, notificationStore: notificationStore)
}
}
.windowStyle(.hiddenTitleBar)
.commands {
CommandGroup(replacing: .appInfo) {
Button("About cmux") {
showAboutPanel()
}
}
// New tab commands
CommandGroup(replacing: .newItem) {
Button("New Tab") {
tabManager.addTab()
}
.keyboardShortcut("t", modifiers: .command)
Button("New Tab") {
tabManager.addTab()
}
.keyboardShortcut("n", modifiers: .command)
Button("New Tab") {
tabManager.addTab()
}
.keyboardShortcut("`", modifiers: [.control, .shift])
}
// Close tab
CommandGroup(after: .newItem) {
Button("Close Panel") {
tabManager.closeCurrentPanelWithConfirmation()
}
.keyboardShortcut("w", modifiers: .command)
Button("Close Tab") {
tabManager.closeCurrentTabWithConfirmation()
}
.keyboardShortcut("w", modifiers: [.command, .shift])
}
// Tab navigation
CommandGroup(after: .toolbar) {
Button("Next Tab") {
tabManager.selectNextTab()
}
.keyboardShortcut("]", modifiers: [.command, .shift])
Button("Previous Tab") {
tabManager.selectPreviousTab()
}
.keyboardShortcut("[", modifiers: [.command, .shift])
Button("Next Tab") {
tabManager.selectNextTab()
}
.keyboardShortcut(.tab, modifiers: .control)
Button("Previous Tab") {
tabManager.selectPreviousTab()
}
.keyboardShortcut(.tab, modifiers: [.control, .shift])
Divider()
// Cmd+1 through Cmd+9 for tab selection
ForEach(1...9, id: \.self) { number in
Button("Tab \(number)") {
if number == 9 {
tabManager.selectLastTab()
} else {
tabManager.selectTab(at: number - 1)
}
}
.keyboardShortcut(KeyEquivalent(Character("\(number)")), modifiers: .command)
}
}
}
}
private func showAboutPanel() {
let bundle = Bundle.main
let appName = bundle.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
?? bundle.object(forInfoDictionaryKey: "CFBundleName") as? String
?? "cmux"
let version = bundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "1.0"
let build = bundle.object(forInfoDictionaryKey: "CFBundleVersion") as? String ?? "1"
NSApp.orderFrontStandardAboutPanel(options: [
.applicationName: appName,
.version: version,
.applicationVersion: build
])
NSApp.activate(ignoringOtherApps: true)
}
}