123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- // +build windows
- package winterm
- const (
- horizontal = iota
- vertical
- )
- func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_BUFFER_INFO) SMALL_RECT {
- if h.originMode {
- sr := h.effectiveSr(info.Window)
- return SMALL_RECT{
- Top: sr.top,
- Bottom: sr.bottom,
- Left: 0,
- Right: info.Size.X - 1,
- }
- } else {
- return SMALL_RECT{
- Top: info.Window.Top,
- Bottom: info.Window.Bottom,
- Left: 0,
- Right: info.Size.X - 1,
- }
- }
- }
- // setCursorPosition sets the cursor to the specified position, bounded to the screen size
- func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL_RECT) error {
- position.X = ensureInRange(position.X, window.Left, window.Right)
- position.Y = ensureInRange(position.Y, window.Top, window.Bottom)
- err := SetConsoleCursorPosition(h.fd, position)
- if err != nil {
- return err
- }
- h.logf("Cursor position set: (%d, %d)", position.X, position.Y)
- return err
- }
- func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error {
- return h.moveCursor(vertical, param)
- }
- func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error {
- return h.moveCursor(horizontal, param)
- }
- func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) error {
- info, err := GetConsoleScreenBufferInfo(h.fd)
- if err != nil {
- return err
- }
- position := info.CursorPosition
- switch moveMode {
- case horizontal:
- position.X += int16(param)
- case vertical:
- position.Y += int16(param)
- }
- if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
- return err
- }
- return nil
- }
- func (h *windowsAnsiEventHandler) moveCursorLine(param int) error {
- info, err := GetConsoleScreenBufferInfo(h.fd)
- if err != nil {
- return err
- }
- position := info.CursorPosition
- position.X = 0
- position.Y += int16(param)
- if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
- return err
- }
- return nil
- }
- func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error {
- info, err := GetConsoleScreenBufferInfo(h.fd)
- if err != nil {
- return err
- }
- position := info.CursorPosition
- position.X = int16(param) - 1
- if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
- return err
- }
- return nil
- }
|