xterm.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package input
  2. import (
  3. "github.com/charmbracelet/x/ansi"
  4. )
  5. func parseXTermModifyOtherKeys(params ansi.Params) Event {
  6. // XTerm modify other keys starts with ESC [ 27 ; <modifier> ; <code> ~
  7. xmod, _, _ := params.Param(1, 1)
  8. xrune, _, _ := params.Param(2, 1)
  9. mod := KeyMod(xmod - 1)
  10. r := rune(xrune)
  11. switch r {
  12. case ansi.BS:
  13. return KeyPressEvent{Mod: mod, Code: KeyBackspace}
  14. case ansi.HT:
  15. return KeyPressEvent{Mod: mod, Code: KeyTab}
  16. case ansi.CR:
  17. return KeyPressEvent{Mod: mod, Code: KeyEnter}
  18. case ansi.ESC:
  19. return KeyPressEvent{Mod: mod, Code: KeyEscape}
  20. case ansi.DEL:
  21. return KeyPressEvent{Mod: mod, Code: KeyBackspace}
  22. }
  23. // CSI 27 ; <modifier> ; <code> ~ keys defined in XTerm modifyOtherKeys
  24. k := KeyPressEvent{Code: r, Mod: mod}
  25. if k.Mod <= ModShift {
  26. k.Text = string(r)
  27. }
  28. return k
  29. }
  30. // TerminalVersionEvent is a message that represents the terminal version.
  31. type TerminalVersionEvent string
  32. // ModifyOtherKeysEvent represents a modifyOtherKeys event.
  33. //
  34. // 0: disable
  35. // 1: enable mode 1
  36. // 2: enable mode 2
  37. //
  38. // See: https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h3-Functions-using-CSI-_-ordered-by-the-final-character_s_
  39. // See: https://invisible-island.net/xterm/manpage/xterm.html#VT100-Widget-Resources:modifyOtherKeys
  40. type ModifyOtherKeysEvent uint8