diff options
| author | citrons <citrons@mondecitronne.com> | 2025-06-04 12:20:22 -0500 |
|---|---|---|
| committer | citrons <citrons@mondecitronne.com> | 2025-06-07 16:02:18 -0500 |
| commit | 3fba023a229a5aa69658c6e34bdf95e8fe6c258f (patch) | |
| tree | 727ba44e5255b860bf3acf9f1ddb5a4625d47796 /tui | |
| parent | 59bbcf6d5e11f6240ea4d0a5aa2851305fac1ec0 (diff) | |
support bracketed paste
Diffstat (limited to 'tui')
| -rw-r--r-- | tui/draw.go | 2 | ||||
| -rw-r--r-- | tui/event.go | 60 |
2 files changed, 48 insertions, 14 deletions
diff --git a/tui/draw.go b/tui/draw.go index 14f11fa..d30e0eb 100644 --- a/tui/draw.go +++ b/tui/draw.go @@ -106,6 +106,7 @@ func Start() error { scr.back = make(surface) _, err = os.Stdout.WriteString( terminfo.Get(caps.EnterCaMode) + + "\033[?2004h" + // bracketed paste terminfo.Get(caps.XM, 1) + terminfo.Get(caps.ClearScreen), ) @@ -119,6 +120,7 @@ func End() { os.Stdout.WriteString( terminfo.Get(caps.ClearScreen) + terminfo.Get(caps.XM, 0) + + "\033[?2004l" + // disable bracketed paste terminfo.Get(caps.ExitCaMode), ) if term.Restore(0, saved) != nil { diff --git a/tui/event.go b/tui/event.go index 5ce7c4e..71d2f41 100644 --- a/tui/event.go +++ b/tui/event.go @@ -15,19 +15,22 @@ import ( type Event struct { TextInput rune Key keys.Key - Mouse struct { - Button int - Pressed bool - Released bool - X, Y int - Scroll int - } + Mouse MouseEvent Err error Resize bool } +type MouseEvent struct { + Button int + Pressed bool + Released bool + X, Y int + Scroll int +} + var ( evChan chan Event = make(chan Event, 1) + lastEvent chan Event = make(chan Event, 1) once sync.Once ) func Events() <-chan Event { @@ -39,19 +42,37 @@ func Events() <-chan Event { signal.Notify(sigs, syscall.SIGWINCH) go func() { for _ = range sigs { - evChan <- Event {Resize: true} + sendEvent(Event {Resize: true}) } }() }) return evChan } +func sendEvent(ev Event) { + select { + case lastEvent <- ev: + default: + } + evChan <- ev +} + +func getLastEvent() Event { + var ev Event + select { + case ev = <-lastEvent: + default: + } + return ev +} + func readKeys(ch <-chan termfo.Event, evChan chan<- Event) { + var pasting bool for kev := range ch { var ev Event if kev.Err != nil { ev.Err = kev.Err - evChan <- ev + sendEvent(ev) return } @@ -64,22 +85,33 @@ func readKeys(ch <-chan termfo.Event, evChan chan<- Event) { } ev.TextInput = r } - if kev.Key == keys.Tab { - ev.TextInput = '\t' - } switch kev.Key { case keys.Mouse: if err := parseMouse(&ev, ch); err != nil { ev.Err = err - evChan <- ev + sendEvent(ev) return } default: ev.Key = kev.Key } - evChan <- ev + if string(kev.Seq) == "\033[200~" { + pasting = true + } + if pasting { + switch kev.Seq[0] { + case '\n', '\t': + ev.TextInput = rune(kev.Seq[0]) + } + ev.Key = 0 + } + if string(kev.Seq) == "\033[201~" { + pasting = false + } + + sendEvent(ev) } } |
