package xset import ( "fmt" "edge-infra.dev/pkg/sds/display/displaymanager/applier/xorg/command" "edge-infra.dev/pkg/sds/display/displaymanager/applier/xorg/command/runner" ) const xsetPath = "/usr/bin/xset" const ( dpmsCmd = "dpms" dpmsEnableCmd = "+dpms" dpmsDisableCmd = "-dpms" screenSaverCmd = "s" blankCmd = "blank" ) // Command is able to build an Xset command to configure DPMS and run it. type Command interface { command.Command SetDPMS(enabled bool) SetBlankTimeSeconds(seconds int) SetDPMSSettings(standBySeconds, suspendTimeSeconds, offTimeSeconds int) } // NewXsetCommand returns a new xset.Command implementation. func NewXsetCommand(r runner.Runner) Command { return &xsetCmd{ cmdRunner: r, cmds: cmds{}, } } // Slice of args for each xset command type cmds [][]string type xsetCmd struct { cmdRunner runner.Runner cmds } func (x *xsetCmd) Path() string { return xsetPath } func (x *xsetCmd) Run() error { for _, args := range x.cmds { if err := x.cmdRunner.Run(xsetPath, args...); err != nil { return err } } return nil } func (x *xsetCmd) SetDPMS(enabled bool) { if enabled { // e.g. xset +dpms args := []string{dpmsEnableCmd} x.cmds = append(x.cmds, args) } else { // e.g. xset -dpms args := []string{dpmsDisableCmd} x.cmds = append(x.cmds, args) } } func (x *xsetCmd) SetDPMSSettings(standBySeconds, suspendTimeSeconds, offTimeSeconds int) { // e.g. xset dpms 30 60 90 args := []string{dpmsCmd, fmt.Sprint(standBySeconds), fmt.Sprint(suspendTimeSeconds), fmt.Sprint(offTimeSeconds)} x.cmds = append(x.cmds, args) } func (x *xsetCmd) SetBlankTimeSeconds(seconds int) { // e.g. xset s blank && xset s 30 blankArgs := []string{screenSaverCmd, blankCmd} x.cmds = append(x.cmds, blankArgs) delayArgs := []string{screenSaverCmd, fmt.Sprint(seconds)} x.cmds = append(x.cmds, delayArgs) }