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

Reply via email to