diff --git a/docs/changelog.rst b/docs/changelog.rst index 8c2845e03..1e1939572 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -93,6 +93,8 @@ Detailed list of changes - ssh kitten: Fix kitten not being on PATH when SSHing into Debian systems (:iss:`7160`) +- diff kitten: Abort when run inside a terminal that does not support the kitty keyboard protocol (:iss:`8185`) + 0.38.1 [2024-12-26] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/kittens/diff/main.go b/kittens/diff/main.go index e36c42c33..164a5caff 100644 --- a/kittens/diff/main.go +++ b/kittens/diff/main.go @@ -146,9 +146,16 @@ func main(_ *cli.Command, opts_ *Options, args []string) (rc int, err error) { lp.SetCursorShape(loop.BAR_CURSOR, true) lp.AllowLineWrapping(false) lp.SetWindowTitle(fmt.Sprintf("%s vs. %s", left, right)) + lp.QueryCapabilities() h.initialize() return "", nil } + lp.OnCapabilitiesReceived = func(tc loop.TerminalCapabilities) error { + if !tc.KeyboardProtocol { + return fmt.Errorf("This terminal does not support the kitty keyboard protocol, or you are running inside a terminal multiplexer that is blocking querying for kitty keyboard protocol support. The diff kitten cannot function without it.") + } + return nil + } lp.OnWakeup = h.on_wakeup lp.OnFinalize = func() string { lp.SetCursorVisible(true) diff --git a/tools/tui/loop/api.go b/tools/tui/loop/api.go index fbd6a8cee..577dec3e0 100644 --- a/tools/tui/loop/api.go +++ b/tools/tui/loop/api.go @@ -117,7 +117,7 @@ type Loop struct { OnSIGTERM func() (bool, error) // Called when capabilities response is received - OnCapabilitiesReceived func(TerminalCapabilities) + OnCapabilitiesReceived func(TerminalCapabilities) error } func New(options ...func(self *Loop)) (*Loop, error) { diff --git a/tools/tui/loop/run.go b/tools/tui/loop/run.go index 601979b32..ec1acdf3d 100644 --- a/tools/tui/loop/run.go +++ b/tools/tui/loop/run.go @@ -128,7 +128,9 @@ func (self *Loop) handle_csi(raw []byte) (err error) { if strings.HasPrefix(csi, "?") && strings.HasSuffix(csi, "c") { self.waiting_for_capabilities_response = false if self.OnCapabilitiesReceived != nil { - self.OnCapabilitiesReceived(self.TerminalCapabilities) + if err = self.OnCapabilitiesReceived(self.TerminalCapabilities); err != nil { + return err + } } } else if strings.HasPrefix(csi, "?997;") && strings.HasSuffix(csi, "n") { switch csi[len(csi)-2] {