#!/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/ {
  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 /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
    desktop_entry > "$HOME/Desktop/$linkname.desktop"
fi

exit 0
