Do not append empty ":" in LD_LIBRARY_PATH.
[wine/multimedia.git] / programs / winelauncher.in
blobdd26af572e6644729f5ebc95657ef7af09fa5975
1 #!/bin/sh
2 #------------------------------------------------------------------------------
3 # Winelauncher
4 # This shell script attempts to intelligently manage the process
5 # of launching a program with Wine. It adds some level of
6 # visual feedback to an end user.
8 # Usage:
9 # winelauncher [options] "<windows program> [program arguments]"
11 # This script is meant to be installed to /usr/bin/wine, and
12 # to be used to invoke a Windows executable.
13 # The options are passed through directly to Wine, and are
14 # documented in the Wine man page.
16 # Copyright (c) 2000 by Jeremy White for CodeWeavers
18 # This library is free software; you can redistribute it and/or
19 # modify it under the terms of the GNU Lesser General Public
20 # License as published by the Free Software Foundation; either
21 # version 2.1 of the License, or (at your option) any later version.
23 # This library is distributed in the hope that it will be useful,
24 # but WITHOUT ANY WARRANTY; without even the implied warranty of
25 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 # Lesser General Public License for more details.
28 # You should have received a copy of the GNU Lesser General Public
29 # License along with this library; if not, write to the Free Software
30 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #------------------------------------------------------------------------------
33 #------------------------------------------------------------------------------
34 # Primary configuration area - change this if you installed Wine to
35 # a different location
36 #------------------------------------------------------------------------------
37 WINEBIN=@bindir@
38 WINELIB=@libdir@
39 WINESERVER=
40 WINEDLLPATH=@dlldir@
42 #------------------------------------------------------------------------------
43 # Establish Color Scheme
44 #------------------------------------------------------------------------------
45 COLOR=' -xrm *.Command.background:darkgrey
46 -xrm *.Command.foreground:black
47 -xrm *.Text.background:black
48 -xrm *.Text.foreground:green
49 -xrm *.Form.background:grey
50 -xrm *.Form.foreground:green
51 -xrm *.foreground:green
52 -xrm *.background:black'
55 #------------------------------------------------------------------------------
56 # Locate either xmessage or gmessage, if we can.
57 #------------------------------------------------------------------------------
58 type xmessage >/dev/null 2>/dev/null
59 if [ $? -ne 0 ] ; then
60 # xmessage not found; make sure the user notices this error
61 # (GUI users wouldn't even notice if we printed the text on console !)
62 MSGFILE=`mktemp "/tmp/wine.xmessage.XXXXXX"`
63 cat > $MSGFILE <<EOF
64 Warning:
65 The Wine launcher is unable to find the xmessage program,
66 which it needs to properly notify you of Wine execution status
67 or problems.
69 This launcher script relies heavily on finding this tool,
70 and without it, it will behave very poorly.
72 We strongly recommend that you use your distribution's
73 software methods to locate xmessage, or alternatively
74 use your favourite internet search engine to find out
75 how you are supposed to install xmessage on your system.
76 EOF
78 # try to display message file with tons of different X11 editors
79 # until we find one that's installed and working
80 for EDITPRG in nedit gedit kedit gvim xemacs; do
81 type $EDITPRG >/dev/null 2>/dev/null
82 if [ $? -eq 0 ] ; then
83 # execute editor and exit if successful
84 $EDITPRG $MSGFILE && exit
86 done
88 # ok, we really give up now, this system is hosed ;-)
89 cat $MSGFILE
90 rm $MSGFILE
91 else
92 XMESSAGE="xmessage $COLOR"
95 launch_winesetup()
97 which winesetup
98 if [ $? -eq 0 ] ; then
99 winesetup
100 else
101 if [ -x /opt/wine/bin/winesetup ] ; then
102 /opt/wine/bin/winesetup
103 else
104 $XMESSAGE -title "Error" \
105 "Error: Unable to find winesetup in your PATH or in /opt/wine/bin:
106 I am not able to configure Wine.
108 If winesetup is being distributed in a separate package
109 that is not installed yet on your system, then please install this
110 package.
111 winesetup can also be downloaded from www.codeweavers.com.
113 If you choose to not use winesetup for configuration, then
114 you can find information on how to prepare a Wine config file manually
115 in the Wine README / README.gz file or in the Wine User Guide."
120 #------------------------------------------------------------------------------
121 # We're going to do a lot of fancy footwork below.
122 # Before we get started, it would be nice to know the argv0
123 # of the actual script we're running (and lets remove at least
124 # one level of symlinking).
125 #------------------------------------------------------------------------------
126 argv0_path=`which $0`
127 if [ -z $argv0_path ] ; then
128 argv0_path=$0
131 real_name=`find $argv0_path -type l -printf "%l\n"`
132 if [ ! $real_name ]; then
133 real_name=$argv0_path
134 elif [ ! -x $real_name ]; then
135 real_name=`find $argv0_path -printf "%h\n"`/$real_name
138 argv0_dir=`find $real_name -printf "%h\n"`
140 if [ -z $argv0_dir ] ; then
141 argv0_dir=.
144 #------------------------------------------------------------------------------
145 # Okay, now all that junk above was established at configure time.
146 # However, if this is an RPM install, they may have chosen
147 # to relocate this installation. If so, that stuff above
148 # is all broken and we should rejigger it.
149 #------------------------------------------------------------------------------
150 WINE_BIN_NAME=wine.bin
151 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
152 WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -n 1`
155 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
156 WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -n 1`
159 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
160 WINE_BIN_NAME=wine
161 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
162 WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -n 1`
165 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
166 WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -n 1`
170 if [ ! -r $WINELIB/libwine.so ] ; then
171 WINELIB=`find $argv0_dir -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -n 1`
174 if [ ! -r $WINELIB/libwine.so ] ; then
175 WINELIB=`find $argv0_dir/../ -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -n 1`
178 if [ -x $WINEBIN/wineserver ] ; then
179 WINESERVER=$WINEBIN/wineserver
182 #------------------------------------------------------------------------------
183 # Hey, if we built Wine from source, let's add a little extra fun to
184 # mix it up a bit
185 #------------------------------------------------------------------------------
186 if [ -x $WINEBIN/server/wineserver ] ; then
187 WINESERVER=$WINEBIN/server/wineserver
190 if [ -r $WINELIB/dlls/ntdll.dll.so ] ; then
191 WINEDLLPATH=$WINELIB/dlls
195 #------------------------------------------------------------------------------
196 # Okay, set the paths and move on.
197 #------------------------------------------------------------------------------
198 if [ -n "$LD_LIBRARY_PATH" ]; then
199 export LD_LIBRARY_PATH=$WINELIB:$LD_LIBRARY_PATH
200 else
201 export LD_LIBRARY_PATH=$WINELIB
203 export PATH=$WINEBIN:$PATH
204 export WINELOADER=$WINEBIN/$WINE_BIN_NAME
205 export WINEDLLPATH
206 export WINESERVER
208 info_flag=~/.wine/.no_prelaunch_window_flag
209 debug_flag=~/.wine/.no_debug_window_flag
210 debug_options="warn+all"
212 if [ -f $info_flag ] ; then
213 use_info_message=0
214 else
215 use_info_message=1
218 if [ -f $debug_flag ] ; then
219 use_debug_message=0
220 else
221 use_debug_message=1
225 #------------------------------------------------------------------------------
226 # Handle winelib apps going through here
227 #------------------------------------------------------------------------------
228 winelib=0
229 if [ -f $argv0_path.so ] ; then
230 winelib=1
231 export WINEPRELOAD=$argv0_path.so
235 #------------------------------------------------------------------------------
236 # No arguments? Help 'em out
237 #------------------------------------------------------------------------------
238 always_see_output=0
239 no_args=0
240 if [ $# -eq 0 ] ; then
241 no_args=1
244 if [ $# -eq 1 -a "$1" = "" ] ; then
245 no_args=1
248 if [ $winelib -eq 1 ] ; then
249 no_args=0
252 if [ $no_args -eq 1 ] ; then
253 echo "Wine called with no arguments."
254 echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..."
255 $XMESSAGE -buttons " Okay ":0," See the Wine Usage Statement ":1," Configure Wine ":2 \
256 -title "Welcome to Wine" \
259 You have started Wine without specifying any arguments.
261 Wine requires at least one argument - the name of the Windows
262 application you would like to run.
264 If you have launched this through the KDE menu system
265 and your KDE installation is specially configured for Wine,
266 then you can use the KDE file browser to select a Windows
267 executable and then click on it to launch Wine with
268 that application.
270 You can similarly use the GNOME file manager to
271 select a Windows executable and double click on it.
273 If you would like to see the command line arguments
274 for Wine, select the second option, below.
277 welcome_rc=$?
278 if [ $welcome_rc -eq 0 ] ; then
279 exit
282 if [ $welcome_rc -eq 2 ] ; then
283 launch_winesetup
284 exit
287 use_info_message=0
288 always_see_output=1
291 #------------------------------------------------------------------------------
292 # No config file? Offer to help 'em out...
293 #------------------------------------------------------------------------------
294 conf=0
296 while [ $conf -eq 0 ] ; do
298 if [ -f ~/.winerc ] ; then
299 conf=1
301 if [ -f ~/.wine/config ] ; then
302 conf=2
304 if [ -f /etc/wine.conf ] ; then
305 conf=3
308 if [ $conf -ne 0 ] ; then
309 break;
312 echo "No configuration file detected."
313 $XMESSAGE -buttons " Cancel ":0," Proceed ":1," Configure Wine ":2 \
314 -title "Welcome to Wine" \
317 You have started Wine, but we cannot find a Wine
318 configuration file.
320 This is normal if you have never run Wine before.
321 If this is the case, select the 'Configure Wine'
322 option, below, to create a configuration file.
325 init_rc=$?
326 if [ $init_rc -eq 0 ] ; then
327 exit
330 if [ $init_rc -eq 1 ] ; then
331 break
334 if [ $init_rc -eq 2 ] ; then
335 launch_winesetup
338 # 127 == xmessage not available
339 if [ $init_rc -eq 127 ] ; then
340 exit
343 done
345 #------------------------------------------------------------------------------
346 # Optionally Warn the user we're going to be launching Wine...
347 #------------------------------------------------------------------------------
348 if [ $use_info_message -ne 0 ] ; then
349 echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..."
350 $XMESSAGE -timeout 30 -buttons " Dismiss ":0," Never display this message again ":3 \
351 -title "Wine Launch Window" \
352 "Invoking $WINEBIN/$WINE_BIN_NAME $@ ...
354 This dialog box is a temporary status dialog to let you know
355 that Wine is attempting to launch your application.
357 Since Wine is still very much in a development stage,
358 many applications will fail silently.
359 This dialog box is your indication
360 that we're *trying* to run your application.
362 This dialog box will automatically disappear after 30 seconds,
363 or after your application finishes.
365 You can permanently disable this dialog by selecting
366 the option below.
368 info_message_pid=$!
371 #------------------------------------------------------------------------------
372 # Here's a little function to clean up after that dialog...
373 #------------------------------------------------------------------------------
374 clean_up_info_message ()
376 if [ $use_info_message -ne 0 ] ; then
378 #------------------------------------------------------------------------------
379 # Okay, make sure that the notice window is dead (and kill it if it ain't)
380 #------------------------------------------------------------------------------
381 ps $info_message_pid >/dev/null 2>&1
382 if [ $? -ne 0 ] ; then
383 wait $info_message_pid
384 info_return=$?
385 else
386 info_return=0
387 kill $info_message_pid
390 #------------------------------------------------------------------------------
391 # If they didn't like the warning window, turn it off
392 #------------------------------------------------------------------------------
393 if [ $info_return -eq 3 ] ; then
394 $XMESSAGE -title "Wine Prelaunch Control" \
395 "Wine will now disable the prelaunch window you just saw.
396 You will no longer be notified when Wine is attempting
397 to start a Windows application.
399 Please take note that you can reenable this window
400 by removing the $info_flag file." -buttons " Okay ":0," Cancel ":1
401 if [ $? -eq 0 ] ; then
402 touch $info_flag
407 use_info_message=0
409 #------------------------------------------------------------------------------
410 # Generate a temporary log file name
411 #------------------------------------------------------------------------------
412 if [ -n "$TMP" ] ; then
413 log_dir="$TMP"
414 else
415 log_dir="/tmp"
417 use_log_name=0
418 log_name=`mktemp "$log_dir/wine.log.XXXXXX"`
419 if [ $? -eq 0 ] ; then
420 use_log_name=1
422 use_status_name=0
423 status_name=`mktemp "$log_dir/wine.status.XXXXXX"`
424 if [ $? -eq 0 ] ; then
425 use_status_name=1
428 #------------------------------------------------------------------------------
429 # Okay, really launch Wine...
430 #------------------------------------------------------------------------------
431 if [ $use_log_name -ne 0 -a $use_status_name -ne 0 ] ; then
432 ( $WINEBIN/$WINE_BIN_NAME "$@"; echo $? >$status_name ) 2>&1 | tee "$log_name"
433 wine_return=`cat $status_name`
434 else
435 $WINEBIN/$WINE_BIN_NAME "$@"
436 wine_return=$?
438 if [ $use_status_name -ne 0 ] ; then
439 rm -f $status_name
442 #------------------------------------------------------------------------------
443 # Test the return code, and see if it fails
444 #------------------------------------------------------------------------------
445 if [ $always_see_output -eq 0 -a $wine_return -eq 0 ] ; then
446 echo "Wine exited with a successful status"
447 if [ $use_log_name -ne 0 ] ; then
448 rm -f "$log_name"
450 else
451 if [ $always_see_output -eq 0 ] ; then
452 echo "Wine failed with return code $wine_return"
455 #------------------------------------------------------------------------------
456 # Gracefully display a debug message if they like...
457 #------------------------------------------------------------------------------
458 while [ $use_debug_message -gt 0 ] ; do
460 #------------------------------------------------------------------------------
461 # Build up the menu of choices they can make...
462 #------------------------------------------------------------------------------
463 BUTTONS=' Okay :0'
464 if [ $use_log_name -ne 0 ] ; then
465 BUTTONS="$BUTTONS"', View Log :1'
468 BUTTONS="$BUTTONS"', Debug :2'
469 BUTTONS="$BUTTONS"', Configure :4'
470 BUTTONS="$BUTTONS"', Disable :3'
472 #------------------------------------------------------------------------------
473 # Build an error message
474 #------------------------------------------------------------------------------
475 MESSAGE="
476 Wine has exited with a failure status of $wine_return.
478 Wine is still development software, so there can be many
479 explanations for this problem.
481 You can choose to run Wine again with a higher level
482 of debug messages (the debug option, below).
484 You can attempt to reconfigure Wine to make it work better.
485 Note that one change you can make that will dramatically
486 effect Wine's behaviour is to change whether or not
487 Wine uses a true Windows partition, mounted under Linux,
488 or whether it uses an empty Windows directory.
489 The Wine Configuration program can assist you in making
490 those changes (select Configure, below, for more).
492 You can disable this message entirely by selecting the
493 Disable option below."
495 if [ $always_see_output -ne 0 -a $wine_return -eq 0 ] ; then
496 MESSAGE="
497 Wine has exited with a failure status of $wine_return.
499 You can disable this message entirely by selecting the
500 Disable option below."
504 if [ $use_log_name -ne 0 ] ; then
505 MESSAGE="$MESSAGE
507 Wine has captured a log of the Wine output in the file $log_name.
508 You may view this file by selecting View Log, below."
511 #------------------------------------------------------------------------------
512 # Display the message
513 #------------------------------------------------------------------------------
514 $XMESSAGE -title "Wine Finished With Error" -buttons "$BUTTONS" "$MESSAGE"
515 debug_return=$?
517 #------------------------------------------------------------------------------
518 # Dismiss the other window...
519 #------------------------------------------------------------------------------
520 clean_up_info_message
522 #------------------------------------------------------------------------------
523 # Process a configure instruction
524 #------------------------------------------------------------------------------
525 if [ $debug_return -eq 4 ] ; then
526 launch_winesetup
527 continue;
530 #------------------------------------------------------------------------------
531 # Process a view instruction
532 #------------------------------------------------------------------------------
533 if [ $debug_return -eq 1 ] ; then
534 $XMESSAGE -title "View Wine Log" -file "$log_name" -buttons " Okay ":0,"Delete $log_name":1
535 if [ $? -eq 1 ] ; then
536 echo "Deleting $log_name"
537 rm -f "$log_name"
538 use_log_name=0
540 else
541 use_debug_message=0
544 #------------------------------------------------------------------------------
545 # If they didn't like the warning window, turn it off
546 #------------------------------------------------------------------------------
547 if [ $debug_return -eq 3 ] ; then
548 $XMESSAGE -title "Wine Debug Log Control" \
549 "Wine will now disable the Wine debug output control window you just saw.
550 You will no longer be notified when Wine fails to start a
551 Windows application.
553 Please take note that you can reenable this window
554 by removing the $debug_flag file." -buttons " Okay ":0," Cancel ":1
556 if [ $? -eq 0 ] ; then
557 touch $debug_flag
562 #------------------------------------------------------------------------------
563 # If they want to retry with debug, let 'em.
564 #------------------------------------------------------------------------------
565 if [ $debug_return -eq 2 ] ; then
566 echo "Rerunning WINEDEBUG=$debug_options $0 $@"
567 WINEDEBUG=$debug_options exec $0 "$@"
569 done
573 clean_up_info_message
575 # killed by signal?
576 if [ $wine_return -ge 128 ]; then
577 # try to kill myself with the same signal
578 kill -$[wine_return - 128] $$
579 # if we get here the kill didn't work
580 exit 1