#!/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()
{
    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 "$1"); do
            test "$i" = "$2" && continue
            echo "      <Filename>$i</Filename>"
        done

        # New record
        echo "      <Filename>$2</Filename>"
        echo "    </Include>"

        IFS='-'
        for i in $1; do
            echo "  </Menu>"
        done
        echo '</Menu>'                        
    ) > $tmpfile
    chmod 0600 $tmpfile

    mv -f $tmpfile "$xdg_config_dir/$1.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" | sed 's!/!-!g'`
    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
