...
1
2
3
4 package termenv
5
6 import (
7 "fmt"
8 "strconv"
9
10 "golang.org/x/sys/windows"
11 )
12
13 func (o *Output) ColorProfile() Profile {
14 if !o.isTTY() {
15 return Ascii
16 }
17
18 if o.environ.Getenv("ConEmuANSI") == "ON" {
19 return TrueColor
20 }
21
22 winVersion, _, buildNumber := windows.RtlGetNtVersionNumbers()
23 if buildNumber < 10586 || winVersion < 10 {
24
25 if o.environ.Getenv("ANSICON") != "" {
26 conVersion := o.environ.Getenv("ANSICON_VER")
27 cv, err := strconv.ParseInt(conVersion, 10, 64)
28 if err != nil || cv < 181 {
29
30 return ANSI
31 }
32
33 return ANSI256
34 }
35
36 return Ascii
37 }
38 if buildNumber < 14931 {
39
40 return ANSI256
41 }
42
43 return TrueColor
44 }
45
46 func (o Output) foregroundColor() Color {
47
48 return ANSIColor(7)
49 }
50
51 func (o Output) backgroundColor() Color {
52
53 return ANSIColor(0)
54 }
55
56
57
58
59
60
61
62 func EnableWindowsANSIConsole() (uint32, error) {
63 handle, err := windows.GetStdHandle(windows.STD_OUTPUT_HANDLE)
64 if err != nil {
65 return 0, err
66 }
67
68 var mode uint32
69 err = windows.GetConsoleMode(handle, &mode)
70 if err != nil {
71 return 0, err
72 }
73
74
75 if mode&windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING != windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING {
76 vtpmode := mode | windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
77 if err := windows.SetConsoleMode(handle, vtpmode); err != nil {
78 return 0, err
79 }
80 }
81
82 return mode, nil
83 }
84
85
86 func RestoreWindowsConsole(mode uint32) error {
87 handle, err := windows.GetStdHandle(windows.STD_OUTPUT_HANDLE)
88 if err != nil {
89 return err
90 }
91
92 return windows.SetConsoleMode(handle, mode)
93 }
94
95
96
97
98
99 func EnableVirtualTerminalProcessing(o *Output) (restoreFunc func() error, err error) {
100
101 restoreFunc = func() error {
102 return nil
103 }
104
105
106 tty := o.TTY()
107 if tty == nil {
108 return
109 }
110
111
112
113 var mode uint32
114 if err2 := windows.GetConsoleMode(windows.Handle(tty.Fd()), &mode); err2 != nil {
115 return
116 }
117
118
119
120 if mode&windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING == windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING {
121 return
122 }
123
124
125
126 if err2 := windows.SetConsoleMode(windows.Handle(tty.Fd()), mode|windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING); err2 != nil {
127 err = fmt.Errorf("windows.SetConsoleMode: %w", err2)
128 return
129 }
130
131
132
133
134 restoreFunc = func() error {
135 return windows.SetConsoleMode(windows.Handle(tty.Fd()), mode)
136 }
137
138 return
139 }
140
View as plain text