233 lines
5.3 KiB
Bash
Executable File
233 lines
5.3 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# Create menu/desktop entries for an application
|
|
# This is used by the IShellLink interface
|
|
#
|
|
# Copyright 2000 Alexandre Julliard
|
|
# Copyright 2006 Vitaliy Margolen
|
|
#
|
|
# 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, 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.
|
|
|
|
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
|
|
|
|
desktop_entry()
|
|
{
|
|
cat <<EOF
|
|
[Desktop Entry]
|
|
Name=$linkname
|
|
Exec=env WINEPREFIX="${WINEPREFIX:-$HOME/.wine}" wine "$path" $args
|
|
Type=Application
|
|
EOF
|
|
[ -z "$descr" ] || echo "Comment=$descr"
|
|
[ -z "$workdir" ] || echo "Path=$workdir"
|
|
[ -z "$xpmicon" ] || echo "Icon=$xpmicon"
|
|
}
|
|
|
|
directory_entry()
|
|
{
|
|
cat <<EOF
|
|
[Desktop Entry]
|
|
Type=Directory
|
|
EOF
|
|
if [ "$1" = "wine" ] ; then
|
|
echo "Name=Wine"
|
|
echo "Icon=wine"
|
|
else
|
|
echo "Name=$1"
|
|
echo "Icon=folder"
|
|
fi
|
|
}
|
|
|
|
# copy the icon file to a specified dir and set xpmicon to the resulting path
|
|
copy_icon()
|
|
{
|
|
if [ -f "$icon" ]
|
|
then
|
|
xpmicon=`basename "$icon" .xpm`
|
|
|
|
mkdir -p "$1"
|
|
cp "$icon" "$1/$xpmicon.xpm"
|
|
else
|
|
xpmicon=""
|
|
fi
|
|
}
|
|
|
|
# XDG
|
|
|
|
xdg_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/menus/applications-merged"
|
|
xdg_data_dir="${XDG_DATA_HOME:-$HOME/.local/share}"
|
|
|
|
# Create common directories
|
|
mkdir -p "$xdg_config_dir"
|
|
mkdir -p "$xdg_data_dir/desktop-directories"
|
|
|
|
get_menu_entries()
|
|
{
|
|
tmp="$xdg_config_dir/$1.menu"
|
|
|
|
if [ -r "$tmp" ] ; then
|
|
awk '
|
|
BEGIN { RS="<" }
|
|
/^Filename/ {
|
|
if (match($0,/>/)) {
|
|
print substr($0,RSTART+1)
|
|
}
|
|
}' $tmp
|
|
fi
|
|
}
|
|
|
|
# Input
|
|
# menu file name
|
|
# new item
|
|
write_menu_file()
|
|
{
|
|
menu=`echo "$1" | sed 's!/!-!g'`
|
|
filename=`echo "$2" | sed 's!/!-!g'`
|
|
|
|
tmpfile=`mktemp /tmp/wine.XXXXXX`
|
|
(
|
|
echo '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"'
|
|
echo '"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">'
|
|
echo '<Menu>'
|
|
echo ' <Name>Applications</Name>'
|
|
|
|
IFS="/"
|
|
|
|
fullname='wine'
|
|
for i in $1; do
|
|
echo " <Menu>"
|
|
echo " <Name>$fullname-$i</Name>"
|
|
echo " <Directory>$fullname-$i.directory</Directory>"
|
|
|
|
dir_file_name="$xdg_data_dir/desktop-directories/$fullname-$i.directory"
|
|
if [ ! -f "$dir_file_name" ] ; then
|
|
directory_entry "$i" > "$dir_file_name"
|
|
fi
|
|
test "$i" = "wine" || fullname="$fullname-$i"
|
|
done
|
|
|
|
echo " <Include>"
|
|
|
|
IFS="
|
|
"
|
|
for i in $(get_menu_entries "$menu"); do
|
|
test "$i" = "$filename" && continue
|
|
echo " <Filename>$i</Filename>"
|
|
done
|
|
|
|
# New record
|
|
echo " <Filename>$filename</Filename>"
|
|
echo " </Include>"
|
|
|
|
IFS='/'
|
|
for i in $1; do
|
|
echo " </Menu>"
|
|
done
|
|
echo '</Menu>'
|
|
) > $tmpfile
|
|
chmod 0600 $tmpfile
|
|
|
|
mv -f $tmpfile "$xdg_config_dir/$menu.menu"
|
|
}
|
|
|
|
|
|
copy_icon "$xdg_data_dir/icons"
|
|
|
|
linkname=`basename "$link"`
|
|
|
|
if [ $mode = "menu" ] ; then
|
|
mkdir -p "$xdg_data_dir/applications/wine/`dirname "$link"`"
|
|
|
|
linkpath=`dirname "$link"`
|
|
if [ "$linkpath" = "." ] ; then
|
|
linkpath=""
|
|
else
|
|
linkpath="/$linkpath"
|
|
fi
|
|
|
|
desktop_entry > "$xdg_data_dir/applications/wine/$link.desktop"
|
|
write_menu_file "wine$linkpath" "wine$linkpath/$linkname.desktop"
|
|
else
|
|
if [ -d "$HOME/Desktop" ]
|
|
then
|
|
desktop_target="$HOME/Desktop/$linkname.desktop"
|
|
else
|
|
desktop_target="$HOME/$linkname.desktop"
|
|
fi
|
|
desktop_entry > "$desktop_target"
|
|
fi
|
|
|
|
exit 0
|