summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tui/draw.go2
-rw-r--r--tui/event.go60
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)
}
}