#!/bin/sh #--------------------------------------------- # xdg-icon-resource # # Utility script to install icons on a Linux desktop. # # Refer to the usage() function below for usage. # # Copyright 2006, Kevin Krammer # Copyright 2006, Jeremy White # # LICENSE: # #--------------------------------------------- manualpage() { cat << _MANUALPAGE _MANUALPAGE } usage() { cat << _USAGE _USAGE } #@xdg-utils-common@ update_icon_database() { IFS_save=$IFS IFS=":" for x in $PATH:/opt/gnome/bin; do if [ -x $x/gtk-update-icon-cache ] ; then DEBUG 1 "Running $x/gtk-update-icon-cache -f -t $1" $x/gtk-update-icon-cache -f -t $1 return fi done IFS=$IFS_save } [ x"$1" != x"" ] || exit_failure_syntax mode= action= update=yes size= theme=hicolor context=apps icon_file= icon_name= case $1 in install) action=install ;; uninstall) action=uninstall ;; forceupdate) action=forceupdate ;; *) exit_failure_syntax "unknown command '$1'" ;; esac shift while [ $# -gt 0 ] ; do parm=$1 shift case $parm in --noupdate) update=no ;; --user) mode=user ;; --system) mode=system ;; --theme) if [ -z "$1" ] ; then exit_failure_syntax "theme argument missing for --theme" fi theme=$1 shift ;; --size) if [ -z "$1" ] ; then exit_failure_syntax "size argument missing for --size" fi size=$1 shift ;; --context) if [ -z "$1" ] ; then exit_failure_syntax "context argument missing for --context" fi context=$1 shift ;; -*) exit_failure_syntax "unexpected option '$parm'" ;; *) if [ -n "$icon_name" ] ; then exit_failure_syntax "unexpected argument '$parm'" elif [ -n "$icon_file" ] ; then icon_name=$parm else if [ "$action" = "install" ] ; then if [ ! -f "$parm" ] ; then exit_failure_file_missing "file '$parm' does not exist" fi fi icon_file=$parm fi ;; esac done # Shouldn't happen if [ -z "$action" ] ; then exit_failure_syntax "command argument missing" fi # Shouldn't happen if [ -z "$context" ] ; then exit_failure_syntax "context argument missing" fi if [ -z "$mode" ] ; then exit_failure_syntax "expected --user or --system option" fi xdg_dir_name=icons/$theme xdg_user_dir=$XDG_DATA_HOME [ -n "$xdg_user_dir" ] || xdg_user_dir=$HOME/.local/share xdg_user_prefix=$xdg_user_dir/icons xdg_user_dir=$xdg_user_dir/$xdg_dir_name xdg_global_dir= xdg_global_prefix= xdg_system_dirs=$XDG_DATA_DIRS [ -n "$xdg_system_dirs" ] || xdg_system_dirs=/usr/local/share/:/usr/share/ IFS_save=$IFS IFS=":" for x in $xdg_system_dirs ; do if [ -w $x/$xdg_dir_name ] ; then xdg_global_prefix=$x/icons xdg_global_dir=$x/$xdg_dir_name break fi done IFS=$IFS_save [ -w $xdg_global_dir ] || xdg_global_dir= if [ x"$mode" = x"user" ] ; then xdg_base_dir=$xdg_user_dir else xdg_base_dir=$xdg_global_dir if [ -z "$xdg_base_dir" ] ; then [ `whoami` = "root" ] || rootmsg="Try as root or use --user." exit_failure_operation_impossible "No writable system icon directory found. $rootmsg" fi fi if [ x"$action" = x"forceupdate" ] ; then if [ -n "$icon_file" ] ; then exit_failure_syntax "unexpected argument '$icon_file'" fi update_icon_database $xdg_base_dir exit_success fi if [ -z "$icon_file" ] ; then if [ x"$action" = x"install" ] ; then exit_failure_syntax "icon-file argument missing" else exit_failure_syntax "icon-name argument missing" fi fi filetype= xdg_size_name= case $icon_file in *.xpm) filetype=bitmap if [ -z "$size" ] ; then exit_failure_syntax "*.xpm icons must have the icon size specified with --size" fi xdg_size_name=${size}x${size} ;; *.png) filetype=bitmap if [ -z "$size" ] ; then exit_failure_syntax "*.png icons must have the icon size specified with --size" fi xdg_size_name=${size}x${size} ;; *.svg) fileype=svg if [ -n "$size" ] ; then echo "@NAME@: Warning, no icon size should be specified for .svg icons" fi xdg_size_name=scalable ;; *) exit_failure_syntax "icon file to $action must be a *.png, *.xpm or *.svg file" ;; esac if [ -n "$icon_name" ] ; then case $icon_name in *.xpm) ;; *.png) ;; *.svg) ;; *) exit_failure_syntax "icon name must have a .png, .xpm or .svg extension" ;; esac fi # Start KDE legacy workaround section function need_kde_icon_path() { local path path=`readlink -f "$1"` # Normalize path DEBUG 2 "need_kde_icon_path $path" if [ -z $path ] ; then DEBUG 2 "need_kde_icon_path RETURN 1 (not needed, no xdg icon dir)" return 1; # Not needed fi # if kde-config not found... return 0 kde_icon_dirs=`kde-config --path icon` DEBUG 3 "kde_icon_dirs: $kde_icon_dirs" if [ -z $kde_icon_dirs ] ; then DEBUG 3 "no result from kde-config --path icon" DEBUG 2 "need_kde_icon_path RETURN 1 (not needed, no kde icon path)" return 1; # Not needed fi needed=0 # Needed IFS_save=$IFS IFS=":" for y in $kde_icon_dirs ; do x=`readlink -f "$y"` # Normalize path DEBUG 3 "Normalize $y --> $x" if [ -n "$x" ] ; then if [ $x = $path ] ; then needed=1 # Not needed fi if [ -w $x ] ; then kde_global_prefix=$x # Take last writable dir fi fi done IFS=$IFS_save DEBUG 2 "kde_global_prefix: $kde_global_prefix" [ $needed -eq "1" ] && DEBUG 2 "need_kde_icon_path RETURN $needed (not needed)" [ $needed -eq "0" ] && DEBUG 2 "need_kde_icon_path RETURN $needed (needed)" return $needed } kde_dir= if [ x"$mode" = x"user" ] ; then xdg_dir=$xdg_base_dir/$xdg_size_name/$context #KDE 3.x doesn't support XDG_DATA_HOME for icons #Check if xdg_dir prefix is listed by kde-config --path icon #If not, install additional symlink to kdedir if need_kde_icon_path "$xdg_user_prefix" ; then kde_user_dir=$HOME/.kde/share/icons/$theme kde_dir=$kde_user_dir/$xdg_size_name/$context fi my_umask=077 else xdg_dir=$xdg_base_dir/$xdg_size_name/$context #KDE 3.x doesn't support XDG_DATA_DIRS for icons #Check if xdg_dir prefix is listed by kde-config --path icon #If not, install additional symlink to kdedir if need_kde_icon_path "$xdg_global_prefix" ; then kde_global_dir=$kde_global_prefix/$theme kde_dir=$kde_global_dir/$xdg_size_name/$context fi my_umask=022 fi # End KDE legacy workaround section # Start GNOME legacy workaround section need_gnome_mime= [ $context = "mimetypes" ] && need_gnome_mime=true # End GNOME legacy workaround section [ -n "$icon_name" ] || icon_name=`basename $icon_file` icon_icon_file=`echo "$icon_file" | sed 's/\.[^\.]*$/.icon/'` icon_icon_name=`echo "$icon_name" | sed 's/\.[^\.]*$/.icon/'` DEBUG 1 "$action icon in $xdg_dir" [ $action = "install" -a -f $icon_icon_file ] && DEBUG 1 "install $icon_icon_name meta file in $xdg_dir" [ -n "$kde_dir" ] && DEBUG 1 "$action symlink in $kde_dir (KDE 3.x support)" [ -n "$need_gnome_mime" ] && DEBUG 1 "$action gnome-mime-$icon_name symlink (GNOME 2.x support)" case $action in install) save_umask=`umask` umask $my_umask mkdir -p $xdg_dir cp $icon_file $xdg_dir/$icon_name if [ -f "$icon_icon_file" ] ; then cp $icon_icon_file $xdg_dir/$icon_icon_name fi if [ -n "$kde_dir" ] ; then mkdir -p $kde_dir ln -s $xdg_dir/$icon_name $kde_dir/$icon_name fi if [ -n "$need_gnome_mime" ] ; then ln -s $xdg_dir/$icon_name $xdg_dir/gnome-mime-$icon_name fi umask $save_umask ;; uninstall) rm -f $xdg_dir/$icon_name rm -f $xdg_dir/$icon_icon_name if [ -n "$kde_dir" ] ; then rm -f $kde_dir/$icon_name fi if [ -n "$need_gnome_mime" ] ; then rm -f $xdg_dir/gnome-mime-$icon_name fi ;; esac if [ x"$update" = x"yes" ] ; then update_icon_database $xdg_base_dir fi exit_success