diff --git a/terminal/csi.go b/terminal/csi.go index b71a5cd..e333179 100644 --- a/terminal/csi.go +++ b/terminal/csi.go @@ -88,7 +88,7 @@ func csiSetMode(modeStr string, enabled bool, terminal *Terminal) error { } else { terminal.UseMainBuffer() } - case "?1000", "?10061000": // ?10061000 seen from xterm + case "?1000", "?10061000": // ?10061000 seen from htop // enable mouse tracking if enabled { terminal.SetMouseMode(MouseModeVT200) diff --git a/terminal/osc.go b/terminal/osc.go index 77b2547..81cb475 100644 --- a/terminal/osc.go +++ b/terminal/osc.go @@ -1,27 +1,46 @@ package terminal -import "fmt" +import ( + "fmt" + "strings" +) -func oscHandler(buffer chan rune, terminal *Terminal) error { - b := <-buffer - switch b { - case rune('0'): - b = <-buffer - if b == rune(';') { - title := []rune{} - for { - b = <-buffer - if b == 0x07 || b == 0x5c { // 0x07 -> BELL, 0x5c -> ST (\) - break - } - title = append(title, b) - } - terminal.SetTitle(string(title)) - } else { - return fmt.Errorf("Invalid OSC 0 control sequence: 0x%02X", b) +func oscHandler(pty chan rune, terminal *Terminal) error { + + params := []string{} + param := "" + + for { + b := <-pty + if b == 0x07 || b == 0x5c { + params = append(params, param) + break } + if b == ';' { + params = append(params, param) + param = "" + continue + } + param = fmt.Sprintf("%s%c", param, b) + } + + if len(params) == 0 { + return fmt.Errorf("OSC with no params") + } + + pT := params[len(params)-1] + pS := params[:len(params)-1] + + if len(pS) == 0 { + pS = []string{pT} + pT = "" + } + + switch pS[0] { + case "0", "2": + terminal.SetTitle(pT) default: - return fmt.Errorf("Unknown OSC control sequence: 0x%02X", b) + return fmt.Errorf("Unknown OSC control sequence: %s", strings.Join(params, ";")) } return nil }