You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.4 KiB
Plaintext
73 lines
1.4 KiB
Plaintext
package main
|
|
|
|
import "core:fmt"
|
|
import "core:os"
|
|
import "core:sys/unix"
|
|
|
|
foreign import libc "system:c"
|
|
|
|
// Terminal codes
|
|
CLEAR_CODE :: "\033[2J"
|
|
HIDE_CURSOR :: "\033[?25l"
|
|
RESET :: "\0033[0m"
|
|
|
|
TIOCGWINSZ :: 0x5413
|
|
|
|
winsize :: struct {
|
|
ws_row: u16,
|
|
ws_col: u16,
|
|
ws_xpixel: u16,
|
|
ws_ypixel: u16,
|
|
}
|
|
|
|
@(default_calling_convention="c")
|
|
foreign libc {
|
|
ioctl :: proc(fd: i32, request: u64, #c_vararg args: ..any) -> i32 ---
|
|
signal :: proc(signum: i32, handler: proc "c" (i32)) -> rawptr ---
|
|
}
|
|
|
|
SIGWINCH :: 28
|
|
|
|
resize_occurred := false
|
|
|
|
signal_handler :: proc "c" (sig: i32) {
|
|
resize_occurred = true
|
|
}
|
|
|
|
get_terminal_size :: proc() -> (rows, cols: int, ok: bool) {
|
|
ws: winsize
|
|
|
|
result := ioctl(i32(os.stdout), TIOCGWINSZ, &ws)
|
|
|
|
if result == -1 {
|
|
return 0, 0, false
|
|
}
|
|
|
|
return int(ws.ws_row), int(ws.ws_col), true
|
|
}
|
|
|
|
main :: proc() {
|
|
signal(SIGWINCH, signal_handler)
|
|
|
|
if len(os.args) != 2 {
|
|
fmt.eprintln("INCORRECT NUMBER OF COMMAND LINE ARGUMENTS")
|
|
return
|
|
}
|
|
|
|
filename := os.args[1]
|
|
data, ok := os.read_entire_file_from_filename(os.args[1])
|
|
if !ok {
|
|
fmt.eprintfln("ERROR: failed to open file: %s", filename)
|
|
}
|
|
|
|
for {
|
|
if resize_occurred {
|
|
resize_occurred = false
|
|
rows, cols, ok := get_terminal_size()
|
|
if ok {
|
|
fmt.printf("Terminal resized! New size: %d rows x %d cols\n", rows, cols)
|
|
}
|
|
}
|
|
}
|
|
}
|