diff --git a/src/Surface.zig b/src/Surface.zig index 1442af8695..73fb604310 100644 --- a/src/Surface.zig +++ b/src/Surface.zig @@ -236,7 +236,7 @@ const DerivedConfig = struct { clipboard_paste_protection: bool, clipboard_paste_bracketed_safe: bool, copy_on_select: configpkg.CopyOnSelect, - confirm_close_surface: bool, + confirm_close_surface: configpkg.ConfirmCloseSurface, cursor_click_to_move: bool, desktop_notifications: bool, font: font.SharedGridSet.DerivedConfig, @@ -784,18 +784,28 @@ pub fn deactivateInspector(self: *Surface) void { /// True if the surface requires confirmation to quit. This should be called /// by apprt to determine if the surface should confirm before quitting. pub fn needsConfirmQuit(self: *Surface) bool { - // If the child has exited then our process is certainly not alive. + // If the child has exited, then our process is certainly not alive. // We check this first to avoid the locking overhead below. - if (self.child_exited) return false; + if (self.child_exited) { + return false; + } - // If we are configured to not hold open surfaces explicitly, just - // always say there is nothing alive. - if (!self.config.confirm_close_surface) return false; + // Based on the 'confirm_close_surface' configuration, decide whether to prompt for confirmation. + return switch (self.config.confirm_close_surface) { + // Always prompt for confirmation before closing the surface, regardless of the terminal state. + .always => true, - // We have to talk to the terminal. - self.renderer_state.mutex.lock(); - defer self.renderer_state.mutex.unlock(); - return !self.io.terminal.cursorIsAtPrompt(); + // Prompt for confirmation only when a process is running. + .when_process_running => blk: { + // We have to talk to the terminal. + self.renderer_state.mutex.lock(); + defer self.renderer_state.mutex.unlock(); + break :blk !self.io.terminal.cursorIsAtPrompt(); + }, + + //Never prompt for confirmation; allow the surface to close immediately. + .never => false, + }; } /// Called from the app thread to handle mailbox messages to our specific diff --git a/src/config.zig b/src/config.zig index b7e818f8e1..75dbaae02b 100644 --- a/src/config.zig +++ b/src/config.zig @@ -14,6 +14,7 @@ pub const formatEntry = formatter.formatEntry; // Field types pub const ClipboardAccess = Config.ClipboardAccess; +pub const ConfirmCloseSurface = Config.ConfirmCloseSurface; pub const CopyOnSelect = Config.CopyOnSelect; pub const CustomShaderAnimation = Config.CustomShaderAnimation; pub const FontSyntheticStyle = Config.FontSyntheticStyle; diff --git a/src/config/Config.zig b/src/config/Config.zig index c6702bb742..c958f6e978 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -1304,9 +1304,15 @@ keybind: Keybinds = .{}, /// This configuration can only be set via CLI arguments. @"config-default-files": bool = true, -/// Confirms that a surface should be closed before closing it. This defaults to -/// true. If set to false, surfaces will close without any confirmation. -@"confirm-close-surface": bool = true, +/// Confirms that a surface should be closed before closing it. +/// +/// Valid values: +/// - always: Always prompt for confirmation when closing. +/// - when_process_running: Prompt when a process is running (default). +/// - never: Never prompt for confirmation. +/// +/// The default value is `when_process_running`. +@"confirm-close-surface": ConfirmCloseSurface = .when_process_running, /// Whether or not to quit after the last surface is closed. /// @@ -5331,6 +5337,13 @@ pub const AutoUpdate = enum { download, }; +/// See confirm-close-surface +pub const ConfirmCloseSurface = enum { + always, + when_process_running, + never, +}; + /// See theme pub const Theme = struct { light: []const u8,