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