diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index f7143454f..aa8fd277f 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -71,9 +71,10 @@ type Loop struct { OnReceivedData func(data []byte) error } -func New() (*Loop, error) { +func New(options ...func(self *Loop)) (*Loop, error) { l := Loop{controlling_term: nil, timers_temp: make([]*timer, 4)} l.terminal_options.alternate_screen = true + l.terminal_options.restore_colors = true l.escape_code_parser.HandleCSI = l.handle_csi l.escape_code_parser.HandleOSC = l.handle_osc l.escape_code_parser.HandleDCS = l.handle_dcs @@ -81,6 +82,9 @@ func New() (*Loop, error) { l.escape_code_parser.HandleSOS = l.handle_sos l.escape_code_parser.HandlePM = l.handle_pm l.escape_code_parser.HandleRune = l.handle_rune + for _, f := range options { + f(&l) + } return &l, nil } @@ -109,12 +113,31 @@ func (self *Loop) RemoveTimer(id IdType) bool { return false } -func (self *Loop) NoAlternateScreen() { +func (self *Loop) NoAlternateScreen() *Loop { + self.terminal_options.alternate_screen = false + return self +} + +func NoAlternateScreen(self *Loop) { self.terminal_options.alternate_screen = false } -func (self *Loop) MouseTracking(mt MouseTracking) { +func (self *Loop) MouseTrackingMode(mt MouseTracking) *Loop { self.terminal_options.mouse_tracking = mt + return self +} + +func MouseTrackingMode(self *Loop, mt MouseTracking) { + self.terminal_options.mouse_tracking = mt +} + +func (self *Loop) NoRestoreColors() *Loop { + self.terminal_options.restore_colors = false + return self +} + +func NoRestoreColors(self *Loop) { + self.terminal_options.restore_colors = false } func (self *Loop) DeathSignalName() string { diff --git a/tools/tui/loop/terminal-state.go b/tools/tui/loop/terminal-state.go index 2ce05afef..dfd3101b4 100644 --- a/tools/tui/loop/terminal-state.go +++ b/tools/tui/loop/terminal-state.go @@ -76,8 +76,8 @@ const ( ) type TerminalStateOptions struct { - alternate_screen, no_kitty_keyboard_mode bool - mouse_tracking MouseTracking + alternate_screen, kitty_keyboard_mode, restore_colors bool + mouse_tracking MouseTracking } func set_modes(sb *strings.Builder, modes ...Mode) { @@ -100,7 +100,9 @@ func (self *TerminalStateOptions) SetStateEscapeCodes() []byte { sb.WriteString(SAVE_CURSOR) } sb.WriteString(SAVE_PRIVATE_MODE_VALUES) - sb.WriteString(SAVE_COLORS) + if self.restore_colors { + sb.WriteString(SAVE_COLORS) + } sb.WriteString(DECSACE_DEFAULT_REGION_SELECT) reset_modes(&sb, IRM, DECKM, DECSCNM, BRACKETED_PASTE, FOCUS_TRACKING, @@ -110,10 +112,10 @@ func (self *TerminalStateOptions) SetStateEscapeCodes() []byte { set_modes(&sb, ALTERNATE_SCREEN) sb.WriteString(CLEAR_SCREEN) } - if self.no_kitty_keyboard_mode { - sb.WriteString("\033[>u") - } else { + if self.kitty_keyboard_mode { sb.WriteString("\033[>31u") + } else { + sb.WriteString("\033[>u") } if self.mouse_tracking != NO_MOUSE_TRACKING { sb.WriteString(MOUSE_SGR_PIXEL_MODE.EscapeCodeToSet()) @@ -139,7 +141,9 @@ func (self *TerminalStateOptions) ResetStateEscapeCodes() []byte { sb.WriteString(SAVE_CURSOR) } sb.WriteString(RESTORE_PRIVATE_MODE_VALUES) - sb.WriteString(RESTORE_CURSOR) + if self.restore_colors { + sb.WriteString(RESTORE_CURSOR) + } sb.WriteString(RESTORE_COLORS) return []byte(sb.String()) } diff --git a/tools/tui/password.go b/tools/tui/password.go index eb1da2e68..0371d059f 100644 --- a/tools/tui/password.go +++ b/tools/tui/password.go @@ -21,8 +21,7 @@ func (self *KilledBySignal) Error() string { return self.Msg } var Canceled = errors.New("Canceled by user") func ReadPassword(prompt string, kill_if_signaled bool) (password string, err error) { - lp, err := loop.New() - lp.NoAlternateScreen() + lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors) shadow := "" if err != nil { return