Files
csvu/src/term.zig
T
2024-09-02 22:23:58 +02:00

53 lines
1.4 KiB
Zig

const std = @import("std");
const builtin = @import("builtin");
const Dimensions = struct { width: u16, height: u16 };
const Error = error{ UnsupportedOs, ErrorFetchingDimensions };
pub fn getTerminalDimensions() !Dimensions {
const os_tag = builtin.os.tag;
switch (os_tag) {
.linux, .macos, .freebsd, .openbsd, .netbsd => {
return try getUnixTerminalDimensions();
},
.windows => {
return try getWindowsTerminalDimensions();
},
else => {
return Error.UnsupportedOs;
}
}
}
fn getUnixTerminalDimensions() !Dimensions {
const os = std.os;
const size: os.linux.winsize = undefined;
const fd = std.io.getStdOut().handle;
_ = os.linux.ioctl(fd, os.linux.T.IOCSWINSZ, @intFromPtr(&size));
return Dimensions{ .width = size.ws_col, .height = size.ws_row };
}
fn getWindowsTerminalDimensions() !Dimensions {
const win = std.os.windows;
const handle = win.GetStdHandle(win.STD_OUTPUT_HANDLE) catch return Error.ErrorFetchingDimensions;
var csbi: win.CONSOLE_SCREEN_BUFFER_INFO = undefined;
if (win.kernel32.GetConsoleScreenBufferInfo(handle, &csbi) == 0) {
return Error.ErrorFetchingDimensions;
}
const width = csbi.srWindow.Right - csbi.srWindow.Left + 1;
const height = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
return Dimensions{
.width = @intCast(width),
.height = @intCast(height),
};
}