From 8bba5b30a42a6f100a43e958c62360a4afba07e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krist=C3=B3f=20T=C3=B3th?= Date: Tue, 18 Aug 2020 13:15:45 +0200 Subject: [PATCH] Refactor screensaver package into display and lockscreen --- display/display.go | 45 ++++++++++++++++++++++++++++ lockscreen/lockscreen.go | 26 ++++++++++++++++ main.go | 13 ++++---- screensaver/screensaver.go | 61 -------------------------------------- 4 files changed, 78 insertions(+), 67 deletions(-) create mode 100644 display/display.go create mode 100644 lockscreen/lockscreen.go delete mode 100644 screensaver/screensaver.go diff --git a/display/display.go b/display/display.go new file mode 100644 index 0000000..c4c49f3 --- /dev/null +++ b/display/display.go @@ -0,0 +1,45 @@ +package display + +import ( + "os/exec" + "regexp" + "strings" +) + + +// Suspend the display using xset +func Suspend() error { + cmd := exec.Command("xset", + "dpms", + "force", + "suspend", + ) + return cmd.Run() +} + +// IsOn determines if the display is on +func IsOn() (bool, error) { + cmd := exec.Command("xset", "q") + outputBytes, err := cmd.CombinedOutput() + if err != nil { + return false, err + } + return determineIfDisplayIsOn(string(outputBytes)), nil +} + +func determineIfDisplayIsOn(xsetOutput string) bool { + if ! strings.Contains(xsetOutput, "Monitor") { + // after booting xset q is missing this line + // lacking better ideas assume display is on + return true + } + + re := regexp.MustCompile(`Monitor is (\w+)`) + matches := re.FindStringSubmatch(xsetOutput) + if len(matches) >= 2 { + if matches[1] == "On" { + return true + } + } + return false +} diff --git a/lockscreen/lockscreen.go b/lockscreen/lockscreen.go new file mode 100644 index 0000000..53be539 --- /dev/null +++ b/lockscreen/lockscreen.go @@ -0,0 +1,26 @@ +package lockscreen + +import ( + "os/exec" + "strings" +) + + +// IsActive checks whether the screen is locked (checks if the screensaver is active) +func IsActive() (bool, error) { + cmd := exec.Command("qdbus", + "org.kde.screensaver", + "/ScreenSaver", + "org.freedesktop.ScreenSaver.GetActive", + ) + outputBytes, err := cmd.CombinedOutput() + if err != nil { + return false, err + } + output := string(outputBytes) + + if strings.HasPrefix(output, "true") { + return true, nil + } + return false, nil +} \ No newline at end of file diff --git a/main.go b/main.go index 581d62f..9ad82b8 100644 --- a/main.go +++ b/main.go @@ -2,7 +2,8 @@ package main import( "after-lock/evdev" - "after-lock/screensaver" + "after-lock/lockscreen" + "after-lock/display" "after-lock/atomicflag" "time" "sync" @@ -57,22 +58,22 @@ func (af *afterLock) detectKeypresses() { func (af *afterLock) hybernateDisplayLoop() { for { - active, err := screensaver.IsActive() + screenLocked, err := lockscreen.IsActive() if err != nil { panic(err) } - if !active { + if !screenLocked { af.stopFlag.Set(true) af.wg.Wait() return } - shouldSleepDisplay, err := screensaver.ShouldBeActive() + displayOn, err := display.IsOn() if err != nil { panic(err) } - if shouldSleepDisplay { - err := screensaver.Activate() + if displayOn { + err := display.Suspend() if err != nil { panic(err) } diff --git a/screensaver/screensaver.go b/screensaver/screensaver.go deleted file mode 100644 index ca4bbae..0000000 --- a/screensaver/screensaver.go +++ /dev/null @@ -1,61 +0,0 @@ -package screensaver - -import ( - "os/exec" - "regexp" - "strings" -) - - -func IsActive() (bool, error) { - cmd := exec.Command("qdbus", - "org.kde.screensaver", - "/ScreenSaver", - "org.freedesktop.ScreenSaver.GetActive", - ) - outputBytes, err := cmd.CombinedOutput() - if err != nil { - return false, err - } - output := string(outputBytes) - - if strings.HasPrefix(output, "true") { - return true, nil - } - return false, nil -} - -func Activate() error { - cmd := exec.Command("xset", - "dpms", - "force", - "suspend", - ) - return cmd.Run() -} - -func ShouldBeActive() (bool, error) { - cmd := exec.Command("xset", "q") - outputBytes, err := cmd.CombinedOutput() - if err != nil { - return false, err - } - return arbitrateXsetOutput(string(outputBytes)), nil -} - -func arbitrateXsetOutput(output string) bool { - if ! strings.Contains(output, "Monitor") { - // after booting xset q is missing this line - // lacking better ideas assume display is on - return true - } - - re := regexp.MustCompile(`Monitor is (\w+)`) - matches := re.FindStringSubmatch(output) - if len(matches) >= 2 { - if matches[1] == "On" { - return true - } - } - return false -}