diff --git a/res/config.ini b/res/config.ini index b077e44..cf76d35 100644 --- a/res/config.ini +++ b/res/config.ini @@ -4,6 +4,11 @@ # matrix -> CMatrix animation = none +# Stop the animation after some time +# 0 -> Run forever (default) +# 1..2e12 -> Stop the animation after this many seconds +animation_timeout_sec = 0 + # Format string for clock in top right corner (see strftime specification). Example: %c # If null, the clock won't be shown clock = null diff --git a/src/config/Config.zig b/src/config/Config.zig index 863759a..4d2b270 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -57,3 +57,4 @@ brightness_down_key: []const u8 = "F5", brightness_up_key: []const u8 = "F6", brightnessctl: []const u8 = "/usr/bin/brightnessctl", brightness_change: []const u8 = "10", +animation_timeout_sec: u12 = 0, diff --git a/src/main.zig b/src/main.zig index dd3b25a..1bd9dd8 100644 --- a/src/main.zig +++ b/src/main.zig @@ -65,6 +65,12 @@ pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; defer _ = gpa.deinit(); + // to be able to stop the animation after some time + + var tv_zero: std.c.timeval = undefined; + _ = std.c.gettimeofday(&tv_zero, null); + var animation_timed_out: bool = false; + const allocator = gpa.allocator(); // Load arguments @@ -384,10 +390,12 @@ pub fn main() !void { if (auth_fails < 10) { _ = termbox.tb_clear(); - switch (config.animation) { - .none => {}, - .doom => doom.draw(), - .matrix => matrix.draw(), + if (!animation_timed_out) { + switch (config.animation) { + .none => {}, + .doom => doom.draw(), + .matrix => matrix.draw(), + } } if (config.bigclock and buffer.box_height + (bigclock.HEIGHT + 2) * 2 < buffer.height) draw_big_clock: { @@ -533,8 +541,21 @@ pub fn main() !void { var timeout: i32 = -1; // Calculate the maximum timeout based on current animations, or the (big) clock. If there's none, we wait for the event indefinitely instead - if (animate) { + if (animate and !animation_timed_out) { timeout = config.min_refresh_delta; + + // check how long we have been running so we can turn off the animation + var tv: std.c.timeval = undefined; + _ = std.c.gettimeofday(&tv, null); + + if (config.animation_timeout_sec > 0 and tv.tv_sec - tv_zero.tv_sec > config.animation_timeout_sec) { + animation_timed_out = true; + switch (config.animation) { + .none => {}, + .doom => doom.deinit(), + .matrix => matrix.deinit(), + } + } } else if (config.bigclock and config.clock == null) { var tv: std.c.timeval = undefined; _ = std.c.gettimeofday(&tv, null);