[PD-cvs] SF.net SVN: pure-data: [10012] branches/pd-extended/v0-40/pd/src/u_main.tk
eighthave at users.sourceforge.net
eighthave at users.sourceforge.net
Tue Jun 17 15:46:38 CEST 2008
Revision: 10012
http://pure-data.svn.sourceforge.net/pure-data/?rev=10012&view=rev
Author: eighthave
Date: 2008-06-17 06:46:37 -0700 (Tue, 17 Jun 2008)
Log Message:
-----------
first stab at an app creator for Mac OS X. Basically, it just copies itself and sets up the patch to be started automatically
Modified Paths:
--------------
branches/pd-extended/v0-40/pd/src/u_main.tk
Modified: branches/pd-extended/v0-40/pd/src/u_main.tk
===================================================================
--- branches/pd-extended/v0-40/pd/src/u_main.tk 2008-06-17 13:26:13 UTC (rev 10011)
+++ branches/pd-extended/v0-40/pd/src/u_main.tk 2008-06-17 13:46:37 UTC (rev 10012)
@@ -810,6 +810,9 @@
} else { # Mac OS X
# Cmd-m is minimize window on Mac OS X, so remove binding
.mbar.file add command -label Message -command {menu_send}
+ .mbar.file add separator
+ .mbar.file add command -label "Make app from patch..." -state disabled
+ .mbar.file add command -label "Make app from folder..." -state disabled
}
.mbar.file add separator
.mbar.file add command -label Close -accelerator [accel_munge "Ctrl+w"] \
@@ -881,6 +884,114 @@
########### functions for menu functions on document windows ########
+# make embedded application on Mac OS X
+proc makeapp_promptreplace {appdir} {
+ if {[file exists $appdir]} {
+ set answer [tk_messageBox -message [concat overwrite $appdir "?"] \
+ -type yesno -icon question]
+ return [string equal $answer "yes"]
+ } else {
+ return 1
+ }
+}
+
+proc makeapp_createapp {appdir} {
+ global pd_guidir
+ set pdapp_contents [file normalize "$pd_guidir/.."]
+ pdtk_post "Copying:$pdapp_contents\n -->\t$appdir/\n"
+ file delete -force -- $appdir
+ file mkdir -- $appdir
+ file copy -- $pdapp_contents "$appdir/"
+ file rename -force -- $appdir/Contents/org.puredata.pd.default.plist \
+ $appdir/Contents/org.puredata.pd.plist
+}
+
+proc makeapp_makeinfoplist {appdir} {
+ regexp {.*/(.+)\.app} $appdir -> appname
+ pdtk_post "Setting up $appdir/Contents/Info.plist\n"
+ set info_plist [open "$appdir/Contents/Info.plist" r]
+ set new_info_plist [read $info_plist]
+ regsub -- {CFBundleName</key>.*?<string>Pd-extended<} $new_info_plist \
+ "CFBundleName</key>\n\t<string>$appname<" new_info_plist
+ set cfbundleversion [clock format [clock seconds] -format %Y.%m.%d]
+ regsub -- {CFBundleVersion</key>.*?<string>.*?<} $new_info_plist \
+ "CFBundleVersion</key>\n\t<string>$cfbundleversion<" new_info_plist
+ regsub -- {org.puredata.pd.wish} $new_info_plist \
+ "org.puredata.pd.app.$appname" new_info_plist
+ regsub -- {<key>CFBundleDocumentTypes.+</array>} $new_info_plist \
+ {} new_info_plist
+ close $info_plist
+ set info_plist [open "$appdir/Contents/Info.plist" w]
+ puts $info_plist $new_info_plist
+ close $info_plist
+}
+
+proc makeapp_copycurrentpatch {appdir patch patchname isdir} {
+ if {$isdir} {
+ pdtk_post [format "Copying:%s\n -->\t$appdir/Contents/Resources/extra/\n" \
+ [file dirname $patch]]
+ file copy -- [file dirname $patch] "$appdir/Contents/Resources/extra/"
+ } else {
+ set embedded_patch "$appdir/Contents/Resources/extra/$patchname/$patchname.pd"
+ pdtk_post "Copying:$patch\n -->\t$embedded_patch\n"
+ file mkdir -- "$appdir/Contents/Resources/extra/$patchname"
+ file copy -- $patch $embedded_patch
+ }
+}
+
+proc makeapp_getpatchname {top_window} {
+ set top_window_path [wm attributes $top_window -titlepath]
+ if {$top_window_path != ""} {
+ pdtk_post "top window path $top_window_path\n"
+ return $top_window_path
+ } else {
+ return ""
+ }
+}
+
+proc makeapp_embedprefs {appdir patch_to_open} {
+ pdtk_post "Setting up $appdir/Contents/org.puredata.pd.plist\n"
+ set plist [open "$appdir/Contents/org.puredata.pd.plist" r]
+ set new_plist [read $plist]
+ close $plist
+ regsub -- {flags</key>.*?<string>.*?<} $new_plist \
+ "flags</key>\n\t<string>-open hcs/embed.pd -open $patch_to_open<" new_plist
+ set plist [open "$appdir/Contents/org.puredata.pd.plist" w]
+ puts $plist $new_plist
+ close $plist
+
+}
+
+proc menu_makeapp {isdir} {
+ set top_window [lindex [wm stackorder .] end]
+ menu_windowparent $top_window
+ set patch [makeapp_getpatchname $top_window]
+ if {$patch == ""} {
+ pdtk_post \
+ "No patch found! Select an open parent patch with the mouse, then try again.\n"
+ return
+ }
+ # TODO set -parent to patch being turned into app
+ pdtk_post "Select name for app to build...\n"
+ set appdir [tk_getSaveFile -filetypes { {{Mac OS X Application} {.app}} } \
+ -parent $top_window -defaultextension .app \
+ -title "Save application to..."]
+ if {$appdir != ""} {
+ if {![string match "*.app" $appdir]} {
+ set appdir "$appdir.app"
+# pdtk_post "Adding .app extension: $appdir\n"
+ }
+ if {[makeapp_promptreplace $appdir]} {
+ makeapp_createapp $appdir
+ makeapp_makeinfoplist $appdir
+ regexp {.*/(.*?)\.pd} $patch -> patchname
+ makeapp_copycurrentpatch $appdir $patch $patchname $isdir
+ makeapp_embedprefs $appdir "$patchname/$patchname.pd"
+ pdtk_post "$appdir is complete!\n"
+ }
+ }
+}
+
proc menu_save {name} {
pdtk_canvas_checkgeometry $name
pd [concat $name menusave \;]
@@ -1233,6 +1344,11 @@
} else {
# Cmd-m is minimize window on Mac OS X
$name.m.file add command -label Message -command {menu_send}
+ $name.m.file add separator
+ $name.m.file add command -label "Make app from patch..." \
+ -command {menu_makeapp 0}
+ $name.m.file add command -label "Make app from folder..." \
+ -command {menu_makeapp 1}
}
$name.m.file add separator
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Pd-cvs
mailing list