From 561358a6acd9bcd57b9b8b76d60060b24a5de522 Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Mon, 22 Oct 2018 10:36:55 +0100 Subject: [PATCH 1/4] Add 256 colour support --- demo/256.sh | 12 ++ terminal/csi.go | 3 +- terminal/sgr.go | 297 +++++++++++++++++++++++++++++++----------------- 3 files changed, 204 insertions(+), 108 deletions(-) create mode 100755 demo/256.sh diff --git a/demo/256.sh b/demo/256.sh new file mode 100755 index 0000000..43e485e --- /dev/null +++ b/demo/256.sh @@ -0,0 +1,12 @@ + +#!/bin/bash + +for i in {0..255} ; do + printf "\x1b[48;5;%sm%3d\e[0m " "$i" "$i" + if (( i == 15 )) || (( i > 15 )) && (( (i-15) % 6 == 0 )); then + printf "\n"; + fi + done + + + diff --git a/terminal/csi.go b/terminal/csi.go index 2ea40b2..96fa116 100644 --- a/terminal/csi.go +++ b/terminal/csi.go @@ -52,8 +52,7 @@ func csiInsertLinesHandler(params []string, intermediate string, terminal *Termi } } terminal.logger.Debugf("Inserting %d lines", count) - panic("Not supported") - return nil + return fmt.Errorf("Not supported") } func csiScrollDownHandler(params []string, intermediate string, terminal *Terminal) error { diff --git a/terminal/sgr.go b/terminal/sgr.go index e438062..c6c8c90 100644 --- a/terminal/sgr.go +++ b/terminal/sgr.go @@ -2,118 +2,203 @@ package terminal import ( "fmt" + "strconv" "github.com/liamg/aminal/buffer" ) func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal) error { - for i := range params { - param := params[i] - switch param { - case "00", "0", "": - attr := terminal.ActiveBuffer().CursorAttr() - *attr = buffer.CellAttributes{ - FgColour: terminal.config.ColourScheme.Foreground, - BgColour: terminal.config.ColourScheme.Background, - } - case "1", "01": - terminal.ActiveBuffer().CursorAttr().Bold = true - case "2", "02": - terminal.ActiveBuffer().CursorAttr().Dim = true - case "4", "04": - terminal.ActiveBuffer().CursorAttr().Underline = true - case "5", "05": - terminal.ActiveBuffer().CursorAttr().Blink = true - case "7", "07": - terminal.ActiveBuffer().CursorAttr().Reverse = true - case "8", "08": - terminal.ActiveBuffer().CursorAttr().Hidden = true - case "21": - terminal.ActiveBuffer().CursorAttr().Bold = false - case "22": - terminal.ActiveBuffer().CursorAttr().Dim = false - case "24": - terminal.ActiveBuffer().CursorAttr().Underline = false - case "25": - terminal.ActiveBuffer().CursorAttr().Blink = false - case "27": - terminal.ActiveBuffer().CursorAttr().Reverse = false - case "28": - terminal.ActiveBuffer().CursorAttr().Hidden = false - case "39": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Foreground - case "30": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Black - case "31": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Red - case "32": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Green - case "33": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Yellow - case "34": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Blue - case "35": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Magenta - case "36": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Cyan - case "37": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White - case "90": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.DarkGrey - case "91": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightRed - case "92": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightGreen - case "93": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightYellow - case "94": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightBlue - case "95": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightMagenta - case "96": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightCyan - case "97": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White - case "49": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Background - case "40": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Black - case "41": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Red - case "42": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Green - case "43": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Yellow - case "44": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Blue - case "45": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Magenta - case "46": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Cyan - case "47": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White - case "100": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.DarkGrey - case "101": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightRed - case "102": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightGreen - case "103": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightYellow - case "104": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightBlue - case "105": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightMagenta - case "106": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightCyan - case "107": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White - default: - return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", param, intermediate) - } - - //terminal.logger.Debugf("SGR control sequence: (ESC[%s%sm)", param, intermediate) + if len(params) == 0 { + return nil } + + param := params[0] + + switch param { + case "00", "0", "": + attr := terminal.ActiveBuffer().CursorAttr() + *attr = buffer.CellAttributes{ + FgColour: terminal.config.ColourScheme.Foreground, + BgColour: terminal.config.ColourScheme.Background, + } + case "1", "01": + terminal.ActiveBuffer().CursorAttr().Bold = true + case "2", "02": + terminal.ActiveBuffer().CursorAttr().Dim = true + case "4", "04": + terminal.ActiveBuffer().CursorAttr().Underline = true + case "5", "05": + terminal.ActiveBuffer().CursorAttr().Blink = true + case "7", "07": + terminal.ActiveBuffer().CursorAttr().Reverse = true + case "8", "08": + terminal.ActiveBuffer().CursorAttr().Hidden = true + case "21": + terminal.ActiveBuffer().CursorAttr().Bold = false + case "22": + terminal.ActiveBuffer().CursorAttr().Dim = false + case "24": + terminal.ActiveBuffer().CursorAttr().Underline = false + case "25": + terminal.ActiveBuffer().CursorAttr().Blink = false + case "27": + terminal.ActiveBuffer().CursorAttr().Reverse = false + case "28": + terminal.ActiveBuffer().CursorAttr().Hidden = false + case "39": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Foreground + case "30": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Black + case "31": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Red + case "32": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Green + case "33": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Yellow + case "34": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Blue + case "35": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Magenta + case "36": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Cyan + case "37": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White + case "90": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.DarkGrey + case "91": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightRed + case "92": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightGreen + case "93": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightYellow + case "94": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightBlue + case "95": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightMagenta + case "96": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightCyan + case "97": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White + case "49": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Background + case "40": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Black + case "41": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Red + case "42": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Green + case "43": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Yellow + case "44": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Blue + case "45": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Magenta + case "46": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Cyan + case "47": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White + case "100": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.DarkGrey + case "101": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightRed + case "102": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightGreen + case "103": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightYellow + case "104": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightBlue + case "105": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightMagenta + case "106": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightCyan + case "107": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White + case "38": // set foreground + if len(params) > 2 { + switch params[1] { + case "5": + // 8 bit colour + colNum, err := strconv.Atoi(params[2]) + if err == nil && colNum < 256 && colNum >= 0 { + terminal.ActiveBuffer().CursorAttr().FgColour = get8BitSGRColour(uint8(colNum), terminal) + } + case "2": + // 24 bit colour + } + } + case "48": // set background + if len(params) > 2 { + switch params[1] { + case "5": + // 8 bit colour + colNum, err := strconv.Atoi(params[2]) + if err == nil && colNum < 256 && colNum >= 0 { + terminal.ActiveBuffer().CursorAttr().BgColour = get8BitSGRColour(uint8(colNum), terminal) + } + case "2": + // 24 bit colour + } + } + default: + return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", param, intermediate) + } + + //terminal.logger.Debugf("SGR control sequence: (ESC[%s%sm)", param, intermediate) + return nil } + +func get8BitSGRColour(colNum uint8, terminal *Terminal) [3]float32 { + + // https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit + + switch colNum { + case 0: + return terminal.config.ColourScheme.Black + case 1: + return terminal.config.ColourScheme.Red + case 2: + return terminal.config.ColourScheme.Green + case 3: + return terminal.config.ColourScheme.Yellow + case 4: + return terminal.config.ColourScheme.Blue + case 5: + return terminal.config.ColourScheme.Magenta + case 6: + return terminal.config.ColourScheme.Cyan + case 7: + return terminal.config.ColourScheme.White + case 8: + return terminal.config.ColourScheme.DarkGrey + case 9: + return terminal.config.ColourScheme.LightRed + case 10: + return terminal.config.ColourScheme.LightGreen + case 11: + return terminal.config.ColourScheme.LightYellow + case 12: + return terminal.config.ColourScheme.LightBlue + case 13: + return terminal.config.ColourScheme.LightMagenta + case 14: + return terminal.config.ColourScheme.LightCyan + case 15: + return terminal.config.ColourScheme.White + } + + if colNum < 232 { + + index := int(colNum - 16) // 0-216 + rgb := (index * 0xffffff) / 216 + r := float32((rgb&0xff0000)>>16) / 0xff + g := float32((rgb&0xff00)>>8) / 0xff + b := float32(rgb&0xff) / 0xff + + return [3]float32{r, g, b} + } + + c := float32(colNum-232) / 0x18 + return [3]float32{c, c, c} +} From 33b117c83ad3496f238cb2b70c84bc0a965b9a79 Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Mon, 22 Oct 2018 10:52:08 +0100 Subject: [PATCH 2/4] Add true colour support --- terminal/sgr.go | 94 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 71 insertions(+), 23 deletions(-) diff --git a/terminal/sgr.go b/terminal/sgr.go index c6c8c90..c9d3520 100644 --- a/terminal/sgr.go +++ b/terminal/sgr.go @@ -115,31 +115,17 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal case "107": terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White case "38": // set foreground - if len(params) > 2 { - switch params[1] { - case "5": - // 8 bit colour - colNum, err := strconv.Atoi(params[2]) - if err == nil && colNum < 256 && colNum >= 0 { - terminal.ActiveBuffer().CursorAttr().FgColour = get8BitSGRColour(uint8(colNum), terminal) - } - case "2": - // 24 bit colour - } + c, err := terminal.getANSIColour(params) + if err != nil { + return err } + terminal.ActiveBuffer().CursorAttr().FgColour = c case "48": // set background - if len(params) > 2 { - switch params[1] { - case "5": - // 8 bit colour - colNum, err := strconv.Atoi(params[2]) - if err == nil && colNum < 256 && colNum >= 0 { - terminal.ActiveBuffer().CursorAttr().BgColour = get8BitSGRColour(uint8(colNum), terminal) - } - case "2": - // 24 bit colour - } + c, err := terminal.getANSIColour(params) + if err != nil { + return err } + terminal.ActiveBuffer().CursorAttr().BgColour = c default: return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", param, intermediate) } @@ -149,7 +135,69 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal return nil } -func get8BitSGRColour(colNum uint8, terminal *Terminal) [3]float32 { +func (terminal *Terminal) getANSIColour(params []string) ([3]float32, error) { + + if len(params) > 2 { + switch params[1] { + case "5": + // 8 bit colour + colNum, err := strconv.Atoi(params[2]) + + if err != nil || colNum >= 256 || colNum < 0 { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid 8-bit colour specifier") + } + return terminal.get8BitSGRColour(uint8(colNum)), nil + + case "2": + if len(params) < 4 { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + // 24 bit colour + if len(params) == 5 { // standard true colour + r, err := strconv.Atoi(params[2]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + g, err := strconv.Atoi(params[3]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + b, err := strconv.Atoi(params[4]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + return [3]float32{ + float32(r) / 0xff, + float32(g) / 0xff, + float32(b) / 0xff, + }, nil + } else if len(params) > 5 { // ISO/IEC International Standard 8613-6 + r, err := strconv.Atoi(params[3]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + g, err := strconv.Atoi(params[4]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + b, err := strconv.Atoi(params[5]) + if err != nil { + return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") + } + return [3]float32{ + float32(r) / 0xff, + float32(g) / 0xff, + float32(b) / 0xff, + }, nil + } + } + } + + return [3]float32{}, fmt.Errorf("Unknown ANSI colour format identifier") + +} + +func (terminal *Terminal) get8BitSGRColour(colNum uint8) [3]float32 { // https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit From 8ec2b4f18b86d1df792f1611a3a21b38c6c8742c Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Mon, 22 Oct 2018 11:10:34 +0100 Subject: [PATCH 3/4] Add true colour support --- README.md | 2 + terminal/sgr.go | 234 ++++++++++++++++++++++++------------------------ 2 files changed, 121 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index cd9a7cb..9ff9349 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,8 @@ Ensure you have your latest graphics card drivers installed before use. |-----------------------------|------|-------| | Pty allocation | ✔ | Needs work for OSX + Windows | OpenGL rendering | ✔ | +| 8-bit (256) colour | ✔ | +| 24-bit (true) colour | ✔ | | Resizing/content reordering | ⏳ | | ANSI escape codes | ⏳ | Most of these are handled now | UTF-8 input | ✔ | diff --git a/terminal/sgr.go b/terminal/sgr.go index c9d3520..7e08c66 100644 --- a/terminal/sgr.go +++ b/terminal/sgr.go @@ -5,6 +5,7 @@ import ( "strconv" "github.com/liamg/aminal/buffer" + "github.com/liamg/aminal/config" ) func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal) error { @@ -13,121 +14,123 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal return nil } - param := params[0] - - switch param { - case "00", "0", "": - attr := terminal.ActiveBuffer().CursorAttr() - *attr = buffer.CellAttributes{ - FgColour: terminal.config.ColourScheme.Foreground, - BgColour: terminal.config.ColourScheme.Background, + for i := range params { + switch params[i] { + case "00", "0", "": + attr := terminal.ActiveBuffer().CursorAttr() + *attr = buffer.CellAttributes{ + FgColour: terminal.config.ColourScheme.Foreground, + BgColour: terminal.config.ColourScheme.Background, + } + case "1", "01": + terminal.ActiveBuffer().CursorAttr().Bold = true + case "2", "02": + terminal.ActiveBuffer().CursorAttr().Dim = true + case "4", "04": + terminal.ActiveBuffer().CursorAttr().Underline = true + case "5", "05": + terminal.ActiveBuffer().CursorAttr().Blink = true + case "7", "07": + terminal.ActiveBuffer().CursorAttr().Reverse = true + case "8", "08": + terminal.ActiveBuffer().CursorAttr().Hidden = true + case "21": + terminal.ActiveBuffer().CursorAttr().Bold = false + case "22": + terminal.ActiveBuffer().CursorAttr().Dim = false + case "24": + terminal.ActiveBuffer().CursorAttr().Underline = false + case "25": + terminal.ActiveBuffer().CursorAttr().Blink = false + case "27": + terminal.ActiveBuffer().CursorAttr().Reverse = false + case "28": + terminal.ActiveBuffer().CursorAttr().Hidden = false + case "39": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Foreground + case "30": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Black + case "31": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Red + case "32": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Green + case "33": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Yellow + case "34": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Blue + case "35": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Magenta + case "36": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Cyan + case "37": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White + case "90": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.DarkGrey + case "91": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightRed + case "92": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightGreen + case "93": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightYellow + case "94": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightBlue + case "95": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightMagenta + case "96": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightCyan + case "97": + terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White + case "49": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Background + case "40": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Black + case "41": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Red + case "42": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Green + case "43": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Yellow + case "44": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Blue + case "45": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Magenta + case "46": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Cyan + case "47": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White + case "100": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.DarkGrey + case "101": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightRed + case "102": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightGreen + case "103": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightYellow + case "104": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightBlue + case "105": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightMagenta + case "106": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightCyan + case "107": + terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White + case "38": // set foreground + c, err := terminal.getANSIColour(params[i:]) + if err != nil { + return err + } + terminal.ActiveBuffer().CursorAttr().FgColour = c + return nil + case "48": // set background + c, err := terminal.getANSIColour(params[i:]) + if err != nil { + return err + } + terminal.ActiveBuffer().CursorAttr().BgColour = c + return nil + default: + return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", params[i:], intermediate) } - case "1", "01": - terminal.ActiveBuffer().CursorAttr().Bold = true - case "2", "02": - terminal.ActiveBuffer().CursorAttr().Dim = true - case "4", "04": - terminal.ActiveBuffer().CursorAttr().Underline = true - case "5", "05": - terminal.ActiveBuffer().CursorAttr().Blink = true - case "7", "07": - terminal.ActiveBuffer().CursorAttr().Reverse = true - case "8", "08": - terminal.ActiveBuffer().CursorAttr().Hidden = true - case "21": - terminal.ActiveBuffer().CursorAttr().Bold = false - case "22": - terminal.ActiveBuffer().CursorAttr().Dim = false - case "24": - terminal.ActiveBuffer().CursorAttr().Underline = false - case "25": - terminal.ActiveBuffer().CursorAttr().Blink = false - case "27": - terminal.ActiveBuffer().CursorAttr().Reverse = false - case "28": - terminal.ActiveBuffer().CursorAttr().Hidden = false - case "39": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Foreground - case "30": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Black - case "31": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Red - case "32": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Green - case "33": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Yellow - case "34": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Blue - case "35": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Magenta - case "36": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.Cyan - case "37": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White - case "90": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.DarkGrey - case "91": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightRed - case "92": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightGreen - case "93": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightYellow - case "94": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightBlue - case "95": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightMagenta - case "96": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.LightCyan - case "97": - terminal.ActiveBuffer().CursorAttr().FgColour = terminal.config.ColourScheme.White - case "49": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Background - case "40": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Black - case "41": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Red - case "42": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Green - case "43": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Yellow - case "44": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Blue - case "45": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Magenta - case "46": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.Cyan - case "47": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White - case "100": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.DarkGrey - case "101": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightRed - case "102": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightGreen - case "103": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightYellow - case "104": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightBlue - case "105": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightMagenta - case "106": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.LightCyan - case "107": - terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White - case "38": // set foreground - c, err := terminal.getANSIColour(params) - if err != nil { - return err - } - terminal.ActiveBuffer().CursorAttr().FgColour = c - case "48": // set background - c, err := terminal.getANSIColour(params) - if err != nil { - return err - } - terminal.ActiveBuffer().CursorAttr().BgColour = c - default: - return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", param, intermediate) } //terminal.logger.Debugf("SGR control sequence: (ESC[%s%sm)", param, intermediate) @@ -135,7 +138,7 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal return nil } -func (terminal *Terminal) getANSIColour(params []string) ([3]float32, error) { +func (terminal *Terminal) getANSIColour(params []string) (config.Colour, error) { if len(params) > 2 { switch params[1] { @@ -154,6 +157,7 @@ func (terminal *Terminal) getANSIColour(params []string) ([3]float32, error) { } // 24 bit colour if len(params) == 5 { // standard true colour + r, err := strconv.Atoi(params[2]) if err != nil { return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") From b886b89f44d9dc541a0f5c0569ff546ecdf483a7 Mon Sep 17 00:00:00 2001 From: Liam Galvin Date: Mon, 22 Oct 2018 11:10:43 +0100 Subject: [PATCH 4/4] Add true colour test script --- demo/true.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100755 demo/true.sh diff --git a/demo/true.sh b/demo/true.sh new file mode 100755 index 0000000..92d9e45 --- /dev/null +++ b/demo/true.sh @@ -0,0 +1,19 @@ + +#!/bin/bash + +awk -v term_cols="${width:-$(tput cols || echo 80)}" 'BEGIN{ + + + s=" "; + for (colnum = 0; colnum255) g = 510-g; + printf "\033[48;2;%d;%d;%dm", r,g,b; + printf "\033[38;2;%d;%d;%dm", 255-r,255-g,255-b; + printf "%s\033[0m", substr(s,colnum%2+1,1); + } + printf "\n"; + + }'