From 28fd558077ec7f210f2bd692b9f8c6367479f572 Mon Sep 17 00:00:00 2001 From: Jeremy White Date: Fri, 10 Nov 2000 22:35:06 +0000 Subject: [PATCH] Make winelauncher smarter about finding the Wine libraries and binaries. Change the color scheme. Handle launches with no arguments, correctly handle invocation as a mime-type handler from KDE. --- tools/winelauncher.in | 347 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 293 insertions(+), 54 deletions(-) diff --git a/tools/winelauncher.in b/tools/winelauncher.in index d54c57e7b4e..94ffba49aec 100755 --- a/tools/winelauncher.in +++ b/tools/winelauncher.in @@ -17,8 +17,6 @@ # #------------------------------------------------------------------------------ - - #------------------------------------------------------------------------------ # Primary configuration area - change this if you installed Wine to # a location other than @prefix@ @@ -31,9 +29,82 @@ prefix=@prefix@ exec_prefix=@exec_prefix@ WINEBIN=@bindir@ WINELIB=@libdir@ +WINESERVERBIN= +WINELIBDLLS= + +#------------------------------------------------------------------------------ +# Establish Color Scheme +#------------------------------------------------------------------------------ +COLOR=' -xrm *.Command.background:darkgrey +-xrm *.Command.foreground:black +-xrm *.Text.background:black +-xrm *.Text.foreground:green +-xrm *.Form.background:grey +-xrm *.Form.foreground:green +-xrm *.foreground:green +-xrm *.background:black' + + +XMESSAGE="xmessage $COLOR" + + +#------------------------------------------------------------------------------ +# We're going to do a lot of fancy footwork below. +# Before we get started, it would be nice to know the argv0, +# of the actual script we're running (and lets remove at least +# one level of symlinking). +#------------------------------------------------------------------------------ +real_name=`find $0 -type l -printf "%l\n"` +if [ ! $real_name ]; then + real_name=$0; +fi +argv0_dir=`find $real_name -printf "%h\n"` + +if [ -z $argv0_dir ] ; then + argv0_dir=. +fi + +#------------------------------------------------------------------------------ +# Okay, now all that junk above was established at configure time. +# However, if this is an RPM install, they may have chosen +# to relocate this installation. If so, that stuff above +# is all broken and we should rejigger it. +#------------------------------------------------------------------------------ +if [ ! -x $WINEBIN/wine ] ; then + WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name 'wine' -printf "%h\n" | head -1` +fi + +if [ ! -x $WINEBIN/wine ] ; then + WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name 'wine' -printf "%h\n" | head -1` +fi + +if [ ! -r $WINELIB/libwine.so ] ; then + WINELIB=`find $argv0_dir -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -1` +fi + +if [ ! -r $WINELIB/libwine.so ] ; then + WINELIB=`find $argv0_dir/../ -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -1` +fi + +#------------------------------------------------------------------------------ +# Hey, if we built Wine from source, let's add a little extra fun to +# mix it up a bit +#------------------------------------------------------------------------------ +if [ -x $WINEBIN/server/wineserver ] ; then + WINESERVERBIN=$WINEBIN/server +fi + +if [ -r $WINELIB/dlls/libuser.so ] ; then + WINELIBDLLS=$WINELIB/dlls +fi + + +#------------------------------------------------------------------------------ +# Okay, set the paths and move on. +#------------------------------------------------------------------------------ +export LD_LIBRARY_PATH=$WINELIB:$WINELIBDLLS:$LD_LIBRARY_PATH +export PATH=$WINEBIN:$WINESERVERBIN:$PATH -export LD_LIBRARY_PATH=$WINELIB:$LD_LIBRARY_PATH -export PATH=$WINEBIN:$PATH info_flag=~/.wine/.no_prelaunch_window_flag debug_flag=~/.wine/.no_debug_window_flag @@ -53,16 +124,127 @@ fi #------------------------------------------------------------------------------ +# No arguments? Help 'em out +#------------------------------------------------------------------------------ +always_see_output=0 +no_args=0 +if [ $# -eq 0 ] ; then + no_args=1 +fi + +if [ $# -eq 1 -a foo$1 = foo ] ; then + no_args=1 +fi + +if [ $no_args -eq 1 ] ; then + echo "Wine called with no arguments." + echo "Invoking $WINEBIN/wine $@ ..." + $XMESSAGE -buttons " Okay ":0," See the Wine Usage Statement ":1," Configure Wine ":2 \ + -title "Welcome to Wine" \ + " + + You have started Wine without specifying any arguments. + + Wine requires a least one argument - the name of the Windows + application you would like to run. + + If you have launched this through the KDE menu system, + you can use the KDE file browser to select a Windows + exectuable and then click on it to launch Wine with + that application. + + You can similarly use the GNOME file manager to + select a Windows executable and double click on it. + + If you would like to see the command line arguments + for Wine, select the second option, below. + + " + welcome_rc=$? + if [ $welcome_rc -eq 0 ] ; then + exit + fi + + if [ $welcome_rc -eq 2 ] ; then + which winesetup + if [ $? -eq 0 ] ; then + winesetup + else + if [ -x /opt/wine/bin/winesetup ] ; then + /opt/wine/bin/winesetup + else + $XMESSAGE -title "Error" "Error: Unable to find winesetup in your PATH or in /opt/wine/bin" + fi + fi + exit + fi + + use_info_message=0 + always_see_output=1 +fi + +#------------------------------------------------------------------------------ # Optionally Warn the user we're going to be launching Wine... #------------------------------------------------------------------------------ if [ $use_info_message -ne 0 ] ; then - echo "Invoking $WINEBIN/wine $* ..." - xmessage -timeout 10 -buttons Dismiss:0,"Never display this message again":3 \ - "Invoking $WINEBIN/wine $* ..." & + echo "Invoking $WINEBIN/wine $@ ..." + $XMESSAGE -timeout 30 -buttons " Dismiss ":0," Never display this message again ":3 \ + -title "Wine Launch Window" \ + "Invoking $WINEBIN/wine $@ ... + + This dialog box is a temporary status dialog to let you know + that Wine is attempting to launch your application. + + Since Wine is still very much in a development stage, many + applications will fail silently. This dialog box is your indication + that we're *trying* to run your application. + + This dialog box will automatically disappear after 30 seconds, + or after your application finishes. + + You can permanently disable this dialog by selecting the option below. + " & info_message_pid=$! fi #------------------------------------------------------------------------------ +# Here's a little function to clean up after that dialog... +#------------------------------------------------------------------------------ +function clean_up_info_message () +{ + if [ $use_info_message -ne 0 ] ; then + + #------------------------------------------------------------------------------ + # Okay, make sure that the notice window is dead (and kill it if it ain't) + #------------------------------------------------------------------------------ + ps $info_message_pid >/dev/null 2>&1 + if [ $? -ne 0 ] ; then + wait $info_message_pid + info_return=$? + else + info_return=0 + kill $info_message_pid + fi + + #------------------------------------------------------------------------------ + # If they didn't like the warning window, turn it off + #------------------------------------------------------------------------------ + if [ $info_return -eq 3 ] ; then + $XMESSAGE -title "Wine Prelaunch Control" \ + "Wine will now disable the prelaunch Window you just saw. + You will no longer be notified when Wine is attempting + to start a Windows application. + + You can reenable this Window by removing the $info_flag file." -buttons " Okay ":0," Cancel ":1 + if [ $? -eq 0 ] ; then + touch $info_flag + fi + fi + fi + + use_info_message=0 +} +#------------------------------------------------------------------------------ # Generate a temporary log file name #------------------------------------------------------------------------------ use_log_name=0 @@ -83,9 +265,9 @@ if [ $use_log_name -ne 0 ] ; then # but still display its output to the screen. # The obvious thing to do is to run wine and pipe output to tee, # but then I can't find a way to get the return code of wine; - # I only get the return code of Wine. + # I only get the return code of tee. #------------------------------------------------------------------------------ - $WINEBIN/wine $* >$log_name 2>&1 & + $WINEBIN/wine "$@" >$log_name 2>&1 & wine_pid=$! tail -f $log_name & @@ -96,46 +278,22 @@ if [ $use_log_name -ne 0 ] ; then kill $tail_pid else - $WINEBIN/wine $* + $WINEBIN/wine "$@" wine_return=$? fi #------------------------------------------------------------------------------ -# Clean up the info message -#------------------------------------------------------------------------------ -if [ $use_info_message -ne 0 ] ; then - - #------------------------------------------------------------------------------ - # Okay, make sure that the notice window is dead (and kill it if it ain't) - #------------------------------------------------------------------------------ - ps $info_message_pid >/dev/null 2>&1 - if [ $? -ne 0 ] ; then - wait $info_message_pid - info_return=$? - else - info_return=0 - kill $info_message_pid - fi - - #------------------------------------------------------------------------------ - # If they didn't like the warning window, turn it off - #------------------------------------------------------------------------------ - if [ $info_return -eq 3 ] ; then - echo "Disabling Wine prelaunch Window. Remove $info_flag to enable" - touch $info_flag - fi -fi - -#------------------------------------------------------------------------------ # Test the return code, and see if it fails #------------------------------------------------------------------------------ -if [ $wine_return -eq 0 ] ; then +if [ $always_see_output -eq 0 -a $wine_return -eq 0 ] ; then echo "Wine exited with a successful status" if [ $use_log_name -ne 0 ] ; then rm -f $log_name fi else - echo "Wine failed with return code $wine_return" + if [ $always_see_output -eq 0 ] ; then + echo "Wine failed with return code $wine_return" + fi #------------------------------------------------------------------------------ # Gracefully display a debug message if they like... @@ -143,20 +301,89 @@ else while [ $use_debug_message -gt 0 ] ; do #------------------------------------------------------------------------------ - # If they didn't like the warning window, turn it off + # Build up the menu of choices they can make... #------------------------------------------------------------------------------ + BUTTONS=' Okay :0' if [ $use_log_name -ne 0 ] ; then - echo "Error log stored in $log_name" - xmessage -buttons Ok:0,"View Log ($log_name)":1,"Rerun with debug":2,"Never display this message again":3\ - "Wine failed with return code $wine_return" - else - xmessage -buttons Ok:0,"Rerun with debug":2,"Never display this message again":3\ - "Wine failed with return code $wine_return" + BUTTONS="$BUTTONS"', View Log :1' fi - info_return=$? - if [ $info_return -eq 1 ] ; then - xmessage -file $log_name -buttons Ok:0,"Delete $log_name":1 + BUTTONS="$BUTTONS"', Debug :2' + BUTTONS="$BUTTONS"', Configure :4' + BUTTONS="$BUTTONS"', Disable :3' + + #------------------------------------------------------------------------------ + # Build an error message + #------------------------------------------------------------------------------ + MESSAGE=" +Wine has exited with a failure status of $wine_return. + +Wine is still development software, so there can be many +explanations for this problem. + +You can choose to run Wine again with a higher level +of debug messages (the debug option, below). + +You can attempt to reconfigure Wine to make it work better. +Note that one change you can make that will dramatically +effect Wine's behaviour is to change whether or not +Wine uses a true Windows partition, mounted under Linux, +or whether it uses an empty Windows directory. +The Wine Configuration program can assist you in making +those changes (select Configure, below, for more). + +You can disable this message entirely by selecting the +Disable option below." + + if [ $always_see_output -ne 0 -a $wine_return -eq 0 ] ; then + MESSAGE=" +Wine has exited with a failure status of $wine_return. + +You can disable this message entirely by selecting the +Disable option below." + + fi + + if [ $use_log_name -ne 0 ] ; then + MESSAGE="$MESSAGE + +Wine has captured a log of the Wine output in the file $log_name. +You may view this file by selecting View Log, below." + fi + + #------------------------------------------------------------------------------ + # Display the message + #------------------------------------------------------------------------------ + $XMESSAGE -title "Wine Finished With Error" -buttons "$BUTTONS" "$MESSAGE" + debug_return=$? + + #------------------------------------------------------------------------------ + # Dismiss the other window... + #------------------------------------------------------------------------------ + clean_up_info_message + + #------------------------------------------------------------------------------ + # Process a configure instruction + #------------------------------------------------------------------------------ + if [ $debug_return -eq 4 ] ; then + which winesetup + if [ $? -eq 0 ] ; then + winesetup + else + if [ -x /opt/wine/bin/winesetup ] ; then + /opt/wine/bin/winesetup + else + $XMESSAGE -title "Error" "Error: Unable to find winesetup in your PATH or in /opt/wine/bin" + fi + fi + continue; + fi + + #------------------------------------------------------------------------------ + # Process a view instruction + #------------------------------------------------------------------------------ + if [ $debug_return -eq 1 ] ; then + $XMESSAGE -title "View Wine Log" -file $log_name -buttons " Okay ":0,"Delete $log_name":1 if [ $? -eq 1 ] ; then echo "Deleting $log_name" rm -f $log_name @@ -169,18 +396,30 @@ else #------------------------------------------------------------------------------ # If they didn't like the warning window, turn it off #------------------------------------------------------------------------------ - if [ $info_return -eq 3 ] ; then - echo "Disabling Wine debug window. Remove $debug_flag to enable" - touch $debug_flag + if [ $debug_return -eq 3 ] ; then + $XMESSAGE -title "Wine Debug Log Control" \ + "Wine will now disable the Wine debug output control window you just saw. + You will no longer be notified when Wine fails to start a + Windows application. + + You can reenable this Window by removing the $debug_flag file." -buttons " Okay ":0," Cancel ":1 + + if [ $? -eq 0 ] ; then + touch $debug_flag + fi + fi #------------------------------------------------------------------------------ # If they want to retry with debug, let 'em. #------------------------------------------------------------------------------ - if [ $info_return -eq 2 ] ; then - echo "Rerunning $0 $debug_options $*" - exec $0 $debug_options $* + if [ $debug_return -eq 2 ] ; then + echo "Rerunning $0 $debug_options $@" + exec $0 $debug_options $@ fi done fi + +clean_up_info_message + -- 2.11.4.GIT