From abd708711bd6bc91499ea49589ebd9ec74d07518 Mon Sep 17 00:00:00 2001 From: Ayman Bagabas Date: Mon, 27 Jan 2025 11:47:15 -0500 Subject: [PATCH] fix(vt): define apc handler and fix warnings --- vt/dcs.go | 11 ++++++++++- vt/handlers.go | 45 ++++++++++++++++++++------------------------- vt/terminal.go | 2 +- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/vt/dcs.go b/vt/dcs.go index 7488d5b2..c291a235 100644 --- a/vt/dcs.go +++ b/vt/dcs.go @@ -4,5 +4,14 @@ import "github.com/charmbracelet/x/ansi" // handleDcs handles a DCS escape sequence. func (t *Terminal) handleDcs(cmd ansi.Cmd, params ansi.Params, data []byte) { - t.logf("unhandled sequence: DCS %q %q", paramsString(cmd, params), data) + if !t.handlers.handleDcs(cmd, params, data) { + t.logf("unhandled sequence: DCS %q %q", paramsString(cmd, params), data) + } +} + +// handleApc handles an APC escape sequence. +func (t *Terminal) handleApc(data []byte) { + if !t.handlers.handleApc(data) { + t.logf("unhandled sequence: APC %q", data) + } } diff --git a/vt/handlers.go b/vt/handlers.go index 71c5f555..7028b5a1 100644 --- a/vt/handlers.go +++ b/vt/handlers.go @@ -25,8 +25,8 @@ type handlers struct { dcsHandlers map[int][]DcsHandler csiHandlers map[int][]CsiHandler oscHandlers map[int][]OscHandler - apcHandlers map[int][]ApcHandler escHandler map[int][]EscHandler + apcHandlers []ApcHandler } // RegisterDcsHandler registers a DCS escape sequence handler. @@ -54,11 +54,8 @@ func (h *handlers) RegisterOscHandler(cmd int, handler OscHandler) { } // RegisterApcHandler registers an APC escape sequence handler. -func (h *handlers) RegisterApcHandler(cmd int, handler ApcHandler) { - if h.apcHandlers == nil { - h.apcHandlers = make(map[int][]ApcHandler) - } - h.apcHandlers[cmd] = append(h.apcHandlers[cmd], handler) +func (h *handlers) RegisterApcHandler(handler ApcHandler) { + h.apcHandlers = append(h.apcHandlers, handler) } // RegisterEscHandler registers an ESC escape sequence handler. @@ -116,14 +113,12 @@ func (h *handlers) handleOsc(cmd int, data []byte) bool { // handleApc handles an APC escape sequence. // It returns true if the sequence was handled. -func (h *handlers) handleApc(cmd int, data []byte) bool { +func (h *handlers) handleApc(data []byte) bool { // Reverse iterate over the handlers so that the last registered handler // is the first to be called. - if handlers, ok := h.apcHandlers[cmd]; ok { - for i := len(handlers) - 1; i >= 0; i-- { - if handlers[i](data) { - return true - } + for i := len(h.apcHandlers) - 1; i >= 0; i-- { + if h.apcHandlers[i](data) { + return true } } return false @@ -451,14 +446,14 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('S', func(params ansi.Params) bool { // Scroll Up [ansi.SU] - n, _ := t.parser.Param(0, 1) + n, _, _ := params.Param(0, 1) t.scr.ScrollUp(n) return true }) t.RegisterCsiHandler('T', func(params ansi.Params) bool { // Scroll Down [ansi.SD] - n, _ := t.parser.Param(0, 1) + n, _, _ := params.Param(0, 1) t.scr.ScrollDown(n) return true }) @@ -474,7 +469,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('X', func(params ansi.Params) bool { // Erase Character [ansi.ECH] - n, _ := t.parser.Param(0, 1) + n, _, _ := params.Param(0, 1) t.eraseCharacter(n) return true }) @@ -513,7 +508,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('c', func(params ansi.Params) bool { // Primary Device Attributes [ansi.DA1] - n, _ := t.parser.Param(0, 0) + n, _, _ := params.Param(0, 0) if n != 0 { return false } @@ -530,7 +525,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler(ansi.Command('>', 0, 'c'), func(params ansi.Params) bool { // Secondary Device Attributes [ansi.DA2] - n, _ := t.parser.Param(0, 0) + n, _, _ := params.Param(0, 0) if n != 0 { return false } @@ -575,7 +570,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('g', func(params ansi.Params) bool { // Tab Clear [ansi.TBC] - value, _ := t.parser.Param(0, 0) + value, _, _ := params.Param(0, 0) switch value { case 0: x, _ := t.scr.CursorPosition() @@ -621,7 +616,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('n', func(params ansi.Params) bool { // Device Status Report [ansi.DSR] - n, ok := t.parser.Param(0, 1) + n, _, ok := params.Param(0, 1) if !ok || n == 0 { return false } @@ -630,7 +625,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { case 5: // Operating Status // We're always ready ;) // See: https://vt100.net/docs/vt510-rm/DSR-OS.html - t.buf.WriteString(ansi.DeviceStatusReport(ansi.DECStatus(0))) + t.buf.WriteString(ansi.DeviceStatusReport(ansi.DECStatusReport(0))) case 6: // Cursor Position Report [ansi.CPR] x, y := t.scr.CursorPosition() t.buf.WriteString(ansi.CursorPositionReport(x+1, y+1)) @@ -642,7 +637,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { }) t.RegisterCsiHandler(ansi.Command('?', 0, 'n'), func(params ansi.Params) bool { - n, ok := t.parser.Param(0, 1) + n, _, ok := params.Param(0, 1) if !ok || n == 0 { return false } @@ -673,7 +668,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler(ansi.Command(0, ' ', 'q'), func(params ansi.Params) bool { // Set Cursor Style [ansi.DECSCUSR] style := 1 - if param, ok := t.parser.Param(0, 0); ok && param > style { + if param, _, ok := params.Param(0, 0); ok && param > style { style = param } t.scr.setCursorStyle(CursorStyle((style/2)+1), style%2 == 1) @@ -682,7 +677,7 @@ func (t *Terminal) registerDefaultCsiHandlers() { t.RegisterCsiHandler('r', func(params ansi.Params) bool { // Set Top and Bottom Margins [ansi.DECSTBM] - top, _ := t.parser.Param(0, 1) + top, _, _ := params.Param(0, 1) if top < 1 { top = 1 } @@ -715,13 +710,13 @@ func (t *Terminal) registerDefaultCsiHandlers() { if t.isModeSet(ansi.LeftRightMarginMode) { // Set Left Right Margins [ansi.DECSLRM] - left, _ := t.parser.Param(0, 1) + left, _, _ := params.Param(0, 1) if left < 1 { left = 1 } width := t.Width() - right, _ := t.parser.Param(1, width) + right, _, _ := params.Param(1, width) if right < 1 { right = width } diff --git a/vt/terminal.go b/vt/terminal.go index 050d3e2f..2e9db53b 100644 --- a/vt/terminal.go +++ b/vt/terminal.go @@ -90,7 +90,7 @@ func NewTerminal(w, h int, opts ...Option) *Terminal { HandleEsc: t.handleEsc, HandleDcs: t.handleDcs, HandleOsc: t.handleOsc, - // Apc: t.handleApc, + HandleApc: t.handleApc, // Pm: t.handlePm, // Sos: t.handleSos, })