You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
1.8 KiB
65 lines
1.8 KiB
9 years ago
|
// +build windows
|
||
|
|
||
|
// Copyright 2014 Oleku Konko All rights reserved.
|
||
|
// Use of this source code is governed by a MIT
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// This module is a Terminal API for the Go Programming Language.
|
||
|
// The protocols were written in pure Go and works on windows and unix systems
|
||
|
|
||
|
package ts
|
||
|
|
||
|
import (
|
||
|
"syscall"
|
||
|
"unsafe"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||
|
|
||
|
// Retrieves information about the specified console screen buffer.
|
||
|
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms683171(v=vs.85).aspx
|
||
|
screenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
|
||
|
)
|
||
|
|
||
|
// Contains information about a console screen buffer.
|
||
|
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093(v=vs.85).aspx
|
||
|
type CONSOLE_SCREEN_BUFFER_INFO struct {
|
||
|
DwSize COORD
|
||
|
DwCursorPosition COORD
|
||
|
WAttributes uint16
|
||
|
SrWindow SMALL_RECT
|
||
|
DwMaximumWindowSize COORD
|
||
|
}
|
||
|
|
||
|
// Defines the coordinates of a character cell in a console screen buffer.
|
||
|
// The origin of the coordinate system (0,0) is at the top, left cell of the buffer.
|
||
|
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119(v=vs.85).aspx
|
||
|
type COORD struct {
|
||
|
X, Y uint16
|
||
|
}
|
||
|
|
||
|
// Defines the coordinates of the upper left and lower right corners of a rectangle.
|
||
|
// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311(v=vs.85).aspx
|
||
|
type SMALL_RECT struct {
|
||
|
Left, Top, Right, Bottom uint16
|
||
|
}
|
||
|
|
||
|
func GetSize() (ws Size, err error) {
|
||
|
var info CONSOLE_SCREEN_BUFFER_INFO
|
||
|
rc, _, err := screenBufferInfo.Call(
|
||
|
uintptr(syscall.Stdout),
|
||
|
uintptr(unsafe.Pointer(&info)))
|
||
|
|
||
|
if rc == 0 {
|
||
|
return ws, err
|
||
|
}
|
||
|
|
||
|
ws = Size{info.SrWindow.Bottom,
|
||
|
info.SrWindow.Right,
|
||
|
info.DwCursorPosition.X,
|
||
|
info.DwCursorPosition.Y}
|
||
|
|
||
|
return ws, nil
|
||
|
}
|