From a4dd5b3c4493bcbc6320ece2d46170e9954cc4fc Mon Sep 17 00:00:00 2001 From: AnErrupTion Date: Sat, 2 Aug 2025 13:16:35 +0200 Subject: [PATCH] Backport: Fix clock string length issues Co-authored-by: Plash Signed-off-by: AnErrupTion --- src/interop.zig | 4 +--- src/main.zig | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/interop.zig b/src/interop.zig index 9fc5017..c153f35 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -65,12 +65,10 @@ const set_led_state = if (builtin.os.tag.isBSD()) kbio.KDSETLED else kd.KDSKBLED const numlock_led = if (builtin.os.tag.isBSD()) kbio.LED_NUM else kd.K_NUMLOCK; const capslock_led = if (builtin.os.tag.isBSD()) kbio.LED_CAP else kd.K_CAPSLOCK; -pub fn timeAsString(buf: [:0]u8, format: [:0]const u8) ![]u8 { +pub fn timeAsString(buf: [:0]u8, format: [:0]const u8) []u8 { const timer = std.time.timestamp(); const tm_info = time.localtime(&timer); - const len = time.strftime(buf, buf.len, format, tm_info); - if (len < 0) return error.CannotGetFormattedTime; return buf[0..len]; } diff --git a/src/main.zig b/src/main.zig index a182d89..8697f28 100644 --- a/src/main.zig +++ b/src/main.zig @@ -101,6 +101,7 @@ pub fn main() !void { var lang: Lang = undefined; var save: Save = undefined; var config_load_failed = false; + var can_draw_clock = true; if (res.args.help != 0) { try clap.help(stderr, clap.Help, ¶ms, .{}); @@ -426,15 +427,13 @@ pub fn main() !void { buffer.drawLabel(ly_top_str, 0, 0); - if (config.bigclock != .none and buffer.box_height + (bigclock.HEIGHT + 2) * 2 < buffer.height) draw_big_clock: { + if (config.bigclock != .none and buffer.box_height + (bigclock.HEIGHT + 2) * 2 < buffer.height) { const format = "%H:%M"; const xo = buffer.width / 2 - @min(buffer.width, (format.len * (bigclock.WIDTH + 1))) / 2; const yo = (buffer.height - buffer.box_height) / 2 - bigclock.HEIGHT - 2; var clock_buf: [format.len + 1:0]u8 = undefined; - const clock_str = interop.timeAsString(&clock_buf, format) catch { - break :draw_big_clock; - }; + const clock_str = interop.timeAsString(&clock_buf, format); for (clock_str, 0..) |c, i| { const clock_cell = bigclock.clockCell(animate, c, buffer.fg, buffer.bg, config.bigclock); @@ -466,12 +465,17 @@ pub fn main() !void { } if (config.clock) |clock| draw_clock: { - var clock_buf: [32:0]u8 = undefined; - const clock_str = interop.timeAsString(&clock_buf, clock) catch { - break :draw_clock; - }; + if (!can_draw_clock) break :draw_clock; - if (clock_str.len == 0) return error.FormattedTimeEmpty; + var clock_buf: [64:0]u8 = undefined; + const clock_str = interop.timeAsString(&clock_buf, clock); + + if (clock_str.len == 0) { + // Backport: I've decided not to localize the error message + try info_line.addMessage("clock string too long", config.error_bg, config.error_fg); + can_draw_clock = false; + break :draw_clock; + } buffer.drawLabel(clock_str, buffer.width - @min(buffer.width, clock_str.len), 0); }