diff --git a/include/ghostty.h b/include/ghostty.h index 6fd218e9e..574cc6278 100644 --- a/include/ghostty.h +++ b/include/ghostty.h @@ -419,6 +419,7 @@ typedef struct { ghostty_env_var_s* env_vars; size_t env_var_count; const char* initial_input; + bool wait_after_command; } ghostty_surface_config_s; typedef struct { diff --git a/macos/Sources/App/macOS/AppDelegate.swift b/macos/Sources/App/macOS/AppDelegate.swift index c00025bf5..3f0a15b6a 100644 --- a/macos/Sources/App/macOS/AppDelegate.swift +++ b/macos/Sources/App/macOS/AppDelegate.swift @@ -412,6 +412,11 @@ class AppDelegate: NSObject, // due to things like Homebrew. Instead, we set the command to // `; exit` which is what Terminal and iTerm2 do. config.initialInput = "\(filename); exit\n" + + // For commands executed directly, we want to ensure we wait after exit + // because in most cases scripts don't block on exit and we don't want + // the window to just flash closed once complete. + config.waitAfterCommand = true // Set the parent directory to our working directory so that relative // paths in scripts work. diff --git a/macos/Sources/Ghostty/SurfaceView.swift b/macos/Sources/Ghostty/SurfaceView.swift index aa4de5178..039245429 100644 --- a/macos/Sources/Ghostty/SurfaceView.swift +++ b/macos/Sources/Ghostty/SurfaceView.swift @@ -424,6 +424,9 @@ extension Ghostty { /// Extra input to send as stdin var initialInput: String? = nil + + /// Wait after the command + var waitAfterCommand: Bool = false init() {} @@ -475,6 +478,9 @@ extension Ghostty { // Zero is our default value that means to inherit the font size. config.font_size = fontSize ?? 0 + + // Set wait after command + config.wait_after_command = waitAfterCommand // Use withCString to ensure strings remain valid for the duration of the closure return try workingDirectory.withCString { cWorkingDir in diff --git a/src/apprt/embedded.zig b/src/apprt/embedded.zig index bd1ffd460..c4f0fe18c 100644 --- a/src/apprt/embedded.zig +++ b/src/apprt/embedded.zig @@ -447,6 +447,9 @@ pub const Surface = struct { /// Input to send to the command after it is started. initial_input: ?[*:0]const u8 = null, + + // Wait after the command exits + wait_after_command: bool = false, }; pub fn init(self: *Surface, app: *App, opts: Options) !void { @@ -540,6 +543,11 @@ pub const Surface = struct { ); } + // Wait after command + if (opts.wait_after_command) { + config.@"wait-after-command" = true; + } + // Initialize our surface right away. We're given a view that is // ready to use. try self.core_surface.init(