#!/bin/bash
#(c) Copyright Nov 2007 Barry Kauler www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
#written dec 2007 for Puppy Linux.
#v3.98 BK: fix unionfs saving problem when newer file in pup_save.
#v4.00 HairyWill: restart rox and jwm immediately.
#w477 record name of theme in /etc/desktop_icon_theme
#100411 fbpanel menu did not update.

#110721 new standardised icons to show when mounted.
#110912 modify jwm to use menu icon 'start-button.png' if present.
#120201 rodin.s: internationalized

export TEXTDOMAIN=icon_switcher
export OUTPUT_CHARSET=UTF-8

[ ! -f /usr/share/icons/hicolor/48x48/apps/desktop_icons.svg ] && \
ln -sf /usr/share/pixmaps/puppy/desktop_icons.svg /usr/share/icons/hicolor/48x48/apps && gtk-update-icon-cache -f -i /usr/share/icons/hicolor 2>/dev/null

echo '<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="1080" width="1920">
  <path style="fill:#04465C" d="M 0,0 1920,0 1920,1080 0,1080 z"/>
</svg>' > /usr/share/icons/DarkGreen.svg

if [ -z "$PNGOVERLAY" ] ; then
	if which pngoverlay-cairo >/dev/null 2>&1 ; then
		export PNGOVERLAY='pngoverlay-cairo'
	fi
fi

func_switch (){

	echo
	echo "Setting Desktop Icon Theme..."

	NEWTHEME="$1"
	[ "$NEWTHEME" = "" ] && exit
	if [ ! -d ${SYSROOT}/usr/local/lib/X11/themes/${NEWTHEME} ] ; then
		echo "ERROR: ${SYSROOT}/usr/local/lib/X11/themes/${NEWTHEME} does not exist"
		exit 1
	fi

	echo "Theme: $NEWTHEME"


	#show splash if running in gui mode
	[ -z $ROX_DESKTOP ] && pidof ROX-Filer >/dev/null 2>&1 && export ROX_DESKTOP=yes
	if [ -n "$ROX_DESKTOP" ]; then
		if [ "$UPDATE" = "true" ]; then
			pidof conky && type conkyrestart && CONKY_ACTIVE=yes
			/usr/lib/gtkdialog/box_splash -close never -fontsize large -icon_width 60 -icon /usr/share/pixmaps/puppy/puppy_config.svg -text "$(gettext 'Changing theme')" &
			XPID=$!
		fi
	fi
	if [[ $(pidof labwc) ]]; then
		if [ "$UPDATE" = "true" ]; then
			/usr/lib/gtkdialog/box_splash -close never -fontsize large -icon_width 60 -icon /usr/share/pixmaps/puppy/puppy_config.svg -text "$(gettext 'Changing theme')" &
			XPID=$!
		fi
	fi
	#---
	for ONESVG in `find ${SYSROOT}/usr/local/lib/X11/themes/${NEWTHEME}/ -maxdepth 1 -name \*.svg | tr '\n' ' '`; do
		ONEBASENAME="`basename $ONESVG .svg`"
		rm -f ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}48.png
		rsvg-convert -w 48 -h 48 -o ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}48.png $ONESVG
		rm -f ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}24.png
	done
	for ONEPNG in `find ${SYSROOT}/usr/local/lib/X11/themes/${NEWTHEME}/ -maxdepth 1 -type f -name \*.png | tr '\n' ' '`; do
		ONEBASENAME="`basename $ONEPNG .png`"
		cp -f $ONEPNG ${SYSROOT}/usr/local/lib/X11/pixmaps/
		touch -m ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}.png #v3.98
	done

	if [ "${SYSROOT}" -a "${NEWTHEME}" != "StandardSvg" ] ; then
		# fill in the gaps with the StandardSvg icons...
		for ONESVG in `find ${SYSROOT}/usr/local/lib/X11/themes/StandardSvg/ -maxdepth 1 -name \*.svg | tr '\n' ' '`; do
			ONEBASENAME="`basename $ONESVG .svg`"
			if [ -f ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}48.png ] ; then
				continue
			fi
			echo "[StandardSvg] ${ONEBASENAME}.svg -> ${ONEBASENAME}48.png"
			rsvg-convert -w 48 -h 48 -o ${SYSROOT}/usr/local/lib/X11/pixmaps/${ONEBASENAME}48.png $ONESVG
		done
	fi
 
	#new standardised icons to show when mounted...
	if [ -n "$PNGOVERLAY" -a -e ${SYSROOT}/usr/local/lib/X11/pixmaps/closebox_outline48.png ];then
		rm -f ${SYSROOT}/usr/local/lib/X11/pixmaps/*_mntd*.png
		(
			cd ${SYSROOT}/usr/local/lib/X11/pixmaps
			for ONEDRV in card drive floppy optical usbdrv; do
				$PNGOVERLAY ${ONEDRV}48.png closebox_outline48.png ${ONEDRV}_mntd48.png #background foreground output.
				$PNGOVERLAY ${ONEDRV}48.png locked_outline48.png ${ONEDRV}_mntd_boot48.png
				$PNGOVERLAY ${ONEDRV}48.png nocopy_outline48.png ${ONEDRV}_mntd_nocopy48.png
			done
		)
	fi
 
	#modify jwm to use menu icon 'start-button.png' if present...
	#note, similar code also in 3builddistro in Woof.
	if [ -f ${SYSROOT}/root/.jwmrc-tray ] && [ -f ${SYSROOT}/usr/local/lib/X11/${NEWTHEME}/start-button.png ]; then #chosen theme has menu icon.
		if [ -f ${SYSROOT}/usr/local/lib/X11/pixmaps/start-button.png ];then #precaution.
			if [ ! "`grep -F 'start-button.png' ${SYSROOT}/root/.jwmrc-tray`" ]; then
				#the default is to use 'mini-dog.xpm' with text "Menu"...
				sed -i 's%label="Menu" icon="puppy.svg"%icon="start-button.png"%' ${SYSROOT}$HOME/.jwmrc-tray
			fi
		else
			#chosen theme does not have start-button.png, so go back to the mini-dog.xpm...
			sed -i 's%icon="start-button.png"%label="Menu" icon="puppy.svg"%' ${SYSROOT}$HOME/.jwmrc-tray
		fi
	fi

	echo -n "$NEWTHEME" > ${SYSROOT}/etc/desktop_icon_theme

	if [ "${SYSROOT}" ] ; then
		echo
		return
	fi

	#record current theme...
	if [ -n "$ROX_DESKTOP" ]; then
		if [ "$UPDATE" = "true" ]; then
			#restart rox and jwm immediately...
			roxfiler -p $HOME/Choices/ROX-Filer/PuppyPin
			jwm -restart
			kill $XPID
			[ "$CONKY_ACTIVE" = "yes" ] && conkyrestart 5 &
		fi
	fi
	if [[ $(pidof labwc) ]]; then
		if [ "$UPDATE" = "true" ]; then
			labwc -r
			killall -SIGHUP sfwbar &
			if [[ $(pgrep -f 'spacefm --desktop') ]]; then #spacefm desktop
				if [[ $(ls ~/Desktop/*.desktop) ]]; then #desktop icons
					sleep 0.5
					killall spacefm
					sleep 0.5
					spacefm --desktop &
				fi
			fi
			kill $XPID
		fi
	fi
}
export -f func_switch

#parameters
while [ $# != 0 ]; do
	I=1
	while [ $I -le `echo $# | wc -c` ]; do 
		case $1 in
			-sysroot) SYSROOT="$2" ; shift;;
			-a) NEWTHEME="$2"; shift;;
			-u) UPDATE=true;;
			-h|--help)
				echo '
Usage: icon_switcher [OPTION]

Options
  -a THEME    Activate theme
  -h          Show this help message
  -u          Update desktop
  -sysroot R  Set system root (use with -a THEME)'
				exit;;
		esac
		shift
		I=$[$I+1]
	done
done

if [ "$NEWTHEME" ]; then
	func_switch "$NEWTHEME"
else
	GUI=true
	UPDATE=true
	ICONSETSGUI=""
	for ONEDIR in `find /usr/local/lib/X11/themes/ -mindepth 1 -maxdepth 1 -type d | tr '\n' ' '`; do
		ONENAME="`basename $ONEDIR`"
		[ -f $ONEDIR/folder.svg ] && rsvg-convert -w 48 -h 48 -o /tmp/pis-${ONENAME}-folder.png $ONEDIR/folder.svg
		[ -f $ONEDIR/folder48.png ] && cp -f $ONEDIR/folder48.png /tmp/pis-${ONENAME}-folder.png
		[ -f $ONEDIR/www.svg ] && rsvg-convert -w 48 -h 48 -o /tmp/pis-${ONENAME}-www.png $ONEDIR/www.svg
		[ -f $ONEDIR/www48.png ] && cp -f $ONEDIR/www48.png /tmp/pis-${ONENAME}-www.png
		[ -f $ONEDIR/word.svg ] && rsvg-convert -w 48 -h 48 -o /tmp/pis-${ONENAME}-word.png $ONEDIR/word.svg
		[ -f $ONEDIR/word48.png ] && cp -f $ONEDIR/word48.png /tmp/pis-${ONENAME}-word.png
		[ -f $ONEDIR/spread.svg ] && rsvg-convert -w 48 -h 48 -o /tmp/pis-${ONENAME}-spread.png $ONEDIR/spread.svg
		[ -f $ONEDIR/spread48.png ] && cp -f $ONEDIR/spread48.png /tmp/pis-${ONENAME}-spread.png
		ICONSETSGUI=$ICONSETSGUI'
		<hbox space-expand="true" space-fill="true">
		  <hbox border-width="8" spacing="20" space-expand="false" space-fill="false">
		    <pixmap space-expand="false" space-fill="false"><input file>/tmp/pis-'${ONENAME}'-folder.png</input><height>48</height><width>48</width></pixmap>
		    <pixmap space-expand="false" space-fill="false"><input file>/tmp/pis-'${ONENAME}'-www.png</input><height>48</height><width>48</width></pixmap>
		    <pixmap space-expand="false" space-fill="false"><input file>/tmp/pis-'${ONENAME}'-word.png</input><height>48</height><width>48</width></pixmap>
		    <pixmap space-expand="false" space-fill="false"><input file>/tmp/pis-'${ONENAME}'-spread.png</input><height>48</height><width>48</width></pixmap>
		  </hbox>
		  <text width-request="20" space-expand="false" space-fill="false"><label>""</label></text>
		  <vbox space-expand="true" space-fill="true">
		    <text height-request="1" space-expand="true" space-fill="true"><label>""</label></text>
		    <button space-expand="false" space-fill="false">
		      <label>'${ONENAME}'</label>
		      <action>export UPDATE=true; func_switch "'${ONENAME}'"</action>
		    </button>
		    <text height-request="10" space-expand="false" space-fill="false"><label>""</label></text>
		  </vbox>
		</hbox>'
	done

	S='
	<window title="'$(gettext 'Puppy Icon Switcher')'" icon-name="desktop_icons" height-request="500" width-request="520">
	<vbox>
	  '"`/usr/lib/gtkdialog/xml_info fixed "desktop_icons.svg" 60 "$(gettext 'The Puppy icon switcher sets category icons of desktop menus.')"`"' 
	  <vbox space-expand="true" space-fill="true">
	    <vbox scrollable="true">
	      <eventbox name="bg" above-child="false" visible-window="true" space-expand="true" space-fill="true">
	        <vbox border-width="20" space-expand="false" space-fill="false" name="iconswitch">
	          '${ICONSETSGUI}'
	        </vbox>
	      </eventbox>
	    </vbox>
	  </vbox>
	  <hbox space-expand="false" space-fill="false"> 
	    '
	    [ "`which ptheme_gtk_globalthemes`" ] && S=$S'<button space-expand="false" space-fill="false">
	      '"`/usr/lib/gtkdialog/xml_button-icon windows.svg`"'
	      <label>" '$(gettext 'Global themes')' "</label>
	      <action>ptheme_gtk_globalthemes &</action>
	    </button>'
	    S=$S'<text space-expand="true" space-fill="true"><label>""</label></text>
	    <button>
	      '"`/usr/lib/gtkdialog/xml_button-icon quit`"'
	      <label>'$(gettext 'Quit')'</label>
	    </button>
	    '"`/usr/lib/gtkdialog/xml_scalegrip`"'
	  </hbox>
	</vbox>
	</window>'
	export ICONSWITCHGUI="$S"
	
	#set background pic
	BG_FILE="/usr/share/icons/DarkGreen.svg"
	BG_PATH="`dirname "$BG_FILE"`"
	BG_NAME="`basename "$BG_FILE"`"
	if [ "$GTKDIALOG_BUILD" = 'GTK3' ] ; then
		echo '@import url("/tmp/gtkrc_xml_info.css");
box#iconswitch {
	background-image: url("'$BG_FILE'")
}' > /tmp/gtkrc_bg.css
	else
		echo '
		pixmap_path "'$BG_PATH'"
		style "bg" { bg_pixmap[NORMAL] = "'$BG_NAME'" }
		widget "*bg*" style "bg"' > /tmp/gtkrc_bg
		export GTK2_RC_FILES=/tmp/gtkrc_bg:/root/.gtkrc-2.0
	fi
	. /usr/lib/gtkdialog/xml_info gtk #build bg_pixmap for gtk-theme
	gtkdialog -p ICONSWITCHGUI --styles=/tmp/gtkrc_bg.css
fi
