From 7b48d56e0b4ad4aa2c69674c596ef528143cccda Mon Sep 17 00:00:00 2001 From: Caleb Bassi Date: Thu, 24 Jan 2019 05:23:30 -0800 Subject: [PATCH] Fix termbox event conversion --- _test/log_events.go | 8 +- events.go | 174 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 143 insertions(+), 39 deletions(-) diff --git a/_test/log_events.go b/_test/log_events.go index dc915c7..3196a24 100644 --- a/_test/log_events.go +++ b/_test/log_events.go @@ -8,6 +8,7 @@ package main import ( "fmt" + "log" ui "github.com/gizak/termui" ) @@ -16,16 +17,19 @@ import ( // stdout can also be redirected to a file and read with `tail -f` func main() { if err := ui.Init(); err != nil { - panic(err) + log.Fatalf("failed to initialize termui: %v", err) } defer ui.Close() + events := ui.PollEvents() for { - e := <-ui.PollEvents() + e := <-events fmt.Printf("%v", e) switch e.ID { case "q", "": return + case "": + return } } } diff --git a/events.go b/events.go index 1337416..edaa3b8 100644 --- a/events.go +++ b/events.go @@ -5,7 +5,7 @@ package termui import ( - "strconv" + "fmt" tb "github.com/nsf/termbox-go" ) @@ -68,51 +68,151 @@ func PollEvents() <-chan Event { // convertTermboxKeyboardEvent converts a termbox keyboard event to a more friendly string format. // Combines modifiers into the string instead of having them as additional fields in an event. func convertTermboxKeyboardEvent(e tb.Event) Event { - k := string(e.Ch) - pre := "" - mod := "" - + ID := "%s" if e.Mod == tb.ModAlt { - mod = " 0xFFFF-12 { - k = "" - } else if e.Key > 0xFFFF-25 { - ks := []string{"", "", "", "", "", "", "", "", "", ""} - k = ks[0xFFFF-int(e.Key)-12] - } - if e.Key <= 0x7F { - pre = ""}, - tb.KeyBackspace: {"", ""}, - tb.KeyTab: {"", ""}, - tb.KeyEnter: {"", ""}, - tb.KeyEsc: {"", ""}, - tb.KeyCtrlBackslash: {"C-", "\\"}, - tb.KeyCtrlSlash: {"C-", "/"}, - tb.KeySpace: {"", ""}, - tb.KeyCtrl8: {"C-", "8"}, - } - if sk, ok := kmap[e.Key]; ok { - pre = sk[0] - k = sk[1] + if e.Ch != 0 { + ID = fmt.Sprintf(ID, string(e.Ch)) + } else { + switchExpression := func() string { + switch e.Key { + case tb.KeyF1: + return "" + case tb.KeyF2: + return "" + case tb.KeyF3: + return "" + case tb.KeyF4: + return "" + case tb.KeyF5: + return "" + case tb.KeyF6: + return "" + case tb.KeyF7: + return "" + case tb.KeyF8: + return "" + case tb.KeyF9: + return "" + case tb.KeyF10: + return "" + case tb.KeyF11: + return "" + case tb.KeyF12: + return "" + case tb.KeyInsert: + return "" + case tb.KeyDelete: + return "" + case tb.KeyHome: + return "" + case tb.KeyEnd: + return "" + case tb.KeyPgup: + return "" + case tb.KeyPgdn: + return "" + case tb.KeyArrowUp: + return "" + case tb.KeyArrowDown: + return "" + case tb.KeyArrowLeft: + return "" + case tb.KeyArrowRight: + return "" + + case tb.KeyCtrlTilde: // tb.KeyCtrl2 tb.KeyCtrlSpace + // doesn't work + // doesn't work + return ">" + case tb.KeyCtrlA: + return "" + case tb.KeyCtrlB: + return "" + case tb.KeyCtrlC: + return "" + case tb.KeyCtrlD: + return "" + case tb.KeyCtrlE: + return "" + case tb.KeyCtrlF: + return "" + case tb.KeyCtrlG: + return "" + case tb.KeyBackspace: // tb.KeyCtrlH + // doesn't work + return ">" + case tb.KeyTab: // tb.KeyCtrlI + // doesn't work + return "" + case tb.KeyCtrlJ: + return "" + case tb.KeyCtrlK: + return "" + case tb.KeyCtrlL: + return "" + case tb.KeyEnter: // tb.KeyCtrlM + // doesn't work + return "" + case tb.KeyCtrlN: + return "" + case tb.KeyCtrlO: + return "" + case tb.KeyCtrlP: + return "" + case tb.KeyCtrlQ: + return "" + case tb.KeyCtrlR: + return "" + case tb.KeyCtrlS: + return "" + case tb.KeyCtrlT: + return "" + case tb.KeyCtrlU: + return "" + case tb.KeyCtrlV: + return "" + case tb.KeyCtrlW: + return "" + case tb.KeyCtrlX: + return "" + case tb.KeyCtrlY: + return "" + case tb.KeyCtrlZ: + return "" + case tb.KeyEsc: // tb.KeyCtrlLsqBracket tb.KeyCtrl3 + // doesn't work + // doesn't work + return "" + case tb.KeyCtrl4: // tb.KeyCtrlBackslash + // doesn't work + return "" + case tb.KeyCtrl5: // tb.KeyCtrlRsqBracket + // doesn't work + return "" + case tb.KeyCtrl6: + return "" + case tb.KeyCtrl7: // tb.KeyCtrlSlash tb.KeyCtrlUnderscore + // doesn't work + // doesn't work + return "" + case tb.KeySpace: + return "" + case tb.KeyBackspace2: // tb.KeyCtrl8: + // doesn't work + return "" } + // doesn't work + return "" } + ID = fmt.Sprintf(ID, switchExpression()) } - if pre != "" { - k += ">" - } - - id := pre + mod + k - return Event{ Type: KeyboardEvent, - ID: id, + ID: ID, } }