package cbind
import (
"fmt"
"sync"
"unicode"
"github.com/gdamore/tcell/v2"
)
type eventHandler func (ev *tcell .EventKey ) *tcell .EventKey
type Configuration struct {
handlers map [string ]eventHandler
mutex *sync .RWMutex
}
func NewConfiguration () *Configuration {
c := Configuration {
handlers : make (map [string ]eventHandler ),
mutex : new (sync .RWMutex ),
}
return &c
}
func (c *Configuration ) Set (s string , handler func (ev *tcell .EventKey ) *tcell .EventKey ) error {
mod , key , ch , err := Decode (s )
if err != nil {
return err
}
if key == tcell .KeyRune {
c .SetRune (mod , ch , handler )
} else {
c .SetKey (mod , key , handler )
}
return nil
}
func (c *Configuration ) SetKey (mod tcell .ModMask , key tcell .Key , handler func (ev *tcell .EventKey ) *tcell .EventKey ) {
c .mutex .Lock ()
defer c .mutex .Unlock ()
if mod &tcell .ModShift != 0 && key == tcell .KeyTab {
mod ^= tcell .ModShift
key = tcell .KeyBacktab
}
if mod &tcell .ModCtrl == 0 && key != tcell .KeyBackspace && key != tcell .KeyTab && key != tcell .KeyEnter {
for _ , ctrlKey := range ctrlKeys {
if key == ctrlKey {
mod |= tcell .ModCtrl
break
}
}
}
c .handlers [fmt .Sprintf ("%d-%d" , mod , key )] = handler
}
func (c *Configuration ) SetRune (mod tcell .ModMask , ch rune , handler func (ev *tcell .EventKey ) *tcell .EventKey ) {
switch ch {
case '\t' :
c .SetKey (mod , tcell .KeyTab , handler )
return
case '\n' :
c .SetKey (mod , tcell .KeyEnter , handler )
return
}
if mod &tcell .ModCtrl != 0 {
k , ok := ctrlKeys [unicode .ToLower (ch )]
if ok {
c .SetKey (mod , k , handler )
return
}
}
c .mutex .Lock ()
defer c .mutex .Unlock ()
c .handlers [fmt .Sprintf ("%d:%d" , mod , ch )] = handler
}
func (c *Configuration ) Capture (ev *tcell .EventKey ) *tcell .EventKey {
c .mutex .RLock ()
defer c .mutex .RUnlock ()
if ev == nil {
return nil
}
var keyName string
if ev .Key () != tcell .KeyRune {
keyName = fmt .Sprintf ("%d-%d" , ev .Modifiers (), ev .Key ())
} else {
keyName = fmt .Sprintf ("%d:%d" , ev .Modifiers (), ev .Rune ())
}
handler := c .handlers [keyName ]
if handler != nil {
return handler (ev )
}
return ev
}
func (c *Configuration ) Clear () {
c .mutex .Lock ()
defer c .mutex .Unlock ()
c .handlers = make (map [string ]eventHandler )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .