| #!/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 | |
| StartupWMClass=Wine | |
| 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/ { | |
| RSTART=index($0,">") | |
| if (RSTART>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 |