| #!/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 | 
 | # | 
 | # This library is free software; you can redistribute it and/or | 
 | # modify it under the terms of the GNU Lesser General Public | 
 | # License as published by the Free Software Foundation; either | 
 | # version 2.1 of the License, or (at your option) any later version. | 
 | # | 
 | # This library is distributed in the hope that it will be useful, | 
 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | # Lesser General Public License for more details. | 
 | # | 
 | # You should have received a copy of the GNU Lesser General Public | 
 | # License along with this library; if not, write to the Free Software | 
 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | 
 | #------------------------------------------------------------------------------ | 
 |  | 
 | #------------------------------------------------------------------------------ | 
 | #  Primary configuration area - change this if you installed Wine to | 
 | #    a different location | 
 | #------------------------------------------------------------------------------ | 
 | WINEBIN=@bindir@ | 
 | WINELIB=@libdir@ | 
 | WINESERVER= | 
 | WINEDLLPATH=@dlldir@ | 
 |  | 
 | #------------------------------------------------------------------------------ | 
 | #  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 | 
 |     # xmessage not found; make sure the user notices this error | 
 |     # (GUI users wouldn't even notice if we printed the text on console !) | 
 |     MSGFILE=/tmp/WINE_CANNOT_FIND_XMESSAGE | 
 |     cat > $MSGFILE << EOF | 
 | Warning: | 
 |     The Wine launcher is unable to find the xmessage program, | 
 |     which it needs to properly notify you of Wine execution status | 
 |     or problems. | 
 |  | 
 |     This launcher script relies heavily on finding this tool, | 
 |     and without it, it will behave very poorly. | 
 |  | 
 |     We strongly recommend that you use your distribution's | 
 |     software methods to locate xmessage, or alternatively | 
 |     use your favourite internet search engine to find out | 
 |     how you are supposed to install xmessage on your system. | 
 | EOF | 
 |  | 
 |     # try to display message file with tons of different X11 editors | 
 |     # until we find one that's installed and working | 
 |     for EDITPRG in nedit gedit kedit gvim xemacs; do | 
 |       type $EDITPRG >/dev/null 2>/dev/null | 
 |       if [ $? -eq 0 ] ; then | 
 |         # execute editor and exit if successful | 
 |         $EDITPRG $MSGFILE && exit | 
 |       fi | 
 |     done | 
 |  | 
 |     # ok, we really give up now, this system is hosed ;-) | 
 |     cat $MSGFILE | 
 | else | 
 |     XMESSAGE="xmessage $COLOR" | 
 | fi | 
 |  | 
 | launch_winesetup() | 
 | { | 
 |     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: | 
 |         I am not able to configure Wine. | 
 |  | 
 |         If winesetup is being distributed in a separate package | 
 |         that is not installed yet on your system, then please install this | 
 |         package. | 
 |         winesetup can also be downloaded from www.codeweavers.com. | 
 |  | 
 |         If you choose to not use winesetup for configuration, then | 
 |         you can find information on how to prepare a Wine config file manually | 
 |         in the Wine README / README.gz file or in the Wine User Guide." | 
 |         fi | 
 |     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 -n 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 -n 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 -n 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 -n 1` | 
 |     fi | 
 | fi | 
 |  | 
 | if [ ! -r $WINELIB/libwine.so ] ; then | 
 |     WINELIB=`find $argv0_dir -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -n 1` | 
 | fi | 
 |  | 
 | if [ ! -r $WINELIB/libwine.so ] ; then | 
 |     WINELIB=`find $argv0_dir/../ -maxdepth 2 -name 'libwine.so' -printf "%h\n" | head -n 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/ntdll.dll.so ] ; then | 
 |     WINEDLLPATH=$WINELIB/dlls | 
 | fi | 
 |  | 
 |  | 
 | #------------------------------------------------------------------------------ | 
 | #  Okay, set the paths and move on. | 
 | #------------------------------------------------------------------------------ | 
 | export LD_LIBRARY_PATH=$WINELIB:$LD_LIBRARY_PATH | 
 | export PATH=$WINEBIN:$PATH | 
 | export WINELOADER=$WINEBIN/$WINE_BIN_NAME | 
 | export WINEDLLPATH | 
 | export WINESERVER | 
 |  | 
 | info_flag=~/.wine/.no_prelaunch_window_flag | 
 | debug_flag=~/.wine/.no_debug_window_flag | 
 | debug_options="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 at least one argument - the name of the Windows | 
 |         application you would like to run. | 
 |  | 
 |         If you have launched this through the KDE menu system | 
 |         and your KDE installation is specially configured for Wine, | 
 |         then you can use the KDE file browser to select a Windows | 
 |         executable 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 | 
 |         launch_winesetup | 
 |         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 | 
 |         launch_winesetup | 
 |     fi | 
 |  | 
 |     # 127 == xmessage not available | 
 |     if [ $init_rc -eq 127 ] ; then | 
 |       exit | 
 |     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. | 
 |  | 
 |             Please take note that 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 | 
 |             launch_winesetup | 
 |             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. | 
 |  | 
 |             Please take note that 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 WINEDEBUG=$debug_options $0 $@" | 
 |             WINEDEBUG=$debug_options exec $0 "$@" | 
 |         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 | 
 | fi |