package dpms import ( "fmt" "github.com/jezek/xgb" xgbdpms "github.com/jezek/xgb/dpms" "github.com/jezek/xgb/xproto" "edge-infra.dev/pkg/sds/lib/xorg" ) type NotPresentError struct { msg string } func (e *NotPresentError) Error() string { return e.msg } type DPMS interface { GetDPMSInfo() (*Info, error) } type dpms struct{} func NewDPMS() DPMS { return &dpms{} } type Info struct { ScreenSaver *xproto.GetScreenSaverReply Timeouts *xgbdpms.GetTimeoutsReply Info *xgbdpms.InfoReply Capable bool } func (d *dpms) GetDPMSInfo() (*Info, error) { dpmsInfo := Info{} dpmsPresent := true xgbConn, err := d.dpmsInit() if _, ok := err.(*NotPresentError); ok { dpmsPresent = false } else if err != nil { return nil, err } if err := addScreenSaver(xgbConn, &dpmsInfo); err != nil { return nil, err } if dpmsPresent { if err := addDPMSCapability(xgbConn, &dpmsInfo); err != nil { return nil, err } } if dpmsInfo.Capable { if err := addDPMSStates(xgbConn, &dpmsInfo); err != nil { return nil, err } } return &dpmsInfo, nil } func addScreenSaver(xgbConn *xgb.Conn, dpms *Info) error { screenSaver, err := xproto.GetScreenSaver(xgbConn).Reply() if err != nil { return err } dpms.ScreenSaver = screenSaver return nil } func addDPMSCapability(xgbConn *xgb.Conn, dpms *Info) error { capable, err := xgbdpms.Capable(xgbConn).Reply() if err != nil { return err } else if capable == nil { return fmt.Errorf("DPMS capability not found") } dpms.Capable = capable.Capable return nil } func addDPMSStates(xgbConn *xgb.Conn, dpms *Info) error { timeouts, err := xgbdpms.GetTimeouts(xgbConn).Reply() if err != nil { return err } info, err := xgbdpms.Info(xgbConn).Reply() if err != nil { return err } dpms.Timeouts = timeouts dpms.Info = info return nil } func (d *dpms) dpmsInit() (*xgb.Conn, error) { xgbConn, err := xorg.GetXGBConnection() if err != nil { return nil, err } reply, err := xproto.QueryExtension(xgbConn, 4, "DPMS").Reply() if err == nil && reply != nil && !reply.Present { return xgbConn, &NotPresentError{"DPMS Extension not found"} } if err := xgbdpms.Init(xgbConn); err != nil { return nil, err } return xgbConn, nil }