summaryrefslogtreecommitdiff
path: root/build/icon-theme-installer
blob: bf049391483824bac2259de444663460e9fbcb02 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
#!/usr/bin/env bash

# icon-theme-installer
# Copyright (C) 2006 Novell, Inc.
# Written by Aaron Bockover <abock@gnome.org>
# Licensed under the MIT/X11 license
#
# This script is meant to be invoked from within a Makefile/Makefile.am
# in the install-data-local and uninstall-data sections. It handles the
# task of properly installing icons into the icon theme. It requires a
# few arguments to set up its environment, and a list of files to be
# installed. The format of the file list is critical:
#
# <category>,<local-src-file-name>
#
#   apps,music-player-banshee.svg
#   apps,music-player-banshee-16.png
#   apps,music-player-banshee-22.png
#
# <category> is the icon theme category, for instance, apps, devices,
# actions, emblems...
#
# <local-src-file-name> must have a basename in the form of:
#
#   proper-theme-name[-<SIZE>].<EXTENSION>
#
# Where <SIZE> should be either nothing, which will default to scalable
# or \-[0-9]{2}, which will expand to <SIZE>x<SIZE>. For example:
#
#   music-player-banshee-16.png
#
# The <SIZE> here is -16 and will expand to 16x16 per the icon theme spec
#
# What follows is an example Makefile.am for icon theme installation:
#
# ---------------
# theme=hicolor
# themedir=$(datadir)/icons/$(theme)
# theme_icons = \
#	apps,music-player-banshee.svg \
#	apps,music-player-banshee-16.png \
#	apps,music-player-banshee-22.png \
#	apps,music-player-banshee-24.png \
#	apps,music-player-banshee-32.png
#
# install_icon_exec = $(top_srcdir)/build/icon-theme-installer -t $(theme) -s $(srcdir) -d "x$(DESTDIR)" -b $(themedir) -m "$(mkinstalldirs)" -x "$(INSTALL_DATA)"
# install-data-local:
#	$(install_icon_exec) -i $(theme_icons)
#
#	uninstall-hook:
#		$(install_icon_exec) -u $(theme_icons)
#
#	MAINTAINERCLEANFILES = Makefile.in
#	EXTRA_DIST = $(wildcard *.svg *.png)
# ---------------
#
# Arguments to this program:
#
# -i         : Install
# -u         : Uninstall
# -t <theme> : Theme name (hicolor)
# -d <dir>   : Theme installation dest directory [x$(DESTDIR)] - Always prefix
#              this argument with x; it will be stripped but will act as a
#              placeholder for zero $DESTDIRs (only set by packagers)
# -b <dir>   : Theme installation directory [$(hicolordir)]
# -s <dir>   : Source directory [$(srcdir)]
# -m <exec>  : Command to exec for directory creation [$(mkinstalldirs)]
# -x <exec>  : Command to exec for single file installation [$(INSTALL_DATA)]
# <remainging> : All remainging should be category,filename pairs

while getopts "iut:b:d:s:m:x:" flag; do
	case "$flag" in
		i) INSTALL=yes ;;
		u) UNINSTALL=yes ;;
		t) THEME_NAME=$OPTARG ;;
		d) INSTALL_DEST_DIR=${OPTARG##x} ;;
		b) INSTALL_BASE_DIR=$OPTARG ;;
		s) SRC_DIR=$OPTARG ;;
		m) MKINSTALLDIRS_EXEC=$OPTARG ;;
		x) INSTALL_DATA_EXEC=$OPTARG ;;
	esac
done

shift $(($OPTIND - 1))

if test "x$INSTALL" = "xyes" -a "x$UNINSTALL" = "xyes"; then
	echo "Cannot pass both -i and -u"
	exit 1
elif test "x$INSTALL" = "x" -a "x$UNINSTALL" = "x"; then
	echo "Must path either -i or -u"
	exit 1
fi

if test -z "$THEME_NAME"; then
	echo "Theme name required (-t hicolor)"
	exit 1
fi

if test -z "$INSTALL_BASE_DIR"; then
	echo "Base theme directory required [-b \$(hicolordir)]"
	exit 1
fi

if test ! -x $(echo "$MKINSTALLDIRS_EXEC" | cut -f1 -d' '); then
	echo "Cannot find '$MKINSTALLDIRS_EXEC'; You probably want to pass -m \$(mkinstalldirs)"
	exit 1
fi

if test ! -x $(echo "$INSTALL_DATA_EXEC" | cut -f1 -d' '); then
	echo "Cannot find '$INSTALL_DATA_EXEC'; You probably want to pass -x \$(INSTALL_DATA)"
	exit 1
fi

if test -z "$SRC_DIR"; then
	SRC_DIR=.
fi

for icon in $@; do
	size=$(echo $icon | sed s/[^0-9]*//g)
	category=$(echo $icon | cut -d, -f1)
	build_name=$(echo $icon | cut -d, -f2)
	install_name=$(echo $build_name | sed "s/[0-9]//g; s/-\././")
	install_name=$(basename $install_name)

	if test -z $size; then 
		size=scalable;
		
		if [[ "${INSTALL_BASE_DIR}" == *ubuntu-mono-* ]]; then
			install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$category/$size
	    else
    		install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$size/$category
    	fi
	else
		if [[ "${INSTALL_BASE_DIR}" == *ubuntu-mono-* ]]; then
			install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$category/$size
		else
			size=${size}x${size};
			install_dir=${INSTALL_DEST_DIR}${INSTALL_BASE_DIR}/$size/$category
		fi	
	fi

	install_path=$install_dir/$install_name
	
	if test "x$INSTALL" = "xyes"; then
		echo "Installing $size $install_name into $THEME_NAME icon theme"
		
		$($MKINSTALLDIRS_EXEC $install_dir) || {
			echo "Failed to create directory $install_dir"
			exit 1
		}
		
		$($INSTALL_DATA_EXEC $SRC_DIR/$build_name $install_path) || {
			echo "Failed to install $SRC_DIR/$build_name into $install_path"
			exit 1
		}

		if test ! -e $install_path; then
			echo "Failed to install $SRC_DIR/$build_name into $install_path"
			exit 1
		fi
	else
		if test -e $install_path; then
			echo "Removing $size $install_name from $THEME_NAME icon theme"

			rm $install_path || { 
				echo "Failed to remove $install_path"
				exit 1
			}
		fi
	fi
done

gtk_update_icon_cache_bin="$((which gtk-update-icon-cache || echo /opt/gnome/bin/gtk-update-icon-cache)2>/dev/null)"
gtk_update_icon_cache="$gtk_update_icon_cache_bin -f -t $INSTALL_BASE_DIR"

if test -z "$INSTALL_DEST_DIR"; then 
	if test -x $gtk_update_icon_cache_bin; then 
		echo "Updating GTK icon cache"
		$gtk_update_icon_cache
	else
		echo "*** Icon cache not updated. Could not execute $gtk_update_icon_cache_bin"
	fi
else
	echo "*** Icon cache not updated. After (un)install, run this:"
	echo "***   $gtk_update_icon_cache"
fi