| #!/bin/sh |
| #------------------------------------------------------------------------------ |
| # Winelauncher |
| # This shell script attempts to intelligently manage the process |
| # of launching a program with Wine. It adds some level of |
| # visual feedback to an end user. |
| # |
| # Usage: |
| # winelauncher [options] "<windows program> [program arguments]" |
| # |
| # This script is meant to be installed to /usr/bin/wine, and |
| # to be used to invoke a Windows executable. |
| # The options are passed through directly to Wine, and are |
| # documented in the Wine man page. |
| # |
| # Copyright (c) 2000 by Jeremy White for CodeWeavers |
| # |
| #------------------------------------------------------------------------------ |
| |
| #------------------------------------------------------------------------------ |
| # Primary configuration area - change this if you installed Wine to |
| # a location other than @prefix@ |
| #------------------------------------------------------------------------------ |
| prefix=@prefix@ |
| |
| #------------------------------------------------------------------------------ |
| # Secondary configuration area; change these at your own risk. |
| #------------------------------------------------------------------------------ |
| exec_prefix=@exec_prefix@ |
| WINEBIN=@bindir@ |
| WINELIB=@libdir@ |
| WINESERVER= |
| WINELIBDLLS=@libdir@ |
| |
| #------------------------------------------------------------------------------ |
| # 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' |
| |
| |
| #------------------------------------------------------------------------------ |
| # Locate either xmessage or gmessage, if we can. |
| #------------------------------------------------------------------------------ |
| type xmessage >/dev/null 2>/dev/null |
| if [ $? -ne 0 ] ; then |
| echo " |
| Warning: |
| The Wine launcher is unable to find xmessage. |
| |
| This launcher script relies heavily on finding this tool, |
| and without it, it will behave poorly. |
| |
| Most Linux distributions have one or the other of these |
| tools. |
| |
| We strongly recommend that you use your distributions |
| software methods to locate xmessage." |
| |
| else |
| XMESSAGE="xmessage $COLOR" |
| fi |
| |
| |
| #------------------------------------------------------------------------------ |
| # 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). |
| #------------------------------------------------------------------------------ |
| argv0_path=`which $0` |
| if [ -z $argv0_path ] ; then |
| argv0_path=$0 |
| fi |
| |
| real_name=`find $argv0_path -type l -printf "%l\n"` |
| if [ ! $real_name ]; then |
| real_name=$argv0_path |
| elif [ ! -x $real_name ]; then |
| real_name=`find $argv0_path -printf "%h\n"`/$real_name |
| 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. |
| #------------------------------------------------------------------------------ |
| WINE_BIN_NAME=wine.bin |
| if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then |
| WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1` |
| fi |
| |
| if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then |
| WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1` |
| fi |
| |
| if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then |
| WINE_BIN_NAME=wine |
| if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then |
| WINEBIN=`find $argv0_dir -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1` |
| fi |
| |
| if [ ! -x $WINEBIN/$WINE_BIN_NAME ] ; then |
| WINEBIN=`find $argv0_dir/../ -maxdepth 1 -perm +0111 -type f -name "$WINE_BIN_NAME" -printf "%h\n" | head -1` |
| fi |
| 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 |
| |
| if [ -x $WINEBIN/wineserver ] ; then |
| WINESERVER=$WINEBIN/wineserver |
| 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 |
| WINESERVER=$WINEBIN/server/wineserver |
| fi |
| |
| if [ -r $WINELIB/dlls/libntdll.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:$PATH |
| export WINEDLLPATH=$WINELIBDLLS |
| export WINELOADER=$WINEBIN/$WINE_BIN_NAME |
| |
| info_flag=~/.wine/.no_prelaunch_window_flag |
| debug_flag=~/.wine/.no_debug_window_flag |
| debug_options="-debugmsg warn+all" |
| |
| if [ -f $info_flag ] ; then |
| use_info_message=0 |
| else |
| use_info_message=1 |
| fi |
| |
| if [ -f $debug_flag ] ; then |
| use_debug_message=0 |
| else |
| use_debug_message=1 |
| fi |
| |
| |
| #------------------------------------------------------------------------------ |
| # Handle winelib apps going through here |
| #------------------------------------------------------------------------------ |
| winelib=0 |
| if [ -f $argv0_path.so ] ; then |
| winelib=1 |
| export WINEPRELOAD=$argv0_path.so |
| 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 "$1" = "" ] ; then |
| no_args=1 |
| fi |
| |
| if [ $winelib -eq 1 ] ; then |
| no_args=0 |
| fi |
| |
| if [ $no_args -eq 1 ] ; then |
| echo "Wine called with no arguments." |
| echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..." |
| $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 |
| |
| #------------------------------------------------------------------------------ |
| # No config file? Offer to help 'em out... |
| #------------------------------------------------------------------------------ |
| conf=0 |
| |
| while [ $conf -eq 0 ] ; do |
| |
| if [ -f ~/.winerc ] ; then |
| conf=1 |
| fi |
| if [ -f ~/.wine/config ] ; then |
| conf=2 |
| fi |
| if [ -f /etc/wine.conf ] ; then |
| conf=3 |
| fi |
| |
| if [ $conf -ne 0 ] ; then |
| break; |
| fi |
| |
| echo "No configuration file detected." |
| $XMESSAGE -buttons " Cancel ":0," Proceed ":1," Configure Wine ":2 \ |
| -title "Welcome to Wine" \ |
| " |
| |
| You have started Wine but we cannot find a Wine |
| configuration file. |
| |
| This is normal if you have never run Wine before. |
| If this is the case, select the 'Configure Wine' |
| option, below, to create a configuration file. |
| |
| " |
| init_rc=$? |
| if [ $init_rc -eq 0 ] ; then |
| exit |
| fi |
| |
| if [ $init_rc -eq 1 ] ; then |
| break |
| fi |
| |
| if [ $init_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 |
| fi |
| |
| done |
| |
| #------------------------------------------------------------------------------ |
| # Optionally Warn the user we're going to be launching Wine... |
| #------------------------------------------------------------------------------ |
| if [ $use_info_message -ne 0 ] ; then |
| echo "Invoking $WINEBIN/$WINE_BIN_NAME $@ ..." |
| $XMESSAGE -timeout 30 -buttons " Dismiss ":0," Never display this message again ":3 \ |
| -title "Wine Launch Window" \ |
| "Invoking $WINEBIN/$WINE_BIN_NAME $@ ... |
| |
| 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... |
| #------------------------------------------------------------------------------ |
| 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 |
| #------------------------------------------------------------------------------ |
| if [ -n "$TMP" ] ; then |
| log_dir="$TMP" |
| else |
| log_dir="/tmp" |
| fi |
| use_log_name=0 |
| log_name=`mktemp "$log_dir/wine.log.XXXXXX"` |
| if [ $? -eq 0 ] ; then |
| use_log_name=1 |
| fi |
| use_status_name=0 |
| status_name=`mktemp "$log_dir/wine.status.XXXXXX"` |
| if [ $? -eq 0 ] ; then |
| use_status_name=1 |
| fi |
| |
| #------------------------------------------------------------------------------ |
| # Okay, really launch Wine... |
| #------------------------------------------------------------------------------ |
| if [ $use_log_name -ne 0 -a $use_status_name -ne 0 ] ; then |
| ( $WINEBIN/$WINE_BIN_NAME "$@"; echo $? >$status_name ) 2>&1 | tee "$log_name" |
| wine_return=`cat $status_name` |
| else |
| $WINEBIN/$WINE_BIN_NAME "$@" |
| wine_return=$? |
| fi |
| if [ $use_status_name -ne 0 ] ; then |
| rm -f $status_name |
| fi |
| |
| #------------------------------------------------------------------------------ |
| # Test the return code, and see if it fails |
| #------------------------------------------------------------------------------ |
| 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 |
| if [ $always_see_output -eq 0 ] ; then |
| echo "Wine failed with return code $wine_return" |
| fi |
| |
| #------------------------------------------------------------------------------ |
| # Gracefully display a debug message if they like... |
| #------------------------------------------------------------------------------ |
| while [ $use_debug_message -gt 0 ] ; do |
| |
| #------------------------------------------------------------------------------ |
| # Build up the menu of choices they can make... |
| #------------------------------------------------------------------------------ |
| BUTTONS=' Okay :0' |
| if [ $use_log_name -ne 0 ] ; then |
| BUTTONS="$BUTTONS"', View Log :1' |
| fi |
| |
| 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" |
| use_log_name=0 |
| fi |
| else |
| use_debug_message=0 |
| fi |
| |
| #------------------------------------------------------------------------------ |
| # If they didn't like the warning window, turn it off |
| #------------------------------------------------------------------------------ |
| 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 [ $debug_return -eq 2 ] ; then |
| echo "Rerunning $0 $debug_options $@" |
| exec $0 $debug_options "$@" |
| fi |
| done |
| fi |
| |
| |
| clean_up_info_message |
| |
| # killed by signal? |
| if [ $wine_return -ge 128 ]; then |
| # try to kill myself with the same signal |
| kill -$[wine_return - 128] $$ |
| # if we get here the kill didn't work |
| exit 1 |