From mboxrd@z Thu Jan 1 00:00:00 1970 From: Federico Beffa Subject: Re: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support for GIO and XDG theming. Date: Thu, 8 Jan 2015 18:43:15 +0100 Message-ID: References: <877fxnhk78.fsf@gmail.com> <878ui1s26u.fsf@gnu.org> <87oaq9moor.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:35529) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Y9H7D-0000jB-Gz for guix-devel@gnu.org; Thu, 08 Jan 2015 12:43:28 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Y9H78-0001Hr-1y for guix-devel@gnu.org; Thu, 08 Jan 2015 12:43:23 -0500 In-Reply-To: <87oaq9moor.fsf@gmail.com> List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: =?UTF-8?B?5a6L5paH5q2m?= Cc: Guix-devel On Thu, Jan 8, 2015 at 1:39 PM, =E5=AE=8B=E6=96=87=E6=AD=A6 wrote: > Federico Beffa writes: > >> On Sun, Dec 21, 2014 at 11:54 AM, Ludovic Court=C3=A8s wr= ote: >>> Federico Beffa skribis: >>> >>>> On Fri, Dec 19, 2014 at 1:56 PM, =E5=AE=8B=E6=96=87=E6=AD=A6 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 >> Date: Thu, 18 Dec 2014 20:58:18 +0100 >> Subject: [PATCH 1/4] guix: build/glib-or-gtk-build-system: Add support f= or 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 th= eming >> 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 na= mes 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+ (wi= th "or" >> ;; to be interpreted in the mathematical sense). This is achieved by a= dding >> -;; 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 d= ata. >> +;; 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 in= put >> ;; 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, gene= rate >> +;; 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.htm= l * 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." >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. >> ;; 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-compil= ation >> @@ -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 ca= che >> ,@(if implicit-inputs? >> (standard-packages) >> '()) >> diff --git a/guix/build/glib-or-gtk-build-system.scm b/guix/build/glib-o= r-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=3D? s directory) p)) >> #f directories-list)) >> >> +;; We do not include $HOME/.guix-profile/gtk-v.0 (v=3D2 or 3) because w= e 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 l= ist >> 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 t= hemes >> +;; in $HOME/.themes (for backward compatibility) and in XDG_DATA_HOME (= which >> +;; defaults to $HOME/.local/share). One way to handle these applicatio= ns >> +;; 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 them= es 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. Regards, Fede