From 52aedb077c7e71dcafefa33c86aac4bc9600a8c1 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 6 Mar 2019 18:53:51 +0300 Subject: [PATCH] #147 Hyperlinks, corrected set/unset --- terminal/osc.go | 36 +++++++++++++++++++++++------------- terminal/sixel.go | 10 ++++++++-- terminal/terminal.go | 3 ++- 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/terminal/osc.go b/terminal/osc.go index 7c41920..8322156 100644 --- a/terminal/osc.go +++ b/terminal/osc.go @@ -12,18 +12,28 @@ func oscHandler(pty chan rune, terminal *Terminal) error { params := []string{} param := "" - for { - b := <-pty - if terminal.IsOSCTerminator(b) { - params = append(params, param) - break + { + isEscaped := false // flag if the previous character was escape + + for { + b := <-pty + if terminal.IsOSCTerminator(b, isEscaped) { + params = append(params, param) + break + } + if isEscaped { + isEscaped = false + } else if b == 0x1b { + isEscaped = true + continue + } + if b == ';' { + params = append(params, param) + param = "" + continue + } + param = fmt.Sprintf("%s%c", param, b) } - if b == ';' { - params = append(params, param) - param = "" - continue - } - param = fmt.Sprintf("%s%c", param, b) } if len(params) == 0 { @@ -42,8 +52,8 @@ func oscHandler(pty chan rune, terminal *Terminal) error { case "0", "2": terminal.SetTitle(pT) case "8": // hyperlink - if len(pS) > 2 { - terminal.terminalState.CurrentHyperlink = &buffer.Hyperlink{Uri: pS[2]} + if len(params) > 2 && len(params[2]) > 0 { + terminal.terminalState.CurrentHyperlink = &buffer.Hyperlink{Uri: params[2]} } else { terminal.terminalState.CurrentHyperlink = nil } diff --git a/terminal/sixel.go b/terminal/sixel.go index 4c452bc..5eecc47 100644 --- a/terminal/sixel.go +++ b/terminal/sixel.go @@ -11,14 +11,20 @@ import ( "github.com/liamg/aminal/sixel" ) -type boolFormRuneFunc func(rune) bool +type boolFormRuneFunc func(rune, bool) bool func swallowByFunction(pty chan rune, isTerminator boolFormRuneFunc) { + isEscaped := false for { b := <-pty - if isTerminator(b) { + if isTerminator(b, isEscaped) { break } + if isEscaped { + isEscaped = false + } else if b == 0x1b { + isEscaped = true + } } } diff --git a/terminal/terminal.go b/terminal/terminal.go index 1e117f0..20eca8d 100644 --- a/terminal/terminal.go +++ b/terminal/terminal.go @@ -134,7 +134,8 @@ func (terminal *Terminal) GetMouseExtMode() MouseExtMode { return terminal.mouseExtMode } -func (terminal *Terminal) IsOSCTerminator(char rune) bool { +func (terminal *Terminal) IsOSCTerminator(char rune, isEscaped bool) bool { + // @todo handle isEscaped flag _, ok := terminal.platformDependentSettings.OSCTerminators[char] return ok }