diff --git a/docs/changelog.rst b/docs/changelog.rst index 3108ba201..ecd31a49f 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -64,6 +64,8 @@ Detailed list of changes - Improve rendering of Unicode shade character to avoid Moire patterns (:pull:`7401`) +- kitten @ send-key: Fix some keys being sent in kitty keyboard protocol encoding when not using socket for remote control + 0.34.1 [2024-04-19] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tools/cmd/at/tty_io.go b/tools/cmd/at/tty_io.go index cc35f67f4..2f91283d9 100644 --- a/tools/cmd/at/tty_io.go +++ b/tools/cmd/at/tty_io.go @@ -26,9 +26,11 @@ func is_stream_response(serialized_response []byte) bool { func do_chunked_io(io_data *rc_io_data) (serialized_response []byte, err error) { serialized_response = make([]byte, 0) - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.OnlyDisambiguateKeys) + lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors) if io_data.on_key_event != nil { lp.FullKeyboardProtocol() + } else { + lp.NoKeyboardStateChange() } if err != nil { return diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index dbd7da9cd..92df19b9a 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -146,6 +146,15 @@ func OnlyDisambiguateKeys(self *Loop) { self.terminal_options.kitty_keyboard_mode = DISAMBIGUATE_KEYS } +func (self *Loop) NoKeyboardStateChange() *Loop { + self.terminal_options.kitty_keyboard_mode = NO_KEYBOARD_STATE_CHANGE + return self +} + +func NoKeyboardStateChange(self *Loop) { + self.terminal_options.kitty_keyboard_mode = NO_KEYBOARD_STATE_CHANGE +} + func (self *Loop) FullKeyboardProtocol() *Loop { self.terminal_options.kitty_keyboard_mode = FULL_KEYBOARD_PROTOCOL return self diff --git a/tools/tui/loop/terminal-state.go b/tools/tui/loop/terminal-state.go index 778adfdc3..96cf72211 100644 --- a/tools/tui/loop/terminal-state.go +++ b/tools/tui/loop/terminal-state.go @@ -12,12 +12,14 @@ import ( type KeyboardStateBits uint8 const ( - DISAMBIGUATE_KEYS KeyboardStateBits = 1 << iota - REPORT_KEY_EVENT_TYPES - REPORT_ALTERNATE_KEYS - REPORT_ALL_KEYS_AS_ESCAPE_CODES - REPORT_TEXT_WITH_KEYS - FULL_KEYBOARD_PROTOCOL = DISAMBIGUATE_KEYS | REPORT_ALTERNATE_KEYS | REPORT_ALL_KEYS_AS_ESCAPE_CODES | REPORT_TEXT_WITH_KEYS | REPORT_KEY_EVENT_TYPES + LEGACY_KEYS KeyboardStateBits = 0 + DISAMBIGUATE_KEYS = 1 + REPORT_KEY_EVENT_TYPES = 2 + REPORT_ALTERNATE_KEYS = 4 + REPORT_ALL_KEYS_AS_ESCAPE_CODES = 8 + REPORT_TEXT_WITH_KEYS = 16 + FULL_KEYBOARD_PROTOCOL = DISAMBIGUATE_KEYS | REPORT_ALTERNATE_KEYS | REPORT_ALL_KEYS_AS_ESCAPE_CODES | REPORT_TEXT_WITH_KEYS | REPORT_KEY_EVENT_TYPES + NO_KEYBOARD_STATE_CHANGE = 32 ) const ( @@ -130,10 +132,12 @@ func (self *TerminalStateOptions) SetStateEscapeCodes() string { set_modes(&sb, ALTERNATE_SCREEN) sb.WriteString(CLEAR_SCREEN) } - if self.kitty_keyboard_mode > 0 { - sb.WriteString(fmt.Sprintf("\033[>%du", self.kitty_keyboard_mode)) - } else { + switch self.kitty_keyboard_mode { + case LEGACY_KEYS: sb.WriteString("\033[>u") + case NO_KEYBOARD_STATE_CHANGE: + default: + sb.WriteString(fmt.Sprintf("\033[>%du", self.kitty_keyboard_mode)) } if self.mouse_tracking != NO_MOUSE_TRACKING { sb.WriteString(MOUSE_SGR_PIXEL_MODE.EscapeCodeToSet()) @@ -152,7 +156,9 @@ func (self *TerminalStateOptions) SetStateEscapeCodes() string { func (self *TerminalStateOptions) ResetStateEscapeCodes() string { var sb strings.Builder sb.Grow(64) - sb.WriteString("\033[