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}
)
}