wine/tools/wineshelllink
2006-03-28 12:22:59 +02:00

257 lines
5.9 KiB
Bash
Executable file

#!/bin/sh
#
# Create menu/desktop entries for an application
# This is used by the IShellLink interface
#
# Copyright 2000 Alexandre Julliard
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# Note that the link is a relative unix-style path name. Since the / character
# is not valid in Windows filenames it is an adequate separator to show the
# menu structure. (This program may need to split the menu structure out for
# implementing xdg-style menus)
mode=""
args=""
menu=""
icon=""
descr=""
link=""
path=""
workdir=""
usage()
{
cat <<EOF
usage: wineshelllink options
options:
--desktop create a desktop link
--menu create a menu entry
--path xx path to the application
--link xx name of link to create, including path
--args xx command-line arguments for the application
--icon xx icon to display
--workdir xx working directory for the application
--descr xx application description
EOF
exit 2
}
if [ $# -eq 0 ] ; then
usage
fi
while [ $# -gt 0 ]
do
case "$1" in
--desktop) mode="desktop"; shift 1 ;;
--menu) mode="menu"; shift 1 ;;
--path) path="$2"; shift 2 ;;
--link) link="$2"; shift 2 ;;
--args) args="$2"; shift 2 ;;
--icon) icon="$2"; shift 2 ;;
--descr) descr="$2"; shift 2 ;;
--workdir) workdir="$2"; shift 2 ;;
*) usage ;;
esac
done
if [ -z "$mode" ] ; then
echo "Either --desktop or --menu required"
usage
fi
if [ -z "$link" ] ; then
echo "You must specify a link name with --link"
usage
fi
kde_entry()
{
xname=`basename "$link"`
cat <<EOF
# KDE Config File
[KDE Desktop Entry]
Name=$xname
Exec=wine '$path' $args
Type=Application
Comment=$descr
EOF
[ -z "$workdir" ] || echo "Path=\"$workdir\""
[ -z "$xpmicon" ] || echo "Icon=$xpmicon"
}
gnome_entry()
{
xname=`basename "$link"`
cat <<EOF
[Desktop Entry]
Name=$xname
Exec=wine "$path" $args
Type=Application
Comment=$descr
EOF
[ -z "$workdir" ] || echo "Path=$workdir"
[ -z "$xpmicon" ] || echo "Icon=$xpmicon"
}
mdk_entry()
{
base=`basename "$link"`
section=`dirname "$link"`
[ -z "$icon" ] || xicon="icon=\"$xpmicon\""
pathmenu=`echo "$path" | sed 's+\\\\+\\\\\\\\+g'`
echo "?package(local.Wine):needs=x11 section=\"/Wine/$section\" title=\"$base\" longtitle=\"$descr\" command=\"wine '$pathmenu' $args\" $xicon"
}
# copy the icon file to a specified dir and set xpmicon to the resulting path
copy_icon()
{
dir="$1"
mkdir -p "$dir"
mkdir -p "$dir/""`dirname "$link"`" || true
if [ -f "$icon" ]
then
cp "$icon" "$dir/$link.xpm"
xpmicon="$dir/$link.xpm"
else
xpmicon=""
fi
}
# Debian/Mandrake
type update-menus > /dev/null 2>&1
if [ $? = 0 -a $mode = "menu" ]
then
iconname="`basename "$link"`.xpm"
dir="$HOME/.menu/icons"
if [ -f "$icon" ]
then
mkdir -p "$dir"
cp "$icon" "$dir/$iconname"
xpmicon="$dir/$iconname"
else
xpmicon=""
fi
mdk_entry >> "$HOME/.menu/wine"
if [ -d "/usr/lib/menu" ] && [ -w "/usr/lib/menu" ]
then
mdk_entry >> "/usr/lib/menu/wine"
fi
update-menus > /dev/null 2>&1
fi
# KDE
if [ -d "$HOME/.kde" ]
then
kdeversion=0
if type kde-config >/dev/null 2>&1
then
kdeversion=`kde-config -v | grep KDE: | sed -n "s/^KDE: \([^.]*\)\..*$/\1/p"`
fi
if [ $kdeversion -ge 2 ]
then
copy_icon "$HOME/.kde/share/applnk/Wine"
if [ $mode = "menu" ]
then
gnome_entry > "$HOME/.kde/share/applnk/Wine/$link.desktop"
elif [ -d "$HOME/Desktop" ]
then
gnome_entry > "$HOME/Desktop/$link.desktop"
fi
else
copy_icon "$HOME/.kde/share/applnk/Wine"
if [ $mode = "menu" ]
then
kde_entry > "$HOME/.kde/share/applnk/Wine/$link.kdelnk"
# KDE 1.x kludge. Wake up KDE, if we can find kpanel running
type kwmcom >/dev/null 2>/dev/null && \
ps u -C kpanel >/dev/null 2>/dev/null && \
kwmcom kpanel:restart
elif [ -d "$HOME/Desktop" ]
then
kde_entry > "$HOME/Desktop/$link.kdelnk"
# KDE 1.x kludge: wake up KDE, if we can find kfm running...
type kfmclient >/dev/null 2>/dev/null && \
ps u -C kfm >/dev/null 2>/dev/null && \
kfmclient refreshDesktop
fi
fi
fi
if [ -d "$HOME/.kde2" ]
then
copy_icon "$HOME/.kde2/share/applnk/Wine"
if [ $mode = "menu" ]
then
gnome_entry > "$HOME/.kde2/share/applnk/Wine/$link.desktop"
else
if [ -d "$HOME/Desktop2" ]
then
gnome_entry > "$HOME/Desktop2/$link.desktop"
fi
if [ -d "$HOME/Desktop" ]
then
gnome_entry > "$HOME/Desktop/$link.desktop"
fi
fi
fi
if [ -d "$HOME/.kde3/share/applnk" ]
then
copy_icon "$HOME/.kde3/share/applnk/Wine"
if [ $mode = "menu" ]
then
gnome_entry > "$HOME/.kde3/share/applnk/Wine/$link.desktop"
else
if [ -d "$HOME/Desktop3" ]
then
gnome_entry > "$HOME/Desktop3/$link.desktop"
fi
if [ -d "$HOME/Desktop2" ]
then
gnome_entry > "$HOME/Desktop2/$link.desktop"
fi
if [ -d "$HOME/Desktop" ]
then
gnome_entry > "$HOME/Desktop/$link.desktop"
fi
fi
fi
# Gnome
if [ -d "$HOME/.gnome" ]
then
copy_icon "$HOME/.gnome/apps/Wine"
if [ $mode = "menu" ]
then
gnome_entry > "$HOME/.gnome/apps/Wine/$link.desktop"
elif [ -d "$HOME/.gnome-desktop" ]
then
gnome_entry > "$HOME/.gnome-desktop/$link.desktop"
fi
fi
exit 0