mirror of
https://github.com/ghostty-org/ghostty.git
synced 2025-08-02 14:57:31 +03:00
core: app needsConfirmQuit to streamline quitting if no active sessions
This commit is contained in:
@ -316,6 +316,7 @@ bool ghostty_app_tick(ghostty_app_t);
|
||||
void *ghostty_app_userdata(ghostty_app_t);
|
||||
void ghostty_app_keyboard_changed(ghostty_app_t);
|
||||
void ghostty_app_reload_config(ghostty_app_t);
|
||||
bool ghostty_app_needs_confirm_quit(ghostty_app_t);
|
||||
|
||||
ghostty_surface_config_s ghostty_surface_config_new();
|
||||
|
||||
|
10
src/App.zig
10
src/App.zig
@ -168,6 +168,16 @@ pub fn focusedSurface(self: *const App) ?*Surface {
|
||||
return surface;
|
||||
}
|
||||
|
||||
/// Returns true if confirmation is needed to quit the app. It is up to
|
||||
/// the apprt to call this.
|
||||
pub fn needsConfirmQuit(self: *const App) bool {
|
||||
for (self.surfaces.items) |v| {
|
||||
if (v.core_surface.needsConfirmQuit()) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Initialize once and return the font discovery mechanism. This remains
|
||||
/// initialized throughout the lifetime of the application because some
|
||||
/// font discovery mechanisms (i.e. fontconfig) are unsafe to reinit.
|
||||
|
@ -504,22 +504,24 @@ pub fn deinit(self: *Surface) void {
|
||||
/// Close this surface. This will trigger the runtime to start the
|
||||
/// close process, which should ultimately deinitialize this surface.
|
||||
pub fn close(self: *Surface) void {
|
||||
const process_alive = process_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) break :process_alive false;
|
||||
self.rt_surface.close(self.needsConfirmQuit());
|
||||
}
|
||||
|
||||
// If we are configured to not hold open surfaces explicitly, just
|
||||
// always say there is nothing alive.
|
||||
if (!self.config.confirm_close_surface) break :process_alive false;
|
||||
/// 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.
|
||||
// We check this first to avoid the locking overhead below.
|
||||
if (self.child_exited) return false;
|
||||
|
||||
// We have to talk to the terminal.
|
||||
self.renderer_state.mutex.lock();
|
||||
defer self.renderer_state.mutex.unlock();
|
||||
break :process_alive !self.io.terminal.cursorIsAtPrompt();
|
||||
};
|
||||
// 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;
|
||||
|
||||
self.rt_surface.close(process_alive);
|
||||
// We have to talk to the terminal.
|
||||
self.renderer_state.mutex.lock();
|
||||
defer self.renderer_state.mutex.unlock();
|
||||
return !self.io.terminal.cursorIsAtPrompt();
|
||||
}
|
||||
|
||||
/// Called from the app thread to handle mailbox messages to our specific
|
||||
|
@ -787,6 +787,11 @@ pub const CAPI = struct {
|
||||
};
|
||||
}
|
||||
|
||||
/// Returns true if the app needs to confirm quitting.
|
||||
export fn ghostty_app_needs_confirm_quit(v: *App) bool {
|
||||
return v.core_app.needsConfirmQuit();
|
||||
}
|
||||
|
||||
/// Returns initial surface options.
|
||||
export fn ghostty_surface_config_new() apprt.Surface.Options {
|
||||
return .{};
|
||||
|
Reference in New Issue
Block a user