From 9a818117d7a0cb4053d6a287c0b0d5e524581180 Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Fri, 30 May 2025 23:00:45 +0200 Subject: [PATCH] feat(panic): panic handler to recover termios when crashing --- examples/demo.zig | 1 + examples/elements/alignment.zig | 1 + examples/elements/button.zig | 1 + examples/elements/input.zig | 1 + examples/elements/scrollable.zig | 1 + examples/errors.zig | 1 + examples/layouts/grid.zig | 1 + examples/layouts/horizontal.zig | 1 + examples/layouts/mixed.zig | 1 + examples/layouts/vertical.zig | 1 + examples/styles/palette.zig | 1 + examples/styles/text.zig | 1 + src/app.zig | 19 +++++++++++++++++++ 13 files changed, 31 insertions(+) diff --git a/examples/demo.zig b/examples/demo.zig index 7bb18e8..dae0c5e 100644 --- a/examples/demo.zig +++ b/examples/demo.zig @@ -188,6 +188,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/elements/alignment.zig b/examples/elements/alignment.zig index bcf6a44..51f7da6 100644 --- a/examples/elements/alignment.zig +++ b/examples/elements/alignment.zig @@ -90,6 +90,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/elements/button.zig b/examples/elements/button.zig index 9a80804..dca6458 100644 --- a/examples/elements/button.zig +++ b/examples/elements/button.zig @@ -137,6 +137,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/elements/input.zig b/examples/elements/input.zig index d714154..692784c 100644 --- a/examples/elements/input.zig +++ b/examples/elements/input.zig @@ -217,6 +217,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/elements/scrollable.zig b/examples/elements/scrollable.zig index dfd6a00..fd1999b 100644 --- a/examples/elements/scrollable.zig +++ b/examples/elements/scrollable.zig @@ -189,6 +189,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/errors.zig b/examples/errors.zig index 08c7cff..3483ed6 100644 --- a/examples/errors.zig +++ b/examples/errors.zig @@ -150,6 +150,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/layouts/grid.zig b/examples/layouts/grid.zig index d98bc42..edb1a6c 100644 --- a/examples/layouts/grid.zig +++ b/examples/layouts/grid.zig @@ -106,6 +106,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/layouts/horizontal.zig b/examples/layouts/horizontal.zig index 7a4d3da..fefd100 100644 --- a/examples/layouts/horizontal.zig +++ b/examples/layouts/horizontal.zig @@ -98,6 +98,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/layouts/mixed.zig b/examples/layouts/mixed.zig index 62e66c1..19d64c7 100644 --- a/examples/layouts/mixed.zig +++ b/examples/layouts/mixed.zig @@ -114,6 +114,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/layouts/vertical.zig b/examples/layouts/vertical.zig index 648c2fe..097b46f 100644 --- a/examples/layouts/vertical.zig +++ b/examples/layouts/vertical.zig @@ -97,6 +97,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/styles/palette.zig b/examples/styles/palette.zig index a935c99..8eaff9a 100644 --- a/examples/styles/palette.zig +++ b/examples/styles/palette.zig @@ -93,6 +93,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/examples/styles/text.zig b/examples/styles/text.zig index 9177f38..8276a20 100644 --- a/examples/styles/text.zig +++ b/examples/styles/text.zig @@ -148,6 +148,7 @@ pub fn main() !void { } } +pub const panic = App.panic_handler; const log = std.log.scoped(.default); const std = @import("std"); diff --git a/src/app.zig b/src/app.zig index c5b7404..2da2c1d 100644 --- a/src/app.zig +++ b/src/app.zig @@ -393,6 +393,25 @@ pub fn App(comptime E: type) type { } } + pub fn panic_handler(msg: []const u8, _: ?*std.builtin.StackTrace, ret_addr: ?usize) noreturn { + terminal.disableMouseSupport() catch {}; + terminal.exitAltScreen() catch {}; + terminal.showCursor() catch {}; + var termios: posix.termios = .{ + .iflag = .{}, + .lflag = .{}, + .cflag = .{}, + .oflag = .{}, + .cc = undefined, + .line = 0, + .ispeed = undefined, + .ospeed = undefined, + }; + terminal.disableRawMode(&termios) catch {}; + terminal.restoreScreen() catch {}; + std.debug.defaultPanic(msg, ret_addr); + } + const element = @import("element.zig"); pub const Event = mergeTaggedUnions(event.SystemEvent, E); pub const Container = @import("container.zig").Container(Event);