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) - 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) - Redirects occur automatically if it only adds a trailing slash (#271)
- Non-gemini links are underlined by default to help color blind users (#189) - 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 ### Changed
- Bookmarks are stored using XML in the XBEL format, old bookmarks are transferred (#68) - 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) - The user's terminal theme colors are used by default (#181)
## Removed ## 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) - The default Amfora theme, get it back [here](https://github.com/makeworld-the-better-one/amfora/blob/master/contrib/themes/amfora.toml)
### Fixed ### Fixed

View File

@ -6,7 +6,6 @@
## Upstream Bugs ## Upstream Bugs
- Bookmark keys aren't deleted, just set to `""` - Bookmark keys aren't deleted, just set to `""`
- Waiting on [this viper PR](https://github.com/spf13/viper/pull/519) to be merged - 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) - [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 - [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 - [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/gdamore/tcell/v2"
"github.com/makeworld-the-better-one/amfora/cache" "github.com/makeworld-the-better-one/amfora/cache"
homedir "github.com/mitchellh/go-homedir" homedir "github.com/mitchellh/go-homedir"
"github.com/muesli/termenv"
"github.com/rkoesters/xdg/basedir" "github.com/rkoesters/xdg/basedir"
"github.com/rkoesters/xdg/userdirs" "github.com/rkoesters/xdg/userdirs"
"github.com/spf13/viper" "github.com/spf13/viper"
@ -59,6 +60,11 @@ var MediaHandlers = make(map[string]MediaHandler)
// Defaults to ScrollBarAuto on an invalid value // Defaults to ScrollBarAuto on an invalid value
var ScrollBar cview.ScrollBarVisibility 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 { func Init() error {
// *** Set paths *** // *** Set paths ***
@ -370,7 +376,14 @@ func Init() error {
} }
if viper.GetBool("a-general.color") { if viper.GetBool("a-general.color") {
cview.Styles.PrimitiveBackgroundColor = GetColor("bg") 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 // Parse HTTP command
HTTPCommand = viper.GetStringSlice("a-general.http") 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" // 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. // 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 themeMu = sync.RWMutex{}
var theme = map[string]tcell.Color{ var theme = map[string]tcell.Color{
// Map these for special uses in code
"ColorBg": ColorBg,
"ColorFg": ColorFg,
// Default values below // Default values below
// Only the 16 Xterm system tcell.Colors are used, because those are the tcell.Colors overrided // Only the 16 Xterm system tcell.Colors are used, because those are the tcell.Colors overrided
// by the user's default terminal theme // by the user's default terminal theme
// Used for cview.Styles.PrimitiveBackgroundColor // Used for cview.Styles.PrimitiveBackgroundColor
// Set to tcell.ColorDefault because that allows transparent terminals to work // 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, "bg": tcell.ColorDefault,
"tab_num": tcell.ColorTeal, "tab_num": tcell.ColorTeal,
"tab_divider": tcell.ColorWhite, "tab_divider": ColorFg,
"bottombar_label": tcell.ColorTeal, "bottombar_label": tcell.ColorTeal,
"bottombar_text": tcell.ColorBlack, "bottombar_text": ColorBg,
"bottombar_bg": tcell.ColorWhite, "bottombar_bg": ColorFg,
"scrollbar": tcell.ColorWhite, "scrollbar": ColorFg,
// Modals // Modals
"btn_bg": tcell.ColorTeal, // All modal buttons "btn_bg": tcell.ColorTeal, // All modal buttons
"btn_text": tcell.ColorWhite, "btn_text": tcell.ColorWhite, // White instead of ColorFg because background is known to be Teal
"dl_choice_modal_bg": tcell.ColorOlive, "dl_choice_modal_bg": tcell.ColorOlive,
"dl_choice_modal_text": tcell.ColorWhite, "dl_choice_modal_text": tcell.ColorWhite,
@ -65,10 +81,10 @@ var theme = map[string]tcell.Color{
"amfora_link": tcell.ColorBlue, "amfora_link": tcell.ColorBlue,
"foreign_link": tcell.ColorPurple, "foreign_link": tcell.ColorPurple,
"link_number": tcell.ColorSilver, "link_number": tcell.ColorSilver,
"regular_text": tcell.ColorWhite, "regular_text": ColorFg,
"quote_text": tcell.ColorWhite, "quote_text": ColorFg,
"preformatted_text": tcell.ColorWhite, "preformatted_text": ColorFg,
"list_text": tcell.ColorWhite, "list_text": ColorFg,
} }
func SetColor(key string, color tcell.Color) { func SetColor(key string, color tcell.Color) {
@ -83,7 +99,23 @@ func SetColor(key string, color tcell.Color) {
func GetColor(key string) tcell.Color { func GetColor(key string) tcell.Color {
themeMu.RLock() themeMu.RLock()
defer themeMu.RUnlock() 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 // colorToString converts a color to a string for use in a cview tag
@ -92,6 +124,19 @@ func colorToString(color tcell.Color) string {
return "-" return "-"
} }
if color == ColorFg {
if hasDarkTerminalBackground {
return "white"
}
return "black"
}
if color == ColorBg {
if hasDarkTerminalBackground {
return "black"
}
return "white"
}
if color&tcell.ColorIsRGB == 0 { if color&tcell.ColorIsRGB == 0 {
// tcell.Color is not RGB/TrueColor, it's a tcell.Color from the default terminal // tcell.Color is not RGB/TrueColor, it's a tcell.Color from the default terminal
// theme as set above // theme as set above
@ -99,6 +144,7 @@ func colorToString(color tcell.Color) string {
return ColorToColorName[color] return ColorToColorName[color]
} }
// Color set by user, must be respected exactly so hex code is used
return fmt.Sprintf("#%06x", color.Hex()) return fmt.Sprintf("#%06x", color.Hex())
} }

View File

@ -96,8 +96,6 @@ func Init(version, commit, builtBy string) {
layout.AddItem(bottomBar, 1, 1, false) layout.AddItem(bottomBar, 1, 1, false)
if viper.GetBool("a-general.color") { if viper.GetBool("a-general.color") {
layout.SetBackgroundColor(config.GetColor("bg"))
bottomBar.SetBackgroundColor(config.GetColor("bottombar_bg")) bottomBar.SetBackgroundColor(config.GetColor("bottombar_bg"))
bottomBar.SetLabelColor(config.GetColor("bottombar_label")) bottomBar.SetLabelColor(config.GetColor("bottombar_label"))
bottomBar.SetFieldBackgroundColor(config.GetColor("bottombar_bg")) bottomBar.SetFieldBackgroundColor(config.GetColor("bottombar_bg"))
@ -106,7 +104,7 @@ func Init(version, commit, builtBy string) {
browser.SetTabBackgroundColor(config.GetColor("bg")) browser.SetTabBackgroundColor(config.GetColor("bg"))
browser.SetTabBackgroundColorFocused(config.GetColor("tab_num")) browser.SetTabBackgroundColorFocused(config.GetColor("tab_num"))
browser.SetTabTextColor(config.GetColor("tab_num")) browser.SetTabTextColor(config.GetColor("tab_num"))
browser.SetTabTextColorFocused(config.GetTextColor("bg", "tab_num")) browser.SetTabTextColorFocused(config.GetColor("ColorBg"))
browser.SetTabSwitcherDivider( browser.SetTabSwitcherDivider(
"", "",
fmt.Sprintf("[%s:%s]|[-]", config.GetColorString("tab_divider"), config.GetColorString("bg")), 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/go-homedir v1.1.0
github.com/mitchellh/mapstructure v1.3.1 // indirect github.com/mitchellh/mapstructure v1.3.1 // indirect
github.com/mmcdole/gofeed v1.1.2 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/pelletier/go-toml v1.8.0 // indirect
github.com/rkoesters/xdg v0.0.0-20181125232953-edd15b846f9b github.com/rkoesters/xdg v0.0.0-20181125232953-edd15b846f9b
github.com/schollz/progressbar/v3 v3.8.0 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-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.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.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.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU=
github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= 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 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 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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/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/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=