#!/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] " [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@ 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 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 #------------------------------------------------------------------------------ # 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 $* ..." & info_message_pid=$! fi #------------------------------------------------------------------------------ # Generate a temporary log file name #------------------------------------------------------------------------------ use_log_name=0 log_name=`mktemp /tmp/wine.log.XXXXXX` if [ $? -eq 0 ] ; then which tail >/dev/null 2>&1 if [ $? -eq 0 ]; then use_log_name=1 fi fi #------------------------------------------------------------------------------ # Okay, really launch Wine... #------------------------------------------------------------------------------ if [ $use_log_name -ne 0 ] ; then #------------------------------------------------------------------------------ # Okay, we bend over backwards to run Wine, get that status, # 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. #------------------------------------------------------------------------------ $WINEBIN/wine $* >$log_name 2>&1 & wine_pid=$! tail -f $log_name & tail_pid=$! wait $wine_pid wine_return=$? kill $tail_pid else $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 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" #------------------------------------------------------------------------------ # Gracefully display a debug message if they like... #------------------------------------------------------------------------------ while [ $use_debug_message -gt 0 ] ; do #------------------------------------------------------------------------------ # If they didn't like the warning window, turn it off #------------------------------------------------------------------------------ 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" fi info_return=$? if [ $info_return -eq 1 ] ; then xmessage -file $log_name -buttons Ok: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 [ $info_return -eq 3 ] ; then echo "Disabling Wine debug window. Remove $debug_flag to enable" touch $debug_flag 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 $* fi done fi