Tom Willemse
a85ad3fddd
- Sort all use-module directives - Remove ‘gcc-toolchain’ from the installed packages because it appears that the regular emacs-next (not from a git checkout) works fine without it. - Add ‘emacs-org-roam’ and ‘emacs-vterm’ packages because they both come with C modules and installing them on-the-fly in Emacs wasn't working properly. - Add ‘fakeroot’ package because it appears to be needed now that I'm using guix-home if I want to build packages for Archlinux. This still happens when I need to install some proprietary program from the AUR. - Add an Emacs configuration service. For now this just ensures that the ‘emacs-next’ package is installed and creates a shepherd service that starts Emacs when I log in. - Change the default run dialog from ‘rofi -show run’ to ‘rofi -show drun’ to run .desktop files. This offers more control over what does and doesn't show up in the list and allows me to put only stuff in there that actually works in a graphical environment.
257 lines
10 KiB
Scheme
257 lines
10 KiB
Scheme
(define-module (oni home services rofi)
|
|
#:use-module (gnu services configuration)
|
|
#:use-module (gnu packages xdisorg)
|
|
#:use-module (gnu home services)
|
|
#: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 (oni home services xbindkeys)
|
|
#:use-module (srfi srfi-1)
|
|
#:use-module (srfi srfi-26)
|
|
#:use-module (ice-9 match)
|
|
#:use-module (ice-9 regex)
|
|
#:use-module (ice-9 common-list)
|
|
|
|
#:export (home-rofi-service-type
|
|
home-rofi-configuration
|
|
|
|
home-rofi-default-service))
|
|
|
|
;;; This module has been copied from
|
|
;;; https://github.com/nouun/jayu/blob/92ff6629da686f0ddc96a4d6cb2a657c76795bc6/jayu/home/services/xdisorg.scm
|
|
|
|
(define-configuration/no-serialization home-rofi-configuration
|
|
(package
|
|
(package rofi)
|
|
"Package to use for setting Rofi")
|
|
(config (alist '())
|
|
"rofi config")
|
|
(theme (alist '())
|
|
"theme config"))
|
|
|
|
(define color-regexp
|
|
(make-regexp
|
|
(string-append
|
|
"("
|
|
;; #RGB
|
|
"#[a-zA-Z0-9]{3}" "|"
|
|
;; #RGBA
|
|
"#[a-zA-Z0-9]{4}" "|"
|
|
;; #RRGGBB
|
|
"#[a-zA-Z0-9]{6}" "|"
|
|
;; #RRGGBBAA
|
|
"#[a-zA-Z0-9]{8}" "|"
|
|
;; rgb(123, 123, 123)
|
|
"rgba?. *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *" "|"
|
|
;; rgba(123, 123, 123, 0.1)
|
|
"rgba?. *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *, [0-9]\\.[0-9]*" "|"
|
|
;; rgba(123, 123, 123, 100%)
|
|
"rgba?. *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *, *[0-9]{1,3} *%? *, [0-9]{1,3} *% *"
|
|
;;children
|
|
")")))
|
|
|
|
(define (format-rofi-value val)
|
|
(cond
|
|
((list? val)
|
|
(string-join (map format-rofi-value val) " "))
|
|
((boolean? val)
|
|
(if val "true" "false"))
|
|
((number? val)
|
|
(string-append
|
|
(object->string val)
|
|
(if (not (eq? 0 val))
|
|
"px" "")))
|
|
((symbol? val)
|
|
(object->string val))
|
|
((string? val)
|
|
(let ((color-match (regexp-exec color-regexp val)))
|
|
(if (or (string-prefix? "@" val)
|
|
(regexp-match? color-match))
|
|
val
|
|
(string-append "\"" val "\""))))
|
|
(else val)))
|
|
|
|
(define (format-rofi-config config)
|
|
(let ((key (object->string (car config)))
|
|
(value (cdr config)))
|
|
(define (format-children children)
|
|
(string-append
|
|
"[" (string-join (map object->string children) ",") "]"))
|
|
(string-append key ": "
|
|
(if (eq? 'children (car config))
|
|
(format-children value)
|
|
(format-rofi-value value))
|
|
";")))
|
|
|
|
(define (serialize-rofi-config config)
|
|
(list
|
|
(string-append
|
|
"configuration {\n "
|
|
(string-join (map format-rofi-config config) "\n ")
|
|
"\n}\n")))
|
|
|
|
(define (format-rofi-theme theme)
|
|
(let ((keys (map (lambda (s)
|
|
(if (symbol? s)
|
|
(symbol->string s)
|
|
(object->string s)))
|
|
(butlast theme 1)))
|
|
(values (car (list-tail theme (- (length theme) 1)))))
|
|
(string-append (string-join keys ", ")
|
|
" {\n "
|
|
(string-join
|
|
(map format-rofi-config values)
|
|
"\n ")
|
|
"\n}\n")))
|
|
|
|
(define (serialize-rofi-theme theme)
|
|
(string-join (map format-rofi-theme theme) "\n"))
|
|
|
|
(define (home-rofi-files-service conf)
|
|
`(("rofi/config.rasi"
|
|
,(apply mixed-text-file
|
|
"config.rasi"
|
|
(append
|
|
;; Main config
|
|
(serialize-rofi-config
|
|
(home-rofi-configuration-config conf))
|
|
;; Apply theme
|
|
(if (not (eq? (home-rofi-configuration-theme conf) '()))
|
|
(list "\n@import \"guix\"\n") '()))))
|
|
("rofi/guix.rasi"
|
|
,(mixed-text-file
|
|
"guix.rasi"
|
|
(serialize-rofi-theme
|
|
(home-rofi-configuration-theme conf))))))
|
|
|
|
(define (home-rofi-profile-service config)
|
|
(list (home-rofi-configuration-package config)))
|
|
|
|
(define (home-rofi-extension old-config extension-configs)
|
|
(match old-config
|
|
(($ <home-rofi-configuration> _ package* config* theme*)
|
|
(home-rofi-configuration
|
|
(package package*)
|
|
(config (append config*
|
|
(append-map home-rofi-configuration-config
|
|
extension-configs)))
|
|
(theme (append theme*
|
|
(append-map home-rofi-configuration-theme
|
|
extension-configs)))))))
|
|
|
|
(define (add-rofi-xbindkeys-keybindings config)
|
|
(home-xbindkeys-extension
|
|
(keybindings
|
|
'(((mod4 r) . "herbstclient spawn rofi -modi drun -show drun")
|
|
((mod4 w) . "herbstclient spawn rofi -show window -window-command \"/home/chelys/usr/bin/hlwm-switch-to-window {window}\"")))))
|
|
|
|
(define home-rofi-service-type
|
|
(service-type (name 'home-rofi)
|
|
(extensions
|
|
(list (service-extension
|
|
home-xdg-configuration-files-service-type
|
|
home-rofi-files-service)
|
|
(service-extension
|
|
home-profile-service-type
|
|
home-rofi-profile-service)
|
|
(service-extension
|
|
home-xbindkeys-service-type
|
|
add-rofi-xbindkeys-keybindings)))
|
|
(compose concatenate)
|
|
(extend home-rofi-extension)
|
|
(default-value (home-rofi-configuration))
|
|
(description "Configure Rofi")))
|
|
|
|
(define (generate-home-rofi-documentation)
|
|
(generate-documentation
|
|
`((home-rofi-configuration
|
|
,home-rofi-configuration-fields))
|
|
'home-rofi-configuration))
|
|
|
|
(define-public home-rofi-default-service
|
|
(service home-rofi-service-type
|
|
(home-rofi-configuration
|
|
(config
|
|
'((kb-cancel . "Escape,Control+g")
|
|
(window-format . "{c} {t}")))
|
|
(theme
|
|
'((* ((text-color . "#bfbfbf")
|
|
(background-color . "#3f4242")
|
|
(lightbg . "#5b6161")
|
|
(red . "#a85454")
|
|
(orange . "#faa41a")
|
|
(blue . "#1f2c3f")
|
|
|
|
(selected-normal-foreground . "@text-color")
|
|
(normal-foreground . "@text-color")
|
|
(alternate-normal-background . "@background-color")
|
|
(selected-urgent-foreground . "@text-color")
|
|
(urgent-foreground . "@text-color")
|
|
(alternate-urgent-background . "@background-color")
|
|
(active-foreground . "@text-color")
|
|
(selected-active-foreground . "@text-color")
|
|
(alternate-normal-foreground . "@text-color")
|
|
(alternate-active-background . "@blue")
|
|
(bordercolor . "@text-color")
|
|
(normal-background . "@background-color")
|
|
(selected-normal-background . "@blue")
|
|
(separatorcolor . "@orange")
|
|
(spacing . 2)
|
|
(urgent-background . "@red")
|
|
(alternate-urgent-foreground . "@text-color")
|
|
(selected-urgent-background . "@red")
|
|
(alternate-active-foreground . "@text-color")
|
|
(selected-active-background . "@blue")
|
|
(active-background . "@red")
|
|
|
|
(font . "Fantasque Sans Mono 14")))
|
|
(window ((border . 0)
|
|
(text-color . "@text-color")
|
|
(background-color . "rgba(0, 0, 0, 0%)")
|
|
(padding . 5)
|
|
(text-color . "@bordercolor")
|
|
(background-color . "@background-color")))
|
|
(mainbox ((border . 0)
|
|
(padding . 0)))
|
|
(message ((border . "1px dash 0px 0px")
|
|
(text-color . "@separatorcolor")
|
|
(padding . "2px 0px 0px")))
|
|
(textbox ((text-color . "@text-color")))
|
|
(listview ((fixed-height . 0)
|
|
(border . "2px 0px 0px")
|
|
(padding . "2px 0px 0px")
|
|
(text-color . "@separatorcolor")))
|
|
(element ((border . 0)
|
|
(children "element-icon" "element-text")
|
|
(spacing . "5px")))
|
|
(element.normal.normal ((text-color . "@normal-foreground")
|
|
(background-color . "@normal-background")))
|
|
(element.normal.urgent ((text-color . "@urgent-foreground")
|
|
(background-color . "@urgent-background")))
|
|
(element.normal.active ((text-color . "@active-foreground")
|
|
(background-color . "@active-background")))
|
|
(element.selected.urgent ((text-color . "@selected-urgent-foreground")
|
|
(background-color . "@selected-urgent-background")))
|
|
(element.selected.active ((text-color . "@selected-active-foreground")
|
|
(background-color . "@selected-active-foreground")))
|
|
(element.alternate.normal ((text-color . "@alternate-normal-foreground")
|
|
(background-color . "@alternate-normal-background")))
|
|
(element.alternate.urgent ((text-color . "@alternate-urgent-foreground")
|
|
(background-color . "@alternate-urgent-background")))
|
|
(element.alternate.active ((text-color . "@alternate-active-foreground")
|
|
(background-color . "@alternate-active-background")))
|
|
(mode-switcher ((border . "1px dash 0px 0px")))
|
|
(#{button selected}# ((text-color . "@selected-normal-foreground")
|
|
(background-color . "@selected-normal-background")))
|
|
(inputbar ((spacing . 0)
|
|
(border . "0px")
|
|
(children "prompt" "textbox-prompt-colon" "entry" "case-indicator")))
|
|
(#{button normal}# ((text-color . "@text-color")))
|
|
(text-prompt-color ((expand . #f)
|
|
(str . ":")
|
|
(margin . "0px 0.3em 0em 0em")
|
|
(text-color . "@normal-foreground"))))))))
|