-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
101 lines (89 loc) · 2.38 KB
/
main.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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package main
import (
"flag"
"log"
"github.com/jezek/xgb"
"github.com/jezek/xgb/randr"
"github.com/jezek/xgb/xproto"
)
type Whitepoints []struct{ R, G, B float64 }
var wp = Whitepoints{
{1.00000000, 0.18172716, 0.00000000}, /* 1000K */
{1.00000000, 0.42322816, 0.00000000},
{1.00000000, 0.54360078, 0.08679949},
{1.00000000, 0.64373109, 0.28819679},
{1.00000000, 0.71976951, 0.42860152},
{1.00000000, 0.77987699, 0.54642268},
{1.00000000, 0.82854786, 0.64816570},
{1.00000000, 0.86860704, 0.73688797},
{1.00000000, 0.90198230, 0.81465502},
{1.00000000, 0.93853986, 0.88130458},
{1.00000000, 0.97107439, 0.94305985},
{1.00000000, 1.00000000, 1.00000000}, /* 6500K */
{0.95160805, 0.96983355, 1.00000000},
{0.91194747, 0.94470005, 1.00000000},
{0.87906581, 0.92357340, 1.00000000},
{0.85139976, 0.90559011, 1.00000000},
{0.82782969, 0.89011714, 1.00000000},
{0.80753191, 0.87667891, 1.00000000},
{0.78988728, 0.86491137, 1.00000000}, /* 10000K */
{0.77442176, 0.85453121, 1.00000000},
}
func (wp Whitepoints) Gamma(temp int) (r, g, b float64) {
temp -= 1000
ratio := float64(temp%500) / 500.0
i, j := temp/500, temp/500+1
r = wp[i].R*(1-ratio) + wp[j].R*ratio
g = wp[i].G*(1-ratio) + wp[j].G*ratio
b = wp[i].B*(1-ratio) + wp[j].B*ratio
return
}
func Gamma(size int, temp int) (r, g, b []uint16) {
gammar, gammag, gammab := wp.Gamma(temp)
r = make([]uint16, size)
g = make([]uint16, size)
b = make([]uint16, size)
for i := 0; i < size; i++ {
gamma := 65535.0 * float64(i) / float64(size)
r[i] = uint16(gamma * gammar)
g[i] = uint16(gamma * gammag)
b[i] = uint16(gamma * gammab)
}
return
}
func Set(temp int) error {
conn, err := xgb.NewConn()
if err != nil {
return err
}
defer conn.Close()
if err := randr.Init(conn); err != nil {
return err
}
root := xproto.Setup(conn).DefaultScreen(conn).Root
res, err := randr.GetScreenResourcesCurrent(conn, root).Reply()
if err != nil {
return err
}
for _, crtc := range res.Crtcs {
size, err := randr.GetCrtcGammaSize(conn, crtc).Reply()
if err != nil {
return err
}
r, g, b := Gamma(int(size.Size), temp)
err = randr.SetCrtcGammaChecked(conn, crtc, size.Size, r, g, b).Check()
if err != nil {
return err
}
}
return nil
}
func main() {
temp := defTemp
flag.Var(&temp, "temp", temp.Usage())
flag.Parse()
log.Printf("Set %vK", temp.Value)
if err := Set(temp.Value); err != nil {
log.Fatal(err)
}
}