From 28c733352ef71fb48cc90a94af39d99f1731eaae Mon Sep 17 00:00:00 2001 From: Yves Biener Date: Mon, 17 Nov 2025 18:30:31 +0100 Subject: [PATCH] feat(event): introduce `.bell` system event --- src/container.zig | 6 ++++++ src/event.zig | 3 +++ src/terminal.zig | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/src/container.zig b/src/container.zig index df5c6d4..f5e39d2 100644 --- a/src/container.zig +++ b/src/container.zig @@ -915,6 +915,11 @@ pub fn Container(Model: type, Event: type) type { relative_mouse.y -= this.origin.y; try this.element.handle(model, .{ .mouse = relative_mouse }); }, + .bell => { + // ring the terminal bell and do not propagate the event any further + _ = try terminal.ringBell(); + return; + }, else => try this.element.handle(model, event), } for (this.elements.items) |*element| try element.handle(model, event); @@ -961,6 +966,7 @@ const assert = std.debug.assert; const Allocator = std.mem.Allocator; const build_options = @import("build_options"); const input = @import("input.zig"); +const terminal = @import("terminal.zig"); const isTaggedUnion = @import("event.zig").isTaggedUnion; const Cell = @import("cell.zig"); const Color = @import("color.zig").Color; diff --git a/src/event.zig b/src/event.zig index ec23600..8410398 100644 --- a/src/event.zig +++ b/src/event.zig @@ -13,6 +13,9 @@ pub const SystemEvent = union(enum) { /// Usually no `Container` nor `Element` should act on that event, as it /// only serves for event based loops to force a re-draw with a new `Event`. resize, + /// Ring the terminal bell to notify the user. This `Event` is handled by + /// every `Container` and will not be passed through the container tree. + bell, /// Error event to notify other containers about a recoverable error err: struct { /// actual error diff --git a/src/terminal.zig b/src/terminal.zig index c6085cf..4a70f95 100644 --- a/src/terminal.zig +++ b/src/terminal.zig @@ -54,6 +54,10 @@ pub fn disableMouseSupport() !void { _ = try posix.write(posix.STDIN_FILENO, ctlseqs.mouse_reset); } +pub fn ringBell() !void { + _ = try posix.write(posix.STDIN_FILENO, &.{7}); +} + pub fn read(buf: []u8) !usize { return try posix.read(posix.STDIN_FILENO, buf); }