...

Source file src/edge-infra.dev/pkg/sds/lib/xorg/dpms/dpms.go

Documentation: edge-infra.dev/pkg/sds/lib/xorg/dpms

     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