aboutsummaryrefslogtreecommitdiff
path: root/tw/services/files/sessionmenu
diff options
context:
space:
mode:
Diffstat (limited to 'tw/services/files/sessionmenu')
-rwxr-xr-xtw/services/files/sessionmenu38
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"))))