confirm-close-surface option can be set to always to always require confirmation

Fixes #3648
The confirm-close-surface configuration can now be set to always
ensuring a confirmation dialog is shown before closing a surface, even
if shell integration indicates no running processes.
This commit is contained in:
Mohammadi, Erfan
2024-12-28 14:31:29 +03:30
committed by Mitchell Hashimoto
parent 6cbd69da78
commit 85fc49b22c
3 changed files with 29 additions and 13 deletions

View File

@ -236,7 +236,7 @@ const DerivedConfig = struct {
clipboard_paste_protection: bool, clipboard_paste_protection: bool,
clipboard_paste_bracketed_safe: bool, clipboard_paste_bracketed_safe: bool,
copy_on_select: configpkg.CopyOnSelect, copy_on_select: configpkg.CopyOnSelect,
confirm_close_surface: bool, confirm_close_surface: configpkg.ConfirmCloseSurface,
cursor_click_to_move: bool, cursor_click_to_move: bool,
desktop_notifications: bool, desktop_notifications: bool,
font: font.SharedGridSet.DerivedConfig, font: font.SharedGridSet.DerivedConfig,
@ -784,18 +784,20 @@ pub fn deactivateInspector(self: *Surface) void {
/// True if the surface requires confirmation to quit. This should be called /// True if the surface requires confirmation to quit. This should be called
/// by apprt to determine if the surface should confirm before quitting. /// by apprt to determine if the surface should confirm before quitting.
pub fn needsConfirmQuit(self: *Surface) bool { 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. // 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 // Check the configuration for confirming close behavior.
// always say there is nothing alive. return switch (self.config.confirm_close_surface) {
if (!self.config.confirm_close_surface) return false; .always => true,
.false => false,
// We have to talk to the terminal. .true => true: {
self.renderer_state.mutex.lock(); self.renderer_state.mutex.lock();
defer self.renderer_state.mutex.unlock(); defer self.renderer_state.mutex.unlock();
return !self.io.terminal.cursorIsAtPrompt(); break :true !self.io.terminal.cursorIsAtPrompt();
},
};
} }
/// Called from the app thread to handle mailbox messages to our specific /// Called from the app thread to handle mailbox messages to our specific

View File

@ -14,6 +14,7 @@ pub const formatEntry = formatter.formatEntry;
// Field types // Field types
pub const ClipboardAccess = Config.ClipboardAccess; pub const ClipboardAccess = Config.ClipboardAccess;
pub const ConfirmCloseSurface = Config.ConfirmCloseSurface;
pub const CopyOnSelect = Config.CopyOnSelect; pub const CopyOnSelect = Config.CopyOnSelect;
pub const CustomShaderAnimation = Config.CustomShaderAnimation; pub const CustomShaderAnimation = Config.CustomShaderAnimation;
pub const FontSyntheticStyle = Config.FontSyntheticStyle; pub const FontSyntheticStyle = Config.FontSyntheticStyle;

View File

@ -1304,9 +1304,13 @@ keybind: Keybinds = .{},
/// This configuration can only be set via CLI arguments. /// This configuration can only be set via CLI arguments.
@"config-default-files": bool = true, @"config-default-files": bool = true,
/// Confirms that a surface should be closed before closing it. This defaults to /// Confirms that a surface should be closed before closing it.
/// true. If set to false, surfaces will close without any confirmation. ///
@"confirm-close-surface": bool = true, /// This defaults to `true`. If set to `false`, surfaces will close without
/// any confirmation. This can also be set to `always`, which will always
/// confirm closing a surface, even if shell integration says a process isn't
/// running.
@"confirm-close-surface": ConfirmCloseSurface = .true,
/// Whether or not to quit after the last surface is closed. /// Whether or not to quit after the last surface is closed.
/// ///
@ -3636,6 +3640,15 @@ const Replay = struct {
} }
}; };
/// Valid values for confirm-close-surface
/// c_int because it needs to be extern compatible
/// If this is changed, you must also update ghostty.h
pub const ConfirmCloseSurface = enum(c_int) {
false,
true,
always,
};
/// Valid values for custom-shader-animation /// Valid values for custom-shader-animation
/// c_int because it needs to be extern compatible /// c_int because it needs to be extern compatible
/// If this is changed, you must also update ghostty.h /// If this is changed, you must also update ghostty.h