diff options
Diffstat (limited to 'tui/event.go')
| -rw-r--r-- | tui/event.go | 60 |
1 files changed, 46 insertions, 14 deletions
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) } } |
