Wire up key handling

This commit is contained in:
Kovid Goyal 2022-08-24 11:01:04 +05:30
parent d6ed20323b
commit 42a5129553
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
3 changed files with 39 additions and 0 deletions

View File

@ -51,6 +51,7 @@ type KeyEvent struct {
ShiftedKey string
AlternateKey string
Text string
Handled bool
}
func KeyEventFromCSI(csi string) *KeyEvent {

View File

@ -19,9 +19,42 @@ type Loop struct {
death_signal Signal
exit_code int
write_buf []byte
// Callbacks
OnKeyEvent func(loop *Loop, event *KeyEvent) error
OnText func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error
}
func (self *Loop) handle_csi(raw []byte) error {
csi := string(raw)
ke := KeyEventFromCSI(csi)
if ke != nil {
return self.handle_key_event(ke)
}
return nil
}
func (self *Loop) handle_key_event(ev *KeyEvent) error {
if self.OnKeyEvent != nil {
err := self.OnKeyEvent(self, ev)
if err != nil {
return err
}
if ev.Handled {
return nil
}
}
if ev.MatchesPressOrRepeat("ctrl+c") {
ev.Handled = true
return self.on_SIGINT()
}
if ev.MatchesPressOrRepeat("ctrl+z") {
ev.Handled = true
return self.on_SIGTSTP()
}
if ev.Text != "" && self.OnText != nil {
return self.OnText(self, ev.Text, true, false)
}
return nil
}
@ -46,6 +79,9 @@ func (self *Loop) handle_pm(raw []byte) error {
}
func (self *Loop) handle_rune(raw rune) error {
if self.OnText != nil {
return self.OnText(self, string(raw), false, self.escape_code_parser.InBracketedPaste())
}
return nil
}

View File

@ -51,6 +51,8 @@ type EscapeCodeParser struct {
HandleAPC func([]byte) error
}
func (self *EscapeCodeParser) InBracketedPaste() bool { return self.state == bracketed_paste }
func (self *EscapeCodeParser) Parse(data []byte) error {
prev := UTF8_ACCEPT
codep := UTF8_ACCEPT