Add macos-dock-drop-folder-behavior configuration option

This adds a new configuration option that controls whether folders
dropped onto the Ghostty dock icon open in a new tab (default) or
a new window.

The option accepts two values:
- tab: Opens folders in a new tab in the main window (default)
- window: Opens folders in a new window

This is useful for users who prefer window-based workflows over
tab-based workflows when opening folders via drag and drop.
This commit is contained in:
David Keegan
2025-07-31 13:16:52 -06:00
committed by Mitchell Hashimoto
parent d20376c1ff
commit f9ad061ea8
4 changed files with 47 additions and 4 deletions

View File

@@ -402,11 +402,17 @@ 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)
let behavior = ghostty.config.macosDockDropFolderBehavior
if behavior == .window {
_ = TerminalController.newWindow(ghostty, withBaseConfig: config)
} else {
// Default to tab behavior
_ = 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

View File

@@ -282,6 +282,17 @@ extension Ghostty {
return MacOSTitlebarProxyIcon(rawValue: str) ?? defaultValue
}
var macosDockDropFolderBehavior: MacOSDockDropFolderBehavior {
let defaultValue = MacOSDockDropFolderBehavior.tab
guard let config = self.config else { return defaultValue }
var v: UnsafePointer<Int8>? = nil
let key = "macos-dock-drop-folder-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 MacOSDockDropFolderBehavior(rawValue: str) ?? defaultValue
}
var macosWindowShadow: Bool {
guard let config = self.config else { return false }
var v = false;

View File

@@ -304,6 +304,12 @@ extension Ghostty {
case hidden
}
/// Enum for the macos-dock-drop-folder-behavior config option
enum MacOSDockDropFolderBehavior: String {
case tab
case window
}
/// Enum for auto-update-channel config option
enum AutoUpdateChannel: String {
case tip

View File

@@ -2631,6 +2631,20 @@ keybind: Keybinds = .{},
/// editor, etc.
@"macos-titlebar-proxy-icon": MacTitlebarProxyIcon = .visible,
/// Controls the behavior when dropping a folder onto the Ghostty dock icon
/// on macOS.
///
/// Valid values are:
///
/// * `tab` - Open the folder in a new tab in the main window (default).
/// * `window` - Open the folder in a new window.
///
/// The default value is `tab`.
///
/// This setting is only supported on macOS and has no effect on other
/// platforms.
@"macos-dock-drop-folder-behavior": MacOSDockDropFolderBehavior = .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 +7096,12 @@ pub const WindowNewTabPosition = enum {
end,
};
/// See macos-dock-drop-folder-behavior
pub const MacOSDockDropFolderBehavior = enum {
tab,
window,
};
/// See window-show-tab-bar
pub const WindowShowTabBar = enum {
always,