summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xplay.sh27
-rw-r--r--templates/cdemu6
-rw-r--r--templates/default2
-rw-r--r--templates/fuseiso6
-rw-r--r--templates/iso12
5 files changed, 40 insertions, 13 deletions
diff --git a/play.sh b/play.sh
index 44b70c6..736c81e 100755
--- a/play.sh
+++ b/play.sh
@@ -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