Add option to turn on numlock at startup

This commit is contained in:
Kinzie 2024-05-13 08:01:58 +01:00
parent 74f7f08801
commit cbc2cb933f
No known key found for this signature in database
GPG Key ID: EF86FC12BB84F79E
5 changed files with 43 additions and 24 deletions

View File

@ -119,6 +119,9 @@ path = /sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin
# Event timeout in milliseconds # Event timeout in milliseconds
min_refresh_delta = 5 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 (set to ly to use the provided pam config file)
service_name = ly service_name = ly

View File

@ -8,89 +8,89 @@ const termbox = interop.termbox;
const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#'; const X: u32 = if (builtin.os.tag == .linux or builtin.os.tag.isBSD()) 0x2593 else '#';
const O: u32 = 0; const O: u32 = 0;
pub const WIDTH: u64 = 5; pub const WIDTH = 5;
pub const HEIGHT: u64 = 5; pub const HEIGHT = 5;
pub const SIZE = WIDTH * HEIGHT; pub const SIZE = WIDTH * HEIGHT;
// zig fmt: off // zig fmt: off
const ZERO = [_]u32{ const ZERO = [_]u21{
X,X,X,X,X, X,X,X,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,X,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, 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, X,X,X,X,X,
O,O,O,X,X, O,O,O,X,X,
X,X,X,X,X, X,X,X,X,X,
X,X,O,O,O, X,X,O,O,O,
X,X,X,X,X, X,X,X,X,X,
}; };
const THREE = [_]u32{ const THREE = [_]u21{
X,X,X,X,X, X,X,X,X,X,
O,O,O,X,X, O,O,O,X,X,
X,X,X,X,X, X,X,X,X,X,
O,O,O,X,X, O,O,O,X,X,
X,X,X,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,O,X,X, X,X,O,X,X,
X,X,X,X,X, 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 FIVE = [_]u32{ const FIVE = [_]u21{
X,X,X,X,X, X,X,X,X,X,
X,X,O,O,O, X,X,O,O,O,
X,X,X,X,X, X,X,X,X,X,
O,O,O,X,X, O,O,O,X,X,
X,X,X,X,X, X,X,X,X,X,
}; };
const SIX = [_]u32{ const SIX = [_]u21{
X,X,X,X,X, X,X,X,X,X,
X,X,O,O,O, X,X,O,O,O,
X,X,X,X,X, X,X,X,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,X,X,X, X,X,X,X,X,
}; };
const SEVEN = [_]u32{ const SEVEN = [_]u21{
X,X,X,X,X, 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,
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,X,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,X,X,X, X,X,X,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,X,X,X, X,X,X,X,X,
}; };
const NINE = [_]u32{ const NINE = [_]u21{
X,X,X,X,X, X,X,X,X,X,
X,X,O,X,X, X,X,O,X,X,
X,X,X,X,X, X,X,X,X,X,
O,O,O,X,X, O,O,O,X,X,
X,X,X,X,X, X,X,X,X,X,
}; };
const S = [_]u32{ const S = [_]u21{
O,O,O,O,O, O,O,O,O,O,
O,O,X,O,O, O,O,X,O,O,
O,O,O,O,O, O,O,O,O,O,
O,O,X,O,O, O,O,X,O,O,
O,O,O,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, 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) { return switch (char) {
'0' => &ZERO, '0' => &ZERO,
'1' => &ONE, '1' => &ONE,

View File

@ -27,6 +27,7 @@ max_login_len: u8 = 255,
max_password_len: u8 = 255, max_password_len: u8 = 255,
mcookie_cmd: []const u8 = "/usr/bin/mcookie", mcookie_cmd: []const u8 = "/usr/bin/mcookie",
min_refresh_delta: u16 = 5, min_refresh_delta: u16 = 5,
numlock: bool = false,
path: ?[:0]const u8 = "/sbin:/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin", 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_cmd: []const u8 = "/sbin/shutdown -r now",
restart_key: []const u8 = "F2", restart_key: []const u8 = "F2",

View File

@ -48,7 +48,9 @@ pub const VT_ACTIVATE: c_int = 0x5606;
pub const VT_WAITACTIVE: c_int = 0x5607; pub const VT_WAITACTIVE: c_int = 0x5607;
pub const KDGETLED: c_int = 0x4B31; pub const KDGETLED: c_int = 0x4B31;
pub const KDSETLED: c_int = 0x4B32;
pub const KDGKBLED: c_int = 0x4B64; pub const KDGKBLED: c_int = 0x4B64;
pub const KDSKBLED: c_int = 0x4B65;
pub const LED_NUM: c_int = 0x02; pub const LED_NUM: c_int = 0x02;
pub const LED_CAP: c_int = 0x04; pub const LED_CAP: c_int = 0x04;
@ -82,9 +84,8 @@ pub fn getLockState(console_dev: [:0]const u8) !struct {
numlock: bool, numlock: bool,
capslock: bool, capslock: bool,
} { } {
const fd = std.c.open(console_dev, .{ .ACCMODE = .RDONLY }); const fd = try std.posix.open(console_dev, .{ .ACCMODE = .RDONLY }, 0);
if (fd < 0) return error.CannotOpenConsoleDev; defer std.posix.close(fd);
defer _ = std.c.close(fd);
var numlock = false; var numlock = false;
var capslock = false; var capslock = false;
@ -106,3 +107,17 @@ pub fn getLockState(console_dev: [:0]const u8) !struct {
.capslock = capslock, .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;
}
}

View File

@ -127,6 +127,8 @@ pub fn main() !void {
} }
} }
interop.setNumlock(config.console_dev, config.numlock) catch {};
// Initialize information line with host name // Initialize information line with host name
get_host_name: { get_host_name: {
var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined; var name_buf: [std.posix.HOST_NAME_MAX]u8 = undefined;
@ -250,16 +252,14 @@ pub fn main() !void {
var restart = false; var restart = false;
var auth_fails: u64 = 0; var auth_fails: u64 = 0;
// Switch to selected TTY if possible
open_console_dev: { open_console_dev: {
const fd = std.c.open(config.console_dev, .{ .ACCMODE = .WRONLY }); const fd = std.posix.open(config.console_dev, .{ .ACCMODE = .WRONLY }, 0) catch {
defer _ = std.c.close(fd);
if (fd < 0) {
try info_line.setText(lang.err_console_dev); try info_line.setText(lang.err_console_dev);
break :open_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_ACTIVATE, config.tty);
_ = std.c.ioctl(fd, interop.VT_WAITACTIVE, config.tty); _ = std.c.ioctl(fd, interop.VT_WAITACTIVE, config.tty);
} }