Yet another documentation/message text patch.
[wine] / tools / winelauncher.in
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.
7 #  
8 #   Usage:
9 #       winelauncher [options]  "<windows program> [program arguments]"
10 #
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.
15 #
16 #   Copyright (c) 2000 by Jeremy White for CodeWeavers
17 #       
18 #------------------------------------------------------------------------------
19
20 #------------------------------------------------------------------------------
21 #  Primary configuration area - change this if you installed Wine to
22 #    a location other than @prefix@
23 #------------------------------------------------------------------------------
24 prefix=@prefix@
25
26 #------------------------------------------------------------------------------
27 #  Secondary configuration area; change these at your own risk.
28 #------------------------------------------------------------------------------
29 exec_prefix=@exec_prefix@
30 WINEBIN=@bindir@
31 WINELIB=@libdir@
32 WINESERVER=
33 WINELIBDLLS=@libdir@
34
35 #------------------------------------------------------------------------------
36 #  Establish Color Scheme
37 #------------------------------------------------------------------------------
38 COLOR=' -xrm *.Command.background:darkgrey
39 -xrm *.Command.foreground:black
40 -xrm *.Text.background:black
41 -xrm *.Text.foreground:green 
42 -xrm *.Form.background:grey
43 -xrm *.Form.foreground:green
44 -xrm *.foreground:green
45 -xrm *.background:black'
46
47
48 #------------------------------------------------------------------------------
49 #  Locate either xmessage or gmessage, if we can.
50 #------------------------------------------------------------------------------
51 type xmessage >/dev/null 2>/dev/null
52 if [ $? -ne 0 ] ; then
53     echo "
54 Warning:
55    The Wine launcher is unable to find xmessage.
56
57    This launcher script relies heavily on finding this tool,
58    and without it, it will behave poorly.
59
60    Most Linux distributions have one or the other of these
61    tools.
62
63    We strongly recommend that you use your distribution's
64    software methods to locate xmessage."
65
66 else
67     XMESSAGE="xmessage $COLOR"
68 fi
69
70
71 #------------------------------------------------------------------------------
72 #  We're going to do a lot of fancy footwork below.
73 #    Before we get started, it would be nice to know the argv0
74 #    of the actual script we're running (and lets remove at least
75 #    one level of symlinking).
76 #------------------------------------------------------------------------------
77 argv0_path=`which $0`
78 if [ -z $argv0_path ] ; then
79     argv0_path=$0
80 fi
81
82 real_name=`find $argv0_path -type l -printf "%l\n"`
83 if [ ! $real_name ]; then
84     real_name=$argv0_path
85 elif [ ! -x $real_name ]; then
86     real_name=`find $argv0_path -printf "%h\n"`/$real_name
87 fi
88
89 argv0_dir=`find $real_name -printf "%h\n"`
90
91 if [ -z $argv0_dir ] ; then
92     argv0_dir=.
93 fi
94
95 #------------------------------------------------------------------------------
96 #  Okay, now all that junk above was established at configure time.
97 #   However, if this is an RPM install, they may have chosen
98 #   to relocate this installation.  If so, that stuff above
99 #   is all broken and we should rejigger it.
100 #------------------------------------------------------------------------------
101 WINE_BIN_NAME=wine.bin
102 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
103     WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1`
104 fi
105
106 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
107     WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1`
108 fi
109
110 if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
111     WINE_BIN_NAME=wine
112     if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
113         WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1`
114     fi
115
116     if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then
117         WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1`
118     fi
119 fi
120
121 if [ ! -r $WINELIB/libwine.so ] ; then
122     WINELIB=`find $argv0_dir -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -1`
123 fi
124
125 if [ ! -r $WINELIB/libwine.so ] ; then
126     WINELIB=`find $argv0_dir/../ -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -1`
127 fi
128
129 if [ -x $WINEBIN/wineserver ] ; then
130     WINESERVER=$WINEBIN/wineserver
131 fi
132
133 #------------------------------------------------------------------------------
134 #  Hey, if we built Wine from source, let's add a little extra fun to
135 #   mix it up a bit
136 #------------------------------------------------------------------------------
137 if [ -x $WINEBIN/server/wineserver ] ; then
138     WINESERVER=$WINEBIN/server/wineserver
139 fi
140
141 if [ -r $WINELIB/dlls/libntdll.so ] ; then
142     WINELIBDLLS=$WINELIB/dlls
143 fi
144
145
146 #------------------------------------------------------------------------------
147 #  Okay, set the paths and move on.
148 #------------------------------------------------------------------------------
149 export LD_LIBRARY_PATH=$WINELIB:$WINELIBDLLS:$LD_LIBRARY_PATH
150 export PATH=$WINEBIN:$PATH
151 export WINEDLLPATH=$WINELIBDLLS
152 export WINELOADER=$WINEBIN/$WINE_BIN_NAME
153
154 info_flag=~/.wine/.no_prelaunch_window_flag
155 debug_flag=~/.wine/.no_debug_window_flag
156 debug_options="-debugmsg warn+all"
157
158 if [ -f $info_flag ] ; then 
159     use_info_message=0
160 else
161     use_info_message=1
162 fi
163
164 if [ -f $debug_flag ] ; then 
165     use_debug_message=0
166 else
167     use_debug_message=1
168 fi
169
170
171 #------------------------------------------------------------------------------
172 #  Handle winelib apps going through here
173 #------------------------------------------------------------------------------
174 winelib=0
175 if [ -f $argv0_path.so ] ; then
176     winelib=1
177     export WINEPRELOAD=$argv0_path.so
178 fi
179
180
181 #------------------------------------------------------------------------------
182 #  No arguments?  Help 'em out
183 #------------------------------------------------------------------------------
184 always_see_output=0
185 no_args=0
186 if [ $# -eq 0 ] ; then
187     no_args=1
188 fi
189
190 if [ $# -eq 1 -a "$1" = "" ] ; then
191     no_args=1
192 fi
193
194 if [ $winelib -eq 1 ] ; then
195     no_args=0
196 fi
197
198 if [ $no_args -eq 1 ] ; then
199     echo "Wine called with no arguments."
200     echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..."
201     $XMESSAGE -buttons "    Okay    ":0," See the Wine Usage Statement ":1,"  Configure Wine  ":2 \
202         -title "Welcome to Wine" \
203         "
204
205         You have started Wine without specifying any arguments.
206
207         Wine requires a least one argument - the name of the Windows
208         application you would like to run.
209
210         If you have launched this through the KDE menu system,
211         you can use the KDE file browser to select a Windows
212         exectuable and then click on it to launch Wine with
213         that application.
214
215         You can similarly use the GNOME file manager to
216         select a Windows executable and double click on it.
217
218         If you would like to see the command line arguments
219         for Wine, select the second option, below.
220
221         " 
222     welcome_rc=$?
223     if [ $welcome_rc -eq 0 ] ; then
224         exit
225     fi
226
227     if [ $welcome_rc -eq 2 ] ; then
228         which winesetup
229         if [ $? -eq 0 ] ; then
230             winesetup
231         else
232             if [ -x /opt/wine/bin/winesetup ] ; then
233                 /opt/wine/bin/winesetup
234             else
235                 $XMESSAGE -title "Error" "Error:  Unable to find winesetup in your PATH or in /opt/wine/bin"
236             fi
237         fi
238         exit
239     fi
240
241     use_info_message=0
242     always_see_output=1
243 fi
244
245 #------------------------------------------------------------------------------
246 #  No config file?  Offer to help 'em out...
247 #------------------------------------------------------------------------------
248 conf=0
249
250 while [ $conf -eq 0 ] ; do
251
252     if [ -f ~/.winerc ] ; then
253         conf=1
254     fi
255     if [ -f ~/.wine/config ] ; then
256         conf=2
257     fi
258     if [ -f /etc/wine.conf ] ; then
259         conf=3
260     fi
261
262     if [ $conf -ne 0 ] ; then
263         break;
264     fi
265
266     echo "No configuration file detected."
267     $XMESSAGE -buttons "    Cancel    ":0,"  Proceed   ":1,"  Configure Wine  ":2 \
268         -title "Welcome to Wine" \
269         "
270
271         You have started Wine but we cannot find a Wine
272         configuration file.
273
274         This is normal if you have never run Wine before.
275         If this is the case, select the 'Configure Wine'
276         option, below, to create a configuration file.
277
278         " 
279     init_rc=$?
280     if [ $init_rc -eq 0 ] ; then
281         exit
282     fi
283
284     if [ $init_rc -eq 1 ] ; then
285         break
286     fi
287
288     if [ $init_rc -eq 2 ] ; then
289         which winesetup
290         if [ $? -eq 0 ] ; then
291             winesetup
292         else
293             if [ -x /opt/wine/bin/winesetup ] ; then
294                 /opt/wine/bin/winesetup
295             else
296                 $XMESSAGE -title "Error" "Error:  Unable to find winesetup in your PATH or in /opt/wine/bin"
297             fi
298         fi
299     fi
300
301 done
302
303 #------------------------------------------------------------------------------
304 #  Optionally Warn the user we're going to be launching Wine...
305 #------------------------------------------------------------------------------
306 if [ $use_info_message -ne 0 ] ; then
307     echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..."
308     $XMESSAGE -timeout 30 -buttons "    Dismiss    ":0," Never display this message again ":3 \
309         -title "Wine Launch Window" \
310         "Invoking $WINEBIN/$WINE_BIN_NAME $@ ...
311
312         This dialog box is a temporary status dialog to let you know
313         that Wine is attempting to launch your application.
314
315         Since Wine is still very much in a development stage, many
316         applications will fail silently.  This dialog box is your indication 
317         that we're *trying* to run your application.
318
319         This dialog box will automatically disappear after 30 seconds,
320         or after your application finishes.
321
322         You can permanently disable this dialog by selecting the option below.
323         " &
324     info_message_pid=$!
325 fi
326
327 #------------------------------------------------------------------------------
328 #  Here's a little function to clean up after that dialog...
329 #------------------------------------------------------------------------------
330 clean_up_info_message ()
331 {
332     if [ $use_info_message -ne 0 ] ; then
333
334         #------------------------------------------------------------------------------
335         #  Okay, make sure that the notice window is dead (and kill it if it ain't)
336         #------------------------------------------------------------------------------
337         ps $info_message_pid >/dev/null 2>&1
338         if [ $? -ne 0 ] ; then
339             wait $info_message_pid
340             info_return=$?
341         else
342             info_return=0
343             kill $info_message_pid
344         fi
345
346         #------------------------------------------------------------------------------
347         #  If they didn't like the warning window, turn it off
348         #------------------------------------------------------------------------------
349         if [ $info_return -eq 3 ] ; then
350             $XMESSAGE -title "Wine Prelaunch Control" \
351             "Wine will now disable the prelaunch Window you just saw.
352             You will no longer be notified when Wine is attempting
353             to start a Windows application.
354
355             You can reenable this Window by removing the $info_flag file." -buttons "  Okay  ":0," Cancel ":1
356             if [ $? -eq 0 ] ; then
357                 touch $info_flag
358             fi
359         fi
360     fi
361
362     use_info_message=0
363 }
364 #------------------------------------------------------------------------------
365 #  Generate a temporary log file name
366 #------------------------------------------------------------------------------
367 if [ -n "$TMP" ] ; then
368   log_dir="$TMP"
369 else
370   log_dir="/tmp"
371 fi
372 use_log_name=0
373 log_name=`mktemp "$log_dir/wine.log.XXXXXX"`
374 if [ $? -eq 0 ] ; then
375     use_log_name=1
376 fi
377 use_status_name=0
378 status_name=`mktemp "$log_dir/wine.status.XXXXXX"`
379 if [ $? -eq 0 ] ; then
380     use_status_name=1
381 fi
382
383 #------------------------------------------------------------------------------
384 #  Okay, really launch Wine...
385 #------------------------------------------------------------------------------
386 if [ $use_log_name -ne 0 -a $use_status_name -ne 0 ] ; then
387     ( $WINEBIN/$WINE_BIN_NAME "$@"; echo $? >$status_name ) 2>&1 | tee "$log_name"
388     wine_return=`cat $status_name`
389 else
390     $WINEBIN/$WINE_BIN_NAME "$@"
391     wine_return=$?
392 fi
393 if [ $use_status_name -ne 0 ] ; then
394     rm -f $status_name
395 fi
396
397 #------------------------------------------------------------------------------
398 #  Test the return code, and see if it fails
399 #------------------------------------------------------------------------------
400 if [ $always_see_output -eq 0 -a $wine_return -eq 0 ] ; then
401     echo "Wine exited with a successful status"
402     if [ $use_log_name -ne 0 ] ; then
403         rm -f "$log_name"
404     fi
405 else
406     if [ $always_see_output -eq 0 ] ; then
407         echo "Wine failed with return code $wine_return"
408     fi
409
410     #------------------------------------------------------------------------------
411     #  Gracefully display a debug message if they like...
412     #------------------------------------------------------------------------------
413     while [ $use_debug_message -gt 0 ] ; do
414
415         #------------------------------------------------------------------------------
416         #  Build up the menu of choices they can make...
417         #------------------------------------------------------------------------------
418         BUTTONS='    Okay    :0'
419         if [ $use_log_name -ne 0 ] ; then
420             BUTTONS="$BUTTONS"', View Log :1'
421         fi
422
423         BUTTONS="$BUTTONS"',  Debug  :2'
424         BUTTONS="$BUTTONS"',  Configure :4'
425         BUTTONS="$BUTTONS"',  Disable :3'
426
427         #------------------------------------------------------------------------------
428         #  Build an error message
429         #------------------------------------------------------------------------------
430         MESSAGE="
431 Wine has exited with a failure status of $wine_return.
432
433 Wine is still development software, so there can be many
434 explanations for this problem.  
435
436 You can choose to run Wine again with a higher level
437 of debug messages (the debug option, below).
438
439 You can attempt to reconfigure Wine to make it work better.
440 Note that one change you can make that will dramatically
441 effect Wine's behaviour is to change whether or not
442 Wine uses a true Windows partition, mounted under Linux,
443 or whether it uses an empty Windows directory.
444 The Wine Configuration program can assist you in making
445 those changes (select Configure, below, for more).
446
447 You can disable this message entirely by selecting the
448 Disable option below."
449
450         if [ $always_see_output -ne 0 -a $wine_return -eq 0 ] ; then
451             MESSAGE="
452 Wine has exited with a failure status of $wine_return.
453
454 You can disable this message entirely by selecting the
455 Disable option below."
456
457         fi
458
459         if [ $use_log_name -ne 0 ] ; then
460             MESSAGE="$MESSAGE
461
462 Wine has captured a log of the Wine output in the file $log_name.
463 You may view this file by selecting View Log, below."
464         fi
465
466         #------------------------------------------------------------------------------
467         #  Display the message
468         #------------------------------------------------------------------------------
469         $XMESSAGE -title "Wine Finished With Error" -buttons "$BUTTONS" "$MESSAGE"
470         debug_return=$?
471
472         #------------------------------------------------------------------------------
473         #  Dismiss the other window...
474         #------------------------------------------------------------------------------
475         clean_up_info_message
476
477         #------------------------------------------------------------------------------
478         #  Process a configure instruction
479         #------------------------------------------------------------------------------
480         if [ $debug_return -eq 4 ] ; then
481             which winesetup
482             if [ $? -eq 0 ] ; then
483                 winesetup
484             else
485                 if [ -x /opt/wine/bin/winesetup ] ; then
486                     /opt/wine/bin/winesetup
487                 else
488                     $XMESSAGE -title "Error" "Error:  Unable to find winesetup in your PATH or in /opt/wine/bin"
489                 fi
490             fi
491             continue;
492         fi
493
494         #------------------------------------------------------------------------------
495         #  Process a view instruction
496         #------------------------------------------------------------------------------
497         if [ $debug_return -eq 1 ] ; then
498             $XMESSAGE -title "View Wine Log" -file "$log_name" -buttons "  Okay  ":0,"Delete $log_name":1  
499             if [ $? -eq 1 ] ; then
500                 echo "Deleting $log_name"
501                 rm -f "$log_name"
502                 use_log_name=0
503             fi
504         else
505             use_debug_message=0
506         fi
507
508         #------------------------------------------------------------------------------
509         #  If they didn't like the warning window, turn it off
510         #------------------------------------------------------------------------------
511         if [ $debug_return -eq 3 ] ; then
512             $XMESSAGE -title "Wine Debug Log Control" \
513             "Wine will now disable the Wine debug output control window you just saw.
514             You will no longer be notified when Wine fails to start a
515             Windows application.
516
517             You can reenable this Window by removing the $debug_flag file." -buttons "  Okay  ":0," Cancel ":1
518
519             if [ $? -eq 0 ] ; then
520                 touch $debug_flag
521             fi
522
523         fi
524
525         #------------------------------------------------------------------------------
526         #  If they want to retry with debug, let 'em.
527         #------------------------------------------------------------------------------
528         if [ $debug_return -eq 2 ] ; then
529             echo "Rerunning $0 $debug_options $@"
530             exec $0 $debug_options "$@"
531         fi
532     done 
533 fi
534
535
536 clean_up_info_message
537
538 # killed by signal?
539 if [ $wine_return -ge 128 ]; then
540         # try to kill myself with the same signal
541         kill -$[wine_return - 128] $$
542         # if we get here the kill didn't work
543         exit 1