// Copyright 2017-2025 WIT.COM Inc. All rights reserved. // Use of this source code is governed by the GPL 3.0 package main import ( "math/rand" "github.com/awesome-gocui/gocui" "go.wit.com/log" ) // simple colors for light and dark // information about how terminfo works // https://jvns.ca/blog/2024/10/01/terminal-colours/ // TODO: move all this to a protobuf // TODO: add black/white only flag for ttyS0 // TODO: fix kvm/qemu serial console & SIGWINCH. // TODO: check minicom (doesn't work) // TODO: fix riscv boards // DONE ON ENABLE() WIDGET // restores the last saved color and makes it active func (tk *guiWidget) restoreEnableColor() { if tk.color == nil { tk.color = new(colorT) } tk.color.frame = tk.colorLast.frame tk.color.fg = tk.colorLast.fg tk.color.bg = tk.colorLast.bg tk.color.selFg = tk.colorLast.selFg tk.color.selBg = tk.colorLast.selBg tk.activateColor() } // DONE ON DISABLE() WIDGET // makes the button look disabled func (tk *guiWidget) setColorDisable() { if tk.color == nil { tk.color = new(colorT) } // save the current color tk.color.frame = superLightGrey tk.color.fg = gocui.ColorBlack tk.color.bg = superLightGrey tk.color.selFg = superLightGrey tk.color.selBg = superLightGrey tk.activateColor() } // sets the current gocui highlight colors func (tk *guiWidget) activateColor() { if tk.v == nil { return } tk.v.FrameColor = tk.color.frame tk.v.FgColor = tk.color.fg tk.v.BgColor = tk.color.bg tk.v.SelFgColor = tk.color.selFg tk.v.SelBgColor = tk.color.selBg } // saves the color and makes it active func (tk *guiWidget) updateColor() { if tk.v == nil { return } if tk.color != nil { tk.colorLast.frame = tk.color.frame tk.colorLast.fg = tk.color.fg tk.colorLast.bg = tk.color.bg tk.colorLast.selFg = tk.color.selFg tk.colorLast.selBg = tk.color.selBg } tk.activateColor() } // Below are all the colors. TODO: move to protobuf and save in a config file func (tk *guiWidget) setColorWindowFrame() { if tk.color == nil { tk.color = new(colorT) } if me.dark { // use a dark color palette tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlack tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.AttrNone } else { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.AttrNone } tk.updateColor() } // weird. lots of color problems for me on debian sid using the traditional Andy Herzfield 'gnome' func (tk *guiWidget) setColorWindowTitleActive() { if tk.color == nil { tk.color = new(colorT) } if me.dark { // use a dark color palette tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlue tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } else { tk.color.frame = gocui.ColorWhite tk.color.fg = gocui.ColorWhite tk.color.bg = gocui.ColorBlue tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } tk.updateColor() } func (tk *guiWidget) setColorWindowTitle() { if tk.color == nil { tk.color = new(colorT) } if me.dark { // use a dark color palette tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlue tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } else { tk.color.frame = gocui.ColorWhite tk.color.fg = gocui.ColorBlue tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } tk.updateColor() } func (tk *guiWidget) setColorBG() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlack tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.AttrNone } else { tk.color.frame = gocui.ColorWhite tk.color.fg = gocui.ColorWhite tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.AttrNone } tk.updateColor() } func (tk *guiWidget) setColorLabel() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorWhite tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.AttrNone } else { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlack tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.ColorWhite } tk.updateColor() } func (tk *guiWidget) setColorButtonDense() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorBlue tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } else { tk.color.frame = gocui.AttrNone tk.color.fg = gocui.ColorWhite tk.color.bg = gocui.ColorBlue tk.color.selFg = gocui.ColorBlue tk.color.selBg = gocui.AttrNone } tk.updateColor() } func (tk *guiWidget) setColorButton() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.ColorBlack tk.color.fg = gocui.ColorBlue tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } else { tk.color.frame = gocui.ColorBlue tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorWhite tk.color.selBg = gocui.ColorBlue } tk.updateColor() } func (tk *guiWidget) setColorInput() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.ColorYellow tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorYellow tk.color.selBg = gocui.ColorBlack } else { tk.color.frame = gocui.ColorYellow tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.ColorYellow tk.color.selBg = gocui.ColorBlack } tk.updateColor() } func (tk *guiWidget) setColorModal() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.ColorRed tk.color.fg = gocui.ColorRed tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.ColorBlack tk.color.selBg = gocui.AttrNone } else { tk.color.frame = gocui.ColorRed tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.ColorWhite } tk.updateColor() } // what genius figured this out? func (tk *guiWidget) setColorTextbox() { if tk.color == nil { tk.color = new(colorT) } if me.dark { tk.color.frame = gocui.ColorRed tk.color.fg = gocui.ColorRed tk.color.bg = gocui.ColorBlack tk.color.selFg = gocui.ColorBlack tk.color.selBg = gocui.AttrNone } else { tk.color.frame = gocui.ColorRed tk.color.fg = gocui.AttrNone tk.color.bg = gocui.AttrNone tk.color.selFg = gocui.AttrNone tk.color.selBg = gocui.ColorWhite } tk.updateColor() } // just notes down here // what genius figured this out? // originally from github.com/dimasma0305/GoFetch func get_teminal_color_palette() string { // var runes rune // color1 := "\x1b[0;29m  \x1b[0m" // runes = []rune(color1) // view.WriteRunes(runes) color1 := "\x1b[0;29m  \x1b[0m" color2 := "\x1b[0;31m  \x1b[0m" color3 := "\x1b[0;32m  \x1b[0m" color4 := "\x1b[0;33m  \x1b[0m" color5 := "\x1b[0;34m  \x1b[0m" color6 := "\x1b[0;35m  \x1b[0m" color7 := "\x1b[0;36m  \x1b[0m" color8 := "\x1b[0;37m  \x1b[0m" return color1 + " " + color2 + " " + color3 + " " + color4 + " " + color5 + " " + color6 + " " + color7 + " " + color8 } func randColor() gocui.Attribute { colors := []string{"Green", "#FFAA55", "Yellow", "Blue", "Red", "Black", "White"} i := rand.Intn(len(colors)) log.Log(NOW, "randColor() i =", i) return gocui.GetColor(colors[i]) } var none gocui.Attribute = gocui.AttrNone var colorNone colorT = colorT{none, none, none, none, none, "debug none"} var lightPurple gocui.Attribute = gocui.GetColor("#DDDDDD") // light purple var darkPurple gocui.Attribute = gocui.GetColor("#FFAA55") // Dark Purple var heavyPurple gocui.Attribute = gocui.GetColor("#88AA55") // heavy purple var powdererBlue gocui.Attribute = gocui.GetColor("#B0E0E6") // w3c 'powerder blue' var superLightGrey gocui.Attribute = gocui.GetColor("#55AAFF") // super light grey // Standard defined colors from gocui: // ColorBlack ColorRed ColorGreen ColorYellow ColorBlue ColorMagenta ColorCyan ColorWhite // v.BgColor = gocui.GetColor("#111111") // crazy red // v.BgColor = gocui.GetColor("#FF9911") // heavy red // v.SelBgColor = gocui.GetColor("#FFEE11") // blood red // v.BgColor = gocui.GetColor("#55AAFF") // super light grey // v.BgColor = gocui.GetColor("#FFC0CB") // 'w3c pink' yellow