2015-01-09 1:43 GMT+08:00 Federico Beffa <be...@ieee.org>: > On Thu, Jan 8, 2015 at 1:39 PM, 宋文武 <iyzs...@gmail.com> wrote: > > Federico Beffa <be...@ieee.org> writes: > > > >> On Sun, Dec 21, 2014 at 11:54 AM, Ludovic Courtès <l...@gnu.org> wrote: > >>> Federico Beffa <be...@ieee.org> skribis: > >>> > >>>> On Fri, Dec 19, 2014 at 1:56 PM, 宋文武 <iyzs...@gmail.com> wrote: > >>>>> FYI, every apps will install icons into 'hicolor-icon-theme', > >>>>> for it to work, we need regenerated the 'icon-theme.cache' > >>>>> by `gtk-update-icon-cache`. > >>>> > >>>> The icon packages that I looked into are generating the cache by > >>>> themselves at installation. In any case, I think we can add a check > >>>> similar to one we do for schemas, just in case some icon packages do > >>>> not generate the cache. > >>> > >>> Agreed. > >> > >> Please find attached an updated patch. > >> > >> Regards, > >> Fede > >> From 4191ba9b8c86adaf9477e71a3a9f03cb04fc6528 Mon Sep 17 00:00:00 2001 > >> From: Federico Beffa <be...@fbengineering.ch> > >> Date: Thu, 18 Dec 2014 20:58:18 +0100 > >> Subject: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support > for GIO > >> and XDG theming. > >> > >> * guix/build/glib-or-gtk-build-system.scm (data-directories): Rename > >> 'schemas-directories' to 'data-directories' and add support for XDG > theming > >> data. > >> > >> * guix/build/glib-or-gtk-build-system.scm (gio-module-directories): New > >> function. > >> > >> * guix/build/glib-or-gtk-build-system.scm (wrap-all-programs): Update > names to > >> reflect that we are dealing with more types of data and not only with > >> schemas. Add handling of GIO modules. > >> > >> * guix/build-system/glib-or-gtk.scm (lower): Import the 'bin' output of > GLib > >> instead of 'out'. This was an error since we need the program > >> 'glib-compile-schemas'. Update the description. > >> --- > >> guix/build-system/glib-or-gtk.scm | 30 ++++--- > >> guix/build/glib-or-gtk-build-system.scm | 138 > +++++++++++++++++++++++++++----- > >> 2 files changed, 141 insertions(+), 27 deletions(-) > >> > >> diff --git a/guix/build-system/glib-or-gtk.scm > b/guix/build-system/glib-or-gtk.scm > >> index 8091311..7a90587 100644 > >> --- a/guix/build-system/glib-or-gtk.scm > >> +++ b/guix/build-system/glib-or-gtk.scm > >> @@ -34,15 +34,14 @@ > >> ;; This build system is an extension of the 'gnu-build-system'. It > >> ;; accomodates the needs of applications making use of glib or gtk+ > (with "or" > >> ;; to be interpreted in the mathematical sense). This is achieved by > adding > >> -;; two phases run after the 'install' phase: > >> +;; three phases run after the 'install' phase: > >> ;; > >> ;; 'glib-or-gtk-wrap' phase: > >> ;; > >> -;; a) This phase looks for GSettings schemas by verifying the > existence of > >> -;; path "datadir/glib-2.0/schemas" in all input packages. If the path > is > >> -;; found in any package, then all programs in "out/bin" are wrapped in > scripts > >> -;; where the environment variable "XDG_DATA_DIRS" is set and points to > the > >> -;; list of found schemas directories. > >> +;; a) This phase looks for GSettings schemas, GIO modules and theming > data. > >> +;; If any of these is found in any input package, then all programs in > >> +;; "out/bin" are wrapped in scripts defining the nedessary environment > >> +;; variables. > >> ;; > >> ;; b) Looks for the existence of "libdir/gtk-3.0" directories in all > input > >> ;; packages. If any is found, then the environment variable > "GTK_PATH" is > >> @@ -56,6 +55,11 @@ > >> ;; exists and does not include a file named "gschemas.compiled", then > >> ;; "glib-compile-schemas" is run in that directory. > >> ;; > >> +;; 'glib-or-gtk-icon-cache' phase: > >> +;; > >> +;; Looks for the existence of icon themes and, if no cache exists, > generate > >> +;; the "icon-theme.cache" file. > >> +;; > > I think this won't do what we want. > > > > The only icon theme we should be care is hicolor-icon-theme, > > which just provide a layout and the name, every applications > > will install icons under the name, and often with a invalid cache, > > see thunar for example. The icon-theme.cache is invalid because it > > just contain icons from thunar, but the right cache should contain all > > icons of hicolor-icon-theme. Its usage is the same as info.dir for > > texinfo. Currently, info.dir is generated for all packages in profile, > > by code in (guix profiles). We should do the same for cache of hicolor > > theme there. > > > > See also: > > https://lists.gnu.org/archive/html/guix-devel/2015-01/msg00027.html > > > > I believe that what you are saying does not correspond to the > specification at > > http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html > > * In my understanding there can be any number of base directories and > not just hicolor-icon-theme. If the latter is the only one currently > in wide use, it does not means that we should not be considering other > options described in the specification. > > * Any theme can be spread into several different base directories. > Citing the specification: "... A theme can be spread across several > base directories by having subdirectories of the same name. This way > users can extend and override system themes. ... In at least one of > the theme directories there must be a file called index.theme that > describes the theme. The first index.theme found while searching the > base directories in order is used. This file describes the general > attributes of the theme. " > The program gtk-update-icon-cache, according to its manual, "writes a > icon-theme.cache containing cached information about the icons in the > directory tree below the given directory."
Thanks for explanations! you're right. > > >From the above I understand that, if a piece of software provides > icons which are part of a theme, we can point XGD_DATA_DIRS to the > relevant directory in the store and generate a cache for that part of > the theme. My proposal makes sure that the theme is found and used > without having to explicitly install it in a profile. > > The problem that you mention only manifests itself if we want to use > the theme from a profile directory instead of directly from the store. > In the profile there will be a cache clash and your suggestion would > fix it, but this is a different problem. OK. > >> ;; Code: > >> > >> (define %default-modules > >> @@ -76,15 +80,22 @@ > >> (let ((module (resolve-interface '(gnu packages glib)))) > >> (module-ref module 'glib))) > >> > >> +(define (default-gtk+) > >> + "Return the default gtk+ package from which we use > >> +\"gtk-update-icon-cache\"." > >> + (let ((module (resolve-interface '(gnu packages gtk)))) > >> + (module-ref module 'gtk+))) > >> + > >> (define* (lower name > >> #:key source inputs native-inputs outputs system target > >> - (glib (default-glib)) (implicit-inputs? #t) > >> + (glib (default-glib)) (gtk+ (default-gtk+)) > >> + (implicit-inputs? #t) > >> (strip-binaries? #t) > >> #:allow-other-keys > >> #:rest arguments) > >> "Return a bag for NAME." > >> (define private-keywords > >> - '(#:source #:target #:glib #:inputs #:native-inputs > >> + '(#:source #:target #:glib #:gtk+ #:inputs #:native-inputs > >> #:outputs #:implicit-inputs?)) > >> > >> (and (not target) ;XXX: no > cross-compilation > >> @@ -95,7 +106,8 @@ > >> `(("source" ,source)) > >> '()) > >> ,@inputs)) > >> - (build-inputs `(("glib:bin" ,glib) > >> + (build-inputs `(("glib:bin" ,glib "bin") ; to compile schemas > >> + ("gtk+" ,gtk+) ; to generate icon > cache > >> ,@(if implicit-inputs? > >> (standard-packages) > >> '()) > >> diff --git a/guix/build/glib-or-gtk-build-system.scm > b/guix/build/glib-or-gtk-build-system.scm > >> index 9351a70..2fe7aa4 100644 > >> --- a/guix/build/glib-or-gtk-build-system.scm > >> +++ b/guix/build/glib-or-gtk-build-system.scm > >> @@ -22,6 +22,7 @@ > >> #:use-module (guix build utils) > >> #:use-module (ice-9 match) > >> #:use-module (ice-9 regex) > >> + #:use-module (ice-9 ftw) > >> #:use-module (srfi srfi-1) > >> #:use-module (srfi srfi-26) > >> #:export (%standard-phases > >> @@ -41,6 +42,9 @@ > >> (fold (lambda (s p) (or (string-ci=? s directory) p)) > >> #f directories-list)) > >> > >> +;; We do not include $HOME/.guix-profile/gtk-v.0 (v=2 or 3) because we > do not > >> +;; want to mix gtk+-2 and gtk+-3 modules. See > >> +;; https://developer.gnome.org/gtk3/stable/gtk-running.html > >> (define (gtk-module-directories inputs) > >> "Check for the existence of \"libdir/gtk-v.0\" in INPUTS. Return a > list > >> with all found directories." > >> @@ -64,20 +68,60 @@ with all found directories." > >> prev))))) > >> (fold gtk-module '() inputs))) > >> > >> -(define (schemas-directories inputs) > >> - "Check for the existence of \"datadir/glib-2.0/schemas\" in INPUTS. > Return > >> -a list with all found directories." > >> - (define (glib-schemas input previous) > >> +;; See > >> +;; http://www.freedesktop.org/wiki/DesktopThemeSpec > >> +;; http://freedesktop.org/wiki/Specifications/sound-theme-spec > >> +;; http://freedesktop.org/wiki/Specifications/icon-theme-spec > >> +;; > >> +;; Currently desktop themes are not well supported and do not honor > >> +;; XDG_DATA_DIRS. One example is evince which only looks for desktop > themes > >> +;; in $HOME/.themes (for backward compatibility) and in XDG_DATA_HOME > (which > >> +;; defaults to $HOME/.local/share). One way to handle these > applications > >> +;; appears to be by making $HOME/.themes a symlink to > >> +;; $HOME/.guix-profile/share/themes. > > Set GTK_DATA_PREFIX to $HOME/.guix-profile will work too. > > Like in NixOS, we can set it to /run/current-system/profile. > >> +(define (data-directories inputs) > >> + "Check for the existence of \"$datadir/glib-2.0/schemas\" or XDG > themes data > >> +in INPUTS. Return a list with all found directories." > >> + (define (data-directory input previous) > >> (let* ((in (match input > >> ((_ . dir) dir) > >> (_ ""))) > >> (datadir (string-append in "/share"))) > >> - (if (and (subdirectory-exists? datadir "/glib-2.0/schemas") > >> + (if (and (or (subdirectory-exists? datadir "/glib-2.0/schemas") > >> + (subdirectory-exists? datadir "/sounds") > >> + (subdirectory-exists? datadir "/themes") > >> + (subdirectory-exists? datadir "/cursors") > >> + (subdirectory-exists? datadir "/wallpapers") > >> + (subdirectory-exists? datadir "/icons")) > > And I don't think the sounds, themes, cursors, wallpapers and icons are > > hard depends of a application, they are for all applications. > > Why not set XDG_DATA_DIRS to /run/current-system/profile/share and > > $HOME/.guix-profile/share in /etc/profile? (at gnu/system.scm) > > So, install a theme package will work for all applications. > > > > WTDY? > > As said above, my proposal will make sure that the relevant theming > data is found and used directly from the store. > > I think your comment is relevant for "themes" only packages, but I see > it as a different problem which I'm not addressing here. > Agree! > Regards, > Fede >