diff --git a/res/config.ini b/res/config.ini index 83fcc91..596ef36 100644 --- a/res/config.ini +++ b/res/config.ini @@ -51,8 +51,11 @@ auth_fails = 10 # Background color id bg = 0x0000 -# Enable/disable big clock -bigclock = false +# Change the state and language of the big clock +# none -> Disabled (default) +# en -> English +# fa -> Farsi +bigclock = none # Blank main box background # Setting to false will make it transparent diff --git a/src/bigclock.zig b/src/bigclock.zig index 6084569..6f17b72 100644 --- a/src/bigclock.zig +++ b/src/bigclock.zig @@ -1,111 +1,24 @@ const std = @import("std"); -const builtin = @import("builtin"); const interop = @import("interop.zig"); const utils = @import("tui/utils.zig"); +const enums = @import("enums.zig"); +const Lang = @import("bigclock/Lang.zig"); +const en = @import("bigclock/en.zig"); +const fa = @import("bigclock/fa.zig"); -const termbox = interop.termbox; +const termbox = interop.termbox; +const Bigclock = enums.Bigclock; +pub const WIDTH = Lang.WIDTH; +pub const HEIGHT = Lang.HEIGHT; +pub const SIZE = Lang.SIZE; -const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#'; -const O: u32 = 0; - -pub const WIDTH = 5; -pub const HEIGHT = 5; -pub const SIZE = WIDTH * HEIGHT; - -// zig fmt: off -const ZERO = [_]u21{ - X,X,X,X,X, - X,X,O,X,X, - X,X,O,X,X, - X,X,O,X,X, - X,X,X,X,X, -}; -const ONE = [_]u21{ - O,O,O,X,X, - O,O,O,X,X, - O,O,O,X,X, - O,O,O,X,X, - O,O,O,X,X, -}; -const TWO = [_]u21{ - X,X,X,X,X, - O,O,O,X,X, - X,X,X,X,X, - X,X,O,O,O, - X,X,X,X,X, -}; -const THREE = [_]u21{ - X,X,X,X,X, - O,O,O,X,X, - X,X,X,X,X, - O,O,O,X,X, - X,X,X,X,X, -}; -const FOUR = [_]u21{ - X,X,O,X,X, - X,X,O,X,X, - X,X,X,X,X, - O,O,O,X,X, - O,O,O,X,X, -}; -const FIVE = [_]u21{ - X,X,X,X,X, - X,X,O,O,O, - X,X,X,X,X, - O,O,O,X,X, - X,X,X,X,X, -}; -const SIX = [_]u21{ - X,X,X,X,X, - X,X,O,O,O, - X,X,X,X,X, - X,X,O,X,X, - X,X,X,X,X, -}; -const SEVEN = [_]u21{ - X,X,X,X,X, - O,O,O,X,X, - O,O,O,X,X, - O,O,O,X,X, - O,O,O,X,X, -}; -const EIGHT = [_]u21{ - X,X,X,X,X, - X,X,O,X,X, - X,X,X,X,X, - X,X,O,X,X, - X,X,X,X,X, -}; -const NINE = [_]u21{ - X,X,X,X,X, - X,X,O,X,X, - X,X,X,X,X, - O,O,O,X,X, - X,X,X,X,X, -}; -const S = [_]u21{ - O,O,O,O,O, - O,O,X,O,O, - O,O,O,O,O, - O,O,X,O,O, - O,O,O,O,O, -}; -const E = [_]u21{ - O,O,O,O,O, - O,O,O,O,O, - O,O,O,O,O, - O,O,O,O,O, - O,O,O,O,O, -}; -// zig fmt: on - -pub fn clockCell(animate: bool, char: u8, fg: u16, bg: u16) [SIZE]utils.Cell { +pub fn clockCell(animate: bool, char: u8, fg: u16, bg: u16, bigclock: Bigclock) [SIZE]utils.Cell { var cells: [SIZE]utils.Cell = undefined; var tv: interop.system_time.timeval = undefined; _ = interop.system_time.gettimeofday(&tv, null); - const clock_chars = toBigNumber(if (animate and char == ':' and @divTrunc(tv.tv_usec, 500000) != 0) ' ' else char); + const clock_chars = toBigNumber(if (animate and char == ':' and @divTrunc(tv.tv_usec, 500000) != 0) ' ' else char, bigclock); for (0..cells.len) |i| cells[i] = utils.initCell(clock_chars[i], fg, bg); return cells; @@ -122,19 +35,24 @@ pub fn alphaBlit(x: usize, y: usize, tb_width: usize, tb_height: usize, cells: [ } } -fn toBigNumber(char: u8) []const u21 { +fn toBigNumber(char: u8, bigclock: Bigclock) []const u21 { + const locale_chars = switch (bigclock) { + .fa => fa.locale_chars, + .en => en.locale_chars, + .none => unreachable, + }; return switch (char) { - '0' => &ZERO, - '1' => &ONE, - '2' => &TWO, - '3' => &THREE, - '4' => &FOUR, - '5' => &FIVE, - '6' => &SIX, - '7' => &SEVEN, - '8' => &EIGHT, - '9' => &NINE, - ':' => &S, - else => &E, + '0' => &locale_chars.ZERO, + '1' => &locale_chars.ONE, + '2' => &locale_chars.TWO, + '3' => &locale_chars.THREE, + '4' => &locale_chars.FOUR, + '5' => &locale_chars.FIVE, + '6' => &locale_chars.SIX, + '7' => &locale_chars.SEVEN, + '8' => &locale_chars.EIGHT, + '9' => &locale_chars.NINE, + ':' => &locale_chars.S, + else => &locale_chars.E, }; } diff --git a/src/bigclock/Lang.zig b/src/bigclock/Lang.zig new file mode 100644 index 0000000..4229776 --- /dev/null +++ b/src/bigclock/Lang.zig @@ -0,0 +1,23 @@ +const builtin = @import("builtin"); + +pub const WIDTH = 5; +pub const HEIGHT = 5; +pub const SIZE = WIDTH * HEIGHT; + +pub const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#'; +pub const O: u32 = 0; + +pub const LocaleChars = struct { + ZERO: [SIZE]u21, + ONE: [SIZE]u21, + TWO: [SIZE]u21, + THREE: [SIZE]u21, + FOUR: [SIZE]u21, + FIVE: [SIZE]u21, + SIX: [SIZE]u21, + SEVEN: [SIZE]u21, + EIGHT: [SIZE]u21, + NINE: [SIZE]u21, + S: [SIZE]u21, + E: [SIZE]u21, +}; \ No newline at end of file diff --git a/src/bigclock/en.zig b/src/bigclock/en.zig new file mode 100644 index 0000000..868656a --- /dev/null +++ b/src/bigclock/en.zig @@ -0,0 +1,94 @@ +const Lang = @import("Lang.zig"); + +const LocaleChars = Lang.LocaleChars; +const X = Lang.X; +const O = Lang.O; + +// zig fmt: off +pub const locale_chars = LocaleChars{ + .ZERO = [_]u21{ + X,X,X,X,X, + X,X,O,X,X, + X,X,O,X,X, + X,X,O,X,X, + X,X,X,X,X, + }, + .ONE = [_]u21{ + O,O,O,X,X, + O,O,O,X,X, + O,O,O,X,X, + O,O,O,X,X, + O,O,O,X,X, + }, + .TWO = [_]u21{ + X,X,X,X,X, + O,O,O,X,X, + X,X,X,X,X, + X,X,O,O,O, + X,X,X,X,X, + }, + .THREE = [_]u21{ + X,X,X,X,X, + O,O,O,X,X, + X,X,X,X,X, + O,O,O,X,X, + X,X,X,X,X, + }, + .FOUR = [_]u21{ + X,X,O,X,X, + X,X,O,X,X, + X,X,X,X,X, + O,O,O,X,X, + O,O,O,X,X, + }, + .FIVE = [_]u21{ + X,X,X,X,X, + X,X,O,O,O, + X,X,X,X,X, + O,O,O,X,X, + X,X,X,X,X, + }, + .SIX = [_]u21{ + X,X,X,X,X, + X,X,O,O,O, + X,X,X,X,X, + X,X,O,X,X, + X,X,X,X,X, + }, + .SEVEN = [_]u21{ + X,X,X,X,X, + O,O,O,X,X, + O,O,O,X,X, + O,O,O,X,X, + O,O,O,X,X, + }, + .EIGHT = [_]u21{ + X,X,X,X,X, + X,X,O,X,X, + X,X,X,X,X, + X,X,O,X,X, + X,X,X,X,X, + }, + .NINE = [_]u21{ + X,X,X,X,X, + X,X,O,X,X, + X,X,X,X,X, + O,O,O,X,X, + X,X,X,X,X, + }, + .S = [_]u21{ + O,O,O,O,O, + O,O,X,O,O, + O,O,O,O,O, + O,O,X,O,O, + O,O,O,O,O, + }, + .E = [_]u21{ + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + }, +}; +// zig fmt: on \ No newline at end of file diff --git a/src/bigclock/fa.zig b/src/bigclock/fa.zig new file mode 100644 index 0000000..63a897a --- /dev/null +++ b/src/bigclock/fa.zig @@ -0,0 +1,94 @@ +const Lang = @import("Lang.zig"); + +const LocaleChars = Lang.LocaleChars; +const X = Lang.X; +const O = Lang.O; + +// zig fmt: off +pub const locale_chars = LocaleChars{ + .ZERO = [_]u21{ + O,O,O,O,O, + O,O,X,O,O, + O,X,O,X,O, + O,O,X,O,O, + O,O,O,O,O, + }, + .ONE = [_]u21{ + O,O,X,O,O, + O,X,X,O,O, + O,O,X,O,O, + O,O,X,O,O, + O,O,X,O,O, + }, + .TWO = [_]u21{ + O,X,O,X,O, + O,X,X,X,O, + O,X,O,O,O, + O,X,O,O,O, + O,X,O,O,O, + }, + .THREE = [_]u21{ + X,O,X,O,X, + X,X,X,X,X, + X,O,O,O,O, + X,O,O,O,O, + X,O,O,O,O, + }, + .FOUR = [_]u21{ + O,X,O,X,X, + O,X,X,O,O, + O,X,X,X,X, + O,X,O,O,O, + O,X,O,O,O, + }, + .FIVE = [_]u21{ + O,O,X,X,O, + O,X,O,O,X, + X,O,O,O,X, + X,O,X,O,X, + O,X,O,X,O, + }, + .SIX = [_]u21{ + O,X,X,O,O, + O,X,O,O,X, + O,O,X,O,O, + O,X,O,O,O, + X,O,O,O,O, + }, + .SEVEN = [_]u21{ + X,O,O,O,X, + X,O,O,O,X, + O,X,O,X,O, + O,X,O,X,O, + O,O,X,O,O, + }, + .EIGHT = [_]u21{ + O,O,O,X,O, + O,O,X,O,X, + O,O,X,O,X, + O,X,O,O,X, + O,X,O,O,X, + }, + .NINE = [_]u21{ + O,X,X,X,O, + O,X,O,X,O, + O,X,X,X,O, + O,O,O,X,O, + O,O,O,X,O, + }, + .S = [_]u21{ + O,O,O,O,O, + O,O,X,O,O, + O,O,O,O,O, + O,O,X,O,O, + O,O,O,O,O, + }, + .E = [_]u21{ + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + O,O,O,O,O, + }, +}; +// zig fmt: on \ No newline at end of file diff --git a/src/config/Config.zig b/src/config/Config.zig index f9c88db..2d3cd07 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -4,13 +4,14 @@ const enums = @import("../enums.zig"); const Animation = enums.Animation; const Input = enums.Input; const ViMode = enums.ViMode; +const Bigclock = enums.Bigclock; animation: Animation = .none, animation_timeout_sec: u12 = 0, asterisk: ?u8 = '*', auth_fails: u64 = 10, bg: u16 = 0, -bigclock: bool = false, +bigclock: Bigclock = .none, blank_box: bool = true, border_fg: u16 = 8, box_title: ?[]const u8 = null, diff --git a/src/config/migrator.zig b/src/config/migrator.zig index f003213..ad7c378 100644 --- a/src/config/migrator.zig +++ b/src/config/migrator.zig @@ -85,6 +85,22 @@ pub fn configFieldHandler(_: std.mem.Allocator, field: ini.IniField) ?ini.IniFie return null; } + if (std.mem.eql(u8, field.key, "bigclock")) { + // The option now uses a string (which then gets converted into an enum) instead of an boolean + // It also includes the ability to change active bigclock's language + var mapped_field = field; + + if (std.mem.eql(u8, field.value, "true")){ + mapped_field.value = "en"; + mapped_config_fields = true; + }else if (std.mem.eql(u8, field.value, "false")){ + mapped_field.value = "none"; + mapped_config_fields = true; + } + + return mapped_field; + } + return field; } diff --git a/src/enums.zig b/src/enums.zig index 84b011e..ad0cc47 100644 --- a/src/enums.zig +++ b/src/enums.zig @@ -22,3 +22,9 @@ pub const ViMode = enum { normal, insert, }; + +pub const Bigclock = enum { + none, + en, + fa, +}; \ No newline at end of file diff --git a/src/main.zig b/src/main.zig index 1f8c224..b9cf38a 100644 --- a/src/main.zig +++ b/src/main.zig @@ -385,7 +385,7 @@ pub fn main() !void { } } - if (config.bigclock 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) draw_big_clock: { 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; @@ -396,7 +396,7 @@ pub fn main() !void { }; for (clock_str, 0..) |c, i| { - const clock_cell = bigclock.clockCell(animate, c, buffer.fg, buffer.bg); + const clock_cell = bigclock.clockCell(animate, c, buffer.fg, buffer.bg, config.bigclock); bigclock.alphaBlit(xo + i * (bigclock.WIDTH + 1), yo, buffer.width, buffer.height, clock_cell); } } @@ -544,7 +544,7 @@ pub fn main() !void { .matrix => matrix.deinit(), } } - } else if (config.bigclock and config.clock == null) { + } else if (config.bigclock != .none and config.clock == null) { var tv: interop.system_time.timeval = undefined; _ = interop.system_time.gettimeofday(&tv, null);