#!/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