From 242b99d0755a17ac9c784158cf1533a21733aefd Mon Sep 17 00:00:00 2001 From: kattudden <75677047+kattudden@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:15:19 +0100 Subject: [PATCH 1/2] Use Systemd Service. --- main.go | 111 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/main.go b/main.go index 42ff1e8..73f8d24 100644 --- a/main.go +++ b/main.go @@ -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 } } } From c991eb9c004ce2af8028471e036a99b7ec4f617b Mon Sep 17 00:00:00 2001 From: kattudden <75677047+kattudden@users.noreply.github.com> Date: Tue, 7 Jan 2025 16:24:59 +0100 Subject: [PATCH 2/2] Update Readme. --- README.md | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 0b00cad..11cd20e 100644 --- a/README.md +++ b/README.md @@ -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 -t2 [-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 \ No newline at end of file +- Contributing guidelines +- License information +- Troubleshooting tips