forked from mirror/readline
68 lines
1.2 KiB
Go
68 lines
1.2 KiB
Go
// +build windows
|
|
|
|
package readline
|
|
|
|
import (
|
|
"syscall"
|
|
"unsafe"
|
|
)
|
|
|
|
type (
|
|
short int16
|
|
word uint16
|
|
|
|
small_rect struct {
|
|
left short
|
|
top short
|
|
right short
|
|
bottom short
|
|
}
|
|
|
|
coord struct {
|
|
x short
|
|
y short
|
|
}
|
|
|
|
console_screen_buffer_info struct {
|
|
size coord
|
|
cursor_position coord
|
|
attributes word
|
|
window small_rect
|
|
maximum_window_size coord
|
|
}
|
|
)
|
|
|
|
var (
|
|
StdinFd = 0
|
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
|
tmp_info console_screen_buffer_info
|
|
|
|
proc_get_console_screen_buffer_info = kernel32.NewProc("GetConsoleScreenBufferInfo")
|
|
)
|
|
|
|
func get_console_screen_buffer_info(h syscall.Handle, info *console_screen_buffer_info) (err error) {
|
|
r0, _, e1 := syscall.Syscall(proc_get_console_screen_buffer_info.Addr(),
|
|
2, uintptr(h), uintptr(unsafe.Pointer(info)), 0)
|
|
if int(r0) == 0 {
|
|
if e1 != 0 {
|
|
err = error(e1)
|
|
} else {
|
|
err = syscall.EINVAL
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func get_term_size(out syscall.Handle) coord {
|
|
err := get_console_screen_buffer_info(out, &tmp_info)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return tmp_info.size
|
|
}
|
|
|
|
// get width of the terminal
|
|
func getWidth() int {
|
|
return int(get_term_size(syscall.Stdin).x)
|
|
}
|