mirror of https://github.com/mum4k/termdash.git
180 lines
5.5 KiB
Go
180 lines
5.5 KiB
Go
// Copyright 2018 Google Inc.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package termbox
|
|
|
|
// event.go converts termbox events to the termdash format.
|
|
|
|
import (
|
|
"image"
|
|
|
|
"github.com/mum4k/termdash/keyboard"
|
|
"github.com/mum4k/termdash/mouse"
|
|
"github.com/mum4k/termdash/terminal/terminalapi"
|
|
tbx "github.com/nsf/termbox-go"
|
|
)
|
|
|
|
// 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 {
|
|
if tbxEv.Key != 0 && tbxEv.Ch != 0 {
|
|
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.Keyboard{
|
|
Key: keyboard.Key(tbxEv.Ch),
|
|
}
|
|
}
|
|
|
|
k, ok := tbxToTd[tbxEv.Key]
|
|
if !ok {
|
|
return terminalapi.NewErrorf("unknown keyboard key '%v' in a keyboard event", k)
|
|
}
|
|
return &terminalapi.Keyboard{
|
|
Key: k,
|
|
}
|
|
}
|
|
|
|
// convMouse converts a termbox mouse event to the termdash format.
|
|
func convMouse(tbxEv tbx.Event) terminalapi.Event {
|
|
var button mouse.Button
|
|
|
|
switch k := tbxEv.Key; k {
|
|
case tbx.MouseLeft:
|
|
button = mouse.ButtonLeft
|
|
case tbx.MouseMiddle:
|
|
button = mouse.ButtonMiddle
|
|
case tbx.MouseRight:
|
|
button = mouse.ButtonRight
|
|
case tbx.MouseRelease:
|
|
button = mouse.ButtonRelease
|
|
case tbx.MouseWheelUp:
|
|
button = mouse.ButtonWheelUp
|
|
case tbx.MouseWheelDown:
|
|
button = mouse.ButtonWheelDown
|
|
default:
|
|
return terminalapi.NewErrorf("unknown mouse key %v in a mouse event", k)
|
|
}
|
|
|
|
return &terminalapi.Mouse{
|
|
Position: image.Point{tbxEv.MouseX, tbxEv.MouseY},
|
|
Button: button,
|
|
}
|
|
}
|
|
|
|
// convResize converts a termbox resize event to the termdash format.
|
|
func convResize(tbxEv tbx.Event) terminalapi.Event {
|
|
size := image.Point{tbxEv.Width, tbxEv.Height}
|
|
if size.X < 0 || size.Y < 0 {
|
|
return terminalapi.NewErrorf("terminal resized to negative size: %v", size)
|
|
}
|
|
return &terminalapi.Resize{
|
|
Size: size,
|
|
}
|
|
}
|
|
|
|
// toTermdashEvents converts a termbox event to the termdash event format.
|
|
func toTermdashEvents(tbxEv tbx.Event) []terminalapi.Event {
|
|
switch t := tbxEv.Type; t {
|
|
case tbx.EventInterrupt:
|
|
return []terminalapi.Event{
|
|
terminalapi.NewError("event type EventInterrupt isn't supported"),
|
|
}
|
|
case tbx.EventRaw:
|
|
return []terminalapi.Event{
|
|
terminalapi.NewError("event type EventRaw isn't supported"),
|
|
}
|
|
case tbx.EventNone:
|
|
return []terminalapi.Event{
|
|
terminalapi.NewError("event type EventNone isn't supported"),
|
|
}
|
|
case tbx.EventError:
|
|
return []terminalapi.Event{
|
|
terminalapi.NewErrorf("input error occurred: %v", tbxEv.Err),
|
|
}
|
|
case tbx.EventResize:
|
|
return []terminalapi.Event{convResize(tbxEv)}
|
|
case tbx.EventMouse:
|
|
return []terminalapi.Event{convMouse(tbxEv)}
|
|
case tbx.EventKey:
|
|
return []terminalapi.Event{
|
|
convKey(tbxEv),
|
|
}
|
|
default:
|
|
return []terminalapi.Event{
|
|
terminalapi.NewErrorf("unknown termbox event type: %v", t),
|
|
}
|
|
}
|
|
}
|