...
1 package dpms
2
3 import (
4 "fmt"
5
6 "github.com/jezek/xgb"
7 xgbdpms "github.com/jezek/xgb/dpms"
8 "github.com/jezek/xgb/xproto"
9
10 "edge-infra.dev/pkg/sds/lib/xorg"
11 )
12
13 type NotPresentError struct {
14 msg string
15 }
16
17 func (e *NotPresentError) Error() string {
18 return e.msg
19 }
20
21 type DPMS interface {
22 GetDPMSInfo() (*Info, error)
23 }
24
25 type dpms struct{}
26
27 func NewDPMS() DPMS {
28 return &dpms{}
29 }
30
31 type Info struct {
32 ScreenSaver *xproto.GetScreenSaverReply
33 Timeouts *xgbdpms.GetTimeoutsReply
34 Info *xgbdpms.InfoReply
35 Capable bool
36 }
37
38 func (d *dpms) GetDPMSInfo() (*Info, error) {
39 dpmsInfo := Info{}
40 dpmsPresent := true
41
42 xgbConn, err := d.dpmsInit()
43 if _, ok := err.(*NotPresentError); ok {
44 dpmsPresent = false
45 } else if err != nil {
46 return nil, err
47 }
48
49 if err := addScreenSaver(xgbConn, &dpmsInfo); err != nil {
50 return nil, err
51 }
52
53 if dpmsPresent {
54 if err := addDPMSCapability(xgbConn, &dpmsInfo); err != nil {
55 return nil, err
56 }
57 }
58
59 if dpmsInfo.Capable {
60 if err := addDPMSStates(xgbConn, &dpmsInfo); err != nil {
61 return nil, err
62 }
63 }
64
65 return &dpmsInfo, nil
66 }
67
68 func addScreenSaver(xgbConn *xgb.Conn, dpms *Info) error {
69 screenSaver, err := xproto.GetScreenSaver(xgbConn).Reply()
70 if err != nil {
71 return err
72 }
73 dpms.ScreenSaver = screenSaver
74
75 return nil
76 }
77
78 func addDPMSCapability(xgbConn *xgb.Conn, dpms *Info) error {
79 capable, err := xgbdpms.Capable(xgbConn).Reply()
80 if err != nil {
81 return err
82 } else if capable == nil {
83 return fmt.Errorf("DPMS capability not found")
84 }
85
86 dpms.Capable = capable.Capable
87
88 return nil
89 }
90
91 func addDPMSStates(xgbConn *xgb.Conn, dpms *Info) error {
92 timeouts, err := xgbdpms.GetTimeouts(xgbConn).Reply()
93 if err != nil {
94 return err
95 }
96
97 info, err := xgbdpms.Info(xgbConn).Reply()
98 if err != nil {
99 return err
100 }
101
102 dpms.Timeouts = timeouts
103 dpms.Info = info
104
105 return nil
106 }
107
108 func (d *dpms) dpmsInit() (*xgb.Conn, error) {
109 xgbConn, err := xorg.GetXGBConnection()
110 if err != nil {
111 return nil, err
112 }
113
114 reply, err := xproto.QueryExtension(xgbConn, 4, "DPMS").Reply()
115 if err == nil && reply != nil && !reply.Present {
116 return xgbConn, &NotPresentError{"DPMS Extension not found"}
117 }
118
119 if err := xgbdpms.Init(xgbConn); err != nil {
120 return nil, err
121 }
122
123 return xgbConn, nil
124 }
125
View as plain text