# Copyright 1999-2002 Gentoo Technologies, Inc. # Distributed under the terms of the GNU General Public License v2 # $Header: $ ECLASS=font EXPORT_FUNCTIONS pkg_postinst pkg_postrm INHERITED="$INHERITED $ECLASS" DESCRIPTION="Based on the ${ECLASS} eclass" if [ "`use truetype`" ] ; then DEPEND="x11-misc/ttmkfdir ${DEPEND}" fi if [ "`use X`" ] ; then DEPEND="virtual/x11 ${DEPEND}" fi FONTDIR="/usr/X11R6/lib/X11/fonts/local" font_pkg_postinst() { setup_font_dirs ${FONTDIR} } font_pkg_postrm() { setup_font_dirs ${FONTDIR} } # Return 0 on change, or 1 on no change, or if dir do not exist check_changed() { local x="" local fontlist="" # If the dir do not exist, e if [ ! -d $1 ] then return 1 fi # Create a list of all non known config files in the font dir fontlist="$(find $1/ -type f -maxdepth 1 | \ gawk '$0 !~ /fonts\..*$|^.*\.dir$|XftCache/ {print}')" if [ ! -f $1/fonts.list ] then if [ -n "${fontlist}" ] then # No list file exist, so create it and return 0 to add # this font dir as a candidate for updating... echo "${fontlist}" > $1/fonts.list return 0 fi else local retval=1 # All the fonts was removed, so cleanup if [ -z "${fontlist}" ] then for x in $1/fonts.* $1/encodings.dir $1/XftCache do if [ -f ${x} ] then rm -f ${x} fi done return 1 fi # Check that no files was added or removed.... if [ "$(cat $1/fonts.list | md5sum)" != "$(echo "${fontlist}" | md5sum)" ] then retval=0 fi # Check that no files was updated.... if [ "${retval}" -ne 0 ] then local changed_list="" # It should be more consistant if we consider a change to fonts.scale, or # encodings.dir files as a need for an update as well ... # changed_list="$(find $1/ -type f -cnewer $1/fonts.dir | \ # gawk '$0 !~ /fonts\..*$|^.*\.dir$|XftCache/ {print}')" changed_list="$(find $1/ -type f -cnewer $1/fonts.dir | \ gawk '$0 !~ /fonts\.(list|cache-1)$|XftCache/ {print}')" if [ -n "${changed_list}" ] then retval=0 fi fi # OK, something changed, so recreate fonts.list and add as candidate # for updating... if [ "${retval}" -eq 0 ] then echo "${fontlist}" > $1/fonts.list return 0 fi fi return 1 } # This is a function to extract font dirs from # the xfs config file (/etc/X11/fs/config). get_fontdir_list() { [ ! -r /etc/X11/fs/config ] && return 0 gawk ' BEGIN { while((getline xfsconf_data < ("/etc/X11/fs/config")) > 0) { # Strip any comments if (xfsconf_data !~ /^[[:space:]]*#/) { # Dont bother if its a blank line if (xfsconf_data == "") continue # If we have a line that contain 'catalogue=', we # should be where the list of font dirs are if (xfsconf_data ~ /catalogue[[:space:]]*=/) DO_WRITE = 1 # Ok, we got our que, so start if (DO_WRITE) { # Strip any leading spaces and tabs sub(/^[[:space:]]*/, "", xfsconf_data) # Strip the 'catalogue=' part sub(/catalogue[[:space:]]*=[[:space:]]*/, "", xfsconf_data) # The last font dir will not have a ',', so this will # be the last line we read ... if (xfsconf_data !~ /,$/) { DO_WRITE = 0 DONE = 1 } # Strip the ending ',' ... sub(/,$/, "", xfsconf_data) # If we have a valid font path, print it if (xfsconf_data != "") { have_dup = 0 # Check for duplicates ... for (x in DIRLIST) if (DIRLIST[x] == xfsconf_data) { have_dup = 1 break } if (!have_dup) { print xfsconf_data DIRLIST[++i] = xfsconf_data } } } # No need to continue reading the file ... if (DONE) break } } close("/etc/X11/fs/config") }' return 0 } # This is the main beast for setting up the font dirs setup_font_dirs() { local x="" local pending_fontdirs="" local changed="no" umask 022 if [ ! -x /usr/X11R6/bin/mkfontdir -o ! -x /usr/X11R6/bin/ttmkfdir ] then ewarn "Could not find the mkfontdir or ttmkfdir binaries!" return 0 fi if [ ! -d /usr/X11R6/lib/X11/fonts/encodings ] then ewarn "Encodings directory are missing!" ewarn "Please restore /usr/X11R6/lib/X11/fonts/encodings ..." return 0 fi # Generate the encodings.dir ... /usr/X11R6/bin/mkfontdir -n \ -e /usr/X11R6/lib/X11/fonts/encodings \ -e /usr/X11R6/lib/X11/fonts/encodings/large \ -- /usr/X11R6/lib/X11/fonts/encodings ebegin "Scanning font directories" for x in "$@" do if test -d ${x} && check_changed ${x} then if [ -z "${pending_fontdirs}" ] then pending_fontdirs="${x}" else pending_fontdirs="${pending_fontdirs} ${x}" fi fi done eend 0 if [ -n "${pending_fontdirs}" ] then ebegin "Indexing font directories" for x in ${pending_fontdirs} do ebegin " ${x}" # Only generate .scale files if there are truetype fonts present ... if [ "${x/encodings}" = "${x}" -a \ -n "$(find ${x} -iname '*.[otps][pft][cfad]' -print)" ] then /usr/X11R6/bin/ttmkfdir -x 2 \ -e /usr/X11R6/lib/X11/fonts/encodings/encodings.dir \ -o ${x}/fonts.scale -d ${x} > /dev/null fi # Now generate fonts.dir files ... if [ "${x/encodings}" = "${x}" ] then /usr/X11R6/bin/mkfontdir \ -e /usr/X11R6/lib/X11/fonts/encodings \ -e /usr/X11R6/lib/X11/fonts/encodings/large \ -- ${x} > /dev/null fi if [ "${x/encodings}" = "${x}" -a -x /usr/X11R6/bin/xftcache ] && \ [ -n "$(find ${x} -iname '*.[otps][pft][cfad]' -print)" ] then # xftcache is broken, but run it anyhow ... /usr/X11R6/bin/xftcache ${x} &> /dev/null fi eend 0 changed="yes" done fi # While we at it, update fontconfig's cache as well if [ -x /usr/bin/fc-cache -a "${changed}" = "yes" ] then ebegin "Updating FC cache" HOME="/root" /usr/bin/fc-cache -f eend 0 fi } # vim:ts=4