#!/bin/sh #--------------------------------------------- # xdg-icon-resource # # Utility script to install icons on a Linux desktop. # # Refer to the usage() function below for usage. # # Copyright 2009-2010, Fathi Boudra # Copyright 2009-2010, Rex Dieter # Copyright 2006, Kevin Krammer # Copyright 2006, Jeremy White # # LICENSE: # #--------------------------------------------- manualpage() { cat << '_MANUALPAGE' _MANUALPAGE } usage() { cat << '_USAGE' _USAGE } #@xdg-utils-common@ # Set GTK_UPDATE_ICON_CACHE to gtk-update-icon-cache executable path or # to "-" if not found. GTK_UPDATE_ICON_CACHE= find_gtk_update_icon_cache() { [ -n "$GTK_UPDATE_ICON_CACHE" ] && return; GTK_UPDATE_ICON_CACHE="-" for x in `echo "$PATH:/opt/gnome/bin" | sed 's/:/ /g'`; do DEBUG 3 "Checking $x for gtk-update-icon-cache" if [ -x "$x/gtk-update-icon-cache" ] ; then DEBUG 1 "Found $x/gtk-update-icon-cache" GTK_UPDATE_ICON_CACHE="$x/gtk-update-icon-cache" return fi done } # Start GNOME legacy workaround section need_dot_icon_path() { # GTK < 2.6 uses ~/.icons but not XDG_DATA_HOME/icons # The availability of gtk-update-icon-cache is used as indication # of whether the system is using GTK 2.6 or later find_gtk_update_icon_cache [ "$GTK_UPDATE_ICON_CACHE" != "-" ] && return 1; return 0; } update_icon_database() { # Touch me, I'm dirty touch "$1/.@NAME@-dummy" rm -f "$1/.@NAME@-dummy" # Don't create a cache if there wan't one already if [ -f "$1/icon-theme.cache" ] ; then find_gtk_update_icon_cache if [ "$GTK_UPDATE_ICON_CACHE" != "-" ] ; then DEBUG 1 "Running $GTK_UPDATE_ICON_CACHE -f -t \"$1\"" eval '$GTK_UPDATE_ICON_CACHE -f -t "$1"'$xdg_redirect_output return fi fi } [ 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 vendor=true while [ $# -gt 0 ] ; do parm="$1" shift case $parm in --noupdate) update=no ;; --mode) if [ -z "$1" ] ; then exit_failure_syntax "mode argument missing for --mode" fi case "$1" in user) mode="user" ;; system) mode="system" ;; *) exit_failure_syntax "unknown mode '$1'" ;; esac shift ;; --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 if echo "$1" | grep '[^0-9]' > /dev/null 2> /dev/null; then exit_failure_syntax "size argument must be numeric" fi size="$1" shift ;; --context) if [ -z "$1" ] ; then exit_failure_syntax "context argument missing for --context" fi context="$1" shift ;; --novendor) vendor=false ;; -*) 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 check_input_file "$parm" 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 [ -n "$XDG_UTILS_INSTALL_MODE" ] ; then if [ "$XDG_UTILS_INSTALL_MODE" = "system" ] ; then mode="system" elif [ "$XDG_UTILS_INSTALL_MODE" = "user" ] ; then mode="user" fi fi if [ -z "$mode" ] ; then if [ "`whoami`" = "root" ] ; then mode="system" else mode="user" fi 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/" for x in `echo "$xdg_system_dirs" | sed 's/:/ /g'`; do if [ -w "$x/$xdg_dir_name" ] ; then xdg_global_prefix="$x/icons" xdg_global_dir="$x/$xdg_dir_name" break fi done [ -w "$xdg_global_dir" ] || xdg_global_dir= dot_icon_dir= dot_base_dir= if [ x"$mode" = x"user" ] ; then xdg_base_dir="$xdg_user_dir" #Gnome 2.8 supports ~/.icons but not XDG_DATA_HOME if need_dot_icon_path ; then dot_icon_dir="$HOME/.icons" dot_base_dir="$dot_icon_dir/$theme" fi else xdg_base_dir="$xdg_global_dir" if [ -z "$xdg_base_dir" ] ; then exit_failure_operation_impossible "No writable system icon directory found." 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 if [ -n "$dot_icon_dir" ] ; then if [ -d "$dot_icon_dir/" ] && [ ! -L "$dot_icon_dir" ] ; then update_icon_database "$dot_base_dir" fi fi 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 xdg_size_name= extension= if [ -z "$size" ] ; then exit_failure_syntax "the icon size must be specified with --size" fi xdg_size_name="${size}x${size}" if [ x"$action" = x"install" ] ; then case "$icon_file" in *.xpm) extension="xpm" ;; *.png) extension="png" ;; *) exit_failure_syntax "icon file to install must be a *.png or *.xpm file" ;; esac fi if [ -n "$icon_name" ] ; then case "$icon_name" in *.png) exit_failure_syntax "icon name should not include an extension" ;; *.xpm) exit_failure_syntax "icon name should not include an extension" ;; esac fi # Start KDE legacy workaround section need_kde_icon_path() { local path path="$(xdg_realpath "$1")" 2> /dev/null # 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${KDE_SESSION_VERSION}-config --path icon 2> /dev/null |sed 's/:/ /g'` DEBUG 3 "kde_icon_dirs: $kde_icon_dirs" if [ -z "$kde_icon_dirs" ] ; then DEBUG 3 "no result from kde${KDE_SESSION_VERSION}-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 for y in $kde_icon_dirs ; do x="$(xdg_realpath "$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 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_icon_dir=`kde${KDE_SESSION_VERSION}-config --path icon | cut -d ':' -f 1` kde_user_dir="$kde_user_icon_dir/$theme" kde_dir="$kde_user_dir/$xdg_size_name/$context" fi #Gnome 2.8 supports ~/.icons but not XDG_DATA_HOME if [ -n "$dot_icon_dir" ] ; then if [ -L "$dot_icon_dir" ] ; then # Don't do anything dot_icon_dir= elif [ ! -d "$dot_icon_dir/" ] ; then # Symlink if it doesn't exist eval 'ln -s ".local/share/icons" "$dot_icon_dir"'$xdg_redirect_output dot_icon_dir= else dot_icon_dir="$dot_icon_dir/$theme/$xdg_size_name/$context" fi 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" | sed 's/\.[a-z][a-z][a-z]$//'` if [ "$vendor" = "true" ] && [ "$action" = "install" ] && [ "$context" = "apps" ] ; then check_vendor_prefix "$icon_name" "icon name" fi icon_icon_file=`echo "$icon_file" | sed 's/\.[a-z][a-z][a-z]$/.icon/'` icon_icon_name="$icon_name.icon" DEBUG 1 "$action icon in $xdg_dir" [ "$action" = "install" ] && [ -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)" [ "$action" = "install" ] && [ -n "$dot_icon_dir" ] && DEBUG 1 "$action ~/.icons symlink (GNOME 2.8 support)" case "$action" in install) save_umask=`umask` umask $my_umask for icon_dir in "$xdg_dir" "$dot_icon_dir"; do [ -z "$icon_dir" ] && continue mkdir -p "$icon_dir" eval 'cp "$icon_file" "$icon_dir/$icon_name.$extension"'$xdg_redirect_output if [ -f "$icon_icon_file" ] ; then eval 'cp "$icon_icon_file" "$icon_dir/$icon_icon_name"'$xdg_redirect_output fi if [ -n "$need_gnome_mime" ] ; then eval 'ln -s "$icon_name.$extension" "$icon_dir/gnome-mime-$icon_name.$extension"'$xdg_redirect_output fi done if [ -n "$kde_dir" ] ; then mkdir -p "$kde_dir" eval 'ln -s "$xdg_dir/$icon_name.$extension" "$kde_dir/$icon_name.$extension"'$xdg_redirect_output fi umask $save_umask ;; uninstall) for icon_dir in "$xdg_dir" "$dot_icon_dir"; do [ -z "$icon_dir" ] && continue rm -f "$icon_dir/$icon_name.xpm" "$icon_dir/$icon_name.png" rm -f "$icon_dir/$icon_icon_name" if [ -n "$need_gnome_mime" ] ; then rm -f "$icon_dir/gnome-mime-$icon_name.xpm" rm -f "$icon_dir/gnome-mime-$icon_name.png" fi done if [ -n "$kde_dir" ] ; then rm -f "$kde_dir/$icon_name.xpm" "$kde_dir/$icon_name.png" fi ;; esac if [ x"$update" = x"yes" ] ; then update_icon_database "$xdg_base_dir" if [ -n "$dot_icon_dir" ] ; then if [ -d "$dot_icon_dir/" ] && [ ! -L "$dot_icon_dir" ] ; then update_icon_database "$dot_base_dir" fi fi fi exit_success