#!/bin/sh
#
# Create menu/desktop entries for an application
# This is used by the IShellLink interface
#
# Copyright 2000 Alexandre Julliard
#
# 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.  (This program may need to split the menu structure out for
# implementing xdg-style menus)

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

kde_entry()
{
    xname=`basename "$link"`
    cat <<EOF
# KDE Config File
[KDE Desktop Entry]
Name=$xname
Exec=wine '$path' $args
Type=Application
Comment=$descr
EOF
    [ -z "$workdir" ] || echo "Path=\"$workdir\""
    [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
}

gnome_entry()
{
    xname=`basename "$link"`
    cat <<EOF
[Desktop Entry]
Name=$xname
Exec=wine "$path" $args
Type=Application
Comment=$descr
EOF
    [ -z "$workdir" ] || echo "Path=$workdir"
    [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
}

mdk_entry()
{
    base=`basename "$link"`
    section=`dirname "$link"`
    [ -z "$icon" ] || xicon="icon=\"$xpmicon\""
    pathmenu=`echo "$path" | sed 's+\\\\+\\\\\\\\+g'`
    echo "?package(local.Wine):needs=x11 section=\"/Wine/$section\" title=\"$base\" longtitle=\"$descr\" command=\"wine '$pathmenu' $args\" $xicon"
}

# copy the icon file to a specified dir and set xpmicon to the resulting path
copy_icon()
{
  dir="$1"
  mkdir -p "$dir"
  mkdir -p "$dir/""`dirname "$link"`" || true
  if [ -f "$icon" ]
  then
    cp "$icon" "$dir/$link.xpm"
    xpmicon="$dir/$link.xpm"
  else
    xpmicon=""
  fi
}

# Debian/Mandrake

type update-menus > /dev/null 2>&1
if [ $? = 0 -a $mode = "menu" ]
then
  iconname="`basename "$link"`.xpm"
  dir="$HOME/.menu/icons"
  if [ -f "$icon" ]
  then
    mkdir -p "$dir"
    cp "$icon" "$dir/$iconname"
    xpmicon="$dir/$iconname"
  else
    xpmicon=""
  fi
  mdk_entry >> "$HOME/.menu/wine"
  if [ -d "/usr/lib/menu" ] && [ -w "/usr/lib/menu" ]
  then
    mdk_entry >> "/usr/lib/menu/wine"
  fi
  update-menus > /dev/null 2>&1
fi

# KDE

if [ -d "$HOME/.kde" ]
then
  kdeversion=0
  if type kde-config >/dev/null 2>&1
  then
    kdeversion=`kde-config -v | grep KDE: | sed -n "s/^KDE: \([^.]*\)\..*$/\1/p"`
  fi

  if [ $kdeversion -ge 2 ]
  then
    copy_icon "$HOME/.kde/share/applnk/Wine"
    if [ $mode = "menu" ]
    then
      gnome_entry > "$HOME/.kde/share/applnk/Wine/$link.desktop"
    elif [ -d "$HOME/Desktop" ]
    then
      gnome_entry > "$HOME/Desktop/$link.desktop"
    fi
  else
    copy_icon "$HOME/.kde/share/applnk/Wine"
    if [ $mode = "menu" ]
    then
      kde_entry > "$HOME/.kde/share/applnk/Wine/$link.kdelnk"

      # KDE 1.x kludge.  Wake up KDE, if we can find kpanel running
      type kwmcom >/dev/null 2>/dev/null && \
        ps u -C kpanel >/dev/null 2>/dev/null && \
          kwmcom kpanel:restart

    elif [ -d "$HOME/Desktop" ]
    then
      kde_entry > "$HOME/Desktop/$link.kdelnk"
      #   KDE 1.x kludge:  wake up KDE, if we can find kfm running...
      type kfmclient >/dev/null 2>/dev/null && \
        ps u -C kfm >/dev/null 2>/dev/null  && \
          kfmclient refreshDesktop
    fi
  fi
fi

if [ -d "$HOME/.kde2" ]
then
  copy_icon "$HOME/.kde2/share/applnk/Wine"
  if [ $mode = "menu" ]
  then
    gnome_entry > "$HOME/.kde2/share/applnk/Wine/$link.desktop"
  else
    if [ -d "$HOME/Desktop2" ]
    then
      gnome_entry > "$HOME/Desktop2/$link.desktop"
    fi
    if [ -d "$HOME/Desktop" ]
    then
      gnome_entry > "$HOME/Desktop/$link.desktop"
    fi
  fi
fi

if [ -d "$HOME/.kde3/share/applnk" ]
then
  copy_icon "$HOME/.kde3/share/applnk/Wine"
  if [ $mode = "menu" ]
  then
    gnome_entry > "$HOME/.kde3/share/applnk/Wine/$link.desktop"
  else
    if [ -d "$HOME/Desktop3" ]
    then
      gnome_entry > "$HOME/Desktop3/$link.desktop"
    fi
    if [ -d "$HOME/Desktop2" ]
    then
      gnome_entry > "$HOME/Desktop2/$link.desktop"
    fi
    if [ -d "$HOME/Desktop" ]
    then
      gnome_entry > "$HOME/Desktop/$link.desktop"
    fi
  fi
fi

# Gnome

if [ -d "$HOME/.gnome" ]
then
  copy_icon "$HOME/.gnome/apps/Wine"
  if [ $mode = "menu" ]
  then
    gnome_entry > "$HOME/.gnome/apps/Wine/$link.desktop"
  elif [ -d "$HOME/.gnome-desktop" ]
  then
    gnome_entry > "$HOME/.gnome-desktop/$link.desktop"
  fi
fi

exit 0
