12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- ;;; GNU Guix --- Functional package management for GNU
- ;;; Copyright © 2021 Andrew Tropin <andrew@trop.in>
- ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz>
- ;;; Copyright © 2023 Giacomo Leidi <goodoldpaul@autistici.org>
- ;;; Copyright © 2023 Andrew Patterson <andrewpatt7@gmail.com>
- ;;;
- ;;; This file is part of GNU Guix.
- ;;;
- ;;; GNU Guix is free software; you can redistribute it and/or modify it
- ;;; under the terms of the GNU General Public License as published by
- ;;; the Free Software Foundation; either version 3 of the License, or (at
- ;;; your option) any later version.
- ;;;
- ;;; GNU Guix is distributed in the hope that it will be useful, but
- ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
- ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ;;; GNU General Public License for more details.
- ;;;
- ;;; You should have received a copy of the GNU General Public License
- ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
- (define-module (gnu home services fontutils)
- #:use-module (gnu home services)
- #:use-module (gnu packages fontutils)
- #:use-module (guix gexp)
- #:use-module (srfi srfi-1)
- #:use-module (ice-9 match)
- #:use-module (sxml simple)
- #:export (home-fontconfig-service-type))
- ;;; Commentary:
- ;;;
- ;;; Services related to fonts. home-fontconfig service provides
- ;;; fontconfig configuration, which allows fc-* utilities to find
- ;;; fonts in Guix Home's profile and regenerates font cache on
- ;;; activation.
- ;;;
- ;;; Code:
- (define (write-fontconfig-doctype)
- "Prints fontconfig's DOCTYPE to current-output-port."
- ;; This is necessary because SXML doesn't seem to have a way to represent a doctype,
- ;; but sxml->xml /does/ currently call any thunks in the SXML with the XML output port
- ;; as current-output-port, allowing the output to include arbitrary text instead of
- ;; just properly quoted XML.
- (format #t "<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>"))
- (define (config->sxml config)
- "Converts a <home-fontconfig-configuration> record into the SXML representation
- of fontconfig's fonts.conf file."
- (define (snippets->sxml snippet)
- (match snippet
- ((or (? string? dir)
- (? gexp? dir))
- `(dir ,dir))
- ((? list?)
- snippet)))
- `(*TOP* (*PI* xml "version='1.0'")
- ,write-fontconfig-doctype
- (fontconfig
- ,@(map snippets->sxml config))))
- (define (add-fontconfig-config-file config)
- `(("fontconfig/fonts.conf"
- ,(mixed-text-file
- "fonts.conf"
- (call-with-output-string
- (lambda (port)
- (sxml->xml (config->sxml config) port)))))))
- (define (regenerate-font-cache-gexp _)
- `(("profile/share/fonts"
- ,#~(system* #$(file-append fontconfig "/bin/fc-cache") "-fv"))))
- (define home-fontconfig-service-type
- (service-type (name 'home-fontconfig)
- (extensions
- (list (service-extension
- home-xdg-configuration-files-service-type
- add-fontconfig-config-file)
- (service-extension
- home-run-on-change-service-type
- regenerate-font-cache-gexp)
- (service-extension
- home-profile-service-type
- (const (list fontconfig)))))
- (compose concatenate)
- (extend append)
- (default-value '("~/.guix-home/profile/share/fonts"))
- (description
- "Provides configuration file for fontconfig and make
- fc-* utilities aware of font packages installed in Guix Home's profile.")))
|