diff options
-rw-r--r-- | gnu/services/xorg.scm | 46 |
1 files changed, 37 insertions, 9 deletions
diff --git a/gnu/services/xorg.scm b/gnu/services/xorg.scm index d5d7ffbc4c..7db30c996d 100644 --- a/gnu/services/xorg.scm +++ b/gnu/services/xorg.scm @@ -16,6 +16,7 @@ ;;; Copyright © 2023 muradm <mail@muradm.net> ;;; Copyright © 2024 Zheng Junjie <873216071@qq.com> ;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz> +;;; Copyright © 2025 Ian Eure <ian@retrospec.tv> ;;; ;;; This file is part of GNU Guix. ;;; @@ -43,6 +44,7 @@ #:use-module (gnu system privilege) #:use-module (gnu services base) #:use-module (gnu services dbus) + #:use-module (gnu services desktop) #:use-module (gnu packages base) #:use-module (gnu packages guile) #:use-module (gnu packages xorg) @@ -209,6 +211,34 @@ (server-arguments xorg-configuration-server-arguments ;list of strings (default %default-xorg-server-arguments))) +(define merge-xorg-configurations + (case-lambda* + (() (xorg-configuration)) + ((a) a) + ((#:rest configs) + (let ((configs (reverse configs))) ; Prefer later configurations. + (xorg-configuration + (modules (append-map xorg-configuration-modules configs)) + (fonts (append-map xorg-configuration-fonts configs)) + (drivers (append-map xorg-configuration-drivers configs)) + (resolutions (append-map xorg-configuration-resolutions configs)) + (extra-config (append-map xorg-configuration-extra-config configs)) + ;; Prefer the more recently set layout. + (keyboard-layout (find xorg-configuration-keyboard-layout configs)) + + ;; Prefer the last non-default server. + (server + (or (find (lambda (server) (not (eq? xorg-server server))) + (map xorg-configuration-server configs)) + xorg-server)) + + ;; Prefer the last non-default arguments. + (server-arguments + (or + (find (lambda (config) (not (eq? %default-xorg-server-arguments server))) + (map xorg-configuration-server-arguments configs)) + %default-xorg-server-arguments))))))) + (define (xorg-configuration->file config) "Compute an Xorg configuration file corresponding to CONFIG, an <xorg-configuration> record." @@ -227,7 +257,7 @@ (call-with-output-file #$output (lambda (port) (define drivers - '#$(xorg-configuration-drivers config)) + (delete-duplicates '#$(xorg-configuration-drivers config))) (define (device-section driver) (string-append " @@ -247,7 +277,7 @@ Section \"Screen\" ((x y) (string-append "\"" (number->string x) "x" (number->string y) "\""))) - resolutions)) " + (delete-duplicates resolutions))) " EndSubSection EndSection")) @@ -294,7 +324,7 @@ EndSection\n")) (display "Section \"Files\"\n" port) (for-each (lambda (font) (format port " FontPath \"~a\"~%" font)) - '#$(xorg-configuration-fonts config)) + (delete-duplicates '#$(xorg-configuration-fonts config))) (for-each (lambda (module) (format port " ModulePath \"~a\"~%" @@ -315,7 +345,7 @@ EndSection\n" port) (newline port) (display (string-join (map (cut screen-section <> - '#$(xorg-configuration-resolutions config)) + (delete-duplicates '#$(xorg-configuration-resolutions config))) drivers) "\n") port) @@ -335,7 +365,8 @@ EndSection\n" port) (newline port))) (for-each (lambda (config) - (display config port)) + (display config port) + (newline port)) '#$(xorg-configuration-extra-config config)))))) (computed-file "xserver.conf" build))) @@ -632,10 +663,7 @@ a `service-extension', as used by `set-xorg-configuration'." ((_ configuration-record service-type-definition) (service-type (inherit service-type-definition) - (compose (lambda (extensions) - (match extensions - (() #f) - ((config . _) config)))) + (compose merge-xorg-configurations) (extend (lambda (config xorg-configuration) (if xorg-configuration (configuration-record |