Group lockscreen and display suspension related code

This commit is contained in:
2020-09-08 14:08:54 +02:00
parent 48aaf76c8a
commit f80f2be784
6 changed files with 3 additions and 3 deletions

48
xdg/display/display.go Normal file
View File

@ -0,0 +1,48 @@
package display
import (
"os/exec"
"regexp"
"strings"
)
// Xset monitors/controls the display using xset
type Xset struct {}
// Suspend the display
func (Xset) Suspend() error {
cmd := exec.Command("xset",
"dpms",
"force",
"suspend",
)
return cmd.Run()
}
// IsOn determines if the display is on
func (Xset) 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
}

View File

@ -0,0 +1,33 @@
#include "evdev.h"
int block_until_keypress(const char* keyboardPath) {
int keyboardFd = open(keyboardPath, O_RDONLY);
if (keyboardFd < 0) {
return keyboardFd;
}
int eventSize = sizeof(struct input_event);
int bytesRead = 0;
struct input_event events[NUM_EVENTS];
int readEvents = 1;
while(readEvents) {
bytesRead = read(keyboardFd, events, eventSize * NUM_EVENTS);
if (bytesRead < 0) {
return bytesRead;
}
for(int i = 0; i < (bytesRead / eventSize); ++i) {
struct input_event event = events[i];
if(event.type == EV_KEY) {
if(event.value == 1) {
readEvents = 0;
}
}
}
}
close(keyboardFd);
return 0;
}

View File

@ -0,0 +1,28 @@
package keypressdetector
// #cgo CFLAGS: -g -Wall
// #include "evdev.h"
// #include <stdlib.h>
import "C"
import (
"unsafe"
"syscall"
)
// Evdev can detect keypresses on /dev/input devices
type Evdev struct {}
// BlockUntilKeypress waits until a key is pressed on the specified device
func (Evdev) BlockUntilKeypress(devicePath string) error {
path := C.CString(devicePath)
defer C.free(unsafe.Pointer(path))
ret := C.block_until_keypress(path)
if ret < 0 {
return syscall.Errno(ret)
}
return nil
}

View File

@ -0,0 +1,14 @@
#pragma once
#include <linux/input.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define NUM_EVENTS 128
int block_until_keypress(const char* keyboardPath);

View File

@ -0,0 +1,29 @@
package lockscreen
import (
"os/exec"
"strings"
)
// XDG uses qdbus to monitor the freedesktop screensaver status
type XDG struct {}
// IsActive checks whether the screen is locked (checks if the screensaver is active)
func (XDG) 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
}