mirror of
				https://gitea.com/Lydanne/buildx.git
				synced 2025-11-04 10:03:42 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// +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
 | 
						|
}
 |