#!/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 distribution's
   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
fi
