#!/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"`
        xpmicon=${xpmicon%.*}

        mkdir -p "$1"
        cp "$icon" "$1"
    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
