From 3fe884a29a175508517efc4f36643a18ae58c491 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 10 Apr 2026 15:32:27 +0530 Subject: [PATCH] DRYer --- kittens/clipboard/legacy.go | 3 +-- kittens/clipboard/read.go | 3 +-- kittens/clipboard/write.go | 3 +-- kittens/icat/detect.go | 3 +-- kittens/notify/main.go | 3 +-- kittens/query_terminal/main.go | 3 +-- tools/cmd/at/tty_io.go | 8 ++------ tools/tui/loop/api.go | 15 +++++++++++++++ 8 files changed, 23 insertions(+), 18 deletions(-) diff --git a/kittens/clipboard/legacy.go b/kittens/clipboard/legacy.go index 87f9a2040..2916a8a38 100644 --- a/kittens/clipboard/legacy.go +++ b/kittens/clipboard/legacy.go @@ -110,11 +110,10 @@ func run_plain_text_loop(opts *Options) (err error) { defer tempfile.Close() } } - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking, loop.NoInBandResizeNotifications) + lp, err := loop.NewForSimpleInteraction() if err != nil { return } - lp.NoRoundtripToTerminalOnExit = true dest := "c" if opts.UsePrimary { dest = "p" diff --git a/kittens/clipboard/read.go b/kittens/clipboard/read.go index e4911ba2d..77a3a05dd 100644 --- a/kittens/clipboard/read.go +++ b/kittens/clipboard/read.go @@ -286,11 +286,10 @@ func parse_aliases(raw []string) (map[string][]string, error) { } func run_get_loop(opts *Options, args []string) (err error) { - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, err := loop.NewForSimpleInteraction() if err != nil { return err } - lp.NoRoundtripToTerminalOnExit = true var available_mimes []string var wg sync.WaitGroup var getting_data_for string diff --git a/kittens/clipboard/write.go b/kittens/clipboard/write.go index 3a49baab1..883ad06ce 100644 --- a/kittens/clipboard/write.go +++ b/kittens/clipboard/write.go @@ -43,11 +43,10 @@ func (self *Input) has_mime_matching(predicate func(string) bool) bool { } func write_loop(inputs []*Input, opts *Options) (err error) { - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, err := loop.NewForSimpleInteraction() if err != nil { return err } - lp.NoRoundtripToTerminalOnExit = true var waiting_for_write loop.IdType var buf [4096]byte aliases, aerr := parse_aliases(opts.Alias) diff --git a/kittens/icat/detect.go b/kittens/icat/detect.go index b514f822e..29743d690 100644 --- a/kittens/icat/detect.go +++ b/kittens/icat/detect.go @@ -21,12 +21,11 @@ func DetectSupport(timeout time.Duration) (memory, files, direct bool, err error temp_files_to_delete := make([]string, 0, 8) shm_files_to_delete := make([]shm.MMap, 0, 8) var direct_query_id, file_query_id, memory_query_id uint32 - lp, e := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, e := loop.NewForSimpleInteraction() if e != nil { err = e return } - lp.NoRoundtripToTerminalOnExit = true print_error := func(format string, args ...any) { lp.Println(fmt.Sprintf(format, args...)) } diff --git a/kittens/notify/main.go b/kittens/notify/main.go index 86723392a..4e9c9fa03 100644 --- a/kittens/notify/main.go +++ b/kittens/notify/main.go @@ -112,11 +112,10 @@ func (p *parsed_data) generate_chunks(callback func(string)) { } func (p *parsed_data) run_loop() (err error) { - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoMouseTracking, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, err := loop.NewForSimpleInteraction() if err != nil { return err } - lp.NoRoundtripToTerminalOnExit = true activated := -1 prefix := ESC_CODE_PREFIX + "i=" + p.identifier diff --git a/kittens/query_terminal/main.go b/kittens/query_terminal/main.go index dff0da3b2..4b631fa74 100644 --- a/kittens/query_terminal/main.go +++ b/kittens/query_terminal/main.go @@ -26,11 +26,10 @@ func main(cmd *cli.Command, opts *Options, args []string) (rc int, err error) { queries[i] = x } } - lp, err := loop.New(loop.NoAlternateScreen, loop.NoKeyboardStateChange, loop.NoMouseTracking, loop.NoRestoreColors, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, err := loop.NewForSimpleInteraction() if err != nil { return 1, err } - lp.NoRoundtripToTerminalOnExit = true timed_out := false lp.OnInitialize = func() (string, error) { lp.QueryTerminal(queries...) diff --git a/tools/cmd/at/tty_io.go b/tools/cmd/at/tty_io.go index f874362d9..68e848279 100644 --- a/tools/cmd/at/tty_io.go +++ b/tools/cmd/at/tty_io.go @@ -27,19 +27,15 @@ 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) - // we cant do inbandresize notification as in the --no-response case the - // command can cause a resize and the loop can quit before the notification - // arrives, leading to the notification being sent to whatever is executed - // after us. Similarly no focus tracking. - lp, err := loop.New(loop.NoAlternateScreen, loop.NoRestoreColors, loop.NoInBandResizeNotifications, loop.NoFocusTracking) + lp, err := loop.NewForSimpleInteraction() if err != nil { return } if io_data.on_key_event != nil { lp.FullKeyboardProtocol() + lp.NoRoundtripToTerminalOnExit = false } else { lp.NoKeyboardStateChange() - lp.NoRoundtripToTerminalOnExit = true } const ( diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index a2003397b..514b28d80 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -141,6 +141,21 @@ func New(options ...func(self *Loop)) (*Loop, error) { return l, nil } +// Create a loop that does not change terminal state such as keyboard mode, +// resize/focus notifications, mouse tracking, alternate screen etc. Useful +// for special purpose kittens such as icat/clipboard/@ etc. +func NewForSimpleInteraction() (*Loop, error) { + lp, err := New( + NoAlternateScreen, NoRestoreColors, NoMouseTracking, NoInBandResizeNotifications, + NoFocusTracking, NoKeyboardStateChange, + ) + if err == nil { + lp.NoRoundtripToTerminalOnExit = true + lp.terminal_options.color_scheme_change_notification = false + } + return lp, err +} + func (self *Loop) AddTimer(interval time.Duration, repeats bool, callback TimerCallback) (IdType, error) { return self.add_timer(interval, repeats, callback) }