cursor_helpers.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. // +build windows
  2. package winterm
  3. const (
  4. horizontal = iota
  5. vertical
  6. )
  7. func (h *windowsAnsiEventHandler) getCursorWindow(info *CONSOLE_SCREEN_BUFFER_INFO) SMALL_RECT {
  8. if h.originMode {
  9. sr := h.effectiveSr(info.Window)
  10. return SMALL_RECT{
  11. Top: sr.top,
  12. Bottom: sr.bottom,
  13. Left: 0,
  14. Right: info.Size.X - 1,
  15. }
  16. } else {
  17. return SMALL_RECT{
  18. Top: info.Window.Top,
  19. Bottom: info.Window.Bottom,
  20. Left: 0,
  21. Right: info.Size.X - 1,
  22. }
  23. }
  24. }
  25. // setCursorPosition sets the cursor to the specified position, bounded to the screen size
  26. func (h *windowsAnsiEventHandler) setCursorPosition(position COORD, window SMALL_RECT) error {
  27. position.X = ensureInRange(position.X, window.Left, window.Right)
  28. position.Y = ensureInRange(position.Y, window.Top, window.Bottom)
  29. err := SetConsoleCursorPosition(h.fd, position)
  30. if err != nil {
  31. return err
  32. }
  33. h.logf("Cursor position set: (%d, %d)", position.X, position.Y)
  34. return err
  35. }
  36. func (h *windowsAnsiEventHandler) moveCursorVertical(param int) error {
  37. return h.moveCursor(vertical, param)
  38. }
  39. func (h *windowsAnsiEventHandler) moveCursorHorizontal(param int) error {
  40. return h.moveCursor(horizontal, param)
  41. }
  42. func (h *windowsAnsiEventHandler) moveCursor(moveMode int, param int) error {
  43. info, err := GetConsoleScreenBufferInfo(h.fd)
  44. if err != nil {
  45. return err
  46. }
  47. position := info.CursorPosition
  48. switch moveMode {
  49. case horizontal:
  50. position.X += int16(param)
  51. case vertical:
  52. position.Y += int16(param)
  53. }
  54. if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
  55. return err
  56. }
  57. return nil
  58. }
  59. func (h *windowsAnsiEventHandler) moveCursorLine(param int) error {
  60. info, err := GetConsoleScreenBufferInfo(h.fd)
  61. if err != nil {
  62. return err
  63. }
  64. position := info.CursorPosition
  65. position.X = 0
  66. position.Y += int16(param)
  67. if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
  68. return err
  69. }
  70. return nil
  71. }
  72. func (h *windowsAnsiEventHandler) moveCursorColumn(param int) error {
  73. info, err := GetConsoleScreenBufferInfo(h.fd)
  74. if err != nil {
  75. return err
  76. }
  77. position := info.CursorPosition
  78. position.X = int16(param) - 1
  79. if err = h.setCursorPosition(position, h.getCursorWindow(info)); err != nil {
  80. return err
  81. }
  82. return nil
  83. }