53 lines
1.4 KiB
Zig
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),
|
|
};
|
|
}
|