diff options
Diffstat (limited to 'tw/services/files/sessionmenu')
-rwxr-xr-x | tw/services/files/sessionmenu | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tw/services/files/sessionmenu b/tw/services/files/sessionmenu new file mode 100755 index 00000000..91839d8e --- /dev/null +++ b/tw/services/files/sessionmenu @@ -0,0 +1,38 @@ +#!/usr/bin/env -S guile --no-auto-compile +!# +(use-modules (ice-9 format) + (ice-9 match) + (ice-9 ports)) + +(define (call-command/stderr . command) + "Call COMMAND using `system*', but redirect all output to stderr." + (with-output-to-port (current-error-port) + (lambda () (apply system* command)))) + +(match (command-line) + ((_ "quit") + (exit 0)) + ((_ "Reload i3 configuration") + (call-command/stderr "i3-msg" "reload")) + ((_ "Sleep") + ;; "screenlock" blocks until unlocked by the user, so run in background. + ;; TODO: write "mem" to /sys/power/state, but it's owned by root. + (let ((locker (spawn "screenlock" '("screenlock"))) + (sleepfile (open-file "/sys/power/state" "w"))) + (display "mem" sleepfile) + (close sleepfile) + (waitpid locker))) + ((_ "Log out") + (call-command/stderr "i3-msg" "exit")) + ((_ "Shutdown") + (call-command/stderr "sudo" "-n" "/run/current-system/profile/sbin/shutdown")) + ((_ "Reboot") + (call-command/stderr "sudo" "-n" "/run/current-system/profile/sbin/reboot")) + (_ + (format #t "\0~a\x1f~a~%~{~a\0icon\x1f~a~%~}" + "prompt" "Session" + '("Reload i3 configuration" "reload" + "Sleep" "system-suspend" + "Log out" "system-log-out" + "Shutdown" "system-shutdown" + "Reboot" "system-reboot")))) |