feat(gui): implement gui loadConfig and saveConfig

This commit is contained in:
CJ van den Berg 2026-04-01 13:16:37 +02:00
parent 091345fd02
commit 6292000ada
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9
3 changed files with 49 additions and 2 deletions

View file

@ -593,6 +593,8 @@ pub fn build_exe(
.{ .name = "cbor", .module = cbor_mod },
.{ .name = "vaxis", .module = vaxis_mod },
.{ .name = "xterm", .module = gui_xterm_mod },
.{ .name = "soft_root", .module = soft_root_mod },
.{ .name = "gui_config", .module = gui_config_mod },
},
});

View file

@ -17,6 +17,8 @@ const cbor = @import("cbor");
const vaxis = @import("vaxis");
const input_translate = @import("input.zig");
const root = @import("soft_root").root;
const gui_config = @import("gui_config");
const log = std.log.scoped(.wio_app);
@ -42,6 +44,9 @@ var font_name_len: usize = 0;
var font_dirty: std.atomic.Value(bool) = .init(true);
var stop_requested: 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();
// HiDPI scale factor (logical physical pixels). Updated from wio .scale events.
// Only read/written on the wio thread after initialisation.
var dpi_scale: f32 = 1.0;
@ -75,6 +80,7 @@ pub fn start() !std.Thread {
tui_pid = thespian.self_pid().clone();
font_name_len = 0;
stop_requested.store(false, .release);
loadConfig();
return std.Thread.spawn(.{}, wioLoop, .{});
}
@ -143,6 +149,7 @@ pub fn requestRender() void {
pub fn setFontSize(size_px: f32) void {
font_size_px = @intFromFloat(@max(4, size_px));
saveConfig();
font_dirty.store(true, .release);
requestRender();
}
@ -152,10 +159,29 @@ pub fn adjustFontSize(delta: f32) void {
setFontSize(new);
}
pub fn resetFontSize() void {
const default = comptime blk: {
const field = std.meta.fieldInfo(gui_config, .fontsize);
const ptr: *const field.type = @ptrCast(@alignCast(field.default_value_ptr.?));
break :blk ptr.*;
};
setFontSize(@floatFromInt(default));
}
pub fn resetFontFace() void {
const default = comptime blk: {
const field = std.meta.fieldInfo(gui_config, .fontface);
const ptr: *const field.type = @ptrCast(@alignCast(field.default_value_ptr.?));
break :blk ptr.*;
};
setFontFace(default);
}
pub fn setFontFace(name: []const u8) void {
const copy_len = @min(name.len, font_name_buf.len);
@memcpy(font_name_buf[0..copy_len], name[0..copy_len]);
font_name_len = copy_len;
saveConfig();
font_dirty.store(true, .release);
requestRender();
}
@ -206,6 +232,25 @@ pub fn getFontName() []const u8 {
return if (font_name_len > 0) font_name_buf[0..font_name_len] else "monospace";
}
pub fn loadConfig() void {
const conf, _ = root.read_config(gui_config, config_arena);
root.write_config(conf, config_arena) catch
log.err("failed to write gui config file", .{});
font_size_px = conf.fontsize;
const name = conf.fontface;
const copy_len = @min(name.len, font_name_buf.len);
@memcpy(font_name_buf[0..copy_len], name[0..copy_len]);
font_name_len = copy_len;
}
fn saveConfig() void {
var conf, _ = root.read_config(gui_config, config_arena);
conf.fontsize = @truncate(font_size_px);
conf.fontface = getFontName();
root.write_config(conf, config_arena) catch
log.err("failed to write gui config file", .{});
}
pub fn requestAttention() void {
attention_pending.store(true, .release);
wio.cancelWait();

View file

@ -367,7 +367,7 @@ pub fn set_fontsize(self: *Self, fontsize: f32) void {
pub fn reset_fontsize(self: *Self) void {
_ = self;
app.setFontSize(16);
app.resetFontSize();
}
pub fn set_fontface(self: *Self, fontface: []const u8) void {
@ -377,7 +377,7 @@ pub fn set_fontface(self: *Self, fontface: []const u8) void {
pub fn reset_fontface(self: *Self) void {
_ = self;
app.setFontFace("monospace");
app.resetFontFace();
}
pub fn get_fontfaces(self: *Self) void {