From cbc2cb933ff0c58e7f3b09ed9bd13195b1b76bd3 Mon Sep 17 00:00:00 2001 From: Kinzie Date: Mon, 13 May 2024 08:01:58 +0100 Subject: [PATCH] Add option to turn on numlock at startup --- res/config.ini | 3 +++ src/bigclock.zig | 30 +++++++++++++++--------------- src/config/Config.zig | 1 + src/interop.zig | 21 ++++++++++++++++++--- src/main.zig | 12 ++++++------ 5 files changed, 43 insertions(+), 24 deletions(-) diff --git a/res/config.ini b/res/config.ini index 65c6baa..6c92966 100644 --- a/res/config.ini +++ b/res/config.ini @@ -119,6 +119,9 @@ path = /sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin # Event timeout in milliseconds min_refresh_delta = 5 +# Set numlock on/off at startup +numlock = false + # Service name (set to ly to use the provided pam config file) service_name = ly diff --git a/src/bigclock.zig b/src/bigclock.zig index 46d157c..00f7939 100644 --- a/src/bigclock.zig +++ b/src/bigclock.zig @@ -8,89 +8,89 @@ const termbox = interop.termbox; const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#'; const O: u32 = 0; -pub const WIDTH: u64 = 5; -pub const HEIGHT: u64 = 5; +pub const WIDTH = 5; +pub const HEIGHT = 5; pub const SIZE = WIDTH * HEIGHT; // zig fmt: off -const ZERO = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +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 = [_]u32{ +const E = [_]u21{ O,O,O,O,O, O,O,O,O,O, O,O,O,O,O, @@ -122,7 +122,7 @@ pub fn alphaBlit(buffer: [*]termbox.tb_cell, x: u64, y: u64, tb_width: u64, tb_h } } -fn toBigNumber(char: u8) []const u32 { +fn toBigNumber(char: u8) []const u21 { return switch (char) { '0' => &ZERO, '1' => &ONE, diff --git a/src/config/Config.zig b/src/config/Config.zig index b5fdeda..0c584d5 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -27,6 +27,7 @@ max_login_len: u8 = 255, max_password_len: u8 = 255, mcookie_cmd: []const u8 = "/usr/bin/mcookie", min_refresh_delta: u16 = 5, +numlock: bool = false, path: ?[:0]const u8 = "/sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin", restart_cmd: []const u8 = "/sbin/shutdown -r now", restart_key: []const u8 = "F2", diff --git a/src/interop.zig b/src/interop.zig index a053747..80a10aa 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -48,7 +48,9 @@ pub const VT_ACTIVATE: c_int = 0x5606; pub const VT_WAITACTIVE: c_int = 0x5607; pub const KDGETLED: c_int = 0x4B31; +pub const KDSETLED: c_int = 0x4B32; pub const KDGKBLED: c_int = 0x4B64; +pub const KDSKBLED: c_int = 0x4B65; pub const LED_NUM: c_int = 0x02; pub const LED_CAP: c_int = 0x04; @@ -82,9 +84,8 @@ pub fn getLockState(console_dev: [:0]const u8) !struct { numlock: bool, capslock: bool, } { - const fd = std.c.open(console_dev, .{ .ACCMODE = .RDONLY }); - if (fd < 0) return error.CannotOpenConsoleDev; - defer _ = std.c.close(fd); + const fd = try std.posix.open(console_dev, .{ .ACCMODE = .RDONLY }, 0); + defer std.posix.close(fd); var numlock = false; var capslock = false; @@ -106,3 +107,17 @@ pub fn getLockState(console_dev: [:0]const u8) !struct { .capslock = capslock, }; } + +pub fn setNumlock(console_dev: [:0]const u8, val: bool) !void { + const fd = try std.posix.open(console_dev, .{ .ACCMODE = .RDONLY }, 0); + defer std.posix.close(fd); + + var led: c_char = undefined; + _ = std.c.ioctl(fd, KDGKBLED, &led); + + const numlock = (led & K_NUMLOCK) != 0; + if (numlock != val) { + const status = std.c.ioctl(fd, KDSKBLED, led ^ K_NUMLOCK); + if (status != 0) return error.FailedToSetNumlock; + } +} diff --git a/src/main.zig b/src/main.zig index 0abdf01..70fd17e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -127,6 +127,8 @@ pub fn main() !void { } } + interop.setNumlock(config.console_dev, config.numlock) catch {}; + // Initialize information line with host name get_host_name: { var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined; @@ -250,16 +252,14 @@ pub fn main() !void { var restart = false; var auth_fails: u64 = 0; - // Switch to selected TTY if possible open_console_dev: { - const fd = std.c.open(config.console_dev, .{ .ACCMODE = .WRONLY }); - defer _ = std.c.close(fd); - - if (fd < 0) { + const fd = std.posix.open(config.console_dev, .{ .ACCMODE = .WRONLY }, 0) catch { try info_line.setText(lang.err_console_dev); break :open_console_dev; - } + }; + defer std.posix.close(fd); + // Switch to selected TTY if possible _ = std.c.ioctl(fd, interop.VT_ACTIVATE, config.tty); _ = std.c.ioctl(fd, interop.VT_WAITACTIVE, config.tty); }