-
Notifications
You must be signed in to change notification settings - Fork 0
/
terminfo.go
36 lines (30 loc) · 966 Bytes
/
terminfo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package terminal
import (
"sync"
"github.com/gdamore/tcell/v2/terminfo"
"github.com/gdamore/tcell/v2/terminfo/dynamic"
)
var cachedTerminfo map[string]*terminfo.Terminfo
var cachedTerminfoMutex sync.Mutex
func init() {
cachedTerminfo = make(map[string]*terminfo.Terminfo)
}
// findTerminfo returns a terminfo struct via tcell's dynamic method first,
// then using the built-in databases. The aim is to use the terminfo database
// most likely to be correct. Maybe even better would be parsing the terminfo
// file directly using something like https://github.com/beevik/terminfo/, to
// avoid the extra process.
func findTerminfo(name string) (*terminfo.Terminfo, error) {
cachedTerminfoMutex.Lock()
defer cachedTerminfoMutex.Unlock()
if ti, ok := cachedTerminfo[name]; ok {
return ti, nil
}
ti, _, e := dynamic.LoadTerminfo(name)
if e == nil {
cachedTerminfo[name] = ti
return ti, nil
}
ti, e = terminfo.LookupTerminfo(name)
return ti, e
}