Generate font catalogues for the X server

  • Open
  • quality assurance status badge
Details
2 participants
  • Ivan Kozlov
  • Marius Bakke
Owner
unassigned
Submitted by
Ivan Kozlov
Severity
normal
I
I
Ivan Kozlov wrote on 14 Feb 2020 18:17
(name . guix-patches)(address . guix-patches@gnu.org)
2060961581700625@iva4-64850291ca1c.qloud-c.yandex.net
Actually, I am sending this as a patch.

This should produce a "share/fontpath.d" directory in the profile which is a font catalogue as described in Xserver(1). Then the X server font path can be set to include this catalogue and it will find the installed fonts. This concerns all legacy X11 applications using the core fonts system, and most importantly xterm.

The hook ‘fonts-dir-file’ was originally added for this purpose as the comments can tell; you would include e. g. "share/fonts/X11/misc" from the profile in the font path, which is a union directory with symbolic links to fonts that want to install there and a fonts.dir file describing all of them. This has not been working for ages, since the X.org server stopped following symbolic links to font files for security reasons. It should be removed.

--- a/guix/profiles.scm 2020-01-01 13:03:15.579056969 +0300
+++ b/guix/profiles.scm 2020-02-14 19:52:51.979902836 +0300
@@ -1293,6 +1293,37 @@
`((type . profile-hook)
(hook . fonts-dir))))
+(define (fontpath-file manifest)
+ (define build
+ #~(begin
+ (use-modules (srfi srfi-1) (srfi srfi-26) (guix build utils))
+ (let* ((top-font-dirs (filter file-exists?
+ (map (cut string-append <>
+ "/share/fonts")
+ '#$(manifest-inputs manifest))))
+ (font-dirs (append-map (lambda (dir)
+ (find-files dir
+ (lambda (file stat)
+ (and (eq? 'directory (stat:type stat))
+ (file-exists? (string-append file "/fonts.dir"))))
+ #:directories? #t)) top-font-dirs))
+ (fonpath-dir (string-append #$output "/share/fontpath.d")))
+ (mkdir-p fontpath-dir)
+ (chdir fontpath-dir)
+ (for-each (lambda (dir pri)
+ (symlink dir (string-append (basename dir) ":pri=" (number->string pri))))
+ font-dirs
+ (iota (length font-dirs) 1)))))
+ (gexp->derivation "fontpath.d" build
+ #:modules '((guix build utils)
+ (srfi srfi-1)
+ (srfi srfi-26))
+ #:local-build? #t
+ #:substitutable? #f
+ #:properties
+ `((type . profile-hook)
+ (hook . fontpath-dir))))
+
(define (manual-database manifest)
"Return a derivation that builds the manual page database (\"mandb\") for
the entries in MANIFEST."
@@ -1430,6 +1461,7 @@
(list info-dir-file
manual-database
fonts-dir-file
+ fontpath-file
ghc-package-cache-file
ca-certificate-bundle
glib-schemas
I
I
Ivan Kozlov wrote on 12 Jun 2020 20:44
(name . guix-patches)(address . guix-patches@gnu.org)
1222911591987229@mail.yandex.ru
Is nobody interested in this? I don’t see any problems with the patch.

This must have been of concern at least once, judging by fonts-dir-file’s existence. The fontpath mechanism is the only way today to make the core (server-side) fonts work reasonably.

14.02.2020, 20:17, "Ivan Kozlov" <kanichos@yandex.ru>:
Toggle quote (54 lines)
> Actually, I am sending this as a patch.
>
> This should produce a "share/fontpath.d" directory in the profile which is a font catalogue as described in Xserver(1). Then the X server font path can be set to include this catalogue and it will find the installed fonts. This concerns all legacy X11 applications using the core fonts system, and most importantly xterm.
>
> The hook ‘fonts-dir-file’ was originally added for this purpose as the comments can tell; you would include e. g. "share/fonts/X11/misc" from the profile in the font path, which is a union directory with symbolic links to fonts that want to install there and a fonts.dir file describing all of them. This has not been working for ages, since the X.org server stopped following symbolic links to font files for security reasons. It should be removed.
>
> --- a/guix/profiles.scm 2020-01-01 13:03:15.579056969 +0300
> +++ b/guix/profiles.scm 2020-02-14 19:52:51.979902836 +0300
> @@ -1293,6 +1293,37 @@
>                      `((type . profile-hook)
>                        (hook . fonts-dir))))
>
> +(define (fontpath-file manifest)
> + (define build
> + #~(begin
> + (use-modules (srfi srfi-1) (srfi srfi-26) (guix build utils))
> + (let* ((top-font-dirs (filter file-exists?
> + (map (cut string-append <>
> + "/share/fonts")
> + '#$(manifest-inputs manifest))))
> + (font-dirs (append-map (lambda (dir)
> + (find-files dir
> + (lambda (file stat)
> + (and (eq? 'directory (stat:type stat))
> + (file-exists? (string-append file "/fonts.dir"))))
> + #:directories? #t)) top-font-dirs))
> + (fonpath-dir (string-append #$output "/share/fontpath.d")))
> + (mkdir-p fontpath-dir)
> + (chdir fontpath-dir)
> + (for-each (lambda (dir pri)
> + (symlink dir (string-append (basename dir) ":pri=" (number->string pri))))
> + font-dirs
> + (iota (length font-dirs) 1)))))
> + (gexp->derivation "fontpath.d" build
> + #:modules '((guix build utils)
> + (srfi srfi-1)
> + (srfi srfi-26))
> + #:local-build? #t
> + #:substitutable? #f
> + #:properties
> + `((type . profile-hook)
> + (hook . fontpath-dir))))
> +
>  (define (manual-database manifest)
>    "Return a derivation that builds the manual page database (\"mandb\") for
>  the entries in MANIFEST."
> @@ -1430,6 +1461,7 @@
>    (list info-dir-file
>          manual-database
>          fonts-dir-file
> + fontpath-file
>          ghc-package-cache-file
>          ca-certificate-bundle
>          glib-schemas
M
M
Marius Bakke wrote on 22 Jun 2020 22:11
Re: [bug#39602] Generate font catalogues for the X server
87k0zyc14a.fsf@gnu.org
Ivan Kozlov <kanichos@yandex.ru> writes:

Toggle quote (6 lines)
> Actually, I am sending this as a patch.
>
> This should produce a "share/fontpath.d" directory in the profile which is a font catalogue as described in Xserver(1). Then the X server font path can be set to include this catalogue and it will find the installed fonts. This concerns all legacy X11 applications using the core fonts system, and most importantly xterm.
>
> The hook ‘fonts-dir-file’ was originally added for this purpose as the comments can tell; you would include e. g. "share/fonts/X11/misc" from the profile in the font path, which is a union directory with symbolic links to fonts that want to install there and a fonts.dir file describing all of them. This has not been working for ages, since the X.org server stopped following symbolic links to font files for security reasons. It should be removed.

Thanks for this investigation, and the patch!

Overall it LGTM, but I wonder how useful it is, seeing as no one has
reported the issue. Would it make sense to add hooks in the
configuration system instead for setting font path and a font union?

A patch to remove the legacy broken 'fonts-dir-file' generation from
(guix profiles) would be welcome, by the way.

Thanks,
Marius
-----BEGIN PGP SIGNATURE-----

iQEzBAEBCgAdFiEEu7At3yzq9qgNHeZDoqBt8qM6VPoFAl7xEFUACgkQoqBt8qM6
VPo6JAf+I3yM+lOO/MwUBjqXXAJUj+egPaG3zD9erp8VMElegfIGH4ay4w2nZ3pd
9FdZDO2qk+4J+R61fIy9bm3rkrK5tipOGlqH+wwl8fD8zESURq0nyJO8umQjP3lW
IZzBuAVe3UAZAaqfF7fUwua7rK9LW8T0ipXJGtvOhVZgUNYcAOL/IhqV/seO5IHd
7k/o9O2wuedz6UHpkcnITvujKjqj9F2kdK95K/VrQn0yNWyI+/aGzumSiehPNu4t
rMEv8pkbISSN6k0K9wNJ0agnKSFeY1w68NI58KlNDOTETv2n1xgEKsP/B2GH/KnI
vCRswEOOTKKg2q1Q2mpUhkWRzAwtig==
=vG5u
-----END PGP SIGNATURE-----

?