diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index cbd3668c5..d54b49642 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -402,11 +402,9 @@ class AppDelegate: NSObject, var config = Ghostty.SurfaceConfiguration() if (isDirectory.boolValue) { - // When opening a directory, create a new tab in the main - // window with that as the working directory. - // If no windows exist, a new one will be created. + // When opening a directory, check the configuration to decide + // whether to open in a new tab or new window. config.workingDirectory = filename - _ = TerminalController.newTab(ghostty, withBaseConfig: config) } else { // When opening a file, we want to execute the file. To do this, we // don't override the command directly, because it won't load the @@ -418,8 +416,11 @@ class AppDelegate: NSObject, // Set the parent directory to our working directory so that relative // paths in scripts work. config.workingDirectory = (filename as NSString).deletingLastPathComponent - - _ = TerminalController.newWindow(ghostty, withBaseConfig: config) + } + + switch ghostty.config.macosDockDropBehavior { + case .new_tab: _ = TerminalController.newTab(ghostty, withBaseConfig: config) + case .new_window: _ = TerminalController.newWindow(ghostty, withBaseConfig: config) } return true diff --git a/macos/Sources/Ghostty/Ghostty.Config.swift b/macos/Sources/Ghostty/Ghostty.Config.swift index a223b2a0a..6992f59f6 100644 --- a/macos/Sources/Ghostty/Ghostty.Config.swift +++ b/macos/Sources/Ghostty/Ghostty.Config.swift @@ -282,6 +282,17 @@ extension Ghostty { return MacOSTitlebarProxyIcon(rawValue: str) ?? defaultValue } + var macosDockDropBehavior: MacDockDropBehavior { + let defaultValue = MacDockDropBehavior.new_tab + guard let config = self.config else { return defaultValue } + var v: UnsafePointer? = nil + let key = "macos-dock-drop-behavior" + guard ghostty_config_get(config, &v, key, UInt(key.count)) else { return defaultValue } + guard let ptr = v else { return defaultValue } + let str = String(cString: ptr) + return MacDockDropBehavior(rawValue: str) ?? defaultValue + } + var macosWindowShadow: Bool { guard let config = self.config else { return false } var v = false; @@ -607,6 +618,11 @@ extension Ghostty.Config { static let attention = BellFeatures(rawValue: 1 << 2) static let title = BellFeatures(rawValue: 1 << 3) } + + enum MacDockDropBehavior: String { + case new_tab = "new-tab" + case new_window = "new-window" + } enum MacHidden : String { case never diff --git a/src/config/Config.zig b/src/config/Config.zig index 178b9f851..d8fcfa1d7 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -2631,6 +2631,21 @@ keybind: Keybinds = .{}, /// editor, etc. @"macos-titlebar-proxy-icon": MacTitlebarProxyIcon = .visible, +/// Controls the windowing behavior when dropping a file or folder +/// onto the Ghostty icon in the macOS dock. +/// +/// Valid values are: +/// +/// * `new-tab` - Create a new tab in the current window, or open +/// a new window if none exist. +/// * `new-window` - Create a new window unconditionally. +/// +/// The default value is `new-tab`. +/// +/// This setting is only supported on macOS and has no effect on other +/// platforms. +@"macos-dock-drop-behavior": MacOSDockDropBehavior = .@"new-tab", + /// macOS doesn't have a distinct "alt" key and instead has the "option" /// key which behaves slightly differently. On macOS by default, the /// option key plus a character will sometimes produce a Unicode character. @@ -7082,6 +7097,12 @@ pub const WindowNewTabPosition = enum { end, }; +/// See macos-dock-drop-behavior +pub const MacOSDockDropBehavior = enum { + @"new-tab", + window, +}; + /// See window-show-tab-bar pub const WindowShowTabBar = enum { always, diff --git a/src/config/formatter.zig b/src/config/formatter.zig index cabf80953..a42395c19 100644 --- a/src/config/formatter.zig +++ b/src/config/formatter.zig @@ -147,6 +147,8 @@ pub const FileFormatter = struct { opts: std.fmt.FormatOptions, writer: anytype, ) !void { + @setEvalBranchQuota(10_000); + _ = layout; _ = opts;