I want support for installing icons into the appropriate directories which are under /usr/share/icons/... and not just pixmaps.
proposal attached + diff This should not break existing ebuilds. Tested a bit and open for review now.
# @FUNCTION: doicon # @USAGE: doicon [options] <icons> # @DESCRIPTION: # Install icon into the icon directory /usr/share/icons or into # /usr/share/pixmaps if "--size" is not set. # This is useful in conjunction with creating desktop/menu files. # # @CODE # options: # -s, --size # !!! must specify to install into /usr/share/icons/... !!! # size of the icon, like 48 or 48x48 # supported icon sizes are: # 16 22 24 32 36 48 64 72 96 128 192 256 scalable # -c, --context # defaults to "apps" # -t, --theme # defaults to "hicolor" # # icons: list of icons # @CODE # # example 1: # doicon foobar.png fuqbar.svg # results in: insinto /usr/share/pixmaps ; doins foobar.png fuqbar.svg # # example 2: # doicon -s 48 foobar.png fuqbar.svg # results in: insinto /usr/share/icons/hicolor/48x48/apps ; doins foobar.png fuqbar.svg # doicon() { ( # wrap the env here so that the 'insinto' call # doesn't corrupt the env of the caller local size dir i ret local context=apps local theme=hicolor while [[ $# -gt 0 ]] ; do case ${1} in -s|--size) case ${2} in 16|22|24|32|36|48|64|72|96|128|192|256) size=${2}x${2};; 16x16|22x22|24x24|32x32|36x36|48x48|64x64|72x72|96x96|128x128|192x192|256x256) size=${2};; scalable) size=scalable;; *) eqawarn "${2} is an unsupported icon size!" ((++ret));; esac shift 2;; -t|--theme) theme=${2} shift 2;; -c|--context) context=${2} shift 2;; *) if [[ -z ${size} ]] ; then dir=/usr/share/pixmaps else dir=/usr/share/icons/${theme}/${size}/${context} fi insinto "${dir}" if [[ -f ${1} ]] ; then doins "${1}" ((ret+=$?)) elif [[ -d ${1} ]] ; then for i in "${1}"/*.{png,svg} ; do doins "${i}" ((ret+=$?)) done else eqawarn "${1} is not a valid file/directory!" ((++ret)) fi shift 1 ;; esac done exit ${ret} ) } # @FUNCTION: newicon # @USAGE: newicon [options] <icon> <newname> # @DESCRIPTION: # Like doicon, install the specified icon as newname. # # example 1: # newicon foobar.png NEWNAME.png # results in: insinto /usr/share/pixmaps ; newins foobar.png NEWNAME.png # # example 2: # newicon -s 48 foobar.png NEWNAME.png # results in: insinto /usr/share/icons/hicolor/48x48/apps ; newins foobar.png NEWNAME.png # newicon() { ( # wrap the env here so that the 'insinto' call # doesn't corrupt the env of the caller local size dir ret local context=apps local theme=hicolor while [[ $# -gt 0 ]] ; do case ${1} in -s|--size) case ${2} in 16|22|24|32|36|48|64|72|96|128|192|256) size=${2}x${2};; 16x16|22x22|24x24|32x32|36x36|48x48|64x64|72x72|96x96|128x128|192x192|256x256) size=${2};; scalable) size=scalable;; *) eqawarn "${2} is an unsupported icon size!" ((++ret));; esac shift 2;; -t|--theme) theme=${2} shift 2;; -c|--context) context=${2} shift 2;; *) break ;; esac done if [[ -z ${size} ]] ; then dir=/usr/share/pixmaps else dir=/usr/share/icons/${theme}/${size}/${context} fi insinto "${dir}" newins "$@" ((ret+=$?)) exit ${ret} ) }
--- eclass/eutils.eclass +++ eclass/eutils.eclass @@ -945,43 +945,150 @@ } # @FUNCTION: doicon -# @USAGE: <list of icons> +# @USAGE: doicon [options] <icons> # @DESCRIPTION: -# Install the list of icons into the icon directory (/usr/share/pixmaps). +# Install icon into the icon directory /usr/share/icons or into +# /usr/share/pixmaps if "--size" is not set. # This is useful in conjunction with creating desktop/menu files. +# +# @CODE +# options: +# -s, --size +# !!! must specify to install into /usr/share/icons/... !!! +# size of the icon, like 48 or 48x48 +# supported icon sizes are: +# 16 22 24 32 36 48 64 72 96 128 192 256 scalable +# -c, --context +# defaults to "apps" +# -t, --theme +# defaults to "hicolor" +# +# icons: list of icons +# @CODE +# +# example 1: +# doicon foobar.png fuqbar.svg +# results in: insinto /usr/share/pixmaps ; doins foobar.png fuqbar.svg +# +# example 2: +# doicon -s 48 foobar.png fuqbar.svg +# results in: insinto /usr/share/icons/hicolor/48x48/apps ; doins foobar.png fuqbar.svg +# doicon() { ( # wrap the env here so that the 'insinto' call # doesn't corrupt the env of the caller - local i j ret - insinto /usr/share/pixmaps - for i in "$@" ; do - if [[ -f ${i} ]] ; then - doins "${i}" - ((ret+=$?)) - elif [[ -d ${i} ]] ; then - for j in "${i}"/*.png ; do - doins "${j}" + local size dir i ret + local context=apps + local theme=hicolor + + while [[ $# -gt 0 ]] ; do + case ${1} in + -s|--size) + case ${2} in + 16|22|24|32|36|48|64|72|96|128|192|256) + size=${2}x${2};; + 16x16|22x22|24x24|32x32|36x36|48x48|64x64|72x72|96x96|128x128|192x192|256x256) + size=${2};; + scalable) + size=scalable;; + *) + eqawarn "${2} is an unsupported icon size!" + ((++ret));; + esac + shift 2;; + -t|--theme) + theme=${2} + shift 2;; + -c|--context) + context=${2} + shift 2;; + *) + if [[ -z ${size} ]] ; then + dir=/usr/share/pixmaps + else + dir=/usr/share/icons/${theme}/${size}/${context} + fi + + insinto "${dir}" + + if [[ -f ${1} ]] ; then + doins "${1}" ((ret+=$?)) - done - else - ((++ret)) - fi + elif [[ -d ${1} ]] ; then + for i in "${1}"/*.{png,svg} ; do + doins "${i}" + ((ret+=$?)) + done + else + eqawarn "${1} is not a valid file/directory!" + ((++ret)) + fi + shift 1 ;; + esac done exit ${ret} ) } # @FUNCTION: newicon -# @USAGE: <icon> <newname> +# @USAGE: newicon [options] <icon> <newname> # @DESCRIPTION: -# Like all other new* functions, install the specified icon as newname. +# Like doicon, install the specified icon as newname. +# +# example 1: +# newicon foobar.png NEWNAME.png +# results in: insinto /usr/share/pixmaps ; newins foobar.png NEWNAME.png +# +# example 2: +# newicon -s 48 foobar.png NEWNAME.png +# results in: insinto /usr/share/icons/hicolor/48x48/apps ; newins foobar.png NEWNAME.png +# newicon() { ( # wrap the env here so that the 'insinto' call # doesn't corrupt the env of the caller - insinto /usr/share/pixmaps + local size dir ret + local context=apps + local theme=hicolor + + while [[ $# -gt 0 ]] ; do + case ${1} in + -s|--size) + case ${2} in + 16|22|24|32|36|48|64|72|96|128|192|256) + size=${2}x${2};; + 16x16|22x22|24x24|32x32|36x36|48x48|64x64|72x72|96x96|128x128|192x192|256x256) + size=${2};; + scalable) + size=scalable;; + *) + eqawarn "${2} is an unsupported icon size!" + ((++ret));; + esac + shift 2;; + -t|--theme) + theme=${2} + shift 2;; + -c|--context) + context=${2} + shift 2;; + *) + break ;; + esac + done + + if [[ -z ${size} ]] ; then + dir=/usr/share/pixmaps + else + dir=/usr/share/icons/${theme}/${size}/${context} + fi + + insinto "${dir}" newins "$@" + ((ret+=$?)) + + exit ${ret} ) }