diff options
-rwxr-xr-x | play.sh | 27 | ||||
-rw-r--r-- | templates/cdemu | 6 | ||||
-rw-r--r-- | templates/default | 2 | ||||
-rw-r--r-- | templates/fuseiso | 6 | ||||
-rw-r--r-- | templates/iso | 12 |
5 files changed, 40 insertions, 13 deletions
@@ -32,6 +32,9 @@ typeset -A ENV EENV # current binary -- complete path BIN=${0:A} +# current template -- used for EXPORT +CUR_TEMPLATE=play + # global functions {{{1 # print passed arguments to stderr @@ -106,6 +109,10 @@ set_eenv () { inherit () { zparseopts -D e=nonfatal + local old_templ=$CUR_TEMPLATE + + CUR_TEMPLATE=$1 + if [[ ! -e $PLAY_TEMPLATES/$1 ]]; then if [[ -n $nonfatal ]]; then log "Template '$1' not found" @@ -116,17 +123,21 @@ inherit () { fi source $PLAY_TEMPLATES/$1 + + CUR_TEMPLATE=$old_templ } # function, that is used to _export_ the default phase functions -# i.e. 'EXPORT bla prepare' will set bla_prepare as the function being called +# i.e. 'EXPORT prepare' in template 'bla' will set bla_prepare as the function being called # on prepare() +# NB: this relies on CUR_TEMPLATE being correct -- DO NOT set CUR_TEMPLATE in a game file! EXPORT () { - local name=$1 - shift - for f in $@; do - eval "$f () { ${name}_${f}; }" + if [[ -n $PHASES[(r)$f] ]]; then + eval "$f () { ${CUR_TEMPLATE}_${f}; }" + else + log "Invalid phase function '$f' exported in $CUR_TEMPLATE" + fi done } @@ -137,6 +148,10 @@ ENV[DISPLAY]=":1" # phase functions {{{1 +# Array of phases +PHASES=(execute setenv run prepare cleanup) +declare -r PHASES + # to be removed play_execute () { exc -e startx $BIN -x $GAME -- $DISPLAY -ac -br -quiet ${=EXARGS} @@ -183,7 +198,7 @@ play_prepare () { play_cleanup () { } -EXPORT play execute prepare setenv run cleanup +EXPORT $PHASES[@] # internal functions {{{1 diff --git a/templates/cdemu b/templates/cdemu index 81a83b0..f978884 100644 --- a/templates/cdemu +++ b/templates/cdemu @@ -3,7 +3,7 @@ _cdemu_dev () { exc eval "cdemu device-mapping | grep \"^${CDEMU_NO}\" | tr -s ' ' | cut -f 2 -d' '" } -iso_prepare () { +cdemu_prepare () { default_prepare declare -g MOUNT CDEMU_NO @@ -15,11 +15,11 @@ iso_prepare () { exc mount $(_cdemu_dev) } -iso_cleanup () { +cdemu_cleanup () { exc umount $(_cdemu_dev) exc cdemu unload $CDEMU_NO } -EXPORT iso prepare cleanup +EXPORT prepare cleanup # vim:ft=sh diff --git a/templates/default b/templates/default index 9d7d7fc..7e856df 100644 --- a/templates/default +++ b/templates/default @@ -7,6 +7,6 @@ default_prepare () { [[ $PLAY_DEBUG == 0 ]] && ENV[WINEDEBUG]="-all" EENV[WINEPREFIX]='{ [[ -z $NO_WINEINSTS ]] && echo $HOME/.wineinsts/$PREFIX; } || echo $PREFIX' -EXPORT default prepare +EXPORT prepare # vim:ft=sh diff --git a/templates/fuseiso b/templates/fuseiso index 6096b4b..8baf63f 100644 --- a/templates/fuseiso +++ b/templates/fuseiso @@ -1,5 +1,5 @@ -iso_prepare () { +fuseiso_prepare () { default_prepare declare -g MOUNT MOUNTTARGET @@ -9,10 +9,10 @@ iso_prepare () { exc fuseiso -p $MOUNT $MOUNTTARGET } -iso_cleanup () { +fuseiso_cleanup () { exc fusermount -u $MOUNTTARGET } -EXPORT iso prepare cleanup +EXPORT prepare cleanup # vim:ft=sh diff --git a/templates/iso b/templates/iso index ce3fd74..2aad3cd 100644 --- a/templates/iso +++ b/templates/iso @@ -14,4 +14,16 @@ case $ISO_TYPE in *) die "Unknown ISO_TYPE: '$ISO_TYPE'";; esac + +# wrapper phases + +iso_prepare () { + ${ISO_TYPE}_prepare +} + +iso_cleanup () { + ${ISO_TYPE}_cleanup +} + +EXPORT prepare cleanup # vim:ft=sh |