diff options
author | Junegunn Choi <junegunn.c@gmail.com> | 2016-05-11 01:07:06 +0900 |
---|---|---|
committer | Junegunn Choi <junegunn.c@gmail.com> | 2016-05-11 01:07:06 +0900 |
commit | 88a80e3c2ca8f3112a13023b4bb35101ed85a8d5 (patch) | |
tree | 779dd99aa562fae4112461e9adf7a73863fbc531 | |
parent | 24516bcf4d3be8a1a626b6ccdbe79a740fd5754f (diff) |
Determine 256-color capability using tigetnum("colors")
Close #570
-rw-r--r-- | src/curses/curses.go | 75 | ||||
-rw-r--r-- | src/options.go | 11 |
2 files changed, 56 insertions, 30 deletions
diff --git a/src/curses/curses.go b/src/curses/curses.go index 7c42c93b..ebe64159 100644 --- a/src/curses/curses.go +++ b/src/curses/curses.go @@ -109,6 +109,8 @@ const ( const ( doubleClickDuration = 500 * time.Millisecond + colDefault = -1 + colUndefined = -2 ) type ColorTheme struct { @@ -159,6 +161,23 @@ var ( DarkBG int ) +func EmptyTheme() *ColorTheme { + return &ColorTheme{ + UseDefault: true, + Fg: colUndefined, + Bg: colUndefined, + DarkBg: colUndefined, + Prompt: colUndefined, + Match: colUndefined, + Current: colUndefined, + CurrentMatch: colUndefined, + Spinner: colUndefined, + Info: colUndefined, + Cursor: colUndefined, + Selected: colUndefined, + Header: colUndefined} +} + func init() { _prevDownTime = time.Unix(0, 0) _clickY = []int{} @@ -280,44 +299,58 @@ func Init(theme *ColorTheme, black bool, mouse bool) { if theme != nil { C.start_color() - initPairs(theme, black) + var baseTheme *ColorTheme + if C.tigetnum(C.CString("colors")) >= 256 { + baseTheme = Dark256 + } else { + baseTheme = Default16 + } + initPairs(baseTheme, theme, black) _color = attrColored } else { _color = attrMono } } -func initPairs(theme *ColorTheme, black bool) { - fg := C.short(theme.Fg) - bg := C.short(theme.Bg) +func override(a int16, b int16) C.short { + if b == colUndefined { + return C.short(a) + } + return C.short(b) +} + +func initPairs(baseTheme *ColorTheme, theme *ColorTheme, black bool) { + fg := override(baseTheme.Fg, theme.Fg) + bg := override(baseTheme.Bg, theme.Bg) if black { bg = C.COLOR_BLACK } else if theme.UseDefault { - fg = -1 - bg = -1 + fg = colDefault + bg = colDefault C.use_default_colors() } if theme.UseDefault { - FG = -1 - BG = -1 + FG = colDefault + BG = colDefault } else { FG = int(fg) BG = int(bg) - C.assume_default_colors(C.int(theme.Fg), C.int(bg)) + C.assume_default_colors(C.int(override(baseTheme.Fg, theme.Fg)), C.int(bg)) } - CurrentFG = int(theme.Current) - DarkBG = int(theme.DarkBg) - darkBG := C.short(DarkBG) - C.init_pair(ColPrompt, C.short(theme.Prompt), bg) - C.init_pair(ColMatch, C.short(theme.Match), bg) - C.init_pair(ColCurrent, C.short(theme.Current), darkBG) - C.init_pair(ColCurrentMatch, C.short(theme.CurrentMatch), darkBG) - C.init_pair(ColSpinner, C.short(theme.Spinner), bg) - C.init_pair(ColInfo, C.short(theme.Info), bg) - C.init_pair(ColCursor, C.short(theme.Cursor), darkBG) - C.init_pair(ColSelected, C.short(theme.Selected), darkBG) - C.init_pair(ColHeader, C.short(theme.Header), bg) + currentFG := override(baseTheme.Current, theme.Current) + darkBG := override(baseTheme.DarkBg, theme.DarkBg) + CurrentFG = int(currentFG) + DarkBG = int(darkBG) + C.init_pair(ColPrompt, override(baseTheme.Prompt, theme.Prompt), bg) + C.init_pair(ColMatch, override(baseTheme.Match, theme.Match), bg) + C.init_pair(ColCurrent, currentFG, darkBG) + C.init_pair(ColCurrentMatch, override(baseTheme.CurrentMatch, theme.CurrentMatch), darkBG) + C.init_pair(ColSpinner, override(baseTheme.Spinner, theme.Spinner), bg) + C.init_pair(ColInfo, override(baseTheme.Info, theme.Info), bg) + C.init_pair(ColCursor, override(baseTheme.Cursor, theme.Cursor), darkBG) + C.init_pair(ColSelected, override(baseTheme.Selected, theme.Selected), darkBG) + C.init_pair(ColHeader, override(baseTheme.Header, theme.Header), bg) } func Close() { diff --git a/src/options.go b/src/options.go index dfd9a1b6..ab633082 100644 --- a/src/options.go +++ b/src/options.go @@ -132,13 +132,6 @@ type Options struct { Version bool } -func defaultTheme() *curses.ColorTheme { - if strings.Contains(os.Getenv("TERM"), "256") { - return curses.Dark256 - } - return curses.Default16 -} - func defaultOptions() *Options { return &Options{ Fuzzy: true, @@ -153,7 +146,7 @@ func defaultOptions() *Options { Multi: false, Ansi: false, Mouse: true, - Theme: defaultTheme(), + Theme: curses.EmptyTheme(), Black: false, Reverse: false, Cycle: false, @@ -745,7 +738,7 @@ func parseOptions(opts *Options, allArgs []string) { case "--color": spec := optionalNextString(allArgs, &i) if len(spec) == 0 { - opts.Theme = defaultTheme() + opts.Theme = curses.EmptyTheme() } else { opts.Theme = parseTheme(opts.Theme, spec) } |