#!/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 StartupWMClass=Wine 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"` xpmicon=${xpmicon%.*} mkdir -p "$1" cp "$icon" "$1" 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