Merge pull request #1 from kattudden/feature/systemd-service

Feature/systemd service
This commit is contained in:
kattudden
2025-01-07 20:40:47 +01:00
committed by GitHub
2 changed files with 70 additions and 74 deletions

View File

@@ -1,32 +1,30 @@
# swayidle-ctrl
This Go application allows you to manage a swayidle process for screen and display timeout on Sway desktops.
This Go application allows you to enable or disable the swayidle service.
It would also be possible to do it directly with systemctl...
## Features
- Starts a swayidle process in the background with configurable timeouts.
- Terminates any existing swayidle process before starting a new one.
- Provides a flag to disable screen and display timeout functionalities.
- stop / start the swayidle service.
## Usage
This application can be run from the command line. Here's how:
```
swayidle-ctrl -t1 <timeout1> -t2 <timeout2> [-off]
```txt
swayidle-ctrl [-on|-off]
Arguments:
-t1 (default: 300): Sets the timeout in seconds for screen lock activation.
-t2 (default: 600): Sets the timeout in seconds for display power off.
-on (default: false): Enables screen lock and display timeout functionalities.
-off (default: false): Disables screen lock and display timeout functionalities.
```
### Example:
### Examples
Start swayidle with 5 minutes screen lock timeout and 10 minutes display power off timeout:
Enable screen lock and display timeout:
``` bash
swayidle-ctrl -t1 300 -t2 600
swayidle-ctrl -on
```
Disable screen lock and display timeout:
@@ -45,13 +43,12 @@ swayidle-ctrl -off
### Additional Notes
* This application uses `sh -c` to execute the swayidle command. You might need to adjust this based on your specific setup.
* The application terminates any existing `swayidle` process before starting a new one. This ensures you don't have multiple instances running concurrently.
* Consider adding support for additional swayidle functionalities or configuration options in future versions.
- This application uses `sh -c` to execute the swayidle command. You might need to adjust this based on your specific setup.
- The application terminates any existing `swayidle` process before starting a new one. This ensures you don't have multiple instances running concurrently.
- Consider adding support for additional swayidle functionalities or configuration options in future versions.
This readme provides a basic overview of the application. You can customize it further by adding information about:
* Contributing guidelines
* License information
* Troubleshooting tips
- Contributing guidelines
- License information
- Troubleshooting tips

111
main.go
View File

@@ -1,60 +1,15 @@
package main
import (
"bufio"
"flag"
"fmt"
"os"
"os/exec"
"strconv"
"strings"
"syscall"
)
func killSwayidleProcess() error {
command := "ps -ef | grep swayidle | grep -v grep | grep -v ctrl"
func startSwayidleService() error {
command := "systemctl --user start swayidle.service"
cmd := exec.Command("sh", "-c", command)
output, err := cmd.Output()
if err != nil {
return nil
}
scanner := bufio.NewScanner(strings.NewReader(string(output)))
var pids []string
for scanner.Scan() {
fields := strings.Fields(scanner.Text())
if len(fields) >= 2 {
pids = append(pids, fields[1])
}
}
// Beenden der Prozesse
for _, pidStr := range pids {
pid, err := strconv.Atoi(pidStr)
if err != nil {
return err
}
proc, err := os.FindProcess(pid)
if err != nil {
continue
}
err = proc.Kill()
if err != nil {
return err
}
}
return nil
}
func createSwayidleProcess(t1, t2 int) error {
command := fmt.Sprintf("swayidle -w timeout %d 'swaylock -f -c 3B4252' timeout %d 'swaymsg \"output * power off\"' resume 'swaymsg \"output * power on\"' before-sleep 'swaylock -f -c 3B4252'", t1, t2)
cmd := exec.Command("sh", "-c", command)
cmd.SysProcAttr = &syscall.SysProcAttr{Setsid: true}
err := cmd.Start()
if err != nil {
return err
@@ -63,23 +18,67 @@ func createSwayidleProcess(t1, t2 int) error {
return nil
}
func main() {
t1 := flag.Int("t1", 300, "Set timeout for screenlock.")
t2 := flag.Int("t2", 600, "Set timeout for display.")
disable := flag.Bool("off", false, "Disable screenlock and display timeout.")
func stopSwayidleService() error {
command := "systemctl --user stop swayidle.service"
cmd := exec.Command("sh", "-c", command)
err := cmd.Start()
if err != nil {
return err
}
return nil
}
func getSwayidleServiceStatus() (bool, error) {
command := "systemctl --user is-active --quiet swayidle.service"
cmd := exec.Command("sh", "-c", command)
err := cmd.Run()
if err != nil {
if exitError, ok := err.(*exec.ExitError); ok {
/*
Get exit code to evaluate service status.
3 == not Running.
Everything else indicating an Error.
*/
if exitError.ExitCode() == 3 {
return false, nil
}
}
return false, err
}
// Der Service läuft
return true, nil
}
func main() {
enable := flag.Bool("on", false, "Enable screenlock and display timeout.")
disable := flag.Bool("off", false, "Disable screenlock and display timeout.")
flag.Parse()
// kill running swayidle instance.
err := killSwayidleProcess()
// check current status of swayidle service.
isRunning, err := getSwayidleServiceStatus()
if err != nil {
panic(err)
}
if !*disable {
err := createSwayidleProcess(*t1, *t2)
// start service if not already running.
if *enable && !isRunning {
err := startSwayidleService()
if err != nil {
panic(err)
fmt.Println("Failed to start swayidle Service!")
return
}
}
// stop service if not already stoped.
if *disable && isRunning {
err := stopSwayidleService()
if err != nil {
fmt.Println("Failed to stop swayidle Service!")
return
}
}
}