summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunegunn Choi <junegunn.c@gmail.com>2016-05-11 01:07:06 +0900
committerJunegunn Choi <junegunn.c@gmail.com>2016-05-11 01:07:06 +0900
commit88a80e3c2ca8f3112a13023b4bb35101ed85a8d5 (patch)
tree779dd99aa562fae4112461e9adf7a73863fbc531
parent24516bcf4d3be8a1a626b6ccdbe79a740fd5754f (diff)
Determine 256-color capability using tigetnum("colors")
Close #570
-rw-r--r--src/curses/curses.go75
-rw-r--r--src/options.go11
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)
}