aboutsummaryrefslogtreecommitdiffstats
path: root/oni/home/services/picom.scm
diff options
context:
space:
mode:
Diffstat (limited to 'oni/home/services/picom.scm')
-rw-r--r--oni/home/services/picom.scm195
1 files changed, 195 insertions, 0 deletions
diff --git a/oni/home/services/picom.scm b/oni/home/services/picom.scm
new file mode 100644
index 0000000..693f995
--- /dev/null
+++ b/oni/home/services/picom.scm
@@ -0,0 +1,195 @@
+(define-module (oni home services picom)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu packages compton)
+ #:use-module (gnu services xorg)
+ #:use-module (gnu home services)
+ #:use-module (gnu home services shepherd)
+ #:use-module (gnu home services utils)
+ #:use-module (guix packages)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (guix i18n)
+ #:use-module (guix modules)
+ #:use-module (guix diagnostics)
+ #:use-module (srfi srfi-1)
+ #:use-module (srfi srfi-26)
+ #:use-module (ice-9 match)
+
+ #:export (home-picom-service-type
+ home-picom-configuration))
+
+(define (serialize-alist field value)
+ (string-append
+ (symbol->string field)
+ ": {\n"
+ (apply string-append
+ (map (lambda (type)
+ (string-append
+ " "
+ (symbol->string (car type))
+ " = "
+ (cond
+ ((list? (cdr type))
+ (string-append
+ "{ "
+ (apply string-append
+ (map (lambda (option)
+ (string-append (symbol->string (car option)) " = " (if (cdr option) "true" "false")))
+ (cdr type)))
+ " },"))
+ ((string? (cdr type))
+ (string-append "\"" (cdr type) "\";"))
+ ((number? (cdr type))
+ (string-append (number->string (cdr type)) ";")))
+ "\n"))
+ value))
+ "}\n"))
+
+(define (serialize-boolean field value)
+ (string-append (symbol->string field) " = " (if value "true" "false") ";\n"))
+
+(define (serialize-list field value)
+ (string-append (symbol->string field) " = [\n"
+ (apply string-append (map (lambda (item)
+ (string-append " \"" item "\",\n"))
+ value))
+ "];\n"))
+
+(define (serialize-number field value)
+ (string-append (symbol->string field) " = " (number->string value) ";\n"))
+
+(define (serialize-percentage field value)
+ (serialize-number field (/ value 100.0)))
+
+(define (serialize-string field value)
+ (string-append (symbol->string field) " = \"" value "\";\n"))
+
+(define (percentage? value)
+ (and (number? value)
+ (<= 0 value 100)))
+
+(define-configuration home-picom-configuration
+ (package
+ (package picom)
+ "Package to use for setting Picom")
+ (backend
+ (string "xrender")
+ "Specify the backend to use: xrender, glx, or xr_glx_hybrid")
+ (glx-no-stencil
+ (boolean #f)
+ "GLX backend: avoid using stencil buffer, useful if you don’t have a stencil buffer")
+ (detect-transient
+ (boolean #f)
+ "Use WM_TRANSIENT_FOR to group windows, and consider windows in the same group focused at the same time")
+ (shadow
+ (boolean #f)
+ "Enabled client-side shadows on windows")
+ (shadow-radius
+ (number 12)
+ "The blur radius for shadows, in pixels")
+ (shadow-opacity
+ (percentage 75)
+ "The opacity of shadows")
+ (shadow-offset-x
+ (number -15)
+ "The left offset for shadows, in pixels")
+ (shadow-offset-y
+ (number -15)
+ "The top offset for shadows, in pixels")
+ (shadow-exclude
+ (list '())
+ "Specify a list of conditions of windows that should have no shadow")
+ (wintypes
+ (alist '())
+ "Window-type-specific settings")
+ (corner-radius
+ (number 0)
+ "Sets the radius of rounded window corners")
+ (inactive-opacity
+ (percentage 100)
+ "Opacity of inactive windows")
+ (active-opacity
+ (percentage 100)
+ "Default opacity for active windows")
+ (frame-opacity
+ (percentage 100)
+ "Opacity of window titlebars and borders")
+ (inactive-opacity-override
+ (boolean #f)
+ "Let inactive opacity set by -i override the _NET_WM_WINDOW_OPACITY values of windows")
+ (blur-background
+ (boolean #f)
+ "Blur background of semi-transparent / ARGB windows")
+ (blur-background-frame
+ (boolean #f)
+ "Blur background of windows when the window frame is not opaque")
+ (blur-background-fixed
+ (boolean #f)
+ "Use fixed blur strength rather than adjusting according to window opacity")
+ (blur
+ (alist '())
+ "Configure how the window background is blurred")
+ (blur-background-exclude
+ (list '())
+ "Exclude conditions for background blur")
+ (focus-exclude
+ (list '())
+ "Specify a list of conditions of windows that should always be considered focused")
+ (fading
+ (boolean #f)
+ "Fade windows in/out when opening/closing and when opacity changes, unless no-fading-openclose is set")
+ (fade-in-step
+ (percentage 2.8)
+ "Opacity change between steps while fading in")
+ (fade-out-step
+ (percentage 3)
+ "Opacity change between steps while fading out"))
+
+(define (home-picom-config-file config)
+ (computed-file
+ "picom.conf"
+ #~(call-with-output-file #$output
+ (lambda (port)
+ (display #$(serialize-configuration config home-picom-configuration-fields) port)))))
+
+(define (home-picom-files-service config)
+ `(("picom.conf"
+ ,(home-picom-config-file config))))
+
+(define (home-picom-profile-service config)
+ (list (home-picom-configuration-package config)))
+
+(define (home-picom-shepherd-service config)
+ (list
+ (shepherd-service
+ (documentation "Start Picom")
+ (provision '(picom))
+ (auto-start? #t)
+ (start
+ #~(make-forkexec-constructor
+ (list #$(file-append (home-picom-configuration-package config) "/bin/picom")
+ "--config" #$(home-picom-config-file config))
+ #:log-file (format #f "~a/.local/var/log/picom.log" (getenv "HOME"))))
+ (stop #~(make-kill-destructor)))))
+
+(define home-picom-service-type
+ (service-type (name 'home-picom)
+ (extensions
+ (list (service-extension
+ home-xdg-configuration-files-service-type
+ home-picom-files-service)
+ (service-extension
+ home-profile-service-type
+ home-picom-profile-service)
+ (service-extension
+ home-shepherd-service-type
+ home-picom-shepherd-service)))
+ (compose concatenate)
+ (default-value (home-picom-configuration))
+ (description "Configure Picom")))
+
+(define (generate-home-picom-documentation)
+ (generate-documentation
+ `((home-picom-configuration
+ ,home-picom-configuration-fields))
+ 'home-picom-configuration))