#!/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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#

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
  --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

which 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 which 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
      which 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...
      which 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
