diff --git a/src/gui/wio/app.zig b/src/gui/wio/app.zig index 02cf70b5..cc08edff 100644 --- a/src/gui/wio/app.zig +++ b/src/gui/wio/app.zig @@ -55,6 +55,11 @@ var font_backend: gpu.RasterizerBackend = .freetype; var font_dirty: std.atomic.Value(bool) = .init(true); var stop_requested: std.atomic.Value(bool) = .init(false); +// Background color (written from TUI thread, applied by wio thread on each paint). +// Stored as packed RGBA u32 to allow atomic reads/writes. +var background_color: std.atomic.Value(u32) = .init(0x131313ff); // matches gpu.zig default +var background_dirty: std.atomic.Value(bool) = .init(false); + var config_arena_instance: std.heap.ArenaAllocator = std.heap.ArenaAllocator.init(std.heap.page_allocator); const config_arena = config_arena_instance.allocator(); @@ -311,6 +316,13 @@ fn saveConfig() void { log.err("failed to write gui config file", .{}); } +pub fn setBackground(color: gpu.Color) void { + const color_u32: u32 = (@as(u32, color.r) << 24) | (@as(u32, color.g) << 16) | (@as(u32, color.b) << 8) | color.a; + background_color.store(color_u32, .release); + background_dirty.store(true, .release); + wio.cancelWait(); +} + pub fn requestAttention() void { attention_pending.store(true, .release); wio.cancelWait(); @@ -635,6 +647,16 @@ fn wioLoop() void { state.size = .{ .x = win_size.width, .y = win_size.height }; const font = wio_font; + if (background_dirty.swap(false, .acq_rel)) { + const color_u32 = background_color.load(.acquire); + gpu.setBackground(.{ + .r = @truncate(color_u32 >> 24), + .g = @truncate(color_u32 >> 16), + .b = @truncate(color_u32 >> 8), + .a = @truncate(color_u32), + }); + } + // Regenerate glyph indices using the GPU state. // For double-wide characters vaxis emits width=2 for the left // cell and width=0 (continuation) for the right cell. The diff --git a/src/renderer/gui/renderer.zig b/src/renderer/gui/renderer.zig index 5a645703..fffce5db 100644 --- a/src/renderer/gui/renderer.zig +++ b/src/renderer/gui/renderer.zig @@ -409,7 +409,7 @@ pub fn set_terminal_title(self: *Self, text: []const u8) void { pub fn set_terminal_style(self: *Self, style_: Style) void { _ = self; - _ = style_; + if (style_.bg) |bg| app.setBackground(themeColorToGpu(bg)); } pub fn adjust_fontsize(self: *Self, amount: f32) void {