110 lines
2.3 KiB
Go
110 lines
2.3 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/nsf/termbox-go"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func tbprint(x, y int, fg, bg termbox.Attribute, msg string) {
|
||
|
for _, c := range msg {
|
||
|
termbox.SetCell(x, y, c, fg, bg)
|
||
|
x++
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var current string
|
||
|
var curev termbox.Event
|
||
|
|
||
|
func mouse_button_str(k termbox.Key) string {
|
||
|
switch k {
|
||
|
case termbox.MouseLeft:
|
||
|
return "MouseLeft"
|
||
|
case termbox.MouseMiddle:
|
||
|
return "MouseMiddle"
|
||
|
case termbox.MouseRight:
|
||
|
return "MouseRight"
|
||
|
case termbox.MouseRelease:
|
||
|
return "MouseRelease"
|
||
|
case termbox.MouseWheelUp:
|
||
|
return "MouseWheelUp"
|
||
|
case termbox.MouseWheelDown:
|
||
|
return "MouseWheelDown"
|
||
|
}
|
||
|
return "Key"
|
||
|
}
|
||
|
|
||
|
func mod_str(m termbox.Modifier) string {
|
||
|
var out []string
|
||
|
if m&termbox.ModAlt != 0 {
|
||
|
out = append(out, "ModAlt")
|
||
|
}
|
||
|
if m&termbox.ModMotion != 0 {
|
||
|
out = append(out, "ModMotion")
|
||
|
}
|
||
|
return strings.Join(out, " | ")
|
||
|
}
|
||
|
|
||
|
func redraw_all() {
|
||
|
const coldef = termbox.ColorDefault
|
||
|
termbox.Clear(coldef, coldef)
|
||
|
tbprint(0, 0, termbox.ColorMagenta, coldef, "Press 'q' to quit")
|
||
|
tbprint(0, 1, coldef, coldef, current)
|
||
|
switch curev.Type {
|
||
|
case termbox.EventKey:
|
||
|
tbprint(0, 2, coldef, coldef,
|
||
|
fmt.Sprintf("EventKey: k: %d, c: %c, mod: %s", curev.Key, curev.Ch, mod_str(curev.Mod)))
|
||
|
case termbox.EventMouse:
|
||
|
tbprint(0, 2, coldef, coldef,
|
||
|
fmt.Sprintf("EventMouse: x: %d, y: %d, b: %s, mod: %s",
|
||
|
curev.MouseX, curev.MouseY, mouse_button_str(curev.Key), mod_str(curev.Mod)))
|
||
|
case termbox.EventNone:
|
||
|
tbprint(0, 2, coldef, coldef, "EventNone")
|
||
|
}
|
||
|
tbprint(0, 3, coldef, coldef, fmt.Sprintf("%d", curev.N))
|
||
|
termbox.Flush()
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
err := termbox.Init()
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
defer termbox.Close()
|
||
|
termbox.SetInputMode(termbox.InputAlt | termbox.InputMouse)
|
||
|
redraw_all()
|
||
|
|
||
|
data := make([]byte, 0, 64)
|
||
|
mainloop:
|
||
|
for {
|
||
|
if cap(data)-len(data) < 32 {
|
||
|
newdata := make([]byte, len(data), len(data)+32)
|
||
|
copy(newdata, data)
|
||
|
data = newdata
|
||
|
}
|
||
|
beg := len(data)
|
||
|
d := data[beg : beg+32]
|
||
|
switch ev := termbox.PollRawEvent(d); ev.Type {
|
||
|
case termbox.EventRaw:
|
||
|
data = data[:beg+ev.N]
|
||
|
current = fmt.Sprintf("%q", data)
|
||
|
if current == `"q"` {
|
||
|
break mainloop
|
||
|
}
|
||
|
|
||
|
for {
|
||
|
ev := termbox.ParseEvent(data)
|
||
|
if ev.N == 0 {
|
||
|
break
|
||
|
}
|
||
|
curev = ev
|
||
|
copy(data, data[curev.N:])
|
||
|
data = data[:len(data)-curev.N]
|
||
|
}
|
||
|
case termbox.EventError:
|
||
|
panic(ev.Err)
|
||
|
}
|
||
|
redraw_all()
|
||
|
}
|
||
|
}
|