| #!/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 |