|  | #!/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=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` | 
|  | ( | 
|  | 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 | 
|  | desktop_entry > "$HOME/Desktop/$linkname.desktop" | 
|  | fi | 
|  |  | 
|  | exit 0 |