blob: 07334dc7ae352af94c4b913a85e3a62ef2e2437d [file] [log] [blame]
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +00001#!/bin/sh
2#
3# Create menu/desktop entries for an application
4# This is used by the IShellLink interface
5#
6# Copyright 2000 Alexandre Julliard
Vitaliy Margolenda367622006-11-24 13:53:29 -07007# Copyright 2006 Vitaliy Margolen
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +00008#
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00009# This library is free software; you can redistribute it and/or
10# modify it under the terms of the GNU Lesser General Public
11# License as published by the Free Software Foundation; either
12# version 2.1 of the License, or (at your option) any later version.
13#
14# This library is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17# Lesser General Public License for more details.
18#
19# You should have received a copy of the GNU Lesser General Public
20# License along with this library; if not, write to the Free Software
Jonathan Ernst360a3f92006-05-18 14:49:52 +020021# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000022#
23
Bill Medlandd5739ed2005-12-19 21:25:52 +010024# Note that the link is a relative unix-style path name. Since the / character
25# is not valid in Windows filenames it is an adequate separator to show the
Vitaliy Margolenda367622006-11-24 13:53:29 -070026# menu structure.
Bill Medlandd5739ed2005-12-19 21:25:52 +010027
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000028mode=""
29args=""
30menu=""
31icon=""
32descr=""
33link=""
34path=""
35workdir=""
36
37usage()
38{
39 cat <<EOF
40usage: wineshelllink options
41
42options:
43 --desktop create a desktop link
44 --menu create a menu entry
45 --path xx path to the application
Bill Medlandd5739ed2005-12-19 21:25:52 +010046 --link xx name of link to create, including path
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000047 --args xx command-line arguments for the application
48 --icon xx icon to display
49 --workdir xx working directory for the application
50 --descr xx application description
51
52EOF
Francois Gougetbc4f8f92003-09-30 00:28:13 +000053 exit 2
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000054}
55
Jeremy White8dad1d82001-01-17 20:17:03 +000056if [ $# -eq 0 ] ; then
57 usage
58fi
59
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000060while [ $# -gt 0 ]
61do
62 case "$1" in
Simon Walton44b15b182001-12-14 22:45:06 +000063 --desktop) mode="desktop"; shift 1 ;;
64 --menu) mode="menu"; shift 1 ;;
65 --path) path="$2"; shift 2 ;;
66 --link) link="$2"; shift 2 ;;
67 --args) args="$2"; shift 2 ;;
68 --icon) icon="$2"; shift 2 ;;
69 --descr) descr="$2"; shift 2 ;;
70 --workdir) workdir="$2"; shift 2 ;;
71 *) usage ;;
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000072 esac
73done
74
Francois Gougetbc4f8f92003-09-30 00:28:13 +000075if [ -z "$mode" ] ; then
76 echo "Either --desktop or --menu required"
Jeremy White8dad1d82001-01-17 20:17:03 +000077 usage
78fi
79
Francois Gougetbc4f8f92003-09-30 00:28:13 +000080if [ -z "$link" ] ; then
81 echo "You must specify a link name with --link"
Jeremy White8dad1d82001-01-17 20:17:03 +000082 usage
83fi
84
Vitaliy Margolenda367622006-11-24 13:53:29 -070085desktop_entry()
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000086{
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000087 cat <<EOF
88[Desktop Entry]
Vitaliy Margolenda367622006-11-24 13:53:29 -070089Name=$linkname
Marcus Meissnercb54fe62004-09-27 20:32:50 +000090Exec=wine "$path" $args
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000091Type=Application
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000092EOF
Vitaliy Margolenda367622006-11-24 13:53:29 -070093 [ -z "$descr" ] || echo "Comment=$descr"
Vitaly Lipatov5072fd42006-03-26 19:06:54 +040094 [ -z "$workdir" ] || echo "Path=$workdir"
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +000095 [ -z "$xpmicon" ] || echo "Icon=$xpmicon"
96}
97
Vitaliy Margolenda367622006-11-24 13:53:29 -070098directory_entry()
Dusan Lacko8e44ba12001-11-20 18:53:33 +000099{
Vitaliy Margolenda367622006-11-24 13:53:29 -0700100 cat <<EOF
101[Desktop Entry]
102Type=Directory
103EOF
104 if [ "$1" == "wine" ] ; then
105 echo "Name=Wine"
106 echo "Icon=wine"
107 else
108 echo "Name=$1"
109 echo "Icon=folder"
110 fi
Dusan Lacko8e44ba12001-11-20 18:53:33 +0000111}
112
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000113# copy the icon file to a specified dir and set xpmicon to the resulting path
114copy_icon()
115{
Vitaliy Margolenda367622006-11-24 13:53:29 -0700116 if [ -f "$icon" ]
117 then
118 xpmicon=`basename "$icon" .xpm`
119
120 mkdir -p "$1"
121 cp "$icon" "$1/$xpmicon.xpm"
122 else
123 xpmicon=""
124 fi
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000125}
126
Vitaliy Margolenda367622006-11-24 13:53:29 -0700127# XDG
Dusan Lacko8e44ba12001-11-20 18:53:33 +0000128
Vitaliy Margolenda367622006-11-24 13:53:29 -0700129xdg_config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/menus/applications-merged"
130xdg_data_dir="${XDG_DATA_HOME:-$HOME/.local/share}"
Dusan Lacko8e44ba12001-11-20 18:53:33 +0000131
Vitaliy Margolenda367622006-11-24 13:53:29 -0700132# Create common directories
133mkdir -p "$xdg_config_dir"
134mkdir -p "$xdg_data_dir/desktop-directories"
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000135
Vitaliy Margolenda367622006-11-24 13:53:29 -0700136get_menu_entries()
137{
138 tmp="$xdg_config_dir/$1.menu"
Jeremy White8dad1d82001-01-17 20:17:03 +0000139
Vitaliy Margolenda367622006-11-24 13:53:29 -0700140 if [ -r "$tmp" ] ; then
141 awk '
142BEGIN { RS="<" }
143/^Filename/ {
144 if (match($0,/>/)) {
145 print substr($0,RSTART+1)
146 }
147}' $tmp
Dustin Navea35ba7b92002-04-29 19:33:09 +0000148 fi
Vitaliy Margolenda367622006-11-24 13:53:29 -0700149}
Dustin Navea35ba7b92002-04-29 19:33:09 +0000150
Vitaliy Margolenda367622006-11-24 13:53:29 -0700151# Input
152# menu file name
153# new item
154write_menu_file()
155{
156 tmpfile=`mktemp`
157 (
158 echo '<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN"'
159 echo '"http://www.freedesktop.org/standards/menu-spec/menu-1.0.dtd">'
160 echo '<Menu>'
161 echo ' <Name>Applications</Name>'
Dustin Navea35ba7b92002-04-29 19:33:09 +0000162
Vitaliy Margolenda367622006-11-24 13:53:29 -0700163 IFS="-"
Marcus Meissnerb686a902001-03-08 01:12:52 +0000164
Vitaliy Margolenda367622006-11-24 13:53:29 -0700165 fullname='wine'
166 for i in $1; do
167 echo " <Menu>"
168 echo " <Name>$fullname-$i</Name>"
169 echo " <Directory>$fullname-$i.directory</Directory>"
Dustin Navea9df2e562002-05-23 16:31:22 +0000170
Vitaliy Margolenda367622006-11-24 13:53:29 -0700171 dir_file_name="$xdg_data_dir/desktop-directories/$fullname-$i.directory"
172 if [ ! -f "$dir_file_name" ] ; then
173 directory_entry "$i" > "$dir_file_name"
174 fi
175 test "$i" = "wine" || fullname="$fullname-$i"
176 done
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000177
Vitaliy Margolenda367622006-11-24 13:53:29 -0700178 echo " <Include>"
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000179
Vitaliy Margolenda367622006-11-24 13:53:29 -0700180 IFS="
181"
182 for i in $(get_menu_entries "$1"); do
183 test "$i" = "$2" && continue
184 echo " <Filename>$i</Filename>"
185 done
186
187 # New record
188 echo " <Filename>$2</Filename>"
189 echo " </Include>"
190
191 IFS='-'
192 for i in $1; do
193 echo " </Menu>"
194 done
195 echo '</Menu>'
196 ) > $tmpfile
197 chmod 0600 $tmpfile
198
199 mv -f $tmpfile "$xdg_config_dir/$1.menu"
200}
201
202
203copy_icon "$xdg_data_dir/icons"
204
205linkname=`basename "$link"`
206
207if [ $mode = "menu" ] ; then
208 mkdir -p "$xdg_data_dir/applications/wine/`dirname "$link"`"
209
210 linkpath=`dirname "$link" | sed 's!/!-!g'`
211 if [ "$linkpath" == "." ] ; then
212 linkpath=""
213 else
214 linkpath="-$linkpath"
215 fi
216
217 desktop_entry > "$xdg_data_dir/applications/wine/$link.desktop"
218 write_menu_file "wine$linkpath" "wine$linkpath-$linkname.desktop"
219else
220 desktop_entry > "$HOME/Desktop/$linkname.desktop"
Alexandre Julliarde2b4efb2000-11-02 20:22:07 +0000221fi
222
223exit 0