Text and element colors of default theme change to be black on white terminals

Ref #181
This commit is contained in:
makeworld 2021-12-03 17:58:16 -05:00
parent 2e1049b8ab
commit 6666ef2584
7 changed files with 80 additions and 18 deletions

View File

@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Specifying `default` in the theme config uses the terminal's default background color, including transparency (#244, #245)
- Redirects occur automatically if it only adds a trailing slash (#271)
- Non-gemini links are underlined by default to help color blind users (#189)
- Text and element colors of default theme change to be black on white terminals (#181)
### Changed
- Bookmarks are stored using XML in the XBEL format, old bookmarks are transferred (#68)
@ -24,7 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- The user's terminal theme colors are used by default (#181)
## Removed
- Favicon support removed (#199)
- Favicon support (#199)
- The default Amfora theme, get it back [here](https://github.com/makeworld-the-better-one/amfora/blob/master/contrib/themes/amfora.toml)
### Fixed

View File

@ -6,7 +6,6 @@
## Upstream Bugs
- Bookmark keys aren't deleted, just set to `""`
- Waiting on [this viper PR](https://github.com/spf13/viper/pull/519) to be merged
- [cview.Styles not being used](https://code.rocketnine.space/tslocum/cview/issues/47) - issue is circumvented in Amfora
- [ANSI conversion is messed up](https://code.rocketnine.space/tslocum/cview/issues/48)
- [WordWrap is broken in some cases](https://code.rocketnine.space/tslocum/cview/issues/27) - close #156 if this is fixed
- [Prevent panic when reformatting](https://code.rocketnine.space/tslocum/cview/issues/50) - can't reliably reproduce or debug

View File

@ -15,6 +15,7 @@ import (
"github.com/gdamore/tcell/v2"
"github.com/makeworld-the-better-one/amfora/cache"
homedir "github.com/mitchellh/go-homedir"
"github.com/muesli/termenv"
"github.com/rkoesters/xdg/basedir"
"github.com/rkoesters/xdg/userdirs"
"github.com/spf13/viper"
@ -59,6 +60,11 @@ var MediaHandlers = make(map[string]MediaHandler)
// Defaults to ScrollBarAuto on an invalid value
var ScrollBar cview.ScrollBarVisibility
// Whether the user's terminal is dark or light
// Defaults to dark, but is determined in Init()
// Used to prevent white text on a white background with the default theme
var hasDarkTerminalBackground bool
func Init() error {
// *** Set paths ***
@ -370,7 +376,14 @@ func Init() error {
}
if viper.GetBool("a-general.color") {
cview.Styles.PrimitiveBackgroundColor = GetColor("bg")
} // Otherwise it's black by default
} else {
// No colors allowed, set backgroud to black instead of default
themeMu.Lock()
theme["bg"] = tcell.ColorBlack
cview.Styles.PrimitiveBackgroundColor = tcell.ColorBlack
}
hasDarkTerminalBackground = termenv.HasDarkBackground()
// Parse HTTP command
HTTPCommand = viper.GetStringSlice("a-general.http")

View File

@ -11,27 +11,43 @@ import (
// UI element tcell.Colors are mapped to a string key, such as "error" or "tab_bg"
// These are the same keys used in the config file.
// Special color with no real color value
// Used for a default foreground color
// White is the terminal background is black, black if the terminal background is white
// Converted to a real color in this file before being sent out to other modules
const ColorFg = tcell.ColorSpecial | 2
// The same as ColorFg, but inverted
const ColorBg = tcell.ColorSpecial | 3
var themeMu = sync.RWMutex{}
var theme = map[string]tcell.Color{
// Map these for special uses in code
"ColorBg": ColorBg,
"ColorFg": ColorFg,
// Default values below
// Only the 16 Xterm system tcell.Colors are used, because those are the tcell.Colors overrided
// by the user's default terminal theme
// Used for cview.Styles.PrimitiveBackgroundColor
// Set to tcell.ColorDefault because that allows transparent terminals to work
// The rest of this theme assumes that the background is equivalent to tcell.Color zero, or black.
// The rest of this theme assumes that the background is equivalent to black, but
// white colors switched to black later if the background is determined to be white.
//
// Also, this is set to tcell.ColorBlack in config.go if colors are disabled in the config.
"bg": tcell.ColorDefault,
"tab_num": tcell.ColorTeal,
"tab_divider": tcell.ColorWhite,
"tab_divider": ColorFg,
"bottombar_label": tcell.ColorTeal,
"bottombar_text": tcell.ColorBlack,
"bottombar_bg": tcell.ColorWhite,
"scrollbar": tcell.ColorWhite,
"bottombar_text": ColorBg,
"bottombar_bg": ColorFg,
"scrollbar": ColorFg,
// Modals
"btn_bg": tcell.ColorTeal, // All modal buttons
"btn_text": tcell.ColorWhite,
"btn_bg": tcell.ColorTeal, // All modal buttons
"btn_text": tcell.ColorWhite, // White instead of ColorFg because background is known to be Teal
"dl_choice_modal_bg": tcell.ColorOlive,
"dl_choice_modal_text": tcell.ColorWhite,
@ -65,10 +81,10 @@ var theme = map[string]tcell.Color{
"amfora_link": tcell.ColorBlue,
"foreign_link": tcell.ColorPurple,
"link_number": tcell.ColorSilver,
"regular_text": tcell.ColorWhite,
"quote_text": tcell.ColorWhite,
"preformatted_text": tcell.ColorWhite,
"list_text": tcell.ColorWhite,
"regular_text": ColorFg,
"quote_text": ColorFg,
"preformatted_text": ColorFg,
"list_text": ColorFg,
}
func SetColor(key string, color tcell.Color) {
@ -83,7 +99,23 @@ func SetColor(key string, color tcell.Color) {
func GetColor(key string) tcell.Color {
themeMu.RLock()
defer themeMu.RUnlock()
return theme[key]
color := theme[key]
if color == ColorFg {
if hasDarkTerminalBackground {
return tcell.ColorWhite
}
return tcell.ColorBlack
}
if color == ColorBg {
if hasDarkTerminalBackground {
return tcell.ColorBlack
}
return tcell.ColorWhite
}
return color
}
// colorToString converts a color to a string for use in a cview tag
@ -92,6 +124,19 @@ func colorToString(color tcell.Color) string {
return "-"
}
if color == ColorFg {
if hasDarkTerminalBackground {
return "white"
}
return "black"
}
if color == ColorBg {
if hasDarkTerminalBackground {
return "black"
}
return "white"
}
if color&tcell.ColorIsRGB == 0 {
// tcell.Color is not RGB/TrueColor, it's a tcell.Color from the default terminal
// theme as set above
@ -99,6 +144,7 @@ func colorToString(color tcell.Color) string {
return ColorToColorName[color]
}
// Color set by user, must be respected exactly so hex code is used
return fmt.Sprintf("#%06x", color.Hex())
}

View File

@ -96,8 +96,6 @@ func Init(version, commit, builtBy string) {
layout.AddItem(bottomBar, 1, 1, false)
if viper.GetBool("a-general.color") {
layout.SetBackgroundColor(config.GetColor("bg"))
bottomBar.SetBackgroundColor(config.GetColor("bottombar_bg"))
bottomBar.SetLabelColor(config.GetColor("bottombar_label"))
bottomBar.SetFieldBackgroundColor(config.GetColor("bottombar_bg"))
@ -106,7 +104,7 @@ func Init(version, commit, builtBy string) {
browser.SetTabBackgroundColor(config.GetColor("bg"))
browser.SetTabBackgroundColorFocused(config.GetColor("tab_num"))
browser.SetTabTextColor(config.GetColor("tab_num"))
browser.SetTabTextColorFocused(config.GetTextColor("bg", "tab_num"))
browser.SetTabTextColorFocused(config.GetColor("ColorBg"))
browser.SetTabSwitcherDivider(
"",
fmt.Sprintf("[%s:%s]|[-]", config.GetColorString("tab_divider"), config.GetColorString("bg")),

1
go.mod
View File

@ -13,6 +13,7 @@ require (
github.com/mitchellh/go-homedir v1.1.0
github.com/mitchellh/mapstructure v1.3.1 // indirect
github.com/mmcdole/gofeed v1.1.2
github.com/muesli/termenv v0.9.0
github.com/pelletier/go-toml v1.8.0 // indirect
github.com/rkoesters/xdg v0.0.0-20181125232953-edd15b846f9b
github.com/schollz/progressbar/v3 v3.8.0

4
go.sum
View File

@ -143,6 +143,8 @@ github.com/makeworld-the-better-one/go-gemini v0.11.0/go.mod h1:F+3x+R1xeYK90jMt
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
@ -171,6 +173,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/muesli/termenv v0.9.0 h1:wnbOaGz+LUR3jNT0zOzinPnyDaCZUQRZj9GxK8eRVl8=
github.com/muesli/termenv v0.9.0/go.mod h1:R/LzAKf+suGs4IsO95y7+7DpFHO0KABgnZqtlyx2mBw=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=