M home/home-configuration.scm => home/home-configuration.scm +7 -3
@@ 19,6 19,7 @@
(gnu home services xdg)
(gnu home services)
(ruther home dwl wm)
+ (ruther home dwl scripts)
(ruther home themes)
(ruther home services gtk))
@@ 118,9 119,8 @@
(".config/waybar/style.css" ,(local-file "dotfiles/waybar/style.css"))
(".config/mako/config" ,(local-file "dotfiles/mako"))
- ;; Temporary until I figure out how to write those in Guile,
- ;; and put services into shepherd ones
- (".sessions" ,(local-file "dotfiles/session-scripts" #:recursive? #t))
+ ;; TODO the services should be started by shepherd
+ (".start-dwl" ,(start-dwl #:dwl dwl-mine #:waybar waybar-mine))
(".config/dwl/scripts/print.sh" ,(local-file "dotfiles/dwl/print.sh"))
@@ 195,3 195,7 @@
(file-append pinentry-gtk2 "/bin/pinentry-gtk-2"))))
(service home-pipewire-service-type)
(service home-dbus-service-type))))
+
+;; dwl package the scripts for starting, make them in Guile
+
+;; xdg desktop portal, wlr
A home/modules/ruther/home/dwl/scripts.scm => home/modules/ruther/home/dwl/scripts.scm +232 -0
@@ 0,0 1,232 @@
+(define-module (ruther home dwl scripts)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (guix packages)
+ #:use-module (ruther packages wayland)
+ #:use-module (gnu packages glib)
+ #:use-module (gnu packages wm)
+ #:use-module (gnu packages emacs)
+ #:use-module (gnu packages networking)
+ #:use-module (gnu packages gnome)
+ #:use-module (gnu packages freedesktop)
+
+ #:export
+ (wlr-output
+ wlr-randr-config
+ swayidle-timeout
+ swayidle-config
+
+ start-dwl))
+
+(define-record-type* <wlr-output>
+ wlr-output make-wlr-output
+ wlr-output?
+ (name wlr-output-name)
+ (position wlr-output-position
+ (default #f))
+ (enable? wlr-output-enable?
+ (default #t)))
+
+(define-record-type* <wlr-randr-config>
+ wlr-randr-config make-wlr-randr-config
+ wlr-randr-config?
+ (outputs wlr-randr-config-outputs))
+
+(define-record-type* <swayidle-timeout>
+ swayidle-timeout make-swayidle-timeout
+ swayidle-timeout?
+ (time swayidle-timeout-time)
+ (command swayidle-timeout-command)
+ (resume swayidle-timeout-resume
+ (default #f)))
+
+(define-record-type* <swayidle-config>
+ swayidle-config swaidle-config
+ swayidle-config?
+ (wait? swayidle-config-wait?
+ (default #f))
+ (lock swayidle-config-lock)
+ (before-sleep swayidle-config-before-sleep)
+ (timeouts swayidle-config-timeouts))
+
+(define-public (build-wlr-randr-args config)
+ (let ((outputs (wlr-randr-config-outputs config)))
+ (apply append
+ (map
+ (lambda (output)
+ (append
+ `("--output"
+ ,(wlr-output-name output)
+ ,(if (wlr-output-enable? output)
+ "--on"
+ "--off")
+ )
+ (if (wlr-output-position output)
+ `("--pos"
+ ,(format #f
+ "~a,~a"
+ (car (wlr-output-position output))
+ (cdr (wlr-output-position output))))
+ '())))
+ outputs))))
+
+(define-public (invoke-wlr-randr config)
+ #~(apply
+ invoke
+ (cons* (string-append #$wlr-randr "/bin/wlr-randr")
+ '#$(build-wlr-randr-args config))))
+
+(define-public (build-swayidle-timeout-args timeout)
+ (cons* "timeout"
+ (format #f "~a" (swayidle-timeout-time timeout))
+ (swayidle-timeout-command timeout)
+ (if (swayidle-timeout-resume timeout)
+ `("resume"
+ ,(swayidle-timeout-resume timeout))
+ '())))
+
+(define-public (build-swayidle-args config)
+ (let* ((mapped `((,swayidle-config-wait? . '("-w"))
+ (,swayidle-config-before-sleep . ("before-sleep" ,(swayidle-config-before-sleep config)))
+ (,swayidle-config-lock . ("lock" ,(swayidle-config-lock config)))
+ (,swayidle-config-timeouts . ,(apply append (map build-swayidle-timeout-args (swayidle-config-timeouts config))))))
+ (filtered (filter (lambda (x) (not (nil? ((car x) config))))
+ mapped)))
+ (apply append (map cdr filtered))))
+
+(define-public (invoke-swayidle config)
+ #~(apply
+ invoke
+ (cons* (string-append #$swayidle "/bin/swayidle")
+ '#$(build-swayidle-args config))))
+
+(define wlopm-all-screens-gexp
+ #~(begin
+ (use-modules
+ (guix build utils)
+ (ice-9 rdelim)
+ (ice-9 popen))
+
+ (define operation
+ (car (cdr (program-arguments))))
+
+ (define (first-word str)
+ (car (string-split str #\space)))
+
+ (let* ((wlopm (string-append #$wlopm "/bin/wlopm"))
+ (port (open-input-pipe wlopm))
+ (outputs (map first-word (string-split (string-trim-both (read-string port)) #\newline))))
+ (close-pipe port)
+ (for-each (lambda (output)
+ (invoke wlopm (string-append "--" operation) output))
+ outputs))))
+
+(define wlopm-all-screens-bin-gexp
+ (with-imported-modules '((guix build utils))
+ #~(begin
+ (use-modules (guix build utils))
+ (mkdir-p (string-append #$output "/bin"))
+ (symlink
+ #$(program-file "wlopm-all-screens" wlopm-all-screens-gexp)
+ (string-append #$output "/bin/wlopm-all-screens")))))
+
+;; Rules
+
+(define-public preferred-output-config
+ (wlr-randr-config
+ (outputs
+ (list
+ (wlr-output
+ (name "DP-9")
+ (position '(0 . 0))
+ (enable? #t))
+ (wlr-output
+ (name "DP-8")
+ (position '(3840 . 0))
+ (enable? #t))
+ (wlr-output
+ (name "DP-7")
+ (position '(1920 . 0))
+ (enable? #t))
+ (wlr-output
+ (name "eDP-1")
+ (enable? #f))))))
+
+(define-public fallback-output-config
+ (wlr-randr-config
+ (outputs
+ (list
+ (wlr-output
+ (name "eDP-1")
+ (enable? #t))))))
+
+(define-public idle-rules
+ (swayidle-config
+ (wait? #f)
+
+ (lock "swayidle -Ff")
+ (before-sleep "swayidle -Ff")
+
+ (timeouts
+ (list
+ (swayidle-timeout
+ (time 30)
+ (command "makoctl mode -a idle")
+ (resume "makoctl mode -r idle"))
+ (swayidle-timeout
+ (time 300)
+ (command "wlopm-all-screens off")
+ (resume "wlopm-all-screens on"))
+ (swayidle-timeout
+ (time 1800)
+ (command "loginctl suspend"))))))
+
+(define (dwl-startup-cmd-gexp waybar)
+ #~(begin
+ (use-modules (guix build utils)
+ (srfi srfi-34))
+
+ (spawn (string-append #$dbus "/bin/dbus-update-activation-environment")
+ '("dbus-update-activation-environment"
+ "WAYLAND_DISPLAY"
+ "XDG_CURRENT_DESKTOP"
+ "DISPLAY"))
+ (spawn (string-append #$network-manager-applet "/bin/nm-applet") '("nm-applet"))
+ (spawn (string-append #$blueman "/bin/blueman-applet") '("blueman-applet"))
+ (spawn (string-append #$emacs-pgtk "/bin/emacs") '("emacs" "--daemon"))
+ (spawn (string-append #$waybar "/bin/waybar") '("waybar"))
+ (guard (c ((invoke-error? c)
+ #$(invoke-wlr-randr fallback-output-config)))
+ #$(invoke-wlr-randr preferred-output-config))
+
+ ;; TODO: how would I go about putting the correct paths inside of idle-rules withou env?
+ (set-path-environment-variable
+ "PATH"
+ (map (lambda (x) (string-append x "/bin"))
+ '#$(list swayidle
+ (computed-file "wlopm-all-screens" wlopm-all-screens-bin-gexp)
+ mako
+ elogind))
+ #$(invoke-swayidle idle-rules))))
+
+(define (start-dwl-gexp dwl waybar)
+ #~(begin
+ (use-modules (guix build utils))
+ (setenv "XDG_CURRENT_DESKTOP" "wlroots")
+ (setenv "XDG_BACKEND" "wayland")
+ (setenv "QT_QPA_PLATFORM" "wayland;xcb")
+ (setenv "MOZ_ENABLE_WAYLAND" "1")
+ (setenv "_JAVA_AWT_WM_NONREPARENTING" "1")
+
+ (execl (string-append #$dwl "/bin/dwl")
+ "dwl"
+ "-s" #$(program-file "dwl-startup-cmd" (dwl-startup-cmd-gexp waybar)))))
+
+(define* (start-dwl #:key (dwl dwl-0.7) (waybar waybar))
+ (program-file "start-dwl" (start-dwl-gexp dwl waybar)))
+
+(define-public wlopm-all-screens
+ (program-file "wlopm-all-screens" wlopm-all-screens-gexp))
+
+(define-public wlopm-all-screens-bin
+ (computed-file "wlopm-all-screens" wlopm-all-screens-bin-gexp))