-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkbd_backlight.go
93 lines (77 loc) · 1.79 KB
/
kbd_backlight.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
package backlight
import (
"io"
"sync"
"github.com/Shadowbeetle/skbl/upower"
"github.com/godbus/dbus"
)
type KbdBacklight struct {
*Config
dbusSignalCh chan *dbus.Signal
desiredBrightness int32
inputCh chan bool
ErrorCh chan error
mutex sync.Mutex
}
func NewKbdBacklight(conf Config) (*KbdBacklight, error) {
err := conf.setDefaults()
if err != nil {
return nil, err
}
initBr, err := upower.GetBrightness(conf.dbusObject)
if err != nil {
return nil, err
}
dbusCh := make(chan *dbus.Signal, 10)
upower.SignalListen(conf.dbusConnection, conf.dbusObject, dbusCh)
inputCh := make(chan bool)
errCh := make(chan error)
kbl := &KbdBacklight{
Config: &conf,
dbusSignalCh: dbusCh,
desiredBrightness: initBr,
inputCh: inputCh,
ErrorCh: errCh,
}
return kbl, nil
}
func (kbl *KbdBacklight) Run() {
for _, f := range kbl.InputFiles {
go kbl.onInputTurnOn(f)
}
go kbl.onUserBrightnessChange()
go kbl.onIdleTurnOff()
}
func (kbl *KbdBacklight) onInputTurnOn(f io.Reader) {
b1 := make([]byte, 32)
for {
kbl.mutex.Lock() // we only need this because the tests access the reader straight
_, err := f.Read(b1)
kbl.mutex.Unlock()
if err != nil {
kbl.ErrorCh <- err
continue
}
kbl.timer.Reset(kbl.IdleWaitTime)
err = upower.SetBrightness(kbl.dbusObject, kbl.desiredBrightness)
if err != nil {
kbl.ErrorCh <- err
}
}
}
func (kbl *KbdBacklight) onIdleTurnOff() {
for range kbl.timerC {
err := upower.SetBrightness(kbl.dbusObject, 0)
if err != nil {
kbl.ErrorCh <- err
}
}
}
func (kbl *KbdBacklight) onUserBrightnessChange() {
for s := range kbl.dbusSignalCh {
if s.Body[1] == "internal" {
kbl.desiredBrightness = s.Body[0].(int32)
kbl.timer.Reset(kbl.IdleWaitTime)
}
}
}