2 #------------------------------------------------------------------------------
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.
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 #------------------------------------------------------------------------------
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"`
65 The Wine launcher is unable to find the xmessage program,
66 which it needs to properly notify you of Wine execution status
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.
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
88 # ok, we really give up now, this system is hosed ;-)
92 XMESSAGE
="xmessage $COLOR"
98 if [ $?
-eq 0 ] ; then
101 if [ -x /opt
/wine
/bin
/winesetup
] ; then
102 /opt
/wine
/bin
/winesetup
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
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
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
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
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
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
201 export LD_LIBRARY_PATH
=$WINELIB
203 export PATH
=$WINEBIN:$PATH
204 export WINELOADER
=$WINEBIN/$WINE_BIN_NAME
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
218 if [ -f $debug_flag ] ; then
225 #------------------------------------------------------------------------------
226 # Handle winelib apps going through here
227 #------------------------------------------------------------------------------
229 if [ -f $argv0_path.so
] ; then
231 export WINEPRELOAD
=$argv0_path.so
235 #------------------------------------------------------------------------------
236 # No arguments? Help 'em out
237 #------------------------------------------------------------------------------
240 if [ $# -eq 0 ] ; then
244 if [ $# -eq 1 -a "$1" = "" ] ; then
248 if [ $winelib -eq 1 ] ; then
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
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.
278 if [ $welcome_rc -eq 0 ] ; then
282 if [ $welcome_rc -eq 2 ] ; then
291 #------------------------------------------------------------------------------
292 # No config file? Offer to help 'em out...
293 #------------------------------------------------------------------------------
296 while [ $conf -eq 0 ] ; do
298 if [ -f ~
/.winerc
] ; then
301 if [ -f ~
/.wine
/config
] ; then
304 if [ -f /etc
/wine.conf
] ; then
308 if [ $conf -ne 0 ] ; then
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
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.
326 if [ $init_rc -eq 0 ] ; then
330 if [ $init_rc -eq 1 ] ; then
334 if [ $init_rc -eq 2 ] ; then
338 # 127 == xmessage not available
339 if [ $init_rc -eq 127 ] ; then
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
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
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
409 #------------------------------------------------------------------------------
410 # Generate a temporary log file name
411 #------------------------------------------------------------------------------
412 if [ -n "$TMP" ] ; then
418 log_name
=`mktemp "$log_dir/wine.log.XXXXXX"`
419 if [ $?
-eq 0 ] ; then
423 status_name
=`mktemp "$log_dir/wine.status.XXXXXX"`
424 if [ $?
-eq 0 ] ; then
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`
435 $WINEBIN/$WINE_BIN_NAME "$@"
438 if [ $use_status_name -ne 0 ] ; then
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
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 #------------------------------------------------------------------------------
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 #------------------------------------------------------------------------------
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
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
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"
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
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"
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
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
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 "$@"
573 clean_up_info_message
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