Add true colour support

This commit is contained in:
Liam Galvin 2018-10-22 11:10:34 +01:00
parent 33b117c83a
commit 8ec2b4f18b
2 changed files with 121 additions and 115 deletions

View File

@ -55,6 +55,8 @@ Ensure you have your latest graphics card drivers installed before use.
|-----------------------------|------|-------| |-----------------------------|------|-------|
| Pty allocation | ✔ | Needs work for OSX + Windows | Pty allocation | ✔ | Needs work for OSX + Windows
| OpenGL rendering | ✔ | | OpenGL rendering | ✔ |
| 8-bit (256) colour | ✔ |
| 24-bit (true) colour | ✔ |
| Resizing/content reordering | ⏳ | | Resizing/content reordering | ⏳ |
| ANSI escape codes | ⏳ | Most of these are handled now | ANSI escape codes | ⏳ | Most of these are handled now
| UTF-8 input | ✔ | | UTF-8 input | ✔ |

View File

@ -5,6 +5,7 @@ import (
"strconv" "strconv"
"github.com/liamg/aminal/buffer" "github.com/liamg/aminal/buffer"
"github.com/liamg/aminal/config"
) )
func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal) error { func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal) error {
@ -13,9 +14,8 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal
return nil return nil
} }
param := params[0] for i := range params {
switch params[i] {
switch param {
case "00", "0", "": case "00", "0", "":
attr := terminal.ActiveBuffer().CursorAttr() attr := terminal.ActiveBuffer().CursorAttr()
*attr = buffer.CellAttributes{ *attr = buffer.CellAttributes{
@ -115,19 +115,22 @@ func sgrSequenceHandler(params []string, intermediate string, terminal *Terminal
case "107": case "107":
terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White terminal.ActiveBuffer().CursorAttr().BgColour = terminal.config.ColourScheme.White
case "38": // set foreground case "38": // set foreground
c, err := terminal.getANSIColour(params) c, err := terminal.getANSIColour(params[i:])
if err != nil { if err != nil {
return err return err
} }
terminal.ActiveBuffer().CursorAttr().FgColour = c terminal.ActiveBuffer().CursorAttr().FgColour = c
return nil
case "48": // set background case "48": // set background
c, err := terminal.getANSIColour(params) c, err := terminal.getANSIColour(params[i:])
if err != nil { if err != nil {
return err return err
} }
terminal.ActiveBuffer().CursorAttr().BgColour = c terminal.ActiveBuffer().CursorAttr().BgColour = c
return nil
default: default:
return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", param, intermediate) return fmt.Errorf("Unknown SGR control sequence: (ESC[%s%sm)", params[i:], intermediate)
}
} }
//terminal.logger.Debugf("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 return nil
} }
func (terminal *Terminal) getANSIColour(params []string) ([3]float32, error) { func (terminal *Terminal) getANSIColour(params []string) (config.Colour, error) {
if len(params) > 2 { if len(params) > 2 {
switch params[1] { switch params[1] {
@ -154,6 +157,7 @@ func (terminal *Terminal) getANSIColour(params []string) ([3]float32, error) {
} }
// 24 bit colour // 24 bit colour
if len(params) == 5 { // standard true colour if len(params) == 5 { // standard true colour
r, err := strconv.Atoi(params[2]) r, err := strconv.Atoi(params[2])
if err != nil { if err != nil {
return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier") return [3]float32{0, 0, 0}, fmt.Errorf("Invalid true colour specifier")