diff --git a/CHANGELOG.md b/CHANGELOG.md index 518dff7..5c77f86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Termdash now requires at least Go version 1.10, which allows us to utilize `math.Round` instead of our own implementation and `strings.Builder` instead of `bytes.Buffer`. +- Terminal shortcuts like `Ctrl-A` no longer come as two separate events, + Termdash now mirrors termbox-go and sends these as one event. ## [0.8.0] - 30-Mar-2019 diff --git a/keyboard/keyboard.go b/keyboard/keyboard.go index e8bc655..3a852b3 100644 --- a/keyboard/keyboard.go +++ b/keyboard/keyboard.go @@ -55,11 +55,40 @@ var buttonNames = map[Key]string{ KeyArrowDown: "KeyArrowDown", KeyArrowLeft: "KeyArrowLeft", KeyArrowRight: "KeyArrowRight", + KeyCtrlTilde: "KeyCtrlTilde", + KeyCtrlA: "KeyCtrlA", + KeyCtrlB: "KeyCtrlB", + KeyCtrlC: "KeyCtrlC", + KeyCtrlD: "KeyCtrlD", + KeyCtrlE: "KeyCtrlE", + KeyCtrlF: "KeyCtrlF", + KeyCtrlG: "KeyCtrlG", KeyBackspace: "KeyBackspace", KeyTab: "KeyTab", + KeyCtrlJ: "KeyCtrlJ", + KeyCtrlK: "KeyCtrlK", + KeyCtrlL: "KeyCtrlL", KeyEnter: "KeyEnter", + KeyCtrlN: "KeyCtrlN", + KeyCtrlO: "KeyCtrlO", + KeyCtrlP: "KeyCtrlP", + KeyCtrlQ: "KeyCtrlQ", + KeyCtrlR: "KeyCtrlR", + KeyCtrlS: "KeyCtrlS", + KeyCtrlT: "KeyCtrlT", + KeyCtrlU: "KeyCtrlU", + KeyCtrlV: "KeyCtrlV", + KeyCtrlW: "KeyCtrlW", + KeyCtrlX: "KeyCtrlX", + KeyCtrlY: "KeyCtrlY", + KeyCtrlZ: "KeyCtrlZ", KeyEsc: "KeyEsc", - KeyCtrl: "KeyCtrl", + KeyCtrl4: "KeyCtrl4", + KeyCtrl5: "KeyCtrl5", + KeyCtrl6: "KeyCtrl6", + KeyCtrl7: "KeyCtrl7", + KeySpace: "KeySpace", + KeyBackspace2: "KeyBackspace2", } // Printable characters, but worth having constants for them. @@ -91,9 +120,53 @@ const ( KeyArrowDown KeyArrowLeft KeyArrowRight + KeyCtrlTilde + KeyCtrlA + KeyCtrlB + KeyCtrlC + KeyCtrlD + KeyCtrlE + KeyCtrlF + KeyCtrlG KeyBackspace KeyTab + KeyCtrlJ + KeyCtrlK + KeyCtrlL KeyEnter + KeyCtrlN + KeyCtrlO + KeyCtrlP + KeyCtrlQ + KeyCtrlR + KeyCtrlS + KeyCtrlT + KeyCtrlU + KeyCtrlV + KeyCtrlW + KeyCtrlX + KeyCtrlY + KeyCtrlZ KeyEsc - KeyCtrl + KeyCtrl4 + KeyCtrl5 + KeyCtrl6 + KeyCtrl7 + KeyBackspace2 +) + +// Keys declared as duplicates by termbox. +const ( + KeyCtrl2 Key = KeyCtrlTilde + KeyCtrlSpace Key = KeyCtrlTilde + KeyCtrlH Key = KeyBackspace + KeyCtrlI Key = KeyTab + KeyCtrlM Key = KeyEnter + KeyCtrlLsqBracket Key = KeyEsc + KeyCtrl3 Key = KeyEsc + KeyCtrlBackslash Key = KeyCtrl4 + KeyCtrlRsqBracket Key = KeyCtrl5 + KeyCtrlSlash Key = KeyCtrl7 + KeyCtrlUnderscore Key = KeyCtrl7 + KeyCtrl8 Key = KeyBackspace2 ) diff --git a/terminal/termbox/event.go b/terminal/termbox/event.go index d4deae7..c26d88c 100644 --- a/terminal/termbox/event.go +++ b/terminal/termbox/event.go @@ -25,146 +25,84 @@ import ( tbx "github.com/nsf/termbox-go" ) -// newKeyboard creates a new termdash keyboard events with the provided keys. -func newKeyboard(keys ...keyboard.Key) []terminalapi.Event { - var evs []terminalapi.Event - for _, k := range keys { - evs = append(evs, &terminalapi.Keyboard{Key: k}) - } - return evs +// tbxToTd maps termbox key values to the termdash format. +var tbxToTd = map[tbx.Key]keyboard.Key{ + tbx.KeySpace: keyboard.KeySpace, + tbx.KeyF1: keyboard.KeyF1, + tbx.KeyF2: keyboard.KeyF2, + tbx.KeyF3: keyboard.KeyF3, + tbx.KeyF4: keyboard.KeyF4, + tbx.KeyF5: keyboard.KeyF5, + tbx.KeyF6: keyboard.KeyF6, + tbx.KeyF7: keyboard.KeyF7, + tbx.KeyF8: keyboard.KeyF8, + tbx.KeyF9: keyboard.KeyF9, + tbx.KeyF10: keyboard.KeyF10, + tbx.KeyF11: keyboard.KeyF11, + tbx.KeyF12: keyboard.KeyF12, + tbx.KeyInsert: keyboard.KeyInsert, + tbx.KeyDelete: keyboard.KeyDelete, + tbx.KeyHome: keyboard.KeyHome, + tbx.KeyEnd: keyboard.KeyEnd, + tbx.KeyPgup: keyboard.KeyPgUp, + tbx.KeyPgdn: keyboard.KeyPgDn, + tbx.KeyArrowUp: keyboard.KeyArrowUp, + tbx.KeyArrowDown: keyboard.KeyArrowDown, + tbx.KeyArrowLeft: keyboard.KeyArrowLeft, + tbx.KeyArrowRight: keyboard.KeyArrowRight, + tbx.KeyCtrlTilde: keyboard.KeyCtrlTilde, + tbx.KeyCtrlA: keyboard.KeyCtrlA, + tbx.KeyCtrlB: keyboard.KeyCtrlB, + tbx.KeyCtrlC: keyboard.KeyCtrlC, + tbx.KeyCtrlD: keyboard.KeyCtrlD, + tbx.KeyCtrlE: keyboard.KeyCtrlE, + tbx.KeyCtrlF: keyboard.KeyCtrlF, + tbx.KeyCtrlG: keyboard.KeyCtrlG, + tbx.KeyBackspace: keyboard.KeyBackspace, + tbx.KeyTab: keyboard.KeyTab, + tbx.KeyCtrlJ: keyboard.KeyCtrlJ, + tbx.KeyCtrlK: keyboard.KeyCtrlK, + tbx.KeyCtrlL: keyboard.KeyCtrlL, + tbx.KeyEnter: keyboard.KeyEnter, + tbx.KeyCtrlN: keyboard.KeyCtrlN, + tbx.KeyCtrlO: keyboard.KeyCtrlO, + tbx.KeyCtrlP: keyboard.KeyCtrlP, + tbx.KeyCtrlQ: keyboard.KeyCtrlQ, + tbx.KeyCtrlR: keyboard.KeyCtrlR, + tbx.KeyCtrlS: keyboard.KeyCtrlS, + tbx.KeyCtrlT: keyboard.KeyCtrlT, + tbx.KeyCtrlU: keyboard.KeyCtrlU, + tbx.KeyCtrlV: keyboard.KeyCtrlV, + tbx.KeyCtrlW: keyboard.KeyCtrlW, + tbx.KeyCtrlX: keyboard.KeyCtrlX, + tbx.KeyCtrlY: keyboard.KeyCtrlY, + tbx.KeyCtrlZ: keyboard.KeyCtrlZ, + tbx.KeyEsc: keyboard.KeyEsc, + tbx.KeyCtrl4: keyboard.KeyCtrl4, + tbx.KeyCtrl5: keyboard.KeyCtrl5, + tbx.KeyCtrl6: keyboard.KeyCtrl6, + tbx.KeyCtrl7: keyboard.KeyCtrl7, + tbx.KeyBackspace2: keyboard.KeyBackspace2, } // convKey converts a termbox keyboard event to the termdash format. -func convKey(tbxEv tbx.Event) []terminalapi.Event { +func convKey(tbxEv tbx.Event) terminalapi.Event { if tbxEv.Key != 0 && tbxEv.Ch != 0 { - return []terminalapi.Event{ - terminalapi.NewErrorf("the key event contain both a key(%v) and a character(%v)", tbxEv.Key, tbxEv.Ch), - } + return terminalapi.NewErrorf("the key event contain both a key(%v) and a character(%v)", tbxEv.Key, tbxEv.Ch) } if tbxEv.Ch != 0 { - return []terminalapi.Event{&terminalapi.Keyboard{ + return &terminalapi.Keyboard{ Key: keyboard.Key(tbxEv.Ch), - }} + } } - switch k := tbxEv.Key; k { - case tbx.KeySpace: - return newKeyboard(keyboard.KeySpace) - case tbx.KeyF1: - return newKeyboard(keyboard.KeyF1) - case tbx.KeyF2: - return newKeyboard(keyboard.KeyF2) - case tbx.KeyF3: - return newKeyboard(keyboard.KeyF3) - case tbx.KeyF4: - return newKeyboard(keyboard.KeyF4) - case tbx.KeyF5: - return newKeyboard(keyboard.KeyF5) - case tbx.KeyF6: - return newKeyboard(keyboard.KeyF6) - case tbx.KeyF7: - return newKeyboard(keyboard.KeyF7) - case tbx.KeyF8: - return newKeyboard(keyboard.KeyF8) - case tbx.KeyF9: - return newKeyboard(keyboard.KeyF9) - case tbx.KeyF10: - return newKeyboard(keyboard.KeyF10) - case tbx.KeyF11: - return newKeyboard(keyboard.KeyF11) - case tbx.KeyF12: - return newKeyboard(keyboard.KeyF12) - case tbx.KeyInsert: - return newKeyboard(keyboard.KeyInsert) - case tbx.KeyDelete: - return newKeyboard(keyboard.KeyDelete) - case tbx.KeyHome: - return newKeyboard(keyboard.KeyHome) - case tbx.KeyEnd: - return newKeyboard(keyboard.KeyEnd) - case tbx.KeyPgup: - return newKeyboard(keyboard.KeyPgUp) - case tbx.KeyPgdn: - return newKeyboard(keyboard.KeyPgDn) - case tbx.KeyArrowUp: - return newKeyboard(keyboard.KeyArrowUp) - case tbx.KeyArrowDown: - return newKeyboard(keyboard.KeyArrowDown) - case tbx.KeyArrowLeft: - return newKeyboard(keyboard.KeyArrowLeft) - case tbx.KeyArrowRight: - return newKeyboard(keyboard.KeyArrowRight) - case tbx.KeyBackspace /*, tbx.KeyCtrlH */ : - return newKeyboard(keyboard.KeyBackspace) - case tbx.KeyTab /*, tbx.KeyCtrlI */ : - return newKeyboard(keyboard.KeyTab) - case tbx.KeyEnter /*, tbx.KeyCtrlM*/ : - return newKeyboard(keyboard.KeyEnter) - case tbx.KeyEsc /*, tbx.KeyCtrlLsqBracket, tbx.KeyCtrl3 */ : - return newKeyboard(keyboard.KeyEsc) - case tbx.KeyCtrl2 /*, tbx.KeyCtrlTilde, tbx.KeyCtrlSpace */ : - return newKeyboard(keyboard.KeyCtrl, '2') - case tbx.KeyCtrl4 /*, tbx.KeyCtrlBackslash */ : - return newKeyboard(keyboard.KeyCtrl, '4') - case tbx.KeyCtrl5 /*, tbx.KeyCtrlRsqBracket */ : - return newKeyboard(keyboard.KeyCtrl, '5') - case tbx.KeyCtrl6: - return newKeyboard(keyboard.KeyCtrl, '6') - case tbx.KeyCtrl7 /*, tbx.KeyCtrlSlash, tbx.KeyCtrlUnderscore */ : - return newKeyboard(keyboard.KeyCtrl, '7') - case tbx.KeyCtrl8: - return newKeyboard(keyboard.KeyCtrl, '8') - case tbx.KeyCtrlA: - return newKeyboard(keyboard.KeyCtrl, 'a') - case tbx.KeyCtrlB: - return newKeyboard(keyboard.KeyCtrl, 'b') - case tbx.KeyCtrlC: - return newKeyboard(keyboard.KeyCtrl, 'c') - case tbx.KeyCtrlD: - return newKeyboard(keyboard.KeyCtrl, 'd') - case tbx.KeyCtrlE: - return newKeyboard(keyboard.KeyCtrl, 'e') - case tbx.KeyCtrlF: - return newKeyboard(keyboard.KeyCtrl, 'f') - case tbx.KeyCtrlG: - return newKeyboard(keyboard.KeyCtrl, 'g') - case tbx.KeyCtrlJ: - return newKeyboard(keyboard.KeyCtrl, 'j') - case tbx.KeyCtrlK: - return newKeyboard(keyboard.KeyCtrl, 'k') - case tbx.KeyCtrlL: - return newKeyboard(keyboard.KeyCtrl, 'l') - case tbx.KeyCtrlN: - return newKeyboard(keyboard.KeyCtrl, 'n') - case tbx.KeyCtrlO: - return newKeyboard(keyboard.KeyCtrl, 'o') - case tbx.KeyCtrlP: - return newKeyboard(keyboard.KeyCtrl, 'p') - case tbx.KeyCtrlQ: - return newKeyboard(keyboard.KeyCtrl, 'q') - case tbx.KeyCtrlR: - return newKeyboard(keyboard.KeyCtrl, 'r') - case tbx.KeyCtrlS: - return newKeyboard(keyboard.KeyCtrl, 's') - case tbx.KeyCtrlT: - return newKeyboard(keyboard.KeyCtrl, 't') - case tbx.KeyCtrlU: - return newKeyboard(keyboard.KeyCtrl, 'u') - case tbx.KeyCtrlV: - return newKeyboard(keyboard.KeyCtrl, 'v') - case tbx.KeyCtrlW: - return newKeyboard(keyboard.KeyCtrl, 'w') - case tbx.KeyCtrlX: - return newKeyboard(keyboard.KeyCtrl, 'x') - case tbx.KeyCtrlY: - return newKeyboard(keyboard.KeyCtrl, 'y') - case tbx.KeyCtrlZ: - return newKeyboard(keyboard.KeyCtrl, 'z') - default: - return []terminalapi.Event{ - terminalapi.NewErrorf("unknown keyboard key %v in a keyboard event", k), - } + k, ok := tbxToTd[tbxEv.Key] + if !ok { + return terminalapi.NewErrorf("unknown keyboard key '%v' in a keyboard event", k) + } + return &terminalapi.Keyboard{ + Key: k, } } @@ -230,7 +168,9 @@ func toTermdashEvents(tbxEv tbx.Event) []terminalapi.Event { case tbx.EventMouse: return []terminalapi.Event{convMouse(tbxEv)} case tbx.EventKey: - return convKey(tbxEv) + return []terminalapi.Event{ + convKey(tbxEv), + } default: return []terminalapi.Event{ terminalapi.NewErrorf("unknown termbox event type: %v", t), diff --git a/terminal/termbox/event_test.go b/terminal/termbox/event_test.go index 7746520..6ae2a4b 100644 --- a/terminal/termbox/event_test.go +++ b/terminal/termbox/event_test.go @@ -193,86 +193,99 @@ func TestKeyboardKeys(t *testing.T) { tests := []struct { key tbx.Key ch rune - want []keyboard.Key + want keyboard.Key wantErr bool }{ {key: tbx.KeyF1, ch: 'a', wantErr: true}, {key: 2000, wantErr: true}, - {ch: 'a', want: []keyboard.Key{'a'}}, - {ch: 'A', want: []keyboard.Key{'A'}}, - {ch: 'z', want: []keyboard.Key{'z'}}, - {ch: 'Z', want: []keyboard.Key{'Z'}}, - {ch: '0', want: []keyboard.Key{'0'}}, - {ch: '9', want: []keyboard.Key{'9'}}, - {ch: '!', want: []keyboard.Key{'!'}}, - {ch: ')', want: []keyboard.Key{')'}}, - {key: tbx.KeySpace, want: []keyboard.Key{keyboard.KeySpace}}, - {key: tbx.KeyF1, want: []keyboard.Key{keyboard.KeyF1}}, - {key: tbx.KeyF2, want: []keyboard.Key{keyboard.KeyF2}}, - {key: tbx.KeyF3, want: []keyboard.Key{keyboard.KeyF3}}, - {key: tbx.KeyF4, want: []keyboard.Key{keyboard.KeyF4}}, - {key: tbx.KeyF5, want: []keyboard.Key{keyboard.KeyF5}}, - {key: tbx.KeyF6, want: []keyboard.Key{keyboard.KeyF6}}, - {key: tbx.KeyF7, want: []keyboard.Key{keyboard.KeyF7}}, - {key: tbx.KeyF8, want: []keyboard.Key{keyboard.KeyF8}}, - {key: tbx.KeyF9, want: []keyboard.Key{keyboard.KeyF9}}, - {key: tbx.KeyF10, want: []keyboard.Key{keyboard.KeyF10}}, - {key: tbx.KeyF11, want: []keyboard.Key{keyboard.KeyF11}}, - {key: tbx.KeyF12, want: []keyboard.Key{keyboard.KeyF12}}, - {key: tbx.KeyInsert, want: []keyboard.Key{keyboard.KeyInsert}}, - {key: tbx.KeyDelete, want: []keyboard.Key{keyboard.KeyDelete}}, - {key: tbx.KeyHome, want: []keyboard.Key{keyboard.KeyHome}}, - {key: tbx.KeyEnd, want: []keyboard.Key{keyboard.KeyEnd}}, - {key: tbx.KeyPgup, want: []keyboard.Key{keyboard.KeyPgUp}}, - {key: tbx.KeyPgdn, want: []keyboard.Key{keyboard.KeyPgDn}}, - {key: tbx.KeyArrowUp, want: []keyboard.Key{keyboard.KeyArrowUp}}, - {key: tbx.KeyArrowDown, want: []keyboard.Key{keyboard.KeyArrowDown}}, - {key: tbx.KeyArrowLeft, want: []keyboard.Key{keyboard.KeyArrowLeft}}, - {key: tbx.KeyArrowRight, want: []keyboard.Key{keyboard.KeyArrowRight}}, - {key: tbx.KeyBackspace, want: []keyboard.Key{keyboard.KeyBackspace}}, - {key: tbx.KeyCtrlH, want: []keyboard.Key{keyboard.KeyBackspace}}, - {key: tbx.KeyTab, want: []keyboard.Key{keyboard.KeyTab}}, - {key: tbx.KeyCtrlI, want: []keyboard.Key{keyboard.KeyTab}}, - {key: tbx.KeyEnter, want: []keyboard.Key{keyboard.KeyEnter}}, - {key: tbx.KeyCtrlM, want: []keyboard.Key{keyboard.KeyEnter}}, - {key: tbx.KeyEsc, want: []keyboard.Key{keyboard.KeyEsc}}, - {key: tbx.KeyCtrlLsqBracket, want: []keyboard.Key{keyboard.KeyEsc}}, - {key: tbx.KeyCtrl3, want: []keyboard.Key{keyboard.KeyEsc}}, - {key: tbx.KeyCtrl2, want: []keyboard.Key{keyboard.KeyCtrl, '2'}}, - {key: tbx.KeyCtrlTilde, want: []keyboard.Key{keyboard.KeyCtrl, '2'}}, - {key: tbx.KeyCtrlSpace, want: []keyboard.Key{keyboard.KeyCtrl, '2'}}, - {key: tbx.KeyCtrl4, want: []keyboard.Key{keyboard.KeyCtrl, '4'}}, - {key: tbx.KeyCtrlBackslash, want: []keyboard.Key{keyboard.KeyCtrl, '4'}}, - {key: tbx.KeyCtrl5, want: []keyboard.Key{keyboard.KeyCtrl, '5'}}, - {key: tbx.KeyCtrlRsqBracket, want: []keyboard.Key{keyboard.KeyCtrl, '5'}}, - {key: tbx.KeyCtrl6, want: []keyboard.Key{keyboard.KeyCtrl, '6'}}, - {key: tbx.KeyCtrl7, want: []keyboard.Key{keyboard.KeyCtrl, '7'}}, - {key: tbx.KeyCtrlSlash, want: []keyboard.Key{keyboard.KeyCtrl, '7'}}, - {key: tbx.KeyCtrlUnderscore, want: []keyboard.Key{keyboard.KeyCtrl, '7'}}, - {key: tbx.KeyCtrl8, want: []keyboard.Key{keyboard.KeyCtrl, '8'}}, - {key: tbx.KeyCtrlA, want: []keyboard.Key{keyboard.KeyCtrl, 'a'}}, - {key: tbx.KeyCtrlB, want: []keyboard.Key{keyboard.KeyCtrl, 'b'}}, - {key: tbx.KeyCtrlC, want: []keyboard.Key{keyboard.KeyCtrl, 'c'}}, - {key: tbx.KeyCtrlD, want: []keyboard.Key{keyboard.KeyCtrl, 'd'}}, - {key: tbx.KeyCtrlE, want: []keyboard.Key{keyboard.KeyCtrl, 'e'}}, - {key: tbx.KeyCtrlF, want: []keyboard.Key{keyboard.KeyCtrl, 'f'}}, - {key: tbx.KeyCtrlG, want: []keyboard.Key{keyboard.KeyCtrl, 'g'}}, - {key: tbx.KeyCtrlJ, want: []keyboard.Key{keyboard.KeyCtrl, 'j'}}, - {key: tbx.KeyCtrlK, want: []keyboard.Key{keyboard.KeyCtrl, 'k'}}, - {key: tbx.KeyCtrlL, want: []keyboard.Key{keyboard.KeyCtrl, 'l'}}, - {key: tbx.KeyCtrlN, want: []keyboard.Key{keyboard.KeyCtrl, 'n'}}, - {key: tbx.KeyCtrlO, want: []keyboard.Key{keyboard.KeyCtrl, 'o'}}, - {key: tbx.KeyCtrlP, want: []keyboard.Key{keyboard.KeyCtrl, 'p'}}, - {key: tbx.KeyCtrlQ, want: []keyboard.Key{keyboard.KeyCtrl, 'q'}}, - {key: tbx.KeyCtrlR, want: []keyboard.Key{keyboard.KeyCtrl, 'r'}}, - {key: tbx.KeyCtrlS, want: []keyboard.Key{keyboard.KeyCtrl, 's'}}, - {key: tbx.KeyCtrlT, want: []keyboard.Key{keyboard.KeyCtrl, 't'}}, - {key: tbx.KeyCtrlU, want: []keyboard.Key{keyboard.KeyCtrl, 'u'}}, - {key: tbx.KeyCtrlV, want: []keyboard.Key{keyboard.KeyCtrl, 'v'}}, - {key: tbx.KeyCtrlW, want: []keyboard.Key{keyboard.KeyCtrl, 'w'}}, - {key: tbx.KeyCtrlX, want: []keyboard.Key{keyboard.KeyCtrl, 'x'}}, - {key: tbx.KeyCtrlY, want: []keyboard.Key{keyboard.KeyCtrl, 'y'}}, - {key: tbx.KeyCtrlZ, want: []keyboard.Key{keyboard.KeyCtrl, 'z'}}, + {ch: 'a', want: 'a'}, + {ch: 'A', want: 'A'}, + {ch: 'z', want: 'z'}, + {ch: 'Z', want: 'Z'}, + {ch: '0', want: '0'}, + {ch: '9', want: '9'}, + {ch: '!', want: '!'}, + {ch: ')', want: ')'}, + {key: tbx.KeySpace, want: keyboard.KeySpace}, + {key: tbx.KeyF1, want: keyboard.KeyF1}, + {key: tbx.KeyF2, want: keyboard.KeyF2}, + {key: tbx.KeyF3, want: keyboard.KeyF3}, + {key: tbx.KeyF4, want: keyboard.KeyF4}, + {key: tbx.KeyF5, want: keyboard.KeyF5}, + {key: tbx.KeyF6, want: keyboard.KeyF6}, + {key: tbx.KeyF7, want: keyboard.KeyF7}, + {key: tbx.KeyF8, want: keyboard.KeyF8}, + {key: tbx.KeyF9, want: keyboard.KeyF9}, + {key: tbx.KeyF10, want: keyboard.KeyF10}, + {key: tbx.KeyF11, want: keyboard.KeyF11}, + {key: tbx.KeyF12, want: keyboard.KeyF12}, + {key: tbx.KeyInsert, want: keyboard.KeyInsert}, + {key: tbx.KeyDelete, want: keyboard.KeyDelete}, + {key: tbx.KeyHome, want: keyboard.KeyHome}, + {key: tbx.KeyEnd, want: keyboard.KeyEnd}, + {key: tbx.KeyPgup, want: keyboard.KeyPgUp}, + {key: tbx.KeyPgdn, want: keyboard.KeyPgDn}, + {key: tbx.KeyArrowUp, want: keyboard.KeyArrowUp}, + {key: tbx.KeyArrowDown, want: keyboard.KeyArrowDown}, + {key: tbx.KeyArrowLeft, want: keyboard.KeyArrowLeft}, + {key: tbx.KeyArrowRight, want: keyboard.KeyArrowRight}, + {key: tbx.KeyCtrlTilde, want: keyboard.KeyCtrlTilde}, + {key: tbx.KeyCtrlTilde, want: keyboard.KeyCtrl2}, + {key: tbx.KeyCtrlTilde, want: keyboard.KeyCtrlSpace}, + {key: tbx.KeyCtrl2, want: keyboard.KeyCtrlTilde}, + {key: tbx.KeyCtrlSpace, want: keyboard.KeyCtrlTilde}, + {key: tbx.KeyCtrlA, want: keyboard.KeyCtrlA}, + {key: tbx.KeyCtrlB, want: keyboard.KeyCtrlB}, + {key: tbx.KeyCtrlC, want: keyboard.KeyCtrlC}, + {key: tbx.KeyCtrlD, want: keyboard.KeyCtrlD}, + {key: tbx.KeyCtrlE, want: keyboard.KeyCtrlE}, + {key: tbx.KeyCtrlF, want: keyboard.KeyCtrlF}, + {key: tbx.KeyCtrlG, want: keyboard.KeyCtrlG}, + {key: tbx.KeyBackspace, want: keyboard.KeyBackspace}, + {key: tbx.KeyBackspace, want: keyboard.KeyCtrlH}, + {key: tbx.KeyCtrlH, want: keyboard.KeyBackspace}, + {key: tbx.KeyTab, want: keyboard.KeyTab}, + {key: tbx.KeyTab, want: keyboard.KeyCtrlI}, + {key: tbx.KeyCtrlI, want: keyboard.KeyTab}, + {key: tbx.KeyCtrlJ, want: keyboard.KeyCtrlJ}, + {key: tbx.KeyCtrlK, want: keyboard.KeyCtrlK}, + {key: tbx.KeyCtrlL, want: keyboard.KeyCtrlL}, + {key: tbx.KeyEnter, want: keyboard.KeyEnter}, + {key: tbx.KeyEnter, want: keyboard.KeyCtrlM}, + {key: tbx.KeyCtrlM, want: keyboard.KeyEnter}, + {key: tbx.KeyCtrlN, want: keyboard.KeyCtrlN}, + {key: tbx.KeyCtrlO, want: keyboard.KeyCtrlO}, + {key: tbx.KeyCtrlP, want: keyboard.KeyCtrlP}, + {key: tbx.KeyCtrlQ, want: keyboard.KeyCtrlQ}, + {key: tbx.KeyCtrlR, want: keyboard.KeyCtrlR}, + {key: tbx.KeyCtrlS, want: keyboard.KeyCtrlS}, + {key: tbx.KeyCtrlT, want: keyboard.KeyCtrlT}, + {key: tbx.KeyCtrlU, want: keyboard.KeyCtrlU}, + {key: tbx.KeyCtrlV, want: keyboard.KeyCtrlV}, + {key: tbx.KeyCtrlW, want: keyboard.KeyCtrlW}, + {key: tbx.KeyCtrlX, want: keyboard.KeyCtrlX}, + {key: tbx.KeyCtrlY, want: keyboard.KeyCtrlY}, + {key: tbx.KeyCtrlZ, want: keyboard.KeyCtrlZ}, + {key: tbx.KeyEsc, want: keyboard.KeyEsc}, + {key: tbx.KeyEsc, want: keyboard.KeyCtrlLsqBracket}, + {key: tbx.KeyEsc, want: keyboard.KeyCtrl3}, + {key: tbx.KeyCtrlLsqBracket, want: keyboard.KeyEsc}, + {key: tbx.KeyCtrl3, want: keyboard.KeyEsc}, + {key: tbx.KeyCtrl4, want: keyboard.KeyCtrl4}, + {key: tbx.KeyCtrl4, want: keyboard.KeyCtrlBackslash}, + {key: tbx.KeyCtrlBackslash, want: keyboard.KeyCtrl4}, + {key: tbx.KeyCtrl5, want: keyboard.KeyCtrl5}, + {key: tbx.KeyCtrl5, want: keyboard.KeyCtrlRsqBracket}, + {key: tbx.KeyCtrlRsqBracket, want: keyboard.KeyCtrl5}, + {key: tbx.KeyCtrl6, want: keyboard.KeyCtrl6}, + {key: tbx.KeyCtrl7, want: keyboard.KeyCtrl7}, + {key: tbx.KeyCtrl7, want: keyboard.KeyCtrlSlash}, + {key: tbx.KeyCtrl7, want: keyboard.KeyCtrlUnderscore}, + {key: tbx.KeyCtrlSlash, want: keyboard.KeyCtrl7}, + {key: tbx.KeyCtrlUnderscore, want: keyboard.KeyCtrl7}, + {key: tbx.KeyBackspace2, want: keyboard.KeyBackspace2}, + {key: tbx.KeyBackspace2, want: keyboard.KeyCtrl8}, + {key: tbx.KeyCtrl8, want: keyboard.KeyBackspace2}, } for _, tc := range tests { @@ -284,34 +297,27 @@ func TestKeyboardKeys(t *testing.T) { }) gotCount := len(evs) - var wantCount int - if tc.wantErr { - wantCount = 1 - } else { - wantCount = len(tc.want) - } - + wantCount := 1 if gotCount != wantCount { t.Fatalf("toTermdashEvents => got %d events, want %d, events were:\n%v", gotCount, wantCount, pretty.Sprint(evs)) } + ev := evs[0] - for i, ev := range evs { - if err, ok := ev.(*terminalapi.Error); ok != tc.wantErr { - t.Fatalf("toTermdashEvents => unexpected error:%v, wantErr: %v", err, tc.wantErr) - } - if _, ok := ev.(*terminalapi.Error); ok { - return + if err, ok := ev.(*terminalapi.Error); ok != tc.wantErr { + t.Fatalf("toTermdashEvents => unexpected error:%v, wantErr: %v", err, tc.wantErr) + } + if _, ok := ev.(*terminalapi.Error); ok { + return + } + + switch e := ev.(type) { + case *terminalapi.Keyboard: + if got, want := e.Key, tc.want; got != want { + t.Errorf("toTermdashEvents => got key %v, want %v", got, want) } - switch e := ev.(type) { - case *terminalapi.Keyboard: - if got, want := e.Key, tc.want[i]; got != want { - t.Errorf("toTermdashEvents => got key[%d] %v, want %v", got, i, want) - } - - default: - t.Fatalf("toTermdashEvents => unexpected event type %T", e) - } + default: + t.Fatalf("toTermdashEvents => unexpected event type %T", e) } }) }