From de9c869fb8c1f842bc3dfc4d51f287cb6b644ab2 Mon Sep 17 00:00:00 2001 From: Benjamin Peterson Date: Tue, 1 Jul 2008 18:23:09 +0000 Subject: [PATCH] Hopefully fix make framework install on Mac (see 3174) Removal of the Mac modules broke many of the Mac scripts (including BuildApplet.py) so the building of the Python launcher and IDLE.app was broken. I manually copied built versions of those apps into Mac. Everything else which used Mac modules had to die. --- Mac/Demo/PICTbrowse/ICONbrowse.py | 161 ------ Mac/Demo/PICTbrowse/PICTbrowse.py | 140 ----- Mac/Demo/PICTbrowse/PICTbrowse.rsrc | Bin 785 -> 0 bytes Mac/Demo/PICTbrowse/PICTbrowse2.py | 162 ------ Mac/Demo/PICTbrowse/cicnbrowse.py | 161 ------ Mac/Demo/PICTbrowse/oldPICTbrowse.py | 158 ------ Mac/Demo/PICTbrowse/oldPICTbrowse.rsrc | Bin 502 -> 0 bytes Mac/Demo/applescript.html | 362 ------------- .../applescript/Disk_Copy/Special_Events.py | 424 --------------- .../applescript/Disk_Copy/Standard_Suite.py | 477 ----------------- .../applescript/Disk_Copy/Utility_Events.py | 212 -------- Mac/Demo/applescript/Disk_Copy/__init__.py | 35 -- Mac/Demo/applescript/makedisk.py | 15 - Mac/Demo/example0.html | 75 --- Mac/Demo/example0/checktext.py | 35 -- Mac/Demo/example1.html | 193 ------- Mac/Demo/example1/dnslookup-1.gif | Bin 2570 -> 0 bytes Mac/Demo/example1/dnslookup-1.py | 55 -- Mac/Demo/example1/dnslookup-1.rsrc | Bin 604 -> 0 bytes Mac/Demo/example2.html | 162 ------ Mac/Demo/example2/dnslookup-2.gif | Bin 2984 -> 0 bytes Mac/Demo/example2/dnslookup-2.py | 85 --- Mac/Demo/example2/dnslookup-2.rsrc | Bin 707 -> 0 bytes Mac/Demo/html.icons/createmake.png | Bin 14212 -> 0 bytes Mac/Demo/html.icons/mkapplet.gif | Bin 1010 -> 0 bytes Mac/Demo/html.icons/modulator.gif | Bin 6479 -> 0 bytes Mac/Demo/html.icons/options.gif | Bin 4231 -> 0 bytes Mac/Demo/html.icons/preferences.gif | Bin 5344 -> 0 bytes Mac/Demo/html.icons/python.gif | Bin 1004 -> 0 bytes Mac/Demo/imgbrowse/imgbrowse.py | 115 ----- Mac/Demo/imgbrowse/mac_image.py | 55 -- Mac/Demo/index.html | 156 ------ Mac/Demo/mlte/mlted.py | 374 -------------- Mac/Demo/quicktime/MovieInWindow.py | 70 --- Mac/Demo/quicktime/VerySimplePlayer.py | 92 ---- Mac/Demo/resources/copyres.py | 63 --- Mac/Demo/resources/listres.py | 60 --- Mac/Demo/sound/morselib.py | 202 -------- Mac/Demo/sound/playaiff.py | 45 -- Mac/Demo/textedit.html | 150 ------ Mac/Demo/textedit/ped.py | 359 ------------- .../Contents/Info.plist} | 8 +- Mac/IDLE/IDLE.app/Contents/MacOS/IDLE | 23 + Mac/IDLE/IDLE.app/Contents/MacOS/Python | 1 + Mac/IDLE/IDLE.app/Contents/PkgInfo | 1 + .../IDLE.app/Contents/Resources/IDLE.icns | Bin 0 -> 53456 bytes .../Contents/Resources/PythonCompiled.icns | Bin 0 -> 60777 bytes .../Contents/Resources/PythonSource.icns | Bin 0 -> 54522 bytes .../IDLE.app/Contents/Resources/idlemain.py | 30 ++ Mac/IDLE/Makefile.in | 60 --- Mac/IDLE/config-extensions.def | 88 ---- Mac/IDLE/config-main.def | 79 --- Mac/Makefile.in | 76 +-- Mac/PythonLauncher/Makefile.in | 53 +- .../Python Launcher.app/Contents/Info.plist} | 52 +- .../Python Launcher.app/Contents/PkgInfo | 1 + .../Resources/English.lproj/Credits.rtf | 30 ++ .../English.lproj/MainMenu.nib/classes.nib | 12 + .../English.lproj/MainMenu.nib/info.nib | 21 + .../English.lproj/MyDocument.nib/classes.nib | 26 + .../English.lproj/MyDocument.nib/info.nib | 16 + .../PreferenceWindow.nib/classes.nib | 26 + .../PreferenceWindow.nib/info.nib | 16 + .../Contents/Resources/factorySettings.plist | 87 ++++ Mac/README | 5 - Mac/Tools/fixapplepython23.py | 2 +- Mac/scripts/BuildApplet.icns | Bin 120107 -> 0 bytes Mac/scripts/BuildApplet.py | 149 ------ Mac/scripts/BuildApplet.rsrc | Bin 3169 -> 0 bytes Mac/scripts/buildpkg.py | 484 ------------------ Mac/scripts/zappycfiles.py | 36 -- Makefile.pre.in | 1 - Misc/NEWS | 8 + configure | 28 +- configure.in | 1 - 75 files changed, 363 insertions(+), 5710 deletions(-) delete mode 100644 Mac/Demo/PICTbrowse/ICONbrowse.py delete mode 100644 Mac/Demo/PICTbrowse/PICTbrowse.py delete mode 100644 Mac/Demo/PICTbrowse/PICTbrowse.rsrc delete mode 100644 Mac/Demo/PICTbrowse/PICTbrowse2.py delete mode 100644 Mac/Demo/PICTbrowse/cicnbrowse.py delete mode 100644 Mac/Demo/PICTbrowse/oldPICTbrowse.py delete mode 100644 Mac/Demo/PICTbrowse/oldPICTbrowse.rsrc delete mode 100644 Mac/Demo/applescript.html delete mode 100644 Mac/Demo/applescript/Disk_Copy/Special_Events.py delete mode 100644 Mac/Demo/applescript/Disk_Copy/Standard_Suite.py delete mode 100644 Mac/Demo/applescript/Disk_Copy/Utility_Events.py delete mode 100644 Mac/Demo/applescript/Disk_Copy/__init__.py delete mode 100644 Mac/Demo/applescript/makedisk.py delete mode 100644 Mac/Demo/example0.html delete mode 100644 Mac/Demo/example0/checktext.py delete mode 100644 Mac/Demo/example1.html delete mode 100644 Mac/Demo/example1/dnslookup-1.gif delete mode 100644 Mac/Demo/example1/dnslookup-1.py delete mode 100644 Mac/Demo/example1/dnslookup-1.rsrc delete mode 100644 Mac/Demo/example2.html delete mode 100644 Mac/Demo/example2/dnslookup-2.gif delete mode 100644 Mac/Demo/example2/dnslookup-2.py delete mode 100644 Mac/Demo/example2/dnslookup-2.rsrc delete mode 100644 Mac/Demo/html.icons/createmake.png delete mode 100644 Mac/Demo/html.icons/mkapplet.gif delete mode 100644 Mac/Demo/html.icons/modulator.gif delete mode 100644 Mac/Demo/html.icons/options.gif delete mode 100644 Mac/Demo/html.icons/preferences.gif delete mode 100644 Mac/Demo/html.icons/python.gif delete mode 100644 Mac/Demo/imgbrowse/imgbrowse.py delete mode 100644 Mac/Demo/imgbrowse/mac_image.py delete mode 100644 Mac/Demo/index.html delete mode 100644 Mac/Demo/mlte/mlted.py delete mode 100644 Mac/Demo/quicktime/MovieInWindow.py delete mode 100644 Mac/Demo/quicktime/VerySimplePlayer.py delete mode 100644 Mac/Demo/resources/copyres.py delete mode 100644 Mac/Demo/resources/listres.py delete mode 100644 Mac/Demo/sound/morselib.py delete mode 100644 Mac/Demo/sound/playaiff.py delete mode 100644 Mac/Demo/textedit.html delete mode 100644 Mac/Demo/textedit/ped.py rename Mac/IDLE/{Info.plist.in => IDLE.app/Contents/Info.plist} (89%) create mode 100755 Mac/IDLE/IDLE.app/Contents/MacOS/IDLE create mode 120000 Mac/IDLE/IDLE.app/Contents/MacOS/Python create mode 100644 Mac/IDLE/IDLE.app/Contents/PkgInfo create mode 100644 Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns create mode 100644 Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns create mode 100644 Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns create mode 100644 Mac/IDLE/IDLE.app/Contents/Resources/idlemain.py delete mode 100644 Mac/IDLE/Makefile.in delete mode 100644 Mac/IDLE/config-extensions.def delete mode 100644 Mac/IDLE/config-main.def rename Mac/{scripts/BuildApplet.plist => PythonLauncher/Python Launcher.app/Contents/Info.plist} (51%) create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib create mode 100644 Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist delete mode 100644 Mac/scripts/BuildApplet.icns delete mode 100644 Mac/scripts/BuildApplet.py delete mode 100644 Mac/scripts/BuildApplet.rsrc delete mode 100644 Mac/scripts/buildpkg.py delete mode 100644 Mac/scripts/zappycfiles.py diff --git a/Mac/Demo/PICTbrowse/ICONbrowse.py b/Mac/Demo/PICTbrowse/ICONbrowse.py deleted file mode 100644 index f55070bf53e..00000000000 --- a/Mac/Demo/PICTbrowse/ICONbrowse.py +++ /dev/null @@ -1,161 +0,0 @@ -"""browsepict - Display all "ICON" resources found""" - -import FrameWork -import EasyDialogs -from Carbon import Res -from Carbon import Qd -from Carbon import Win -from Carbon import Controls -from Carbon import List -from Carbon import Icn -import macresource - -# -# Resource definitions -ID_MAIN=512 -MAIN_LIST=1 -MAIN_SHOW=2 - -# Where is the picture window? -LEFT=200 -TOP=64 -MINWIDTH=32 -MINHEIGHT=32 -MAXWIDTH=320 -MAXHEIGHT=320 - -def main(): - macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc") - ICONbrowse() - -class ICONbrowse(FrameWork.Application): - def __init__(self): - # First init menus, etc. - FrameWork.Application.__init__(self) - # Next create our dialog - self.main_dialog = MyDialog(self) - # Now open the dialog - contents = self.findICONresources() - self.main_dialog.open(ID_MAIN, contents) - # Finally, go into the event loop - self.mainloop() - - def makeusermenus(self): - self.filemenu = m = FrameWork.Menu(self.menubar, "File") - self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit) - - def quit(self, *args): - self._quit() - - def showICON(self, resid): - w = ICONwindow(self) - w.open(resid) - #EasyDialogs.Message('Show ICON %r' % (resid,)) - - def findICONresources(self): - num = Res.CountResources('ICON') - rv = [] - for i in range(1, num+1): - Res.SetResLoad(0) - try: - r = Res.GetIndResource('ICON', i) - finally: - Res.SetResLoad(1) - id, type, name = r.GetResInfo() - rv.append((id, name)) - return rv - -class ICONwindow(FrameWork.Window): - def open(self, (resid, resname)): - if not resname: - resname = '#%r' % (resid,) - self.resid = resid - self.picture = Icn.GetIcon(self.resid) - l, t, r, b = 0, 0, 32, 32 - self.pictrect = (l, t, r, b) - width = r-l - height = b-t - if width < MINWIDTH: width = MINWIDTH - elif width > MAXWIDTH: width = MAXWIDTH - if height < MINHEIGHT: height = MINHEIGHT - elif height > MAXHEIGHT: height = MAXHEIGHT - bounds = (LEFT, TOP, LEFT+width, TOP+height) - - self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) - self.do_postopen() - - def do_update(self, *args): - currect = self.fitrect() - Icn.PlotIcon(currect, self.picture) - - def fitrect(self): - """Return self.pictrect scaled to fit in window""" - graf = self.wid.GetWindowPort() - screenrect = graf.GetPortBounds() - picwidth = self.pictrect[2] - self.pictrect[0] - picheight = self.pictrect[3] - self.pictrect[1] - if picwidth > screenrect[2] - screenrect[0]: - factor = float(picwidth) / float(screenrect[2]-screenrect[0]) - picwidth = picwidth / factor - picheight = picheight / factor - if picheight > screenrect[3] - screenrect[1]: - factor = float(picheight) / float(screenrect[3]-screenrect[1]) - picwidth = picwidth / factor - picheight = picheight / factor - return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth), - screenrect[1]+int(picheight)) - -class MyDialog(FrameWork.DialogWindow): - "Main dialog window for ICONbrowse" - - def open(self, id, contents): - self.id = id - FrameWork.DialogWindow.open(self, ID_MAIN) - self.dlg.SetDialogDefaultItem(MAIN_SHOW) - self.contents = contents - self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST) - h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart, - Controls.kControlListBoxListHandleTag) - self.list = List.as_List(h) - self.setlist() - - def setlist(self): - self.list.LDelRow(0, 0) - self.list.LSetDrawingMode(0) - if self.contents: - self.list.LAddRow(len(self.contents), 0) - for i in range(len(self.contents)): - v = repr(self.contents[i][0]) - if self.contents[i][1]: - v = v + '"' + self.contents[i][1] + '"' - self.list.LSetCell(v, (0, i)) - self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def getselection(self): - items = [] - point = (0,0) - while 1: - ok, point = self.list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - values = [] - for i in items: - values.append(self.contents[i]) - return values - - def do_show(self, *args): - selection = self.getselection() - for resid in selection: - self.parent.showICON(resid) - - def do_close(self): - self.close() - - def do_itemhit(self, item, event): - if item == MAIN_SHOW: - self.do_show() - -main() diff --git a/Mac/Demo/PICTbrowse/PICTbrowse.py b/Mac/Demo/PICTbrowse/PICTbrowse.py deleted file mode 100644 index e2bc87bf9dc..00000000000 --- a/Mac/Demo/PICTbrowse/PICTbrowse.py +++ /dev/null @@ -1,140 +0,0 @@ -"""browsepict - Display all "PICT" resources found""" - -import FrameWork -import EasyDialogs -from Carbon import Res -from Carbon import Qd -from Carbon import Win -from Carbon import Controls -from Carbon import List -import struct -import macresource - -# -# Resource definitions -ID_MAIN=512 -MAIN_LIST=1 -MAIN_SHOW=2 - -# Where is the picture window? -LEFT=200 -TOP=64 - -def main(): - macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc") - PICTbrowse() - -class PICTbrowse(FrameWork.Application): - def __init__(self): - # First init menus, etc. - FrameWork.Application.__init__(self) - # Next create our dialog - self.main_dialog = MyDialog(self) - # Now open the dialog - contents = self.findPICTresources() - self.main_dialog.open(ID_MAIN, contents) - # Finally, go into the event loop - self.mainloop() - - def makeusermenus(self): - self.filemenu = m = FrameWork.Menu(self.menubar, "File") - self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit) - - def quit(self, *args): - self._quit() - - def showPICT(self, resid): - w = PICTwindow(self) - w.open(resid) - #EasyDialogs.Message('Show PICT %r' % (resid,)) - - def findPICTresources(self): - num = Res.CountResources('PICT') - rv = [] - for i in range(1, num+1): - Res.SetResLoad(0) - try: - r = Res.GetIndResource('PICT', i) - finally: - Res.SetResLoad(1) - id, type, name = r.GetResInfo() - rv.append((id, name)) - return rv - -class PICTwindow(FrameWork.Window): - def open(self, (resid, resname)): - if not resname: - resname = '#%r' % (resid,) - self.resid = resid - picture = Qd.GetPicture(self.resid) - # Get rect for picture - print(repr(picture.data[:16])) - sz, t, l, b, r = struct.unpack('hhhhh', picture.data[:10]) - print('pict:', t, l, b, r) - width = r-l - height = b-t - if width < 64: width = 64 - elif width > 480: width = 480 - if height < 64: height = 64 - elif height > 320: height = 320 - bounds = (LEFT, TOP, LEFT+width, TOP+height) - print('bounds:', bounds) - - self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) - self.wid.SetWindowPic(picture) - self.do_postopen() - -class MyDialog(FrameWork.DialogWindow): - "Main dialog window for PICTbrowse" - - def open(self, id, contents): - self.id = id - FrameWork.DialogWindow.open(self, ID_MAIN) - self.dlg.SetDialogDefaultItem(MAIN_SHOW) - self.contents = contents - self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST) - h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart, - Controls.kControlListBoxListHandleTag) - self.list = List.as_List(h) - self.setlist() - - def setlist(self): - self.list.LDelRow(0, 0) - self.list.LSetDrawingMode(0) - if self.contents: - self.list.LAddRow(len(self.contents), 0) - for i in range(len(self.contents)): - v = repr(self.contents[i][0]) - if self.contents[i][1]: - v = v + '"' + self.contents[i][1] + '"' - self.list.LSetCell(v, (0, i)) - self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def getselection(self): - items = [] - point = (0,0) - while 1: - ok, point = self.list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - values = [] - for i in items: - values.append(self.contents[i]) - return values - - def do_show(self, *args): - selection = self.getselection() - for resid in selection: - self.parent.showPICT(resid) - - def do_close(self): - self.close() - - def do_itemhit(self, item, event): - if item == MAIN_SHOW: - self.do_show() - -main() diff --git a/Mac/Demo/PICTbrowse/PICTbrowse.rsrc b/Mac/Demo/PICTbrowse/PICTbrowse.rsrc deleted file mode 100644 index 526ff522aa7b108bad8f9ceafabc2aa178be3dd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 785 zcmbVKJxIeq6n=?G)wZ-nt1f~!Xh#tz2PtBsrBeUeqE2Gd1Y0Q$UeLI@I*W6`RS>0{ zi-UsT)Xi1U-BENn-(8Y6P+dIu-rv2u_wn8Xbre8`-qVMnK|~rs5MjhFLP79+9o03p zX{AtH(j*MPD;GTnbNQ|Gje?`qKArf0F9t4NPzS-9@r_)jq*KeW&1wF>Ntdm8 zDIU2;%(zbgLV`^M=U{dr6{Dgj)cNtF$=HUsB6{T3U9P|$c zGSxDzSmnC7{)dQqZxk_1K2A08i&xf*q+kIOQW73PkvxJj#Q2Cv!L+R-oR96M4hbbT zL5Pmq9ev1d8=G% MAXWIDTH: width = MAXWIDTH - if height < MINHEIGHT: height = MINHEIGHT - elif height > MAXHEIGHT: height = MAXHEIGHT - bounds = (LEFT, TOP, LEFT+width, TOP+height) - - self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) - self.do_postopen() - - def do_update(self, *args): - currect = self.fitrect() - Qd.DrawPicture(self.picture, currect) - - def fitrect(self): - """Return self.pictrect scaled to fit in window""" - graf = self.dlg.GetWindowPort() - screenrect = graf.GetPortBounds() - picwidth = self.pictrect[2] - self.pictrect[0] - picheight = self.pictrect[3] - self.pictrect[1] - if picwidth > screenrect[2] - screenrect[0]: - factor = float(picwidth) / float(screenrect[2]-screenrect[0]) - picwidth = picwidth / factor - picheight = picheight / factor - if picheight > screenrect[3] - screenrect[1]: - factor = float(picheight) / float(screenrect[3]-screenrect[1]) - picwidth = picwidth / factor - picheight = picheight / factor - return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth), - screenrect[1]+int(picheight)) - -class MyDialog(FrameWork.DialogWindow): - "Main dialog window for PICTbrowse" - - def open(self, id, contents): - self.id = id - FrameWork.DialogWindow.open(self, ID_MAIN) - self.dlg.SetDialogDefaultItem(MAIN_SHOW) - self.contents = contents - self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST) - h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart, - Controls.kControlListBoxListHandleTag) - self.list = List.as_List(h) - self.setlist() - - def setlist(self): - self.list.LDelRow(0, 0) - self.list.LSetDrawingMode(0) - if self.contents: - self.list.LAddRow(len(self.contents), 0) - for i in range(len(self.contents)): - v = repr(self.contents[i][0]) - if self.contents[i][1]: - v = v + '"' + self.contents[i][1] + '"' - self.list.LSetCell(v, (0, i)) - self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def getselection(self): - items = [] - point = (0,0) - while 1: - ok, point = self.list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - values = [] - for i in items: - values.append(self.contents[i]) - return values - - def do_show(self, *args): - selection = self.getselection() - for resid in selection: - self.parent.showPICT(resid) - - def do_close(self): - self.close() - - def do_itemhit(self, item, event): - if item == MAIN_SHOW: - self.do_show() - -main() diff --git a/Mac/Demo/PICTbrowse/cicnbrowse.py b/Mac/Demo/PICTbrowse/cicnbrowse.py deleted file mode 100644 index 4bc7008ed46..00000000000 --- a/Mac/Demo/PICTbrowse/cicnbrowse.py +++ /dev/null @@ -1,161 +0,0 @@ -"""browsepict - Display all "cicn" resources found""" - -import FrameWork -import EasyDialogs -from Carbon import Res -from Carbon import Qd -from Carbon import Win -from Carbon import Controls -from Carbon import List -from Carbon import Icn -import macresource - -# -# Resource definitions -ID_MAIN=512 -MAIN_LIST=1 -MAIN_SHOW=2 - -# Where is the picture window? -LEFT=200 -TOP=64 -MINWIDTH=32 -MINHEIGHT=32 -MAXWIDTH=320 -MAXHEIGHT=320 - -def main(): - macresource.need('DLOG', ID_MAIN, "PICTbrowse.rsrc") - CIconbrowse() - -class CIconbrowse(FrameWork.Application): - def __init__(self): - # First init menus, etc. - FrameWork.Application.__init__(self) - # Next create our dialog - self.main_dialog = MyDialog(self) - # Now open the dialog - contents = self.findcicnresources() - self.main_dialog.open(ID_MAIN, contents) - # Finally, go into the event loop - self.mainloop() - - def makeusermenus(self): - self.filemenu = m = FrameWork.Menu(self.menubar, "File") - self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit) - - def quit(self, *args): - self._quit() - - def showCIcon(self, resid): - w = CIconwindow(self) - w.open(resid) - #EasyDialogs.Message('Show cicn %r' % (resid,)) - - def findcicnresources(self): - num = Res.CountResources('cicn') - rv = [] - for i in range(1, num+1): - Res.SetResLoad(0) - try: - r = Res.GetIndResource('cicn', i) - finally: - Res.SetResLoad(1) - id, type, name = r.GetResInfo() - rv.append((id, name)) - return rv - -class CIconwindow(FrameWork.Window): - def open(self, (resid, resname)): - if not resname: - resname = '#%r' % (resid,) - self.resid = resid - self.picture = Icn.GetCIcon(self.resid) - l, t, r, b = 0, 0, 32, 32 - self.pictrect = (l, t, r, b) - width = r-l - height = b-t - if width < MINWIDTH: width = MINWIDTH - elif width > MAXWIDTH: width = MAXWIDTH - if height < MINHEIGHT: height = MINHEIGHT - elif height > MAXHEIGHT: height = MAXHEIGHT - bounds = (LEFT, TOP, LEFT+width, TOP+height) - - self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) - self.do_postopen() - - def do_update(self, *args): - currect = self.fitrect() - Icn.PlotCIcon(currect, self.picture) - - def fitrect(self): - """Return self.pictrect scaled to fit in window""" - graf = self.wid.GetWindowPort() - screenrect = graf.GetPortBounds() - picwidth = self.pictrect[2] - self.pictrect[0] - picheight = self.pictrect[3] - self.pictrect[1] - if picwidth > screenrect[2] - screenrect[0]: - factor = float(picwidth) / float(screenrect[2]-screenrect[0]) - picwidth = picwidth / factor - picheight = picheight / factor - if picheight > screenrect[3] - screenrect[1]: - factor = float(picheight) / float(screenrect[3]-screenrect[1]) - picwidth = picwidth / factor - picheight = picheight / factor - return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth), - screenrect[1]+int(picheight)) - -class MyDialog(FrameWork.DialogWindow): - "Main dialog window for cicnbrowse" - - def open(self, id, contents): - self.id = id - FrameWork.DialogWindow.open(self, ID_MAIN) - self.dlg.SetDialogDefaultItem(MAIN_SHOW) - self.contents = contents - self.ctl = self.dlg.GetDialogItemAsControl(MAIN_LIST) - h = self.ctl.GetControlData_Handle(Controls.kControlListBoxPart, - Controls.kControlListBoxListHandleTag) - self.list = List.as_List(h) - self.setlist() - - def setlist(self): - self.list.LDelRow(0, 0) - self.list.LSetDrawingMode(0) - if self.contents: - self.list.LAddRow(len(self.contents), 0) - for i in range(len(self.contents)): - v = repr(self.contents[i][0]) - if self.contents[i][1]: - v = v + '"' + self.contents[i][1] + '"' - self.list.LSetCell(v, (0, i)) - self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def getselection(self): - items = [] - point = (0,0) - while 1: - ok, point = self.list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - values = [] - for i in items: - values.append(self.contents[i]) - return values - - def do_show(self, *args): - selection = self.getselection() - for resid in selection: - self.parent.showCIcon(resid) - - def do_close(self): - self.close() - - def do_itemhit(self, item, event): - if item == MAIN_SHOW: - self.do_show() - -main() diff --git a/Mac/Demo/PICTbrowse/oldPICTbrowse.py b/Mac/Demo/PICTbrowse/oldPICTbrowse.py deleted file mode 100644 index 6ddd318e652..00000000000 --- a/Mac/Demo/PICTbrowse/oldPICTbrowse.py +++ /dev/null @@ -1,158 +0,0 @@ -"""browsepict - Display all "PICT" resources found""" - -import FrameWork -import EasyDialogs -from Carbon import Res -from Carbon import Qd -from Carbon import Win -from Carbon import List -import struct -import macresource - -# -# Resource definitions -ID_MAIN=512 -MAIN_LIST=1 -MAIN_SHOW=2 - -# Where is the picture window? -LEFT=200 -TOP=64 - -def main(): - macresource.need('DLOG', ID_MAIN, "oldPICTbrowse.rsrc") - PICTbrowse() - -class PICTbrowse(FrameWork.Application): - def __init__(self): - # First init menus, etc. - FrameWork.Application.__init__(self) - # Next create our dialog - self.main_dialog = MyDialog(self) - # Now open the dialog - contents = self.findPICTresources() - self.main_dialog.open(ID_MAIN, contents) - # Finally, go into the event loop - self.mainloop() - - def makeusermenus(self): - self.filemenu = m = FrameWork.Menu(self.menubar, "File") - self.quititem = FrameWork.MenuItem(m, "Quit", "Q", self.quit) - - def quit(self, *args): - self._quit() - - def showPICT(self, resid): - w = PICTwindow(self) - w.open(resid) - #EasyDialogs.Message('Show PICT %r' % (resid,)) - - def findPICTresources(self): - num = Res.CountResources('PICT') - rv = [] - for i in range(1, num+1): - Res.SetResLoad(0) - try: - r = Res.GetIndResource('PICT', i) - finally: - Res.SetResLoad(1) - id, type, name = r.GetResInfo() - rv.append((id, name)) - return rv - -class PICTwindow(FrameWork.Window): - def open(self, (resid, resname)): - if not resname: - resname = '#%r' % (resid,) - self.resid = resid - picture = Qd.GetPicture(self.resid) - # Get rect for picture - print(repr(picture.data[:16])) - sz, t, l, b, r = struct.unpack('hhhhh', picture.data[:10]) - print('pict:', t, l, b, r) - width = r-l - height = b-t - if width < 64: width = 64 - elif width > 480: width = 480 - if height < 64: height = 64 - elif height > 320: height = 320 - bounds = (LEFT, TOP, LEFT+width, TOP+height) - print('bounds:', bounds) - - self.wid = Win.NewWindow(bounds, resname, 1, 0, -1, 1, 0) - self.wid.SetWindowPic(picture) - self.do_postopen() - -class MyDialog(FrameWork.DialogWindow): - "Main dialog window for PICTbrowse" - - def open(self, id, contents): - self.id = id - FrameWork.DialogWindow.open(self, ID_MAIN) - self.dlg.SetDialogDefaultItem(MAIN_SHOW) - tp, h, rect = self.dlg.GetDialogItem(MAIN_LIST) - rect2 = rect[0]+1, rect[1]+1, rect[2]-17, rect[3]-17 # Scroll bar space - self.list = List.LNew(rect2, (0, 0, 1, len(contents)), (0,0), 0, self.wid, - 0, 1, 1, 1) - self.contents = contents - self.setlist() - - def setlist(self): - self.list.LDelRow(0, 0) - self.list.LSetDrawingMode(0) - if self.contents: - self.list.LAddRow(len(self.contents), 0) - for i in range(len(self.contents)): - v = repr(self.contents[i][0]) - if self.contents[i][1]: - v = v + '"' + self.contents[i][1] + '"' - self.list.LSetCell(v, (0, i)) - self.list.LSetDrawingMode(1) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def do_listhit(self, event): - (what, message, when, where, modifiers) = event - Qd.SetPort(self.wid) - where = Qd.GlobalToLocal(where) - print('LISTHIT', where) - if self.list.LClick(where, modifiers): - self.do_show() - - def getselection(self): - items = [] - point = (0,0) - while 1: - ok, point = self.list.LGetSelect(1, point) - if not ok: - break - items.append(point[1]) - point = point[0], point[1]+1 - values = [] - for i in items: - values.append(self.contents[i]) - return values - - def do_show(self, *args): - selection = self.getselection() - for resid in selection: - self.parent.showPICT(resid) - - def do_rawupdate(self, window, event): - tp, h, rect = self.dlg.GetDialogItem(MAIN_LIST) - Qd.SetPort(self.wid) - Qd.FrameRect(rect) - self.list.LUpdate(self.wid.GetWindowPort().visRgn) - - def do_activate(self, activate, event): - self.list.LActivate(activate) - - def do_close(self): - self.close() - - def do_itemhit(self, item, event): - if item == MAIN_LIST: - self.do_listhit(event) - if item == MAIN_SHOW: - self.do_show() - -main() diff --git a/Mac/Demo/PICTbrowse/oldPICTbrowse.rsrc b/Mac/Demo/PICTbrowse/oldPICTbrowse.rsrc deleted file mode 100644 index fb7a192df2c096f2781a2475aafcf06f6eea0932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 502 zcmZQz6=PsvV!#BbwgX}XAm#$%I3Q*LVvzbI1_s6{Ma4zQLBXyrj0_A_43~hS zm;k62D9gZT4VeEpEpp4xNl7hA zEh;) -Using the Open Scripting Architecture from Python - -

Using the Open Scripting Architecture from Python

-
- -

NOTE: this document describes the OSA support that is shipped with -the core python distribution. Most users are better of with the more -userfriendly appscript library. - -

OSA support in Python is still not 100% complete, but -there is already enough in place to allow you to do some nifty things -with other programs from your python program.

- - -

-In this example, we will look at a scriptable application, extract its -“AppleScript Dictionary,” generate a Python interface package from -the dictionary, and use that package to control the application. -The application we are going to script is Disk Copy, Apple's standard -utility for making copies of floppies, creating files that are mountable -as disk images, etc. -Because we want -to concentrate on the OSA details, we won’t bother with a real -user-interface for our application.

- - -

-When we say “AppleScript” in this document we actually mean -“the Open Scripting Architecture.” There is nothing -AppleScript-specific in the Python implementation. Most of this document -focuses on the classic Mac OS; Mac OS X users have some -additional tools. -

- -

Python OSA architecture

- -

Open Scripting suites and inheritance can be modelled rather nicely -with Python packages, so we generate -a package for each application we want to script. Each suite defined in -the application becomes a module in the -package, and the package main module imports everything from all the -submodules and glues together all the classes (in Python terminology— -events in OSA terminology or verbs in AppleScript terminology).

- -

-A suite in an OSA application can extend the functionality of a standard -suite. This is implemented in Python by importing everything from the -module that implements the standard suites and overriding anything that has -been extended. The standard suites live in the StdSuite package.

- -

-This all sounds complicated, but the good news is that basic -scripting is actually pretty simple. You can do strange and wondrous things -with OSA scripting once you fully understand it.

- -

Creating the Python interface package

- - -

There is a tool in the standard distribution that can automatically -generate the interface packages. This tool is called -gensuitemodule.py, and lives in Mac:scripts. -It looks through a file -for an ‘AETE’ or ‘AEUT’ resource, -the internal representation of the -AppleScript dictionary, and parses the resource to generate the suite -modules. -When we start gensuitemodule, it asks us for an input file; -for our example, -we point it to the Disk Copy executable.

- -

-Next, gensuitemodule wants a folder where it will store the -package it is going to generate. -Note that this is the package folder, not the parent folder, so we -navigate to Python:Mac:Demo:applescript, create a folder -Disk_Copy, and select that.

- -

-We next specify the folder from which gensuitemodule -should import the standard suites. Here, -we always select Python:Mac:Lib:lib-scriptpackages:StdSuites. (There is -one exception to this rule: when you are generating StdSuites itself -you select _builtinSuites.) -

- -

-It starts parsing the AETE resource, and for -each AppleEvent suite it finds, gensuitemodule.py -prompts us for the filename of the -resulting python module. Remember to change folders for the first -module—you don't want to clutter up, say, the -Disk Copy folder -with your python -interfaces. If you want to skip a suite, press cancel and the process -continues with the next suite.

- -

Summary

- -
    - -
  1. Run gensuitemodule.
  2. - -
  3. Select the application (or OSAX) for which you would like a Python interface.
  4. - -
  5. Select the package folder where the interface modules should be - stored.
  6. - -
  7. Specify the folder Python:Mac:Lib:lib-scriptpackages:StdSuites - to import the standard suites (or _builtinSuites if you are - generating StdSuites itself).
  8. - -
  9. Save the generated suites (use cancel to skip a suite).
  10. - - -
- - -

Notes

- - -
    - -
  • The interface package may occasionally need some editing by hand. For example, - gensuitemodule does not handle all Python reserved words, so - if - one of the AppleScript verbs is a Python reserved word, a SyntaxError - may be raised when the package is imported. - Simply rename the class into something acceptable, if this happens; - take a look at how the - print verb is handled (automatically by gensuitemodule) - in the standard suites. But: f you need to edit your package this should be considered a - bug in gensuitemodule, so please report it so it can be fixed in future releases. -
  • - - -
  • If you want to re-create the StdSuite modules, -you should look in one of two places. With versions of AppleScript older than 1.4.0 -(which first shipped with OS 9.0), you will find the -AEUT resources in System Folder:Extensions:Scripting -Additions:Dialects:English Dialect. For newer versions, you will -find them in System Folder:Extensions:Applescript. -
  • - -
  • Since MacPython 2.0, this new structure, with packages -per application and submodules per suite, is used. Older MacPythons had a -single level of modules, with uncertain semantics. With the new structure, -it is possible for programs to override standard suites, as programs often do. - -
  • - -
  • Gensuitemodule.py may ask you questions -like “Where is enum 'xyz ' declared?”. -This is either due to a misunderstanding on my part or (rather too commonly) -bugs in the AETE resources. Pressing cancel is usually the -right choice: it will cause the specific enum not to be treated as an enum -but as a “normal” type. As things like fsspecs and TEXT strings clearly are -not enumerators, this is correct. If someone understands what is really going on -here, please let me know.
  • - -
- - - -

The Python interface package contents

- -

-Let’s glance at the -Disk_Copy package just created. You -may want to open Script Editor alongside to see how it -interprets the dictionary. -

- - -

-The main package module is in __init__.py. -The only interesting bit is the Disk_Copy class, which -includes the event handling classes from the individual suites. It also -inherits aetools.TalkTo, which is a base class that handles all -details on how to start the program and talk to it, and a class variable -_signature which is the default application this class will talk -to (you can override this in various ways when you instantiate your class, see -aetools.py for details). -

- -

-The Special_Events -module is a nice example of a suite module. -The Special_Events_Events class is the bulk of the code -generated. For each verb, it contains a method. Each method knows what -arguments the verb expects, and it makes use of keyword -arguments to present a palatable -interface to the python programmer. - -Notice that each method -calls some routines from aetools, an auxiliary module -living in Mac:Lib. -The other thing to notice is that each method calls -self.send. This comes from the aetools.TalkTo -baseclass.

- - -

-After the big class, there are a number of little class declarations. These -declarations are for the (AppleEvent) classes and properties in the suite. -They allow you to create object IDs, which can then be passed to the verbs. -For instance, -when scripting the popular email program Eudora, -you would use mailbox("inbox").message(1).sender -to get the name of the sender of the first message in mailbox -inbox. It is -also possible to specify this as sender(message(1, mailbox("inbox"))), -which is sometimes needed because these classes don’t always inherit correctly -from baseclasses, so you may have to use a class or property from another -suite.

- -

-Next we get the enumeration dictionaries, which allow you to pass -english names as arguments to verbs, so you don't have to bother with the 4-letter -type code. So, you can say - - diskcopy.create(..., filesystem="Mac OS Standard") - -as it is called in Script Editor, instead of the cryptic lowlevel - - diskcopy.create(..., filesystem="Fhfs") -

- -

-Finally, we get the “table of contents” of the module, listing all -classes and such -by code, which is used by gensuitemodule itself: if you use this -suite as a base package in a later run this is how it knows what is defined in this -suite, and what the Python names are. -

- -

Notes

- -
    - -
  • The aetools module contains some other nifty -AppleEvent tools as well. Have a look at it sometime, there is (of -course) no documentation yet. -
  • - -
  • There are also some older object specifiers for standard objects in aetools. -You use these in the form aetools.Word(10, -aetools.Document(1)), where the corresponding AppleScript -terminology would be word 10 of the first -document. Examine -aetools and aetools.TalkTo -along with -the comments at the end of your suite module if you need to create -more than the standard object specifiers. -
  • - -
- - - - -

Using a Python suite module

- -

-Now that we have created the suite module, we can use it in a Python script. -In older MacPython distributions this used to be a rather -complicated affair, but with the package scheme and with the application signature -known by the package it is very simple: you import the package and instantiate -the class, e.g. - - talker = Disk_Copy.Disk_Copy(start=1) - -You will usually specify the start=1: it will run the application if it is -not already running. -You may want to omit it if you want to talk to the application -only if it is already running, or if the application is something like the Finder. -Another way to ensure that the application is running is to call talker._start(). -

- -

-Looking at the sourcefile makedisk.py, we see that it starts -with some imports. Naturally, one of these is the Python interface to Disk -Copy.

- -

-The main program itself is a wonder of simplicity: we create the -object (talker) that talks to Disk Copy, -create a disk, and mount it. The bulk of -the work is done by talker and the Python interface package we -just created.

- -

-The exception handling does warrant a few comments, though. Since -AppleScript is basically a connectionless RPC protocol, -nothing happens -when we create the talker object. Hence, if the destination application -is not running, we will not notice until we send our first -command (avoid this as described above). There is another thing to note about errors returned by -AppleScript calls: MacOS.Error is raised for -all of the errors that are known to be OSErr-type errors, -while -server generated errors raise aetools.Error.

- -

Scripting Additions

- -

-If you want to use any of the scripting additions (or OSAXen, in -everyday speech) from a Python program, you can use the same method -as for applications, i.e. run gensuitemodule on the -OSAX (commonly found in System Folder:Scripting Additions -or something similar). There is one minor gotcha: the application -signature to use is MACS. You will need to edit the main class -in the __init__.py file of the created package and change the value -of _signature to MACS, or use a subclass to the -same effect. -

- -

-There are two minor points to watch out for when using gensuitemodule -on OSAXen: they appear all to define the class System_Object_Suite, -and a lot of them have the command set in multiple dialects. You have to -watch out for name conflicts and make sure you select a reasonable dialect -(some of the non-English dialects cause gensuitemodule to generate incorrect -Python code).

- -Despite these difficulties, OSAXen offer a lot of possibilities. Take a -look at some of the OSAXen in the Scripting Additions folder, or -download some from the net. - -

Further Reading

- -

-If you want to look at more involved examples of applescripting, look at the standard -modules findertools and nsremote, or (possibly better, as it -is more involved) fullbuild from the Mac:scripts folder. -

- -

Alternatives

- -

Mac OS X

- -

-Under Mac OS X, the above still works, but with some new difficulties. -The application package structure can hide the ‘AETE’ or -‘AEUT’ resource from gensuitemodule, so that, -for example, it cannot generate an OSA interface to iTunes. Script -Editor gets at the dictionary of such programs using a ‘Get -AETE’ AppleEvent, if someone wants to donate code to use the same -method for gensuitemodule: by all means! -

- -

-One alternative is available through the Unix command line version of python. -Apple has provided the osacompile and osascript tools, -which can be used to compile and execute scripts written in OSA languages. See the -man pages for more details. -

- - - - diff --git a/Mac/Demo/applescript/Disk_Copy/Special_Events.py b/Mac/Demo/applescript/Disk_Copy/Special_Events.py deleted file mode 100644 index 2c7e04f1450..00000000000 --- a/Mac/Demo/applescript/Disk_Copy/Special_Events.py +++ /dev/null @@ -1,424 +0,0 @@ -"""Suite Special Events: Commands for mounting Disk Copy images -Level 1, version 1 - -Generated from Macintosh HD:Hulpprogramma's:Disk Copy -AETE/AEUT resource version 1/0, language 0, script 0 -""" - -import aetools -import MacOS - -_code = 'ddsk' - -class Special_Events_Events: - - _argmap_mount = { - 'access_mode' : 'Acss', - 'checksum_verification' : 'VChk', - 'signature_verification' : 'VSig', - 'RAM_caching' : 'Cach', - } - - def mount(self, _object, _attributes={}, **_arguments): - """mount: Mounts an Disk Copy image as a disk volume - Required argument: a reference to the disk image to be mounted - Keyword argument access_mode: the access mode for mounted volume (default is "any", i.e. best possible) - Keyword argument checksum_verification: Verify the checksum before mounting? - Keyword argument signature_verification: Verify the DigiSignŽ signature before mounting? - Keyword argument RAM_caching: Cache the disk image in RAM? (if omitted, don't cache) - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to mounted disk - """ - _code = 'ddsk' - _subcode = 'Moun' - - aetools.keysubst(_arguments, self._argmap_mount) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'Acss', _Enum_Acss) - aetools.enumsubst(_arguments, 'VChk', _Enum_bool) - aetools.enumsubst(_arguments, 'VSig', _Enum_bool) - aetools.enumsubst(_arguments, 'Cach', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_execute_DiskScript = { - 'checksum_verification' : 'VChk', - 'signature_verification' : 'VSig', - } - - def execute_DiskScript(self, _object, _attributes={}, **_arguments): - """execute DiskScript: Executes a Disk Copy-specific DiskScript - Required argument: a reference to the DiskScript to execute - Keyword argument checksum_verification: Should checksums be verified when mounting images referenced in the DiskScript? - Keyword argument signature_verification: Should the DigiSignŽ signature of the DiskScript and the images it references be verified? - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'ddsk' - _subcode = 'XEQd' - - aetools.keysubst(_arguments, self._argmap_execute_DiskScript) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'VChk', _Enum_bool) - aetools.enumsubst(_arguments, 'VSig', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - def unmount(self, _object, _attributes={}, **_arguments): - """unmount: Unmount and eject (if necessary) a volume - Required argument: a reference to disk to be unmounted (and ejected) - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'ddsk' - _subcode = 'Umnt' - - if _arguments: raise TypeError('No optional args expected') - _arguments['----'] = _object - - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_create = { - 'saving_as' : 'SvAs', - 'logical_blocks' : 'Blks', - 'zeroing' : 'Zero', - 'leave_image_mounted' : 'Moun', - 'filesystem' : 'Fsys', - } - - def create(self, _object, _attributes={}, **_arguments): - """create: Create a new Disk Copy document - Required argument: the name of the volume to create - Keyword argument saving_as: the disk image to be created - Keyword argument logical_blocks: the number of logical blocks - Keyword argument zeroing: Should all blocks on the disk be set to zero? - Keyword argument leave_image_mounted: Should the image be mounted after it is created? - Keyword argument filesystem: file system to use (Mac OS Standard/compatible, Mac OS Enhanced) - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to newly created disk image (or newly mounted disk) - """ - _code = 'ddsk' - _subcode = 'Crea' - - aetools.keysubst(_arguments, self._argmap_create) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'SvAs', _Enum_fss_) - aetools.enumsubst(_arguments, 'Blks', _Enum_long) - aetools.enumsubst(_arguments, 'Zero', _Enum_bool) - aetools.enumsubst(_arguments, 'Moun', _Enum_bool) - aetools.enumsubst(_arguments, 'Fsys', _Enum_Fsys) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - def verify_checksum(self, _object, _attributes={}, **_arguments): - """verify checksum: Verify the checksum of a Disk Copy 4.2 or a Disk Copy 6.0 read-only document - Required argument: the disk image to be verified - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: the result of the checksum verification - """ - _code = 'ddsk' - _subcode = 'Vcrc' - - if _arguments: raise TypeError('No optional args expected') - _arguments['----'] = _object - - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - def verify_signature(self, _object, _attributes={}, **_arguments): - """verify signature: Verify the DigiSignŽ signature for a Disk Copy document - Required argument: the disk image to be verified - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: Is the DigiSignŽ signature valid? - """ - _code = 'ddsk' - _subcode = 'Vsig' - - if _arguments: raise TypeError('No optional args expected') - _arguments['----'] = _object - - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_sign_image = { - 'using_signer' : 'Sinr', - } - - def sign_image(self, _object, _attributes={}, **_arguments): - """sign image: Add a DigiSignŽ signature to a Disk Copy document - Required argument: the disk image to be signed - Keyword argument using_signer: a reference to signer file to use - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'ddsk' - _subcode = 'Asig' - - aetools.keysubst(_arguments, self._argmap_sign_image) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'Sinr', _Enum_alis) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_create_a_floppy_from = { - 'signature_verification' : 'VSig', - 'erase_confirmation' : 'Cfrm', - 'make_multiple_floppies' : 'Mult', - } - - def create_a_floppy_from(self, _object, _attributes={}, **_arguments): - """create a floppy from: create a floppy disk from a Disk Copy document - Required argument: the disk image to make a floppy from - Keyword argument signature_verification: Should the DigiSignŽ signature be verified before creating a floppy disk? - Keyword argument erase_confirmation: Should the user be asked to confirm the erasure of the previous contents of floppy disks? - Keyword argument make_multiple_floppies: Should the user be prompted to create multiple floppy disks? - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'ddsk' - _subcode = 'Bfpy' - - aetools.keysubst(_arguments, self._argmap_create_a_floppy_from) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'VSig', _Enum_bool) - aetools.enumsubst(_arguments, 'Cfrm', _Enum_bool) - aetools.enumsubst(_arguments, 'Mult', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_check_image = { - 'details' : 'ChDe', - } - - def check_image(self, _object, _attributes={}, **_arguments): - """check image: Check the disk imageÕs internal data structures for any inconsistencies. Works on NDIF, Disk Copy 4.2, DARTŽ, or DiskSet images. - Required argument: the disk image to be verified - Keyword argument details: Should the disk image details be displayed? - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a record containing a boolean (true/false) value if the image passes consistency tests, and the numbers of warnings and errors - """ - _code = 'ddsk' - _subcode = 'Chek' - - aetools.keysubst(_arguments, self._argmap_check_image) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'ChDe', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_segment_image = { - 'segment_count' : 'SGCT', - 'segment_size' : 'SGSZ', - 'segment_name' : 'SGNM', - 'image_ID' : 'SGID', - } - - def segment_image(self, _object, _attributes={}, **_arguments): - """segment image: Segment a NDIF R/W or R/O image into smaller pieces - Required argument: the disk image to be segmented - Keyword argument segment_count: the number of image segments to create - Keyword argument segment_size: the size of image segments (in blocks) to create - Keyword argument segment_name: the root name for each image segment file - Keyword argument image_ID: string used to generate a unique image ID to group the segments - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a list of references to the image segments created - """ - _code = 'ddsk' - _subcode = 'SGMT' - - aetools.keysubst(_arguments, self._argmap_segment_image) - _arguments['----'] = _object - - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_create_SMI = { - 'source_images' : 'SMI1', - 'launching_application' : 'SMI2', - 'launching_document' : 'SMI3', - 'version_string' : 'SMI4', - 'checksum_verification' : 'VChk', - 'signature_verification' : 'VSig', - 'image_signing' : 'SImg', - } - - def create_SMI(self, _object, _attributes={}, **_arguments): - """create SMI: Creates a self-mounting image (SMI) from a list of NDIF disk images - Required argument: the self-mounting image to create - Keyword argument source_images: a list of references to sources images - Keyword argument launching_application: the path to an application to launch - Keyword argument launching_document: the path to a document to open - Keyword argument version_string: sets the 'vers' 1 resource of the self-mounting image - Keyword argument checksum_verification: Should the checksum of the source images be verified before creating the SMI? - Keyword argument signature_verification: Should the DigiSignŽ signature of the source images be verified before creating the SMI? - Keyword argument image_signing: Should the SMI be given a digital signature when it is created? - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to the self-mounting image created - """ - _code = 'ddsk' - _subcode = 'MSMI' - - aetools.keysubst(_arguments, self._argmap_create_SMI) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'VChk', _Enum_bool) - aetools.enumsubst(_arguments, 'VSig', _Enum_bool) - aetools.enumsubst(_arguments, 'SImg', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - -class Verify_Checksum_reply_record(aetools.ComponentItem): - """Verify Checksum reply record - """ - want = 'Rcrc' -class validity(aetools.NProperty): - """validity - true if checksum is valid """ - which = 'Vlid' - want = 'bool' -class expected_checksum(aetools.NProperty): - """expected checksum - checksum value stored in the image header (in hexadecimal) """ - which = 'crcE' - want = 'TEXT' -class calculated_checksum(aetools.NProperty): - """calculated checksum - checksum value actually calculated (in hexadecimal) """ - which = 'crcA' - want = 'TEXT' - -class Check_Image_reply_record(aetools.ComponentItem): - """Check Image reply record - """ - want = 'Rchk' -class consistency(aetools.NProperty): - """consistency - Does the image pass consistency checks? """ - which = 'Rch1' - want = 'bool' -class error_count(aetools.NProperty): - """error count - the number of errors recorded """ - which = 'Rch2' - want = 'long' -class warning_count(aetools.NProperty): - """warning count - the number of warnings recorded """ - which = 'Rch3' - want = 'long' -Verify_Checksum_reply_record._propdict = { - 'validity' : validity, - 'expected_checksum' : expected_checksum, - 'calculated_checksum' : calculated_checksum, -} -Verify_Checksum_reply_record._elemdict = { -} -Check_Image_reply_record._propdict = { - 'consistency' : consistency, - 'error_count' : error_count, - 'warning_count' : warning_count, -} -Check_Image_reply_record._elemdict = { -} -_Enum_Acss = { - 'read_and_write' : 'RdWr', # read/write access - 'read_only' : 'Rdxx', # read-only access - 'any' : 'Anyx', # best possible access -} - -_Enum_Fsys = { - 'Mac_OS_Standard' : 'Fhfs', # classic HFS file system - 'compatible_Mac_OS_Extended' : 'Fhf+', # new HFS+ file system -} - -_Enum_alis = None # XXXX enum alis not found!! -_Enum_fss_ = None # XXXX enum fss not found!! -_Enum_long = None # XXXX enum long not found!! -_Enum_bool = None # XXXX enum bool not found!! - -# -# Indices of types declared in this module -# -_classdeclarations = { - 'Rchk' : Check_Image_reply_record, - 'Rcrc' : Verify_Checksum_reply_record, -} - -_propdeclarations = { - 'crcE' : expected_checksum, - 'Rch2' : error_count, - 'crcA' : calculated_checksum, - 'Rch3' : warning_count, - 'Vlid' : validity, - 'Rch1' : consistency, -} - -_compdeclarations = { -} - -_enumdeclarations = { - 'Acss' : _Enum_Acss, - 'Fsys' : _Enum_Fsys, -} diff --git a/Mac/Demo/applescript/Disk_Copy/Standard_Suite.py b/Mac/Demo/applescript/Disk_Copy/Standard_Suite.py deleted file mode 100644 index 2dad9479901..00000000000 --- a/Mac/Demo/applescript/Disk_Copy/Standard_Suite.py +++ /dev/null @@ -1,477 +0,0 @@ -"""Suite Standard Suite: Common terms for most applications -Level 1, version 1 - -Generated from Macintosh HD:Hulpprogramma's:Disk Copy -AETE/AEUT resource version 1/0, language 0, script 0 -""" - -import aetools -import MacOS - -_code = 'Core' - -class Standard_Suite_Events: - - _argmap_save = { - '_in' : 'kfil', - 'using_format' : 'SvAs', - 'checksum_verification' : 'VChk', - 'signature_verification' : 'VSig', - 'image_signing' : 'SImg', - 'leave_image_mounted' : 'Moun', - 'percent_free_space' : 'Slop', - 'logical_blocks' : 'Blks', - 'zeroing' : 'Zero', - } - - def save(self, _object, _attributes={}, **_arguments): - """save: Save an object - Required argument: the source object - Keyword argument _in: the target object - Keyword argument using_format: the format for the target - Keyword argument checksum_verification: Should the checksum be verified before saving? - Keyword argument signature_verification: Should the DigiSignŽ signature be verified before saving? - Keyword argument image_signing: Should the image be signed? - Keyword argument leave_image_mounted: Should the image be mounted after saving? - Keyword argument percent_free_space: percent free space to reserve (for image folder operation, 0-255%) - Keyword argument logical_blocks: number of logical blocks in the image (for image folder operation) - Keyword argument zeroing: Should all the blocks in the image be set to zeros? (for image folder operation) - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: the result of the save operation - """ - _code = 'core' - _subcode = 'save' - - aetools.keysubst(_arguments, self._argmap_save) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'kfil', _Enum_obj_) - aetools.enumsubst(_arguments, 'SvAs', _Enum_SvAs) - aetools.enumsubst(_arguments, 'VChk', _Enum_bool) - aetools.enumsubst(_arguments, 'VSig', _Enum_bool) - aetools.enumsubst(_arguments, 'SImg', _Enum_bool) - aetools.enumsubst(_arguments, 'Moun', _Enum_bool) - aetools.enumsubst(_arguments, 'Slop', _Enum_long) - aetools.enumsubst(_arguments, 'Blks', _Enum_long) - aetools.enumsubst(_arguments, 'Zero', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - def do_script(self, _object, _attributes={}, **_arguments): - """do script: Execute an attached script located in the folder "Scripts" - Required argument: the script to be executed - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'core' - _subcode = 'dosc' - - if _arguments: raise TypeError('No optional args expected') - _arguments['----'] = _object - - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - -class application(aetools.ComponentItem): - """application - The Disk Copy application """ - want = 'capp' -class version(aetools.NProperty): - """version - the version of this application """ - which = 'vers' - want = 'vers' -class name(aetools.NProperty): - """name - the name of this application """ - which = 'pnam' - want = 'TEXT' -class comment(aetools.NProperty): - """comment - the comment associated with the application """ - which = 'comt' - want = 'TEXT' -class driver_version(aetools.NProperty): - """driver version - the version of the disk image driver """ - which = 'dVer' - want = 'vers' -class nonejectable_mode(aetools.NProperty): - """nonejectable mode - Should mounted images be non-ejectable? """ - which = 'otto' - want = 'bool' -class save_log_file(aetools.NProperty): - """save log file - Should the log file be saved on disk? """ - which = 'PSaL' - want = 'bool' -class use_speech(aetools.NProperty): - """use speech - Should Disk Copy use spoken feedback? """ - which = 'PTlk' - want = 'bool' -class smart_Save_As(aetools.NProperty): - """smart Save As - Should the Save As... dialog box automatically go to the right folder? """ - which = 'PSSP' - want = 'bool' -class checksum_verification(aetools.NProperty): - """checksum verification - Should image checksums be verified? """ - which = 'PVeC' - want = 'bool' -class signature_verification(aetools.NProperty): - """signature verification - Should digital signatures be verified? """ - which = 'PVeS' - want = 'bool' -class exclude_DiskScripts(aetools.NProperty): - """exclude DiskScripts - Should images referenced in DiskScripts/DiskSets be excluded from verification? """ - which = 'PExD' - want = 'bool' -class exclude_remote_images(aetools.NProperty): - """exclude remote images - Should images that are located on network volumes be excluded from verification? """ - which = 'PExR' - want = 'bool' -class image_signing(aetools.NProperty): - """image signing - Should images be signed with a digital signature? """ - which = 'PSiI' - want = 'bool' -class leave_image_mounted(aetools.NProperty): - """leave image mounted - Should images be mounted after they are created? """ - which = 'PMoA' - want = 'bool' -class erase_confirmation(aetools.NProperty): - """erase confirmation - Should the user be required to confirm commands that erase disks? """ - which = 'PCoE' - want = 'bool' -class zeroing(aetools.NProperty): - """zeroing - Should all blocks of a new image be set to zero? """ - which = 'PZeB' - want = 'bool' -class default_create_size(aetools.NProperty): - """default create size - the default size for a new image, in blocks (512 bytes per block) """ - which = 'PDeS' - want = 'long' -class default_create_name(aetools.NProperty): - """default create name - the default volume name for a new image """ - which = 'PDeN' - want = 'TEXT' -class make_multiple_floppies(aetools.NProperty): - """make multiple floppies - Should the user be prompted to make multiple floppy disk images at a time? """ - which = 'PBuM' - want = 'bool' -class auto_image_upon_insert(aetools.NProperty): - """auto image upon insert - Should a newly-inserted disk automatically be processed into an image? """ - which = 'Paim' - want = 'bool' -class eject_after_auto_image(aetools.NProperty): - """eject after auto image - Should auto-imaged disks be ejected afterwards? """ - which = 'Pejc' - want = 'bool' -class auto_copy_upon_floppy_insert(aetools.NProperty): - """auto copy upon floppy insert - Instead of auto-imaging, should newly-inserted floppy disks be copied? """ - which = 'Pcpf' - want = 'bool' -class volume_suffix(aetools.NProperty): - """volume suffix - the default volume name suffix """ - which = 'PDiE' - want = 'TEXT' -class image_suffix(aetools.NProperty): - """image suffix - the default image name suffix """ - which = 'PImE' - want = 'TEXT' -class default_file_system(aetools.NProperty): - """default file system - the default file system type for new blank images """ - which = 'Pfsy' - want = 'Fsys' -class default_image_format(aetools.NProperty): - """default image format - the default image file format """ - which = 'Pdfm' - want = 'SvAs' - -class disk(aetools.ComponentItem): - """disk - A mounted volume """ - want = 'Disk' - -name = name - -comment = comment -class locked(aetools.NProperty): - """locked - Is the disk locked? """ - which = 'islk' - want = 'bool' -class creation_date(aetools.NProperty): - """creation date - the creation date of disk """ - which = 'ascd' - want = 'ldt ' -class modification_date(aetools.NProperty): - """modification date - the modification date of disk """ - which = 'asmo' - want = 'ldt ' -class crc32_checksum(aetools.NProperty): - """crc32 checksum - the crc-32 checksum of the disk """ - which = 'Xcrc' - want = 'TEXT' -class disk_copy_4_2e_2_checksum(aetools.NProperty): - """disk copy 4.2 checksum - the Disk Copy 4.2 checksum of the disk """ - which = 'Xc42' - want = 'TEXT' -class block_count(aetools.NProperty): - """block count - the number of blocks on disk """ - which = 'Xblk' - want = 'long' -class file_system(aetools.NProperty): - """file system - the file system used on disk """ - which = 'Xfsi' - want = 'TEXT' - -class folder(aetools.ComponentItem): - """folder - A folder or directory on a disk """ - want = 'Fold' - -name = name - -comment = comment - -creation_date = creation_date - -modification_date = modification_date - -class disk_image(aetools.ComponentItem): - """disk image - A disk image file """ - want = 'DImg' - -name = name - -comment = comment - -locked = locked - -creation_date = creation_date - -modification_date = modification_date -class file_format(aetools.NProperty): - """file format - the format of the disk image file """ - which = 'Ifmt' - want = 'TEXT' -class signed(aetools.NProperty): - """signed - Does the disk image have a DigiSignŽ signature? """ - which = 'Isin' - want = 'bool' -class compressed(aetools.NProperty): - """compressed - Is the disk image compressed? """ - which = 'Icom' - want = 'bool' -class segmented(aetools.NProperty): - """segmented - Is the disk image segmented? """ - which = 'Iseg' - want = 'bool' -class segments(aetools.NProperty): - """segments - a list of references to other segments that make up a complete image """ - which = 'Isg#' - want = 'fss ' -class disk_name(aetools.NProperty): - """disk name - the name of the disk this image represents """ - which = 'Idnm' - want = 'TEXT' - -crc32_checksum = crc32_checksum - -disk_copy_4_2e_2_checksum = disk_copy_4_2e_2_checksum - -block_count = block_count - -file_system = file_system -class data_fork_size(aetools.NProperty): - """data fork size - the size (in bytes) of the data fork of the disk image """ - which = 'Idfk' - want = 'long' -class resource_fork_size(aetools.NProperty): - """resource fork size - the size (in bytes) of the resource fork of the disk image """ - which = 'Irfk' - want = 'long' - -class Save_reply_record(aetools.ComponentItem): - """Save reply record - Result from the save operation """ - want = 'cpyR' -class resulting_target_object(aetools.NProperty): - """resulting target object - a reference to the target object after it has been saved """ - which = 'rcpO' - want = 'obj ' -class copy_type(aetools.NProperty): - """copy type - the way in which the target object was saved """ - which = 'rcpT' - want = 'rcpT' -application._propdict = { - 'version' : version, - 'name' : name, - 'comment' : comment, - 'driver_version' : driver_version, - 'nonejectable_mode' : nonejectable_mode, - 'save_log_file' : save_log_file, - 'use_speech' : use_speech, - 'smart_Save_As' : smart_Save_As, - 'checksum_verification' : checksum_verification, - 'signature_verification' : signature_verification, - 'exclude_DiskScripts' : exclude_DiskScripts, - 'exclude_remote_images' : exclude_remote_images, - 'image_signing' : image_signing, - 'leave_image_mounted' : leave_image_mounted, - 'erase_confirmation' : erase_confirmation, - 'zeroing' : zeroing, - 'default_create_size' : default_create_size, - 'default_create_name' : default_create_name, - 'make_multiple_floppies' : make_multiple_floppies, - 'auto_image_upon_insert' : auto_image_upon_insert, - 'eject_after_auto_image' : eject_after_auto_image, - 'auto_copy_upon_floppy_insert' : auto_copy_upon_floppy_insert, - 'volume_suffix' : volume_suffix, - 'image_suffix' : image_suffix, - 'default_file_system' : default_file_system, - 'default_image_format' : default_image_format, -} -application._elemdict = { -} -disk._propdict = { - 'name' : name, - 'comment' : comment, - 'locked' : locked, - 'creation_date' : creation_date, - 'modification_date' : modification_date, - 'crc32_checksum' : crc32_checksum, - 'disk_copy_4_2e_2_checksum' : disk_copy_4_2e_2_checksum, - 'block_count' : block_count, - 'file_system' : file_system, -} -disk._elemdict = { -} -folder._propdict = { - 'name' : name, - 'comment' : comment, - 'creation_date' : creation_date, - 'modification_date' : modification_date, -} -folder._elemdict = { -} -disk_image._propdict = { - 'name' : name, - 'comment' : comment, - 'locked' : locked, - 'creation_date' : creation_date, - 'modification_date' : modification_date, - 'file_format' : file_format, - 'signed' : signed, - 'compressed' : compressed, - 'segmented' : segmented, - 'segments' : segments, - 'disk_name' : disk_name, - 'crc32_checksum' : crc32_checksum, - 'disk_copy_4_2e_2_checksum' : disk_copy_4_2e_2_checksum, - 'block_count' : block_count, - 'file_system' : file_system, - 'data_fork_size' : data_fork_size, - 'resource_fork_size' : resource_fork_size, -} -disk_image._elemdict = { -} -Save_reply_record._propdict = { - 'resulting_target_object' : resulting_target_object, - 'copy_type' : copy_type, -} -Save_reply_record._elemdict = { -} -_Enum_UIAc = { - 'never_interact' : 'eNvr', # DonÕt allow any interaction at all - 'interact_with_self' : 'eInS', # Only allow interaction from internal events - 'interact_with_local' : 'eInL', # Allow interaction from any event originating on this machine - 'interact_with_all' : 'eInA', # Allow interaction from network events -} - -_Enum_SvAs = { - 'NDIF_RW' : 'RdWr', # read/write NDIF disk image - 'NDIF_RO' : 'Rdxx', # read-only NDIF disk image - 'NDIF_Compressed' : 'ROCo', # compressed NDIF disk image - 'Disk_Copy_4_2e_2' : 'DC42', # Disk Copy 4.2 disk image -} - -_Enum_rcpT = { - 'block_disk_copy' : 'cpBl', # block-by-block disk-level copy - 'files_and_file_ID_copy' : 'cpID', # all files including desktop databases and file IDÕs - 'files_and_desktop_info' : 'cpDT', # all files and most desktop information - 'files_only' : 'cpFI', # all files but no desktop information - 'disk_image_conversion' : 'cpCV', # disk image format conversion - 'disk_image_creation' : 'cpCR', # disk image creation -} - -_Enum_long = None # XXXX enum long not found!! -_Enum_bool = None # XXXX enum bool not found!! -_Enum_obj_ = None # XXXX enum obj not found!! - -# -# Indices of types declared in this module -# -_classdeclarations = { - 'DImg' : disk_image, - 'capp' : application, - 'Disk' : disk, - 'Fold' : folder, - 'cpyR' : Save_reply_record, -} - -_propdeclarations = { - 'Xcrc' : crc32_checksum, - 'PDeS' : default_create_size, - 'Idnm' : disk_name, - 'PSSP' : smart_Save_As, - 'Pcpf' : auto_copy_upon_floppy_insert, - 'pnam' : name, - 'Isin' : signed, - 'otto' : nonejectable_mode, - 'PExD' : exclude_DiskScripts, - 'Iseg' : segmented, - 'islk' : locked, - 'asmo' : modification_date, - 'PTlk' : use_speech, - 'Pfsy' : default_file_system, - 'PVeC' : checksum_verification, - 'Xc42' : disk_copy_4_2e_2_checksum, - 'rcpO' : resulting_target_object, - 'Paim' : auto_image_upon_insert, - 'comt' : comment, - 'PCoE' : erase_confirmation, - 'dVer' : driver_version, - 'PDeN' : default_create_name, - 'PBuM' : make_multiple_floppies, - 'rcpT' : copy_type, - 'PDiE' : volume_suffix, - 'Ifmt' : file_format, - 'Pdfm' : default_image_format, - 'ascd' : creation_date, - 'Pejc' : eject_after_auto_image, - 'PZeB' : zeroing, - 'PExR' : exclude_remote_images, - 'PImE' : image_suffix, - 'PVeS' : signature_verification, - 'PSaL' : save_log_file, - 'Xblk' : block_count, - 'PMoA' : leave_image_mounted, - 'Isg#' : segments, - 'Irfk' : resource_fork_size, - 'Icom' : compressed, - 'Xfsi' : file_system, - 'Idfk' : data_fork_size, - 'vers' : version, - 'PSiI' : image_signing, -} - -_compdeclarations = { -} - -_enumdeclarations = { - 'SvAs' : _Enum_SvAs, - 'UIAc' : _Enum_UIAc, - 'rcpT' : _Enum_rcpT, -} diff --git a/Mac/Demo/applescript/Disk_Copy/Utility_Events.py b/Mac/Demo/applescript/Disk_Copy/Utility_Events.py deleted file mode 100644 index 92133452c3d..00000000000 --- a/Mac/Demo/applescript/Disk_Copy/Utility_Events.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Suite Utility Events: Commands that allow the user to select Disk Copy files -Level 1, version 1 - -Generated from Macintosh HD:Hulpprogramma's:Disk Copy -AETE/AEUT resource version 1/0, language 0, script 0 -""" - -import aetools -import MacOS - -_code = 'ddsk' - -class Utility_Events_Events: - - _argmap_select_disk_image = { - 'with_prompt' : 'SELp', - } - - def select_disk_image(self, _no_object=None, _attributes={}, **_arguments): - """select disk image: Prompt the user to select a disk image - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to a disk image - """ - _code = 'UTIL' - _subcode = 'SEL1' - - aetools.keysubst(_arguments, self._argmap_select_disk_image) - if _no_object is not None: raise TypeError('No direct arg expected')y - - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_select_DiskScript = { - 'with_prompt' : 'SELp', - } - - def select_DiskScript(self, _no_object=None, _attributes={}, **_arguments): - """select DiskScript: Prompt the user to select a DiskScript - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to a DiskScript - """ - _code = 'UTIL' - _subcode = 'SEL2' - - aetools.keysubst(_arguments, self._argmap_select_DiskScript) - if _no_object is not None: raise TypeError('No direct arg expected') - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_select_disk_image_or_DiskScript = { - 'with_prompt' : 'SELp', - } - - def select_disk_image_or_DiskScript(self, _no_object=None, _attributes={}, **_arguments): - """select disk image or DiskScript: Prompt the user to select a disk image or DiskScript - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to disk image or a DiskScript - """ - _code = 'UTIL' - _subcode = 'SEL3' - - aetools.keysubst(_arguments, self._argmap_select_disk_image_or_DiskScript) - if _no_object is not None: raise TypeError('No direct arg expected') - - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_select_floppy_disk_image = { - 'with_prompt' : 'SELp', - } - - def select_floppy_disk_image(self, _no_object=None, _attributes={}, **_arguments): - """select floppy disk image: Prompt the user to select a floppy disk image - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to a floppy disk image - """ - _code = 'UTIL' - _subcode = 'SEL4' - - aetools.keysubst(_arguments, self._argmap_select_floppy_disk_image) - if _no_object is not None: raise TypeError('No direct arg expected') - - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_select_disk = { - 'with_prompt' : 'SELp', - } - - def select_disk(self, _no_object=None, _attributes={}, **_arguments): - """select disk: Prompt the user to select a disk volume - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to the disk - """ - _code = 'UTIL' - _subcode = 'SEL5' - - aetools.keysubst(_arguments, self._argmap_select_disk) - if _no_object is not None: raise TypeError('No direct arg expected') - - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_select_folder = { - 'with_prompt' : 'SELp', - } - - def select_folder(self, _no_object=None, _attributes={}, **_arguments): - """select folder: Prompt the user to select a folder - Keyword argument with_prompt: the prompt string to be displayed - Keyword argument _attributes: AppleEvent attribute dictionary - Returns: a reference to the folder - """ - _code = 'UTIL' - _subcode = 'SEL6' - - aetools.keysubst(_arguments, self._argmap_select_folder) - if _no_object is not None: raise TypeError('No direct arg expected') - - aetools.enumsubst(_arguments, 'SELp', _Enum_TEXT) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - - _argmap_log = { - 'time_stamp' : 'TSMP', - } - - def log(self, _object, _attributes={}, **_arguments): - """log: Add a string to the log window - Required argument: the string to add to the log window - Keyword argument time_stamp: Should the log entry be time-stamped? (false if not supplied) - Keyword argument _attributes: AppleEvent attribute dictionary - """ - _code = 'UTIL' - _subcode = 'LOG ' - - aetools.keysubst(_arguments, self._argmap_log) - _arguments['----'] = _object - - aetools.enumsubst(_arguments, 'TSMP', _Enum_bool) - - _reply, _arguments, _attributes = self.send(_code, _subcode, - _arguments, _attributes) - if _arguments.has_key('errn'): - raise aetools.Error(aetools.decodeerror(_arguments)) - # XXXX Optionally decode result - if _arguments.has_key('----'): - return _arguments['----'] - -_Enum_TEXT = None # XXXX enum TEXT not found!! -_Enum_bool = None # XXXX enum bool not found!! - -# -# Indices of types declared in this module -# -_classdeclarations = { -} - -_propdeclarations = { -} - -_compdeclarations = { -} - -_enumdeclarations = { -} diff --git a/Mac/Demo/applescript/Disk_Copy/__init__.py b/Mac/Demo/applescript/Disk_Copy/__init__.py deleted file mode 100644 index ac5056161f9..00000000000 --- a/Mac/Demo/applescript/Disk_Copy/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -""" -Package generated from Macintosh HD:Hulpprogramma's:Disk Copy -Resource aete resid 0 -""" -import aetools -Error = aetools.Error -import Standard_Suite -import Special_Events -import Utility_Events - - -_code_to_module = { - 'Core' : Standard_Suite, - 'ddsk' : Special_Events, - 'ddsk' : Utility_Events, -} - - - -_code_to_fullname = { - 'Core' : ('Disk_Copy.Standard_Suite', 'Standard_Suite'), - 'ddsk' : ('Disk_Copy.Special_Events', 'Special_Events'), - 'ddsk' : ('Disk_Copy.Utility_Events', 'Utility_Events'), -} - -from Standard_Suite import * -from Special_Events import * -from Utility_Events import * - - -class Disk_Copy(Standard_Suite_Events, - Special_Events_Events, - Utility_Events_Events, - aetools.TalkTo): - _signature = 'ddsk' diff --git a/Mac/Demo/applescript/makedisk.py b/Mac/Demo/applescript/makedisk.py deleted file mode 100644 index 981a5ef2869..00000000000 --- a/Mac/Demo/applescript/makedisk.py +++ /dev/null @@ -1,15 +0,0 @@ -import Disk_Copy -import macfs -import sys - -talker = Disk_Copy.Disk_Copy(start=1) -talker.activate() -filespec = macfs.FSSpec('my disk image.img') -try: - objref = talker.create('my disk image', saving_as=filespec, leave_image_mounted=1) -except Disk_Copy.Error as arg: - print("ERROR: my disk image:", arg) -else: - print('objref=', objref) -print('Type return to exit-') -sys.stdin.readline() diff --git a/Mac/Demo/example0.html b/Mac/Demo/example0.html deleted file mode 100644 index 4d785404067..00000000000 --- a/Mac/Demo/example0.html +++ /dev/null @@ -1,75 +0,0 @@ -Using python to create Macintosh applications, part zero - -

Using python to create Macintosh applications, part zero

-
- -This document will show you how to create a simple mac-style -application using Python. We will glance at how to use file dialogs and -messages.

- -Our example program checktext.py asks -the user for a text file and checks what style end-of-lines the file has. -This may need a little explanation: ASCII text files are almost identical -on different machines, with one exception: -

    -
  • Unix systems terminate lines with the "linefeed" character, 0x0a, -
  • Macintoshes terminate lines with the "carriage return" character, -0x0d and -
  • MSDOS and Windows terminate lines with first a carriage return and then a linefeed. -
- -Let us have a look at the program. The first interesting statement in the main -program is the call to macfs.PromptGetFile. This is one of the routines -that allow you to ask the user to specify a file. You pass it one required -argument, the prompt string. There are up to four optional MacOS file type arguments -you can pass, as 4-byte strings. Specifying no file -type will allow the user to select any file, specifying one or more types restricts -the user to files of this type. File types are explained in most books on the Mac.

- -PromptGetFile returns two values: an FSSpec object and a -success indicator. The FSSpec object is the "official" MacOS way of specifying a -file, more on it later. The success indicator tells you whether the user clicked OK -or Cancel. In the event of Cancel we simply exit back to the finder.

- -PromptGetFile has a number of friends that do similar things: -

    -
  • StandardGetFile is identical to PromptGetFile but -without the prompt. It has up to four optional filetype arguments. -
  • StandardPutFile asks the user for an output file. It will -warn the user when she tries to overwrite an existing file. The routine has one -mandatory argument: a prompt string. Pass the empty string if you do not want a prompt. -
  • GetDirectory asks the user for a folder (or directory, in unix terms). -It has one optional argument: a prompt string. -
-All routines return an FSSpec and a success indicator.

- -There are many things you can do with FSSpec objects (see the -macfs section in the -Python Library Reference -for details), but passing them to open is not -one of them. For this, we first have to convert the FSSpec object to a pathname, with -the as_pathname method. This returns a standard MacOS-style pathname with -colon-separated components. This can then be passed to open. Note that -we call open with mode parameter 'rb': we want to read the file in binary -mode. Python, like C and C++, uses unix-style line endings internally and opening a -file in text mode ('r') would result in conversion of carriage-returns to -linefeeds upon reading. This is something that Mac and DOS programmers are usually aware -of but that never ceases to amaze unix buffs.

- -After we open the file we attempt to read all data into memory. If this fails we use -EasyDialogs.Message to display a message in a standard dialog box and exit. -The EasyDialogs module has a few more useful simple dialog routines, more on that in -example 1.

- -The rest of the code is pretty straightforward: we check that the file actually contains -data, count the number of linefeeds and returns and display a message with our guess of the -end-of-line convention used in the file.

- -The example0 folder has three text files in Mac, Unix and DOS style -for you to try the program on. After that, you can continue with example 1 -or go back to the index to find another interesting topic.

- -


-Jack Jansen, -jack@cwi.nl, 18-July-1996. - diff --git a/Mac/Demo/example0/checktext.py b/Mac/Demo/example0/checktext.py deleted file mode 100644 index 25f71e47cf9..00000000000 --- a/Mac/Demo/example0/checktext.py +++ /dev/null @@ -1,35 +0,0 @@ -"""checktext - Check that a text file has macintosh-style newlines""" - -import sys -import EasyDialogs -import string - -def main(): - pathname = EasyDialogs.AskFileForOpen(message='File to check end-of-lines in:') - if not pathname: - sys.exit(0) - fp = open(pathname, 'rb') - try: - data = fp.read() - except MemoryError: - EasyDialogs.Message('Sorry, file is too big.') - sys.exit(0) - if len(data) == 0: - EasyDialogs.Message('File is empty.') - sys.exit(0) - number_cr = string.count(data, '\r') - number_lf = string.count(data, '\n') - if number_cr == number_lf == 0: - EasyDialogs.Message('File contains no lines.') - if number_cr == 0: - EasyDialogs.Message('File has unix-style line endings') - elif number_lf == 0: - EasyDialogs.Message('File has mac-style line endings') - elif number_cr == number_lf: - EasyDialogs.Message('File probably has MSDOS-style line endings') - else: - EasyDialogs.Message('File has no recognizable line endings (binary file?)') - sys.exit(0) - -if __name__ == '__main__': - main() diff --git a/Mac/Demo/example1.html b/Mac/Demo/example1.html deleted file mode 100644 index 03c99789b8a..00000000000 --- a/Mac/Demo/example1.html +++ /dev/null @@ -1,193 +0,0 @@ -Using python to create Macintosh applications, part one - - -

Using python to create Macintosh applications, part one

-
- -This document will show you how to create a simple mac-style -application using Python. We will glance at how to use dialogs and -resources.

- -The example application we look at will be a simple program with a -dialog that allows you to perform domain name lookups on IP addresses -and hostnames. -The source code and -resource file -for this application are available in the example1 folder (which you will have to download -if you are reading this document over the net and if you want to look -at the resources).

- -We will use the builtin module "socket" that allows a -Python program to perform all sorts of networking functions, and we -will create the user interface around that. You should be able to run -the sample code with the standard Python distribution.

- - -If you are interested in building your own extensions to python you -should check out the companion document Creating Macintosh Python C extensions, -which tells you how to build your own C extension. -

- - -

Creating dialog resources

- -Let us start with the creative bit: building the dialogs and creating -an icon for our program. For this you need ResEdit, and a reasonable -working knowledge of how to use it. "Inside Mac" or various books on -macintosh programming will help here.

- -There is one fine point that deserves to be mentioned here: resource numbering. Because often your -resources will be combined with those that the Python interpreter and -various standard modules need you should give your DLOG and DITL -resources numbers above 512. 128 and below are reserved for Apple, -128-228 are for extensions like Tk, -228-255 for the Python interpreter and 256-511 for standard -modules. If you are writing a module that you will be distributing for -inclusion in other people's programs you may want to register a number -in the 256-511 range, contact Guido or myself or whoever you think is -"in charge" of Python for the Macintosh at the moment. Even though the -application we are writing at the moment will keep its resources in a -separate resource file it is still a good idea to make sure that no -conflicts arise: once you have opened your resource file any attempt -by the interpreter to open a dialog will also search your resource -file.

- -Okay, let's have a look at dnslookup-1.rsrc, our resource file. -The DLOG and accompanying DITL resource both have number 512. Since -ResEdit creates both with default ID=128 you should take care to -change the number on both. The dialog itself is pretty basic: two -buttons (Lookup and Quit), two labels and -two text entry areas, one of which is used for output only. Here's what -the dialog will look like at run time

-

-dialog image -
-

- -

An application with a modal dialog

- -Next, we will have to write the actual application. For this example, -we will use a modal dialog. This means that we will put up the dialog -and go into a loop asking the dialog manager for events (buttons -pushed). We handle the actions requested by the user until the Quit -button is pressed, upon which we exit our loop (and the program). This -way of structuring your program is actually rather antisocial, since -you force the user to do whatever you, the application writer, happen -to want. A modal dialog leaves no way of escape whatsoever (except -command-option-escape), and is usually not a good way to structure -anything but the most simple questions. Even then: how often have you -been confronted with a dialog asking a question that you could not -answer because the data you needed was obscured by the dialog itself? -In the next example we will look at an application that does pretty -much the same as this one but in a more user-friendly way.

- -The code itself is contained in the file dnslookup-1.py. Have -a copy handy before you read on. The file starts off with a -textstring giving a short description. Not many tools do anything with -this as yet, but at some point in the future we will have all -sorts of nifty class browser that will display this string, so just -include it. Just put a short description at the start of each module, -class, method and function. After the initial description and some -comments, we import the modules we need.

- -EasyDialogs is a handy standard -module that provides you with routines that put up common text-only -modal dialogs: -

    -
  • Message(str) -displays the message "str" and an OK button, -
  • AskString(prompt, default) -asks for a string, displays OK and Cancel buttons, -
  • AskYesNoCancel(question, default) -displays a question and Yes, No and Cancel buttons. -
- -Res is a pretty complete interface to -the MacOS Resource Manager, described fully in Inside Mac. There is -currently no documentation of it, but the Apple documentation (or -Think Ref) will help you on your way if you remember two points: -
    -
  • Resources are implemented as Python objects, and each routine -with a resource first argument is implemented as a python method. -
  • When in doubt about the arguments examine the routines docstring, -as in print Res.OpenResFile.__doc__ -
- -Similarly, Dlg is an interface to the -Dialog manager (with Dialogs being implemented as python objects and -routines with Dialog arguments being methods). The sys module you -know, I hope. The string module is an often used module that enables -you to perform many string related operations. In this case however, we -are only using the "digits" constant from the string module. We could -have simply defined "digits" as "0123456789". The socket module enables -us to perform the domain name lookups. We -use two calls from it: -
    -
  • gethostbyaddr() -returns the hostname associated with an IP address -
  • gethostbyname() -returns the IP address associated with a hostname -
- -Next in the source file we get definitions for our dialog resource -number and for the item numbers in our dialog. These should match the -situation in our resource file dnslookup-1.rsrc, -obviously.

- -On to the main program. We start off with opening our resource file, -which should live in the same folder as the python source. If we -cannot open it we use EasyDialogs to print a message and -exit. You can try it: just move the resource file somewhere else for a -moment. Then we call do_dialog() to do the real work.

- -Do_dialog() uses Dlg.GetNewDialog() to open -a dialog window initialized from 'DLOG' resource ID_MAIN and putting -it on screen in the frontmost position. Next, we go into a loop, -calling Dlg.ModalDialog() to wait for the next user -action. ModalDialog() will return us the item number that -the user has clicked on (or otherwise activated). It will handle a few -slightly more complicated things also, like the user typing into -simple textfields, but it will not do things like updating -the physical appearance of radio buttons, etc. See Inside Mac or -another programming guide for how to handle this -yourself. Fortunately, our simple application doesn't have to bother with this, -since buttons and textfields are the only active elements we have. So, we do a -simple switch on item number and call the appropriate routine to implement the -action requested. Upon the user pressing "Quit" we simply leave the loop and, -hence, do_dialog(). This will cause the python dialog object -my_dlg to be deleted and the on-screen dialog to disappear.

- -Time for a warning: be very careful what -you do as long as a dialog is on-screen. Printing something, for -instance, may suddenly cause the standard output window to appear over -the dialog, and since we took no measures to redraw the dialog it will -become very difficult to get out of the dialog. Also, command-period -may or may not work in this situation. I have also seen crashes in -such a situation, probably due to the multiple event loops involved or -some oversight in the interpreter. You have been warned.

- -The implementation of the "Lookup" command can use a bit more -explaining: we get the necessary information with dnslookup() -but now we have to update the on-screen dialog to present this -information to the user. The GetDialogItem() method of -the dialog returns three bits of information about the given item: its -type, its data handle and its rect (the on-screen x,y,w,h -coordinates). We are only interested in the data handle here, on which -we call SetDialogItemText() to set our new text. Note -here that python programmers need not bother with the C-string versus -pascal-string controversy: the python glue module knows what is needed -and converts the python string to the correct type.

- -And that concludes our first example of the use of resources and -dialogs. Next, you could have a look at the source of EasyDialogs for -some examples of using input fields and filterprocs. Or, go on with -reading the second part of this document -to see how to implement a better version of this application.

- - - - diff --git a/Mac/Demo/example1/dnslookup-1.gif b/Mac/Demo/example1/dnslookup-1.gif deleted file mode 100644 index 3cd70b2a1d009d47993afda5c3f72d6176efa355..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2570 zcmbu8`8!qr7RNtzZ<8o0Ly-*05J%aBZzWffA>wO}24u_dCFdA2l%6I-87g6$3nv{z zbWE8VlyP4fiYQ8hDXEAKb?m#gf8l1?UL^w|17=a^tU7&y@h7%Y@U7nFn1 zuq{{#egGzPgB`#G3&Vy$4PpQdoqz=#Fc`E!8qp`Bt04_BJOmd5BVj)n3lWCskAwDg z@!oWD@r1O^i&vp*7mcP}U-XV{U9^Kf!s3Rs(jqi{lSK|%cu^WY2e=ZL2Rlt7G=NYI zLL7vm5DG@f79m4~gKceX4Gj(D%MF9?W<(e zdd{l?2d>vZYk5I0+m08fCvTQnE3WamEd`4xFMP-yd10b^QQEv(6Lqq!3o@^TmVfEJ zn~3U&YF*E2^pVE3A!Jy+!(n&xsGsH|2$jYeQJW?Kx{B8FkgZ<2~FLjm32} zUXz3ThWO>`^|koaa5r~XrbAs=$LPB@b*YGYe*Mh1FZa_T9z|5~`HC_}maI9IZNE%9 z|AgHt#^`%%Aw8wre~Vb0avVE(|?XzkRL?i(hp%kpgXo?bqg7-qi8 z_Uux%SMGN9u0(Q@@Fvff$tJf$Y*Spj4zR7Ar;Ix+SbD2+&5sX9D-u2x%Ac>A%jK~% zgT$&kGp~$CpRznV@2QY|Mp*s24IK}aD5-L{9`gF(gp7fX&T0WF> z61%^F;nZ8y=zCJl>9v@+(($+K@voI$muu21;%u)n?8l{T6{@~<6--nmK6mo7o_B5b zb>mNNSI%wHRsLT5@5*GqtAg4S-y4Ki?0H$cqTrza^Wme{O3!Tan>gAe?Y)B8+!K4~ zLBO`G3FlUo?M=+K<~qUY0IK~@7P;&96;^xiD{}hmZpzuI!@zHZ)%i^%w#?g9oj=fN z;UO6KQtGhzOq1PlHD=F|WHPWw#O0yu0zYK;du&cd%%3q+h}_HLz=q zcj?nKv)YMZta{{UuKkujW6!pDhd(J2Z=ElD)HWYF`ps zgsuHeXKs=ev2~$V@=rLm^TWHk!OBOoOG?gDlGzJW3Xi`k`)HKBaafR6BI+H#UywN2 zxuiwBV$?rDC*$|~69!5Kj}l5Qh3m=+%-ne@IyJ&%NUarg;}K$A9Sp2?D1@26pX9$T ziS(M26<+nMLDtkL%1Cwfx|{j>0vbQG%xo<7X*eXD({zuqk%|%>vU&C||7X%C1al;s zj2ksle_V5~Jy=^G)wrwrN35HTy!hUf+;ci2jM=Itv3S>m^`HFX`|jiA^ zSehyGk4@g*l_AD<%Ws^|&~TSJklVd>%UjdP2b+}Sy916Ir~$~}p4Y3iM$JS;QE`TCsEuXJ z&jJ@!&d1gm8*ZvqkyPk-q}O;)SiM#u>FVwDg=1dZdi5@Kd;4+O=(SZ{CigEY+;x#% z;Xu8%VqcCeJgI2b*Lr03!L3)3ddM-c$#s^SEu`kI)#m6PXPft{qtMH~t-q(QdbYge z^4Cq)l5hI^XDfMe_Vj;;;jN^Trx+7~wReT53PAFDW1S-a5B2o+)t&IshyO~!ul{1~>8*Hx)FTc3eXvnyR$T$YMvt%qiJp$bW(C+^MNIn3~ diff --git a/Mac/Demo/example1/dnslookup-1.py b/Mac/Demo/example1/dnslookup-1.py deleted file mode 100644 index 6eb2c73f736..00000000000 --- a/Mac/Demo/example1/dnslookup-1.py +++ /dev/null @@ -1,55 +0,0 @@ -"""Sample program performing domain name lookups and showing off EasyDialogs, -Res and Dlg in the process""" - -import EasyDialogs -from Carbon import Res -from Carbon import Dlg -import socket -import string -import macresource -# -# Definitions for our resources -ID_MAIN=512 - -ITEM_LOOKUP_ENTRY=1 -ITEM_RESULT=2 -ITEM_LOOKUP_BUTTON=3 -ITEM_QUIT_BUTTON=4 - -def main(): - """Main routine: open resource file, call dialog handler""" - macresource.need("DLOG", ID_MAIN, "dnslookup-1.rsrc") - do_dialog() - -def do_dialog(): - """Post dialog and handle user interaction until quit""" - my_dlg = Dlg.GetNewDialog(ID_MAIN, -1) - while 1: - n = Dlg.ModalDialog(None) - if n == ITEM_LOOKUP_BUTTON: - tp, h, rect = my_dlg.GetDialogItem(ITEM_LOOKUP_ENTRY) - txt = Dlg.GetDialogItemText(h) - - tp, h, rect = my_dlg.GetDialogItem(ITEM_RESULT) - Dlg.SetDialogItemText(h, dnslookup(txt)) - elif n == ITEM_QUIT_BUTTON: - break - -def dnslookup(str): - """ Perform DNS lookup on str. If first character of digit is numeric, - assume that str contains an IP address. Otherwise, assume that str - contains a hostname.""" - if str == '': str = ' ' - if str[0] in string.digits: - try: - value = socket.gethostbyaddr(str)[0] - except: - value = 'Lookup failed' - else: - try: - value = socket.gethostbyname(str) - except: - value = 'Lookup failed' - return value - -main() diff --git a/Mac/Demo/example1/dnslookup-1.rsrc b/Mac/Demo/example1/dnslookup-1.rsrc deleted file mode 100644 index 6cf9fe98884e2cc8a872bd5fcaef62122d958ba5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 604 zcmZQz6=PsvV!#BbwgX}XAm#$%I3Q*LVvzbI1_s7oMa4zQLBXyrj0_Ax49|h0 zm;k62D9gY&8%Tg~{2m~|RKm2SG5p{G#`FNE<@$OI9Qtg2YdKd5$fwyk@ulPy=j7*S zmlo)Oj4!AxO3h17Ew0GSOD`@e$tY%GK(dvEfd^q=@&AAA%lrQ;uL>mMk@x?DJv&f*liC`_3WzFw zz5hT{ICfdctF8O@#>*wm$F_!n@!uU(S=;!3x2*L3-APb#S`IP^q|4rhfzc1>k{kwB zuzS=QJQ*w*MFb#@O91kU7)2&PcUsing python to create Macintosh applications, part two - -

Using python to create Macintosh applications, part two

-
- -In this document we rewrite the application of the previous example to use modeless dialogs. We -will use an application framework, and we will have a look at creating -applets, standalone applications written in Python. The source code and -resource file are available in the folder -example2.

- -Again, we start with ResEdit to create our dialogs. Not only do we -want a main dialog this time but also an "About" dialog. This example is less -than complete since we do not provide a BNDL resource -and related stuff that an application cannot be without. We are able to do this -when building a python applet since BuildApplet will substitute default resources -for BNDL, etc. when none are supplied (See below.) -"Inside Mac" or various -books on Macintosh programming will help here. Also, you can refer to -the resource files provided in the Python source distribution for some -of the python-specific points of BNDL programming: the -"appletbundle.rsrc" file is what is used for creating applets if you -don't provide your own resource file.

- -When creating your own BNDL resouorces, keep in mind that the Finder gets -confused if you have more than one application with the same signature. This may be due -to some incorrectness on the side of "BuildApplet", I am not sure. There is one -case when you definitely need a unique signature: when you create an applet that -has its own data files and you want the user to be able to start your -applet by double-clicking one of the datafiles.

- -Let's have a look at dnslookup-2.rsrc, our resource file. Dialog 512 is the -main window which has one button (Lookup), two labels and -two text entry areas, one of which is used for output only. The "Quit" -button has disappeared, because its function is handled by a menu choice. Here's -what it will look like at run time:

-

-dialog image -
-

- -

A modeless dialog application using FrameWork

- -On to the source code in dnslookup-2.py. The -start is similar to our previous example program dnslookup-1.py, with -one extra module being imported. To make life more simple we will use -the FrameWork module, a nifty piece of code that handles -all the gory Mac details of event loop programming, menubar -installation and all the other code that is the same for every Mac -program in the world. Like most standard modules, FrameWork will run -some sample test code when you invoke it as a main program, so try it -now. It will create a menu bar with an Apple menu with the about box -and a "File" menu with some pythonesque choices (which do nothing -interesting, by the way) and a "Quit" command that works.

- -

-If you have not used FrameWork before you may want to -first take a look at the Pathetic EDitor -example, which builds a minimal text editor using FrameWork and TextEdit. -On the other hand: we don't use many features of FrameWork, so you could -also continue with this document. -
- -After the imports we get the definitions of resource-IDs in our -resource file, slightly changed from the previous version of our -program. The main program is also -similar to our previous version, with one important exception: we -first check to see whether our resource is available before opening -the resource file. Why is this? Because later, when we will have -converted the script to an applet, our resources will be available in -the applet file and we don't need the separate resource file -anymore.

- -Next comes the definition of our main class, -DNSLookup, which inherits -FrameWork.Application. The Application class handles the -menu bar and the main event loop and event dispatching. In the -__init__ routine we first let the base class initialize -itself, then we create our modeless dialog and finally we jump into -the main loop. The main loop continues until we call self._quit, -which we will do when the user selects "Quit". When we create -the instance of MyDialog (which inherits -DialogWindow, which inherits Window) we pass -a reference to the application object, this reference is used to tell -Application about our new window. This enables the event loop to keep -track of all windows and dispatch things like update events and mouse -clicks.

- -The makeusermenus() method (which is called sometime -during the Application __init__ routine) creates a File -menu with a Quit command (shortcut command-Q), which will callback to -our quit() method. Quit(), in turn, calls _quit which -causes the mainloop to terminate at a convenient time.

- -Application provides a standard about box, but we override this by -providing our own do_about() method which shows an about -box from a resource as a modal dialog. This piece of code should look -familiar to you from the previous example program. That do_about is -called when the user selects About from the Apple menu is, again, -taken care of by the __init__ routine of Application.

- -The MyDialog class is the container for our main -window. Initialization is again done by first calling the base class -__init__ function and finally setting the local variable -"parent."

- -Do_itemhit() is called when an item is selected in this -dialog by the user. We are passed the item number (and the original -event structure, which we normally ignore). The code is similar to the -main loop of our previous example program: a switch depending on the -item selected. Dnslookup() is quite similar to our previous -example.

- -

Creating applets

- -Now let us try to turn the python script into an applet, a standalone -application. This will not work if you have the "classic 68k" -Python distribution, only if you have the cfm68k or PPC distribution. - -
-Actually, "standalone" is probably not the correct term here, since an -applet does still depend on a lot of the python environment: the -PythonCore shared library, the Python Preferences file, the python Lib -folder and any other modules that the main module depends on. It is -possible to get rid of all these dependencies and create true standalone -applications in Python, but this is a bit difficult. See -Standalone Applications in Python for details. For this -document, by standalone we mean here that -the script has the look-and-feel of an application, including the -ability to have its own document types, be droppable, etc. -
- -The easiest way to create an applet is to take your source file and -drop it onto "BuildApplet", located in the Python home -folder. This will create an applet with the same name as your python -source with the ".py" stripped. Also, if a resource file with the same -name as your source but with ".rsrc" extension is available the -resources from that file will be copied to your applet too. If there -is no resource file for your script a set of default resources will be -used, and the applet will have the default creator 'Pyt0'. The latter -also happens if you do have a resource file but without the BNDL -combo. Actually, as in the present example. -

- -If you need slightly more control over the BuildApplet process you can -double-click it, and you will get dialogs for source and -destination of the applet. The rest of the process, including locating -the resource file, remains the same.

- -Note that though our example application completely bypasses the -normal python user interface this is by no means necessary. Any python -script can be turned into an applet, and all the usual features of the -interpreter still work.

- -That's all for this example, you may now return to the -table of contents to pick another topic.

- - diff --git a/Mac/Demo/example2/dnslookup-2.gif b/Mac/Demo/example2/dnslookup-2.gif deleted file mode 100644 index cd5fe5f55f7dd393edd5767f19a6bf1e3b34d52c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2984 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 diff --git a/Mac/Demo/html.icons/createmake.png b/Mac/Demo/html.icons/createmake.png deleted file mode 100644 index 50d6fa550e28473e5954da0bacb88fe445fa8426..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14212 zcmaL8by!qg^fo+5BaJi+BA|4N)X*JDcZYx=G33ytGz=Y5Qqrk}G!jF1Hw-B`bn}kS z?|r|xzU%t_IA>1mv)0~g?RBpm_e7|DkjKNJ!T|sPc!~-#8UO&wA@WefdWL)=WVoRP z00<~6%1CNKG7qw9z;I#0(D^`{BoUYGxga)YRQ#o2hOKX4)Y1+<4eSvb5oh$z>viAB zu00xyvPdNYlVotDZ|{Odoa>A@A!|_n@SmkfP1eejZ=W8Y0Rp|$XD=dRX8{0iw#&N* zMST-tIsiZrS`eH1z=M+VzLO|GS!vZ;kJrCo>n{SY!)i%KJxcxdT~|Vlxtu6I`fgIo z&W;UrWa9q5JFZIYxkD%uT%PJeFo|BLx4F6b_}J-FdrON^#jis$4ocx|x&1b+PRqnteMvMFL8^7Uz!%9dLNQun(>3 zR=+e_;szbrUodkB-6!GumS;FsRaGXzTij!|EGydDv-|FT1`GrUo*`Hc+oPR8K-Omq zA68Z1tF&+av|OU|9SPV;zcfuOjX%`6KNFmlZ)|U`qFFK3g@o>m&BsqPP^Lr&=oQ0q zaT)$ze{>)P8-GZDB}PD`^1eMbHT$z!KU%`_Z!xjDSVKdliwL)t|C;)LYNPRD@Fek> zzAoPjKd(lIk_Fvx_}}uj%A{WJR^Ubzmk^WoFzlcNjo0RV=gkp3k56M%G~^ar<=-Chr*0|~|t8yW=MXaHuF2UkA-etW;e|KBnw z^l^h^B{_ zp;xL@G8?f88#mn^*8WaeGOZg#u)_-VSG8(GqAIi4u3(K7S**Jq1I1Vam68w`BXNK zH`h%Gj!~pH%`-H*D;FMn-7izNUkg_nWBFeL0zbMk&^C~o(=n3C7~_*s;(VCZFnBx8 z6$IKo|*&Z@_kmnT(?oRFC zsm3Y|&?6R@K>SEPHG6`vOZc;eKTV}P4;~IC)|9P|yevagD#9aegor4y`mYfl>qazx zcRQlfwW*70TQpq#PA+Ec->y_@T=x^-Nd)B)t6>tX5FrNW;QtP9K&8bDWT7aAKcNBu zPfrI~!{B{k+^^b_+x%;?wI9&+SKs46`1W3sS~;SogHiTg4wl!d66{HEw2<9%3zOig zgnz#$QBN9aI2q%{3wr6U!WJt*`{qmBSE+yJ`rKF&DTPHf7&d)@Lor;rfZ@xV7wIb1 z2F37cGv59rerHcl-5rw9De2b_1=CWrRTznik@gb8zJ7ieR+fDQcXg7qrmxr(wsAt$ zQU!x*SrX5@>dpFG0+Ze}yZpT-)|cef<^Iytjs0uKa`})xJsk=qSi*AJu*;3rwM6eX z>LmQjs}8d-!%5HhChS->x%lVPV1X->yR}Z?YZ=0ydy94@L{r{+ZLt9X0pcK#o?o%T zDNLef33pDn3Rk$DWI|&g%@a(3x7WV=uQHhZ-F}N(tqFt`BOp5!;_R}$gF`HW9v+wE{D->N;zZ6- ze0hIc{q*rws1tET)jL|G|GG;B%>}`j}>(9~RE`|2ezVh!vjBLCtM(09kqm;aCICpb) ze9t9>60*JdOZa$&?asX#bs%lNt_OCvX8p|IXU!jX1v}hSKksv{T=na_^fq=S6%%h- zV(S{8hjBhHK%pH?Che^=X8J2qlN%-B&--!41 zU8^W74fQB#DjG(p%WCo)T=PJG2Q^qKR-)pMa+DeO#h2y#Gq`mrSo$yOQt3a1n$`V> zE-1zDFN72Crod8IpQ!%|(tr7d=blL@wGb-&0gK*2`u_n&LlyALRhrNJH|T$!2GfL4 zi=EHQ!sf90%WquNH5GoqbAtAJAiFB>iJv>hiZ3hHoRNK45f=7$?)gYINJb_(^qEqE zGLjPim$%zMLKE8?#Ns5+EoGvXZTjx!saS>Pdzgcv&9A!>qIfo3tHWI6__L6wD=n_r)13oS~7 z`t)QI?XsUlKw@dae~}ODjK=R=xY)fVwwvA`CnAmPz;5JAzg8WHsh8#C%a5qjjLRrD zGN^ZM8xFB1rmVNopO9SSrEStg_{psj=g9Q*RQ=&K5WbHiN6`wnKymUiMn}EB*oPY& zjK2{!aRpO{+iC|fvC6_^aREn%SjL9Mx&}p6Z(o6XAEbu@(RakL-+(f_$(D& zdjt@Z+SF4I#Clq@y?o}tmS$S(UteDtjFMdf7sl+*Zxa^IU#?>U7%&KDd?xvjb?@D-{r>dM#X#nj9z{M0dHHm#p4CF*VZz8lT#J?$iHkRd#nj~r%^>5DEvchV7 z_ljshDB0Jkafaw&Je3=sDt=28W8r>}9D@Bza>lI*OYDSGUCScIP3c_cY=XbKl)2oz zb0_g0a6a5@FLJsMBi@+Be<|2=`7KDs6CPy!Wo+o_sp%MM!%IFL8h+rV&5<%ROE?V6 zr@Q@1t6{iPv$ia2N@|5>jJbULO|(SdHf`Q|e#)e_`2GDrjG(^D`HZi8L=lbdx{-3S z?*MT0#q;N1(h2X+f)pLxJKN$^K=B{7!re_m%l$Q6MKMt9X72o$rS&HiHZ4O4X2xEI zdpvG1HK{1Vp0Ru^Z2HPCurxcZCN>B%c;W7>V}sKyL0gw-3qJYDm<{eKT6}^1y@g$U z<*quZdumFIgjb-kNHp79nMrK5?5~$0BtJ{6$RK}*`b-a4K+P(^u7-?U@`O;YALukjy$4VRppcd(13<Bce)miy1$osUAJ_a$!(nu5{a@fL!PFY>Au zUU4)g3YuB0a$-t(*2@L=+$-qP^YC27*y&VzjuegZ@&iM~?-Xvibk$>rCO5cHd)A^c zTc%s$rSg&PQxdVoEL7<^_@6#?VoYe1k`yZp);;mPcrk43%2P~Sr3(`)lkbZuaK*B% z{-X74G-=W*2|MexQ}plwc*sVrn((dl>mN-8(mpgI+$)y+Yr|enDAx~n0xXMcfZp+Y z{D?OlrI(FIZ*3!ual{^cC5TVoL`sh5a#{&9n5GyGm$CqNUUiB#s4$^@IrUIO#R=2+ z5aD+KHqMaWSVL65^X8Ahc-YH$jpOH#IvYUH0-}313d*$~2pxaF(JNK?zI2SjQyEmr zhQM)lf{A*}IZ0E&9l3pI3i@-teE%xZDrU3J`H5qBxQwe9#HH09s9%0>l_pmW(>GMu z$m?N-KF^t8plVFku7JV6w$(THEnws>C8WGPYfSBZ(ZkeGbtxE#m#Cu6xrT@q6c9)0 zqe%RwY8l!TmI3iJI@htHoK(`wc!H@CaCW49){jfc(9B<_cELYMQk1_SyFV^o}qn&EU~bT zYW-O+@buS6&Y?!CH>xgPx5Q8cHI?w9n_|}}D*W#r>}nD{lvH&XZNGi*mCWsj^_E-e z+$=;zD4Q-7jaT~YhK$B9Dw~dL6RdJ-9s?H07CqYLzj(Yr3s=t3jXwod{qb|Sx+v~{ zHSI0*{ZxesM7Wm~-SP|ywSYF?h`fAopWpD57+11`NThvgez!3lSVVkq~7;wW6QGb~VN+s?%QO7x;!)2rS+q4;6s=GxvMpuuy zD@^VAPZ$^8PuM8R9a}2Kg(GqX=JKTxbV4cCCauWe#sJ$!_t+ z@EqJQh1yv5C!sB~CWY_LZO7ITIe>uvD$PjUQY_>!=1Yh)4Yt!`L0cf#4ew(uq!&0E z*Vu7qt#S2kQhmCEP|ko1b@=+cEWh>j7vbs3=zJIRh@v^lb_)nR_Sb$k_c>+}D)DDr zgT~=R`G}csUiS{Og2dxPix;nCwQ|Lwso&{izdR2YB(0&R>(6b8$9UBPXPntRC0yuH zpMDvPX>rl1UTv)+b7_`de8q!tuiSruB`~dZtjhRjj7|mK>u$ei@H^M1IX@ldbk`HF zFb^kV`P20_SX68p7Vo@wGZWXwp7+HNLK+tI8ZnEh0m8=;2_et>+c;X2vP(m;`Mk0n zGhX0S*f@#0wHX&`Llu}3(p;1B`G(4@Mui%BOf4@}MR~Lk|Ed%jcFzk}*x(9+aKyv+ zPxcyyICCV>zibPOEbeADs86mW(%0iZoB1^~$hPE;IlJIDDGVF+ZsBj+hABKl=HZUW zcANZ=jZ~ngxhzT8@7*bnWa#`B1Iv*~g5y**iT{~)1qF5=N9ay!gGOTF_tvMgK9A6+ zP8ic8my%%pJ&r3eC=98%jBO0YnJ@j+^XjaDt30t^Qu{NX%S9GT1pv8Zv}v#-$22sE zsFhv`QItvm-y|n?mq9>rkZ(gN`nv7}h_w=@*2f{V~sB{e9$>T=F^=jcZ(d-YXeH2D{;ebtK^ZhBhc$BPL_j z$|6AjIQmSAc8fu_gyr{<<8N`k6#TF^87`CK_{4al%6CMr(%)LkxW99w&sJg# z6``^3gvI8QRl*4HX5kGePW)k^``|E3o9j97RGx_F(Y|)QOa|~OnV_}Pa5%T72uK(C zprG=^>DS!eKAJK#NE&%8geaT^5Z0{8^$vsVIOg&Ont# z;U`k>G93nrbUaCJm)P`>V~4JTFW|8ONwnWR1VwmbQ9wG@2Zgv`CVaBPcWO7Xz#U0C zLAi^|v2xfVq@_S%4%7Bf1;wZKxBL=M#f;rtB#TG1QgxAo(oxM+Z`9Fi=gab644y$B z?4-p_c5FYk`kgt3Uq^xE@E)uf{e|0&_qzs6ICk< z$g-SOWhzZv3qUgc$AHyA?%$CV*txxXnGxxBEW?6Hg6UoPB$N(tkW# zWeQd_=)^zu6*onF*aa(CmZ&`D8H@+D z>*lRI#^4#myi%oN3@Q@|t6L5QhZ{Smip?2>U;;mho4?zavNSi(>-B{!EQNFq-GKG% z{GN^B8_TiS9DjXj+ZSbeJ9$$*;HcKvk_r~qf)`K z1t>BXQ&eo~F23)q5#v>0RL~k)Gd<6PUqFDWb`&Mlc7{CW>(~AyZaRzw5QWU3FQQVG zB6sFZV7+0DHGJ3E%VaEM0{d%3rEIk7qQ9&@Tr<5nVn{j3+?O~PBuRog!Fe(5D#$(x zXRm+x9cvh%Gxb6PS4$o>Xof-=7F}P+c9X4?~ z?z?*dV#bV9Zh);#vx*hyy;7gO1k|v}8piaRO^x`TMGu(BLq_)6uG}Sfe67<=Ui2~H z1Y5#~6`k|_Ppf#GqSHuXyjP~=`sGu0kTS48ssiFV$wPn${V8V1bEm+-F51r}eqe8G zo~TF6n+9QOcduZZ&VDajIpjk@k@OQei#F#*jTJ{fCJ=LvlYP6o{Rgd=^$kUa7q{LQ zn5GztvriH`mK$k?3#-vq0Klj{l_JM`0zO$Hl(!Far!o1l^j?POLNYhCOc~Jo-KUy` zyg13Qb1VXwGjbPre#CplpdR~<03%}$VIM>o_TsUr``YbV#}#evJ(Q%4s~v^fhr4l_ zcEyOjCZ8f_W(qDaZx>s_CVGTS^WID2)GgCARCh>lfUlj@z>B}`Bc!`7t{pm%u(0mE zv_3~E=0Q{EEb4DtaNhWIbhkJY`{=W2x=5FIa>0rp)&)k_%Z3eN`xPS?c(UGk#+{eB zl*Fi<%q3<>p6$=9JG(_KpI@u($p_!fsz;wba5)r=l2|-e@?#S}3|@_F zp)&K2PNWS_Y(LISyh@y^EqSV7(pHpVhWj?80P!jUoeWi(&~XgE_|0Ts9*3N~YP&WW;b- z9a+Ko|GG$kvW&RoSgp_1D1(I<^!NcSwxWgzDpL9UId5?GE4_I5^d(nmC-7G!2B z3qiuu@K}zTQlO1EQ7i^}Q8ez;HA0#biOO!m6o(c`f%i&!wxWs083IloG`g;11kh2{ zA~ZY>QV!rm?&~z{9Yo$28c|CoIWs}KFKJ3Oe2+MhsixRbUmK!8FcAq8jQsdS$=Fv* zC$BrABstv`i*H$On1*$$OgNa%IrCJ3@-f)Du|+sZIGs`N44&YHN^-t(WA1D`tF1mZ zPDy|?stQZ$XL7yrZ^p?OpG$V|zWm-*pSd;q^`w{9+D-H*t!W(IS*%=0V)W|eW)y-2 z{)R391ht7Z`8@>&($OiRER4jryt~~*AnsX{Z{w++|DB%+XiH%79}6DZ>Ix(1LkC~$ z_b!FZ(03eb0F+z^D}PwGg!PRpC^;rsjgyAR?YOS@MvWGBWw@t}UoJkx0&Ys&?Cu+<_n~u4MnDyd-epY zEb>!2zcUg^sCstTifUw;G&Qopmbi{U7fs zGXl@|0-v%v29fXNNAcOcHWxb5cd$T38fn4(6)UU*M+Q)jwP2zXjNSFv}-UWYf*#C`X_{5Zqi^hT84~-zgNul2qpGj#_vYfWpN34;fq{Lj`<>xXmX&bBN1?$WaB_bASWlM0TwJ@>^Iu41iSfuG>aKU-)mIQRLkkFg0n==$xD&F zm;kpt|C)8On%ifmM+5YP`^2!c`eRt`?~j4W%L50DyVDYlVY}}371Qs+8%C25u&b`C zc)*yx5C%tKVuK?jARz3AC1>Qf9}|&pWRk^AA_ruIjgdFQ1OiZ4~XiM>woI(Eg=#9S-1syRyiOZeKUN zaY=awYl!Wa1j{M>u3P9;_v`&vtUi`S3akQ)$yKR@ORo!6%a0WD_nJql(M*CZnMrTp zYA1t(g8>A%%kmc4LIEopOML;t+iyRkCEmhwa&iO&1g-}uE&TockB*OtTs=MIv6(fP zzH1hjm6Wfnt|GY%ER=q2t*t$S57*agxDorYM&$gcn!AG9{If0PnSu<&e67P;q{_!; zb=Ppl4K?Q@ObDrRq4&?zBL?;4*rEVK(%)|PcX!kl?KXs_!@El`L&J-ehV z{$juQu8O1CEFUSyqFeTx}gSQ6ce_60|%f(c_U??Gy~ISMNzGD_Z869}zG zF-NVX1|u?yITlN(ikQZb$G-I}SnIo8l$y30K=^BEoOakd?LA5-c<9Kf&gT|)DRVc# zBY0zDg2Pl2v+NID7+>2R#|Hb>3P(`Oox<7+Vtx~CqpWF<{k-CJ{B(+UODij zJT#F`1Z-uEvx{Z$mfvVqTN_kywyXxh0mW9?@(IeYaZ_-Znre?IAn1GbJ~Ur|AzjKH z?Ea*d{7S%MQ+jW)>;2=5B#Lm-ClgasFg07@i2*rj|` z%i-HW(ZOZ;S1&?&6DDeIn?G5p7|FevM!0Euxx3@O@?!Hq^Kv)(is;*;rNe||$5>5& z@XGjY4$(HNC->yvZ)8lO2YCzja@^_RP5$#Q69y0i2IHaap=J(0_n z&&&j-i&){V0v-Lp?&)@o%@q6qn|$9xi1&?gg^XzFdA~?yu=9Pd1mJkXqYY*f-P@5W z$$Js}miU7TnNSvx=)_EHG4qR8FAQ2vM*iWYJpC)1-=vF%Z#@&@6jwI9|F`E?JvByt zYEH-+9WoFRi>;3L z_K)_PqTt5a{fe$J{gp_(beRg(*YvNaG)x#sIGj>fJMEB29j4Ew(QUsXpC@>3DIw14 zm4$f7d!$U$72WTA9M#80_Dv+V3~5}(Ge3_ITnX3gT)Bx{}ON0`G<;W;*Pc|FK{gG6ey(AE$OgH&c9*TjifCXM$^zt zek*hk7>M&XJ%%D+UchWWo$F5&y#v)?(k|}kkCsS`4z2l&6!Nsbd=V{F(~29z{`Lo4 z&Q;HPB8~ExcsP{j#U!Fanv=dn@e|uSoPwnm7r2575~DxQ*N*IAczJovyO*7$9-{V6 z@X)RbFVzZH_(hmBv=H$rkh++ef?83&nT%x)8?5LY;gUS{)|Z0 zf)VsM%R2(Uy1JS;fy1Q-POFmmiCrHN*LQc#Eo>HeQM<^50E5Z<=@zha@mCU+{6MS_ zCBClRNU4$H9%YQK)D7O)HJ_%dO%`)wDe{*6?4-(C?wXubu)8b+Q0 zp|gEnX9ix~;c~i<=Au#1$DKp~gF|53rdhAu2b9{`*l%MD8J!!P*P6zoPIhO3Vey`6kIT3t|0(Hs)0|~C`OifLv ztDAgeatK2W`}z6)(%SJ@PE@QT7Qz=~XpK=k^hdw`~_Si0~&}%x-0{BZ-Mx?b;?`An|Ees%Y5<=53Q>fbhvNkqXCw z?Zk3(XWkv~F*Hz{`^hzW=l@*I93d`FoiKr6dq|=AtA^CSo+-QRuKC!Tzk<*_KG8;? z8a?|!lZFords_2c=6uEmw*7+-MFo^of$#yf;`Zn%&kM} z4!fWzKEQeS*Lh=Q_v*^Z#@f}DCxrygsRo=1*~ziLHXc-+i7ZTWrp8U~y})Fm#O}Rd z3Tkc^sW>=?(C{?*d3z5KkO0ga4ZMwf6kh!Bc#e~j3jTIx&dFeq; zG&|dc*fgV&O>{&7SmzBt4MJBr-lbQS6N_hk=&5UIH&TJv>fU5hBw_%#!z0r&{8e=j zj}Xv(`A7Xy)xDy$lkQ3Yz@R1$_EDXk)GCO^Gq1JX{UDDTRspIUrT)m{4+4r_T+kO4 zl-~S0Z4|>0q`~jK2LPh2>7h?YTGkLy=^Zda-47YHGTh+_IjMAGv z?shr(0lK3qcL9;hBRp|@ls4S4qu+{L7g7~5p8bTh=wxT>AkfYP+A$t^q2v{!%oelf z&_y)W)2Q*wrBA`G?@q4&3>_f^6UzJSowP58*vJ<1nsX433T-H1n>@CpgpbDbs5 zyH3^dt*+W205P74B}eb475Wvv3uM!|gKe8f3$!(UQ-FcWH3l_jE9KvXde3`-|C^t; z(5VjRe$fkNHJbonG6yl(aJosLt4W4p@FqTMbRNO`Ak-Cv!Mpd8V@wJXWi9%rHrs?| zK7Qy)K!j4B8QFHzUlC6aBL3n>;&{5!2j32iOw0!>>~4EXqAPw{(UtejO^%SWl50Te z=UpX_$8*Y@UA&DT>sr@LDWrL`<6%XrQD9k0a_P?s>nf~HMlRSa_6#1izekvLV7!cj z#c`>;twQZ|vq;id6tCCb->wh%f-_%RxqKcr<7#&rKX&lkPBF=6`&Ja179y;EViuaT z)6?Gi?=90N!7sOH_l1STmAI5d`t0LqR(*UD^#mSGyKe7R*t}7f9!&pv6<`JvoG$Tf8t~p>49>b`U zW`t@^Ti6ZZ?AM)#MbI-(4nDx!^*A9CJnQ^?>zZZHgdAmK;R=aHe7#R4W@?*)fTq5oewF58fO za_t999c6TYri;6K@=jZfxU}^UZ_TD)AWvVE-42sb`93tx%l&Ef#K z)xVY&(8J0Io87+{9)8bPDtSlDaL%h0yB{DLwbN)K?t%N=`Riumm&S7!fB(mu8y3~$ zqodIM!5c%NBmd2$apsFW12f4fDd*$UbRk7fs)Ex2U%Z49obTyvhwQoE__YRITHpI1v;o8!?Z6tzYvm!*#i zB()s1ik|96y4j;Ul`Ro)WEvJqfn_!1dw$i>cUhJFz1rt&^GifAmM;H-67Zc&b_-JG z+-hQKWOSXO&|Z6o@tR%N;DgRc6b&YKXoBm~*K4~vm(}byaJ_!STv(^t&RKpf4W?R& zluOIm9pd#&{o-M~5b#nV7Bwwg%Ejp2@@`94gDVJ}Ed*S&a@DYHr#|Y59D{#fNPa1WBnS$SoQKTXMot zvNXyFx=BJo$J}-#V3(#E#2G$fUO(He^rOC`zJY^&$gs;UmnTL_3A8BX=O>zqLagkO zdTUFBqwTel!V6ibKsUUrXN&N)hb;+qkfQ5RT~o@|{NMO3I*7-m z)P-5{bpyC#zF+gG6!?w)x@+w&&|vRW>^pXLNunsDwIJ0SILMa28l*c|c3A4qzEemS zFu9*!vHiQm^JDXf%gzdVuN~_Q-Nvc?UMDL`t^v>6kBeSday5zE+36g|y6W<}9#W}H zrA)=o?gKlQrZ`jn==CfZ-XbUr>q6z^AN}!2FFlh))&#bS>Gnf<1D;q0CD#jM@<*Nb^^a=hHVt-D@xLNyS=X zAZ#7<6-l+eU5`h9{PR0B_KKERs_!7~YsnMa3@~GGD>zYw_DxsXuN=&)F0^9^JyB*J z^G5zt;r879{e2+Fvn8PAqPVL3sGM5=pnGq|Za3V^-klULkV!DL9QBtuuPDS@(mE}t zp`n3!qiFGoscDwDul-B(*OrK+oKYM5ppVJ1Ayv{yu zxiW_!)+71RnuGlZlVGp5 z0nvPKT$uss%iF(=P4WJ9LlW+T!~(i_kQp)w=X^7#5~5N=!U_Dd&}QtRO!{PCpsVWU zBYTj)I!t$C9HC_>H{t}9OFBLhHc2VSvrgy7^Dl4FDK5mV!;ze4V2}UaP1!Zqvd$(s z{n?dv6n}$?)@gtvHqz?t-nE%Ah^otNNvMyU;1S(hD@Om2YWH(utVoP!T0@QS(eGzM zKeZ0Y-F@-0{;mFq`1~IA-duLl{%Ll0da98!Xt?3rQz1oq$x8<{<>Pz#T|apugD>-sk5Y+a{}zu z>Nob@YknIBgT1c3etZ8zl+Up2~}0UJReTaW%M16-m)P4vHnSMO1R9sJguH{HjsI;@X0<8?m}CNp-B4# z^^>a$NE4vX7*Evk-fg5wQaLT)4)=LcHaa?5jkvgA`nvT?RAom~c4T`{=b|_ati<`8 zSKoaw081oE#%cN`3Ubo+B`)ZE5@Ba9B$;x^O^aN^%KGudVz}42K>AL`H(w&GogkR7 zXwqR#d}v9t1_MRw-(LxiI-O~`F0^FcspNh1L)~v=h0V6N+hIr&BsvnE+lD--Hq3k0 zkrE(TzDTj;}}l6M?rDH0P&6y5}$kAd}} z_>(5TO?!xCZXUQ*(trNtO~zOH#u-|$)#&|;Toyk^ACM9-pCWrk*iwFMSONL|uP%}V zwCyVepyq&oSRdNJa@A`_w@_x*q@*3yqDrWCZ2k{7!0shTdC6U2tpE(DOKOl zzR~@sR7?#fLJut~M9OJ`kAuBd){~tQZ8zQW;b-{R^j4R95Z}k^h_}4%eve2l^NUO$kZ>jZr?Z+hPat55+wd$sX$^k3UqOKS;nWg_}4 zoD)ircGiYi1+lT(SEp#c`tL3C^R7=bNTPIqV}=<~^1FZB=&;Le{KoQEqkY2sZ?Zj?iwB^8AtU*% zK(Og6ntUHN+R5*9939abVf_2PEAdJ=pdmwNQ5?U+Q5c^vBNny$-5x{}5N>$@!Fc%% nt>gLaw2L=7Ad28Tn|zCD~5uIGHkcH7(#4giF7})7$fY|ApSu4m0!2XP)_PU43m;bxR3K@E7pm zIq%JT^V0x7xf}uKqU|7VIJxs z9t@~WX=<^V)d+LKGw0MfaSmZDBQs~}Oq?N5FsbHLor+TgDAtNOQ77UAWMr#@IjDm; za4M-OMrcwJi#ZOaHl?Y>W`u=8%%^5zhOi&UGEy}aQ-pO%!KA2(n1I_8inRtch=J?T z4`Q;Lc5r_}a6?j4jL@WHDLFWp+LWdif^#9wm`_v@jO2bC%Sc28^p)$9f=Pua=p&t` z0pwyijpnwrl70}A-L!*DT$me@nqq`zC$Y%E!PKTS!ihpP(~SARi_u8#$FYnA;o}It zM)wZM=!C)M=qjN$GCH^(c^6tEJHip74TDky9c~hF1mQ@Up98N%^SDzMm3#~bQrHei8 z^p8^quT>lxjGy^_XJ)AC;)kGu`ewAYzkS=%&$6R; z>nipB^K0r|^K7Q|Mr~rL zcWj{R^1$lK+Xam|)8oyB#hcc*EKK)qJ+kxI`}T#|!Ldt^(}{1Vhi`s;zP38G`}5qx Ow%5al3r3!GV(&k_Rqzf`EX4|Ns9&LPFWu*~7!bEC2ui0L%f8 z0RRL37^A%2aD_;pt@!H9x9{L5hU93L=&7dc>bCG}Npc(wc&_jKP$<2ia7Zi~kI1BQ z$!t2G(5Q4ut^S}tAoJSHR=?n|cuX#v&*-PO%f$iS@OV5|C^+ld;=8v$_Jx0CfjNUi zg*%5xiD`_Dj*muoSQCVLI&Dj9dH_6dikya^L5oU-o_?aEsY|4guCK6VnwglZe4urA zm_&o8MyllcJ(Y`M3nw& z;zoQ9_lX>7=HDG?2LnzcC#U6~ez#Iiln1h-IhzbQYJ6A>422_Cv|m-7#XRWo=+K>D>DkNpQy98vU2~=_TD0Zaw&QAkZA!N;t%6rc zX);T+DiFRpeV{Zbw(PuhKtn2BNVRZK!#v5ZRkicb%(-?mYZmg<=nkoX|yf$e@cVQc=c1;xaV?(QR3iTLzv+t%-ck4yj`(>WerUj#Z2p6ns$BHEb^_;so z#E;Jz?~ZI#`|t0WVUp%tOIkBs%b72PTDaU-_iUjOdmDcnJ9zKwEkcZcmHv0|04^2W zGg=fUidIL67vO>nHn^aIMSy1BXm>ei;e{A#HefZxnJ3su>18P5h$J=wArTU)bRIz^ zw&>!EvLJ}WUdYAuVHbnJsN;@2&X}V=&eV7ch1JN|?}xS>Bk&RCTXP}(77lvMsO z<&{-tiRG4BcFE7{}~nyI5gcIxS;poS{ysHB!^>Zz!v zs_Lq&w(9Duu#!r^thCl@>#exvs_U-2_Uh}ezy>Squ*4Q??6Jru{;TY=%r@)nv(QE> z?X=WZYwfkzW~=SC!3sct0pNx!?zrTZYwo$|rmOC{?6&LfyYR*<@4WQZYwx}I=Bw|% z^a|iDzW@g;@W2EYZ1BMdC#*2Q{(c)Sx7V5ram3|LZ1Kg#E<7&A!iw9lxEw<(fW#p` zJ95P(r>yeH8iT7cuPhtz@xu_@X|x=cJcwy5OvXUV0py)2lkce;?es>$J0bd%Tm+y{=2){%$(}XUED%8=uKynM9^tMxF5{^Vb-iPs0pn+Y{>?94@0(o#&G)+BS&)JFQ=ac0 zxWN835Q87|-~khuzz{xgf*m{|^b~kPr+E%=1mxcY*(bvf%CCi)6CmZ*XRgw)(1GzA zAr23xLG6L?hUB~84~Gc6BEqkJEA$}}#b-L^kud&yC}iLYr$|98+ADtr+n@YUSiTwx zk%?W?q43bvJ}pvleh3tz4UY&xCqA)+9<-qz_sB;Vs?Uf|l%X5TNW(!Aa*s+RV+a?? z$RLiehJJgY?qYaIGs5wWG_0E%!52sgX3~e$^J4l?_AXI25|dm+qbC2@$r~;)j+TTT z_Y7&m5>_&kgiNFqBWb-2@~)DPyyek02{uYH@|T|^UMNl3JyyEQjlBzIE$O&AXU?vR zK%|{6mC3>EW%G#3v}7!q*~DJ*uz|U};1xy_9xa-#bLryLz=Qkw3QmkzzCM!UGuJbsjzVtgeo`FX`?^7N-D z&1XchD7`46(w`v39#bnQ(P?IMsY_HUH2b+lr^XYhIn^m1tte8kChdC`edbsVYRfCG zbd=-@DiX;^OaA4tpuYChbstbui#O65&b6gYoMs0GT8({{wV|~m zW?>uKzRgx(wO!b4dn+^D){eKt{>|-T;kH`hB3HSjOm1v{8?fLiY`DFB?%K2~-R7M( zjJUOJbF*vQ%$B#iqy6q?!zOy@e= znWA;ZvYz)W;X9u-${x%9GoJ@dXafuQ$5PhWoDscfKVR*>KCUmn-qz?HOWM&^gS4e9 zoi9oY8q=H8w2m*WFHbA-trrEPcgJ@yDuUWxqL!CT1KP4n+ml_Uw(F@=4Nv->OqI8W zAFE$YuUN-x*2om^u{*8kknY--y=L>7gUv=_-^b5qn4}H8o#!;PIB`PWhN<>y`v4F!Ccf4}V!h%n6+>SJNSE-HD zeZTwR4?ilzT@7yv%3EF7*6A^)Nz$$E)UhLNCL#l#Zjv*clT<@s@gV9^n?4q%UuD~` zNgnZ)pU&hrhd2JsPwwZ8L;J5aZMk6E{qlZ8T;~C&IL+q`Zb7!Ypip?g?=WG|9BS0BT1AKF_2^2scpu?K@G`=3>@VNuD|voWq}x2=QJiPickcCb z`CQcqm8jh3&T`0daOH3`=)2ku(TZpE@o|?p(1yl!tRMaE0;Txj`yO4e?{e@lU%R^% z$9I2UeW>kXywGDR^nE9s^>lA|=`C+{oFjenoQImigarHE10D7Zr#!%KYWK^pOZ7p| zs!%yD^@t9*_DR3G+HJ4->F56It)}P4zbSdEqF(foUFYz(e)`lmTcCI!x3kxc*R|qz z=4gjxKmNn5`Hf$HjRjNay`8T0(XYLI!Us;{H&{&9PM@|ju?K2@*ImNbLjl%waOQ2P zbARZvfYQ}~uJeEfNM{mwFA0cg7MNTZsCbihesR`;=R<*hM{k?fb*Ke_Z-#;@SY0eQ zYMh2IjJIYD17 zSeS+QqlH}9g>2)6U>JrxBZg#HhG%1jXqbjalVgR}hHm(Va42JuMPW*KfpK_;c$kNI zsAv>sg8n6gY8Z$Gcvc5ch=zCo0&s|in1gmGh>o~k0i=irKxC3QiGDa=fcS`-sC$tm z{)t4Eh>FOFB6x+HSc=%^FQNE}o_L97MvA6rij)S5i})?5c!;9tT(0=rFZ7 zi*-1P2IqE7HAn=gi&)5uz(|P8m^5toYfCj&MzuxAsD;XCiILchGV_ca<$Fp5Sk+jC z*LXL-c#Gr}dE=x_{TGf@sEmPAj;zRlBLjLYCrj(dj#222dsB<%s9*G$SVf1A?Z}7N zST6h+kB#VZ3OQ5vD3DFai==~!{a9L*7mbbedi>^)OBjo@;$Q{oj5vlgYb8@dr;!6m zVi7ixyLDRJW|Cfbjg^>+!HA2|=8}QPk-;*P=g3AMXp>Wjlf6QOI;meg>64oNh?8}s zlE;;cM){I_xH~&IloZL7P058w**!{WUR8;YSD8auxjC7*m08%8MD&&XC6?hxmIf)5 z8+c=3iIyihWCRqIZTW{(2{0`Qm;R-eX=IkBwKjRFm*~Zp_r#VU>6R>`ZQp2&Af%Wi zC75VNm?Vaf!svaLDMg=Wkvj#MWhR+&DU~bPjSGobcZF}O$C+g2nP=sfj?*&=6?$+7 zO54_xs98IzSzN4{UZVGp&6i5x7nrpfTenGlJm%r z$+u9+!Rdc$f9bdG}eI`MIBH*q_mfm;h>q0;->|Q=nydpxmgSV#uJ<>7Wn#lyeE42)b$# z3Wg9$pc(3vlbMw0xs#bkn;i;g8)}?-2Yz@1oFxigABvSBN|flgIV{?u8n~Jj+MTbJ znB_KC>i46>C_;@nr0Zs*nMR=?I-gp}ap|O)%Ex@Zd2mvCj7DlRC;FcY8FHf8de>>4 zLCShndZaJvl`%S%=qPZ@$(xWTo3s|DMsuaDc&4?Krpf80^;mXo>ZU*gr}8MLJ*9mL z*PF+gr+OMzIGUvR8K+qaQ#Q4z?Ad#cTBwGKn>kvhp~<9o>i%&ZCwbzza787l%SD`J zX{q!%MpNgQ?y083sGcMWs`A38jp(XO2&1nGfh^r#1tM|vNGU}_>2dri) ztiOt+Fsh_rd7;J{WW;)@&B~w1N~X$smeDG$V>+tU`j^+*ch6d?o>Y_F>YUT6t%=&F zMG1K0x?|tEq|x|82KQ3rw61*9uFHz4)0nSoN{#fIIQDv$J{7PM2YNNyuU1;FYpJ8Y zHJ!zXJ%Kk)1{-P!+n1#3uIo9TV%KpI>p1_)t#5@@WQvr*0+=shjJ3UdnyWJ8;lzq0XjjYIQ#TJt>kPho)qgs>pjmlUu&SYq#clw?qnf z1zWIaL%0M3z;g?y``b$W+rA7-d`;tW_Itm8ORb3to@TRGhI31bO}!Sn#@>;dgA?`=@bizH^Mf(u*~f zCcwcP$nMg;p~JK8CXIb%nwtB2h|K=ITdccF`@K~4P2p>go~y!S%*a)Xvdasy^`yPy zi^_@|SC<^PH0hWW?7PT2#p1cj!qdW|>&iQ+nMs_n`?|!o%!v=2zXOV*fShcvImNUr zsKJbK(CNau?2n|0z1It-sqA~roL0jO&3D_Unmn@?9G+pkeAz6@zUIgkOuv!LR^zNv zm5jFLENz(c&SV?U(_6?M=uzd|%H4dlEBd)vY|n(UVl z(=mO~4DHalO4B!M)6x6VI{r;J60Olc4b(Etp+mhkK~2&lebl$h)95?XOl>wvU297n z)ed~q#9Y-?XVqde)yl@zMO@Uz4AxTP)mu&0Wi8epjn-wX)+^1{L1Wg>2iI@v*62#t zdurGIjMoS2)H*A+e4W>RZM+^E*exU1?`PPPip#}|$xo};hppES4cQir(z%S&y-L}Y zz0H@c(s!-dn~l{et<`f4+M&(ZbPUy|{eqU=*wI|9tIgV+?b?_ftg*e&s7=T|ecQk# z**VSIG&tCft+l|7+t1wDq@CEs-P^+b+R(b(CD`1x4cpMYFNiI3)lIk3?b&;s-Ph*Z zneE-M2Hv(U-jz$<{?u*W=e^y@jos?~-R!;F@BOOi{oM0S-|?;5_bte+o!Umd-~2t> z{yo+JzIgQwt_5!3`TgGse$}~+(emBka@^m#t=|$p;R0Ua41VDreBevU;h{_65N_ch z&ceq{+uS|bCEj_WjocBw;=n1F*K79l2cCDrEBFZ{);i$i^J`;T>j%k2rOX^*kexS zmIyOczP4$u<`J2QZ4S3@e#@X3ITESmx>@JWT!@8pkY`@yZ$6Gu1L)3;;Db((e$F)T z80c=!=h|HUTwvabi|*)j&gU>0HeNpGmka5U?&Sr!>3Y7jkPegB2xd|e+6d(WgXFxe>%89U&uE0ke(cDe?7A|UW)ACMsqD}m z?b7aL9y2VK?&+3>?bhb&+TL2-{%YL*?QkRRm=^Bj-aO~-XXakM(;n^DuG8(V?4q;W zA!uh_L+>>xZ}$%Fdf4wuwqH=V@1W-I1aD-ZQ||{j-9xzU#|rRIDDdUZ@WXoW`M&M* z&hLU5IYGt2gc`R!2~`*Gu;NP3iM+m~r54FI?8lJh&{xcF@BH$EE5;I^ zdnx|^bM{xbEI&Qn2lGwrIYB#1e++Z;!cM?Gp$>mbDTI0wjKYw+e-oT=kBe~B2JucO zRq7m0>bTD5c5h&h^-V06JO4bV*1J=xsa*ffksGC!S+j8E*{7UEnyP&@62ffE$>a=x zIghO@-txd)l1N{S)k(0Wsme27m`XTwioZ;UKfj3&#(aEM8Bg&%-=ugNrQAnuDeJ?& z?580A!ZWO@=$H7hTg4^s#&CJ|>MFD9NO<}-SOUxWKm5y;zm}wb`m_9+s2|Is&&+4n z`k0UQ@&~9iAM{jAnr#XIy)XR3uhPyx{nQ`&&L6zjucg_){DF$c(Qo#}uddVor~Z>W z{%LIf=70QMdj7mi`9p8_)Svz6FaPw9{LD+u?Qgp2|NUF(`gaun2w;BupU|juN+1-g%~a6_ ztZ9DSZ;!b70l~AdrOQ0F#4L0~&L*nlvvYcHE_eGdF;jztg@%WSQdlgDiH?tuh;9mk zk(QTFlbD;Fot=#upq`_ogPN74sg9bet*)=43$d@Xs;9NMQLMSVy@s;}z`nzYx5URS zsL0FAvQ~`G&C*iF)4aRZ*|@;M+TN6v%HOFjRp#gD>FVq3?e6dJ@$&QZ{`K)!(c}8y zF#E0o_5unVNU)&6gXr-2^H*)5!-o);bc=YbA;pUr{Y}hxEgZ*>Agxt#L9(RDlPFWF zT*v!~CWCTZRrO0=laCE|`MUCQ)g(xys@1Dl zTUE`FV7ZaP8f{AM>8Y2DmUt z!Da~?UhGuD#;b}MOLmBuY~;z9$5kGCIkRVLo5gniOnO=9V}R;#8eO`zuhYa*r_PcG zsbAN)alsxoyHIZytaA(3>NsDL4{B`O8M6fkax`Mha8aWq`0(rgqjs-IvHZkxGD0$N zC!-}unc7LLV_%O+d-NU9eO!<&e|~)(_;rks4@Euu|Btwr1Ag4iVPAf5z_&+!1*(Q% z8@B-{;VQ+^mP3QjJ=ffY3;r=4ef>o^;fRF@NZx^QjJKhJ9D?_ti`9up;*7df$OLqL z8Hg3W$HDlsJ=8RrEsO{>Z`A=`e>)J p)@l^3w&rRRuDbTh5wE@m8xgF;7HjOW$R?}ovdlK?>`w^*06RJ{w>AI( diff --git a/Mac/Demo/html.icons/options.gif b/Mac/Demo/html.icons/options.gif deleted file mode 100644 index d2f3c8ccc1aafc0c50e11f7024bf44c01cfffb50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4231 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 diff --git a/Mac/Demo/html.icons/python.gif b/Mac/Demo/html.icons/python.gif deleted file mode 100644 index c73f9306a380d43d4d01921c32a8457b7b9b3cd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1004 zcmbu8%}dmA5XMIll%QBOI(X7G=tU)RgtE6oZAB(Q=0c$xMKpAXh$5B}N(6DEE)rye z9Yj!L(U73mJt>vFeDxR|+KMQNsHHkodT4s)_b>E4>@v*EGoN{8clVxM8=H?-Q#Ji2 zGJnBL&BTn&$fFP}s0FdW7RZwtOx09O*_6Cif{B`l37e3&axhk7F=k_el2I^HBQatl z1ki>ww9t%d@;UxA1POsdARmiJHK+vTpyU)tiUyG&9E2PSwXA_9Fb5_uqBW2Pl0X~? zQ$YFGl z1DNQB9oQcb*bvkZ12ia63Jwg0Hl(3N?wqF);3J%d z0pLP8jK;RG5`F*^-LL~pSQs0E8e)J(C$PYQ!O(^@`H8$5X~cMhi@`|jhp~v5{Kw(G zM)&q)bV9c|x{B9EM!V~gcitM=;YWxzbfpN|ZxV61a3qbN1Fi(~uv393Pn09d5@m?e zL`k9qQJkn882^zj6bku#K9|d7v)N20lTN3T$z&pth{xmQ<*r?`P*Q|1s`n57Pn4ED zr=qgf+89mslvS>6dNBEZs%J9Za`M^fq3OQj+7+u~{lhc86{{|eXUbQO_b+R>@b&YL zBUJ-sJ6_y8-#F58wdw4u_RF!cIo(=19sXP!ogLV6rRr1j^6s{w*2- screenrect[2] - screenrect[0]: - factor = float(picwidth) / float(screenrect[2]-screenrect[0]) - picwidth = picwidth / factor - picheight = picheight / factor - if picheight > screenrect[3] - screenrect[1]: - factor = float(picheight) / float(screenrect[3]-screenrect[1]) - picwidth = picwidth / factor - picheight = picheight / factor - return (screenrect[0], screenrect[1], screenrect[0]+int(picwidth), - screenrect[1]+int(picheight)) - - def info(self): - graf = self.wid.GetWindowPort() - bits = graf.GetPortBitMapForCopyBits() - mac_image.dumppixmap(bits.pixmap_data) - -main() diff --git a/Mac/Demo/imgbrowse/mac_image.py b/Mac/Demo/imgbrowse/mac_image.py deleted file mode 100644 index 59306460fea..00000000000 --- a/Mac/Demo/imgbrowse/mac_image.py +++ /dev/null @@ -1,55 +0,0 @@ -"""mac_image - Helper routines (hacks) for images""" -import imgformat -from Carbon import Qd -import struct -import MacOS - -_fmt_to_mac = { - imgformat.macrgb16 : (16, 16, 3, 5), -} - -def mkpixmap(w, h, fmt, data): - """kludge a pixmap together""" - fmtinfo = _fmt_to_mac[fmt] - - rv = struct.pack("lHhhhhhhlllhhhhlll", - id(data)+MacOS.string_id_to_buffer, # HACK HACK!! - w*2 + 0x8000, - 0, 0, h, w, - 0, - 0, 0, # XXXX? - 72<<16, 72<<16, - fmtinfo[0], fmtinfo[1], - fmtinfo[2], fmtinfo[3], - 0, 0, 0) -## print 'Our pixmap, size %d:'%len(rv) -## dumppixmap(rv) - return Qd.RawBitMap(rv) - -def dumppixmap(data): - baseAddr, \ - rowBytes, \ - t, l, b, r, \ - pmVersion, \ - packType, packSize, \ - hRes, vRes, \ - pixelType, pixelSize, \ - cmpCount, cmpSize, \ - planeBytes, pmTable, pmReserved \ - = struct.unpack("lhhhhhhhlllhhhhlll", data) - print('Base: 0x%x'%baseAddr) - print('rowBytes: %d (0x%x)'%(rowBytes&0x3fff, rowBytes)) - print('rect: %d, %d, %d, %d'%(t, l, b, r)) - print('pmVersion: 0x%x'%pmVersion) - print('packing: %d %d'%(packType, packSize)) - print('resolution: %f x %f'%(float(hRes)/0x10000, float(vRes)/0x10000)) - print('pixeltype: %d, size %d'%(pixelType, pixelSize)) - print('components: %d, size %d'%(cmpCount, cmpSize)) - print('planeBytes: %d (0x%x)'%(planeBytes, planeBytes)) - print('pmTable: 0x%x'%pmTable) - print('pmReserved: 0x%x'%pmReserved) - for i in range(0, len(data), 16): - for j in range(16): - if i + j < len(data): - print('%02.2x'%ord(data[i+j]), end=' ') - print() diff --git a/Mac/Demo/index.html b/Mac/Demo/index.html deleted file mode 100644 index 9e01e9f8321..00000000000 --- a/Mac/Demo/index.html +++ /dev/null @@ -1,156 +0,0 @@ -Macintosh Python crash course - -

Macintosh Python crash course

-
- -

This set of documents provides an introduction to various aspects of -Python programming on the Mac. It is assumed that the reader is -already familiar with Python and, to some extent, with MacOS Toolbox -programming. Other readers may find something interesting here too, -your mileage may vary.

- -

As the previous paragraph reveals to the careful observer these examples -are dated, most of them were writting before OSX and haven't been updated -afterwards. They still show how to use the Carbon wrappers but aren't -necessarily the best way to use the Carbon API's in OSX.

- -Another set of Macintosh-savvy examples, more aimed at beginners, is -maintained by Joseph Strout, at Python Tidbits in -http://www.strout.net/python/. -

- -The Python Library -Reference contains a section on Macintosh-specific -modules that you should also read. Documentation is also available -in PostScript and other forms, see the documentation section on the -webserver.

- -

The W widget set by Just van Rossum, does not have complete documentation as -of this writing, but Corran Webster has documented most of it on his -Python Page.

- -There are also some documentation links, as well as other MacPython-related -pages, in the - -Open Directory. - - -

Table of contents

- -
Note: -Some of these documents were actually written a long time ago and have seen -little maintainance, so use with care.
- - -The Python distribution contains a few more examples, all unexplained: -
    -
  • -PICTbrowse is an application that locates PICT -resources and displays them, it demonstrates some quickdraw and the -resource and list managers. In the same folder you will find the very -similar scripts ICONbrowse and cicnbrowse. oldPICTbrowse is the same program -but form the pre-Appearance era, it uses a dialog with a user item and -creates and manages its own List object. - -
  • -Imgbrowse displays image files in -many different formats (gif, tiff, pbm, etc). It shows how to use the -img modules on the mac. - -
  • -Quicktime has the standard MovieInWindow and -VerySimplePlayer examples, re-coded in Python. - -
  • -Resources, Sound and Speech have some examples -on using the respective managers. In the Mac:Lib folder you -will also find modules that do useful things with the Communications -Toolbox, the Finder interface, etc. - -
  • -Printing has an example on using the Printing module to, you guessed -it, print from Python. The code is somewhat self-documenting. Donated -by Just van Rossum, who also donated the Printing module itself. -
- -At some point in the (possibly distant) future, I will add chapters on -how to use bgen to create modules completely automatic and how to make -your Python program scriptable, but that will have to wait.

- -


- -Please let me know if you miss critical information in this -document. I am quite sure that I will never find the time to turn it -into a complete MacPython programmers guide (which would probably be a -400-page book instead of 10 lousy html-files), but it should contain -at least the information that is neither in the standard Python -documentation nor in Inside Mac or other Mac programmers -documentation.

- -


-Jack Jansen, -jack@cwi.nl, 22-Apr-00. - diff --git a/Mac/Demo/mlte/mlted.py b/Mac/Demo/mlte/mlted.py deleted file mode 100644 index f9ccd216eb6..00000000000 --- a/Mac/Demo/mlte/mlted.py +++ /dev/null @@ -1,374 +0,0 @@ -# A minimal text editor using MLTE. Based on wed.py. -# -# To be done: -# - Functionality: find, etc. - -from Menu import DrawMenuBar -from FrameWork import * -from Carbon import Win -from Carbon import Ctl -from Carbon import Qd -from Carbon import Res -from Carbon import Scrap -import os -from Carbon import MacTextEditor -from Carbon import Mlte - -UNDOLABELS = [ # Indexed by MLTECanUndo() value - "Typing", "Cut", "Paste", "Clear", "Font Change", "Color Change", "Size Change", - "Style Change", "Align Left", "Align Center", "Align Right", "Drop", "Move"] - -class MlteWindow(Window): - def open(self, path, name, data): - self.path = path - self.name = name - r = windowbounds(400, 400) - w = Win.NewWindow(r, name, 1, 0, -1, 1, 0) - self.wid = w - flags = MacTextEditor.kTXNDrawGrowIconMask|MacTextEditor.kTXNWantHScrollBarMask| \ - MacTextEditor.kTXNWantVScrollBarMask - self.ted, self.frameid = Mlte.TXNNewObject(None, w, None, flags, MacTextEditor.kTXNTextEditStyleFrameType, - MacTextEditor.kTXNTextFile, MacTextEditor.kTXNMacOSEncoding) - self.ted.TXNSetData(MacTextEditor.kTXNTextData, data, 0, 0x7fffffff) - self.changed = 0 - self.do_postopen() - self.do_activate(1, None) - - def do_idle(self, event): - self.ted.TXNIdle() - self.ted.TXNAdjustCursor(None) - - - - def do_activate(self, onoff, evt): - if onoff: -## self.ted.TXNActivate(self.frameid, 0) - self.ted.TXNFocus(1) - self.parent.active = self - else: - self.ted.TXNFocus(0) - self.parent.active = None - self.parent.updatemenubar() - - def do_update(self, wid, event): - self.ted.TXNDraw(None) - - def do_postresize(self, width, height, window): - self.ted.TXNResizeFrame(width, height, self.frameid) - - def do_contentclick(self, local, modifiers, evt): - self.ted.TXNClick(evt) - self.parent.updatemenubar() - - def do_char(self, ch, event): - self.ted.TXNKeyDown(event) - self.parent.updatemenubar() - - def close(self): - if self.changed: - save = EasyDialogs.AskYesNoCancel('Save window "%s" before closing?'%self.name, 1) - if save > 0: - self.menu_save() - elif save < 0: - return - if self.parent.active == self: - self.parent.active = None - self.ted.TXNDeleteObject() - del self.ted -## del self.tedtexthandle - self.do_postclose() - - def menu_save(self): - if not self.path: - self.menu_save_as() - return # Will call us recursively - dhandle = self.ted.TXNGetData(0, 0x7fffffff) - data = dhandle.data - fp = open(self.path, 'wb') # NOTE: wb, because data has CR for end-of-line - fp.write(data) - if data[-1] <> '\r': fp.write('\r') - fp.close() - self.changed = 0 - - def menu_save_as(self): - path = EasyDialogs.AskFileForSave(message='Save as:') - if not path: return - self.path = path - self.name = os.path.split(self.path)[-1] - self.wid.SetWTitle(self.name) - self.menu_save() - - def menu_cut(self): -## self.ted.WESelView() - self.ted.TXNCut() -### Mlte.ConvertToPublicScrap() -## Scrap.ZeroScrap() -## self.ted.WECut() -## self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def menu_copy(self): -## Scrap.ZeroScrap() - self.ted.TXNCopy() -### Mlte.ConvertToPublicScrap() -## self.updatescrollbars() - self.parent.updatemenubar() - - def menu_paste(self): -### Mlte.ConvertFromPublicScrap() - self.ted.TXNPaste() -## self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def menu_clear(self): -## self.ted.WESelView() - self.ted.TXNClear() -## self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def menu_undo(self): - self.ted.TXNUndo() -## self.updatescrollbars() - self.parent.updatemenubar() - - def menu_redo(self): - self.ted.TXNRedo() -## self.updatescrollbars() - self.parent.updatemenubar() - - def have_selection(self): - start, stop = self.ted.TXNGetSelection() - return start < stop - - def can_paste(self): - return Mlte.TXNIsScrapPastable() - - def can_undo(self): - can, which = self.ted.TXNCanUndo() - if not can: - return None - if which >= len(UNDOLABELS): - # Unspecified undo - return "Undo" - which = UNDOLABELS[which] - - return "Undo "+which - - def can_redo(self): - can, which = self.ted.TXNCanRedo() - if not can: - return None - if which >= len(UNDOLABELS): - # Unspecified undo - return "Redo" - which = UNDOLABELS[which] - - return "Redo "+which - -class Mlted(Application): - def __init__(self): - Application.__init__(self) - self.num = 0 - self.active = None - self.updatemenubar() - - def makeusermenus(self): - self.filemenu = m = Menu(self.menubar, "File") - self.newitem = MenuItem(m, "New window", "N", self.open) - self.openitem = MenuItem(m, "Open...", "O", self.openfile) - self.closeitem = MenuItem(m, "Close", "W", self.closewin) - m.addseparator() - self.saveitem = MenuItem(m, "Save", "S", self.save) - self.saveasitem = MenuItem(m, "Save as...", "", self.saveas) - m.addseparator() - self.quititem = MenuItem(m, "Quit", "Q", self.quit) - - self.editmenu = m = Menu(self.menubar, "Edit") - self.undoitem = MenuItem(m, "Undo", "Z", self.undo) - self.redoitem = MenuItem(m, "Redo", None, self.redo) - m.addseparator() - self.cutitem = MenuItem(m, "Cut", "X", self.cut) - self.copyitem = MenuItem(m, "Copy", "C", self.copy) - self.pasteitem = MenuItem(m, "Paste", "V", self.paste) - self.clearitem = MenuItem(m, "Clear", "", self.clear) - - # Groups of items enabled together: - self.windowgroup = [self.closeitem, self.saveitem, self.saveasitem, self.editmenu] - self.focusgroup = [self.cutitem, self.copyitem, self.clearitem] - self.windowgroup_on = -1 - self.focusgroup_on = -1 - self.pastegroup_on = -1 - self.undo_label = "never" - self.redo_label = "never" - - def updatemenubar(self): - changed = 0 - on = (self.active <> None) - if on <> self.windowgroup_on: - for m in self.windowgroup: - m.enable(on) - self.windowgroup_on = on - changed = 1 - if on: - # only if we have an edit menu - on = self.active.have_selection() - if on <> self.focusgroup_on: - for m in self.focusgroup: - m.enable(on) - self.focusgroup_on = on - changed = 1 - on = self.active.can_paste() - if on <> self.pastegroup_on: - self.pasteitem.enable(on) - self.pastegroup_on = on - changed = 1 - on = self.active.can_undo() - if on <> self.undo_label: - if on: - self.undoitem.enable(1) - self.undoitem.settext(on) - self.undo_label = on - else: - self.undoitem.settext("Nothing to undo") - self.undoitem.enable(0) - changed = 1 - on = self.active.can_redo() - if on <> self.redo_label: - if on: - self.redoitem.enable(1) - self.redoitem.settext(on) - self.redo_label = on - else: - self.redoitem.settext("Nothing to redo") - self.redoitem.enable(0) - changed = 1 - if changed: - DrawMenuBar() - - # - # Apple menu - # - - def do_about(self, id, item, window, event): - EasyDialogs.Message("A simple single-font text editor based on MacTextEditor") - - # - # File menu - # - - def open(self, *args): - self._open(0) - - def openfile(self, *args): - self._open(1) - - def _open(self, askfile): - if askfile: - path = EasyDialogs.AskFileForOpen(typeList=('TEXT',)) - if not path: - return - name = os.path.split(path)[-1] - try: - fp = open(path, 'rb') # NOTE binary, we need cr as end-of-line - data = fp.read() - fp.close() - except IOError as arg: - EasyDialogs.Message("IOERROR: %r" % (arg,)) - return - else: - path = None - name = "Untitled %d"%self.num - data = '' - w = MlteWindow(self) - w.open(path, name, data) - self.num = self.num + 1 - - def closewin(self, *args): - if self.active: - self.active.close() - else: - EasyDialogs.Message("No active window?") - - def save(self, *args): - if self.active: - self.active.menu_save() - else: - EasyDialogs.Message("No active window?") - - def saveas(self, *args): - if self.active: - self.active.menu_save_as() - else: - EasyDialogs.Message("No active window?") - - - def quit(self, *args): - for w in self._windows.values(): - w.close() - if self._windows: - return - self._quit() - - # - # Edit menu - # - - def undo(self, *args): - if self.active: - self.active.menu_undo() - else: - EasyDialogs.Message("No active window?") - - def redo(self, *args): - if self.active: - self.active.menu_redo() - else: - EasyDialogs.Message("No active window?") - - def cut(self, *args): - if self.active: - self.active.menu_cut() - else: - EasyDialogs.Message("No active window?") - - def copy(self, *args): - if self.active: - self.active.menu_copy() - else: - EasyDialogs.Message("No active window?") - - def paste(self, *args): - if self.active: - self.active.menu_paste() - else: - EasyDialogs.Message("No active window?") - - def clear(self, *args): - if self.active: - self.active.menu_clear() - else: - EasyDialogs.Message("No active window?") - - # - # Other stuff - # - - def idle(self, event): - if self.active: - self.active.do_idle(event) - else: - Qd.SetCursor(Qd.GetQDGlobalsArrow()) - -def main(): - Mlte.TXNInitTextension(0) - try: - App = Mlted() - App.mainloop() - finally: - Mlte.TXNTerminateTextension() - -if __name__ == '__main__': - main() diff --git a/Mac/Demo/quicktime/MovieInWindow.py b/Mac/Demo/quicktime/MovieInWindow.py deleted file mode 100644 index 00f596e4720..00000000000 --- a/Mac/Demo/quicktime/MovieInWindow.py +++ /dev/null @@ -1,70 +0,0 @@ -"""MovieInWindow converted to python - -Jack Jansen, CWI, December 1995 -""" - -from Carbon import Qt -from Carbon import QuickTime -from Carbon import Qd -from Carbon import QuickDraw -from Carbon import Evt -from Carbon import Events -from Carbon import Win -from Carbon import Windows -from Carbon import File -import EasyDialogs -import sys -import os - - -def main(): - # skip the toolbox initializations, already done - # XXXX Should use gestalt here to check for quicktime version - Qt.EnterMovies() - - # Get the movie file - if len(sys.argv) > 1: - filename = sys.argv[1] - else: - filename = EasyDialogs.AskFileForOpen() # Was: QuickTime.MovieFileType - if not filename: - sys.exit(0) - - # Open the window - bounds = (175, 75, 175+160, 75+120) - theWindow = Win.NewCWindow(bounds, os.path.split(filename)[1], 1, 0, -1, 0, 0) - Qd.SetPort(theWindow) - # XXXX Needed? SetGWorld((CGrafPtr)theWindow, nil) - - playMovieInWindow(theWindow, filename, theWindow.GetWindowPort().GetPortBounds()) - -def playMovieInWindow(theWindow, theFile, movieBox): - """Play a movie in a window""" - # XXXX Needed? SetGWorld((CGrafPtr)theWindow, nil); - - # Get the movie - theMovie = loadMovie(theFile) - - # Set where we want it - theMovie.SetMovieBox(movieBox) - - # Start at the beginning - theMovie.GoToBeginningOfMovie() - - # Give a little time to preroll - theMovie.MoviesTask(0) - - # Start playing - theMovie.StartMovie() - - while not theMovie.IsMovieDone() and not Evt.Button(): - theMovie.MoviesTask(0) - -def loadMovie(theFile): - """Load a movie given an fsspec. Return the movie object""" - movieResRef = Qt.OpenMovieFile(theFile, 1) - movie, d1, d2 = Qt.NewMovieFromFile(movieResRef, 0, QuickTime.newMovieActive) - return movie - -if __name__ == '__main__': - main() diff --git a/Mac/Demo/quicktime/VerySimplePlayer.py b/Mac/Demo/quicktime/VerySimplePlayer.py deleted file mode 100644 index 7c0fef019e9..00000000000 --- a/Mac/Demo/quicktime/VerySimplePlayer.py +++ /dev/null @@ -1,92 +0,0 @@ -"""VerySimplePlayer converted to python - -Jack Jansen, CWI, December 1995 -""" - -from Carbon import Qt -from Carbon import QuickTime -from Carbon import Qd -from Carbon import QuickDraw -from Carbon import Evt -from Carbon import Events -from Carbon import Win -from Carbon import Windows -from Carbon import File -import EasyDialogs -import sys - -# XXXX maxbounds = (40, 40, 1000, 1000) - -def main(): - print('hello world') # XXXX - # skip the toolbox initializations, already done - # XXXX Should use gestalt here to check for quicktime version - Qt.EnterMovies() - - # Get the movie file - fss = EasyDialogs.AskFileForOpen(wanted=File.FSSpec) # Was: QuickTime.MovieFileType - if not fss: - sys.exit(0) - - # Open the window - bounds = (175, 75, 175+160, 75+120) - theWindow = Win.NewCWindow(bounds, fss.as_tuple()[2], 0, 0, -1, 1, 0) - # XXXX Needed? SetGWorld((CGrafPtr)theWindow, nil) - Qd.SetPort(theWindow) - - # Get the movie - theMovie = loadMovie(fss) - - # Relocate to (0, 0) - bounds = theMovie.GetMovieBox() - bounds = 0, 0, bounds[2]-bounds[0], bounds[3]-bounds[1] - theMovie.SetMovieBox(bounds) - - # Create a controller - theController = theMovie.NewMovieController(bounds, QuickTime.mcTopLeftMovie) - - # Get movie size and update window parameters - rv, bounds = theController.MCGetControllerBoundsRect() - theWindow.SizeWindow(bounds[2], bounds[3], 0) # XXXX or [3] [2]? - Qt.AlignWindow(theWindow, 0) - theWindow.ShowWindow() - - # XXXX MCDoAction(theController, mcActionSetGrowBoxBounds, &maxBounds) - theController.MCDoAction(QuickTime.mcActionSetKeysEnabled, '1') - - # XXXX MCSetActionFilterWithRefCon(theController, movieControllerEventFilter, (long)theWindow) - - done = 0 - while not done: - gotone, evt = Evt.WaitNextEvent(0xffff, 0) - (what, message, when, where, modifiers) = evt -## print what, message, when, where, modifiers # XXXX - - if theController.MCIsPlayerEvent(evt): - continue - - if what == Events.mouseDown: - part, whichWindow = Win.FindWindow(where) - if part == Windows.inGoAway: - done = whichWindow.TrackGoAway(where) - elif part == Windows.inDrag: - Qt.DragAlignedWindow(whichWindow, where, (0, 0, 4000, 4000)) - elif what == Events.updateEvt: - whichWindow = Win.WhichWindow(message) - if not whichWindow: - # Probably the console window. Print something, hope it helps. - print('update') - else: - Qd.SetPort(whichWindow) - whichWindow.BeginUpdate() - Qd.EraseRect(whichWindow.GetWindowPort().GetPortBounds()) - whichWindow.EndUpdate() - -def loadMovie(theFile): - """Load a movie given an fsspec. Return the movie object""" - movieResRef = Qt.OpenMovieFile(theFile, 1) - movie, d1, d2 = Qt.NewMovieFromFile(movieResRef, 0, QuickTime.newMovieActive) - return movie - -if __name__ == '__main__': - main() diff --git a/Mac/Demo/resources/copyres.py b/Mac/Demo/resources/copyres.py deleted file mode 100644 index 6c8a3c03b9d..00000000000 --- a/Mac/Demo/resources/copyres.py +++ /dev/null @@ -1,63 +0,0 @@ -from Carbon.Res import * -from Carbon.Resources import * -import MacOS - -READ = 1 -WRITE = 2 -smAllScripts = -3 - -def raw_input(prompt): - import sys - sys.stdout.write(prompt) - sys.stdout.flush() - return sys.stdin.readline() - -def copyres(src, dst): - """Copy resource from src file to dst file.""" - - cur = CurResFile() - ctor, type = MacOS.GetCreatorAndType(src) - input = FSpOpenResFile(src, READ) - try: - FSpCreateResFile(dst, ctor, type, smAllScripts) - except: - raw_input("%s already exists... CR to write anyway! " % dst) - output = FSpOpenResFile(dst, WRITE) - UseResFile(input) - ntypes = Count1Types() - for itype in range(1, 1+ntypes): - type = Get1IndType(itype) - nresources = Count1Resources(type) - for ires in range(1, 1+nresources): - res = Get1IndResource(type, ires) - res.LoadResource() - id, type, name = res.GetResInfo() - size = res.SizeResource() - attrs = res.GetResAttrs() - print(id, type, name, size, hex(attrs)) - res.DetachResource() - UseResFile(output) - try: - res2 = Get1Resource(type, id) - except (RuntimeError, Res.Error) as msg: - res2 = None - if res2: - print("Duplicate type+id, not copied") - print (res2.size, res2.data) - print(res2.GetResInfo()) - if res2.HomeResFile() == output: - 'OK' - elif res2.HomeResFile() == input: - 'BAD!' - else: - print('Home:', res2.HomeResFile()) - else: - res.AddResource(type, id, name) - #res.SetResAttrs(attrs) - res.WriteResource() - UseResFile(input) - UseResFile(cur) - CloseResFile(output) - CloseResFile(input) - -copyres('::python.¹.rsrc', '::foo.rsrc') diff --git a/Mac/Demo/resources/listres.py b/Mac/Demo/resources/listres.py deleted file mode 100644 index 8f391ebfeba..00000000000 --- a/Mac/Demo/resources/listres.py +++ /dev/null @@ -1,60 +0,0 @@ -# List all resources - -from Carbon import Res -from Carbon.Resources import * - -def list1resources(): - ntypes = Res.Count1Types() - for itype in range(1, 1+ntypes): - type = Res.Get1IndType(itype) - print("Type:", repr(type)) - nresources = Res.Count1Resources(type) - for i in range(1, 1 + nresources): - Res.SetResLoad(0) - res = Res.Get1IndResource(type, i) - Res.SetResLoad(1) - info(res) - -def listresources(): - ntypes = Res.CountTypes() - for itype in range(1, 1+ntypes): - type = Res.GetIndType(itype) - print("Type:", repr(type)) - nresources = Res.CountResources(type) - for i in range(1, 1 + nresources): - Res.SetResLoad(0) - res = Res.GetIndResource(type, i) - Res.SetResLoad(1) - info(res) - -def info(res): - print(res.GetResInfo(), res.SizeResource(), decodeattrs(res.GetResAttrs())) - -attrnames = { - resChanged: 'Changed', - resPreload: 'Preload', - resProtected: 'Protected', - resLocked: 'Locked', - resPurgeable: 'Purgeable', - resSysHeap: 'SysHeap', -} - -def decodeattrs(attrs): - names = [] - for bit in range(16): - mask = 1<> 8) & 255) + chr(val & 255) - sinewave = sinewave + sample[:SAMPWIDTH] - self.sinewave = sinewave - self.silence = '\0' * (n*SAMPWIDTH) - self.morsequeue = '' - - def __del__(self): - self.close() - - def close(self): - self.dev = None - - def pause(self, duration): - self.dev.writeframes(self.silence * duration) - - def noise(self, duration): - self.dev.writeframes(self.sinewave * duration) - - def sendmorse(self, s): - self.morsequeue = self.morsequeue + s - self.dev.usercallback() - self.dev.usercallback() - self.dev.usercallback() - - def usercallback(self): - if self.morsequeue: - c, self.morsequeue = self.morsequeue[0], self.morsequeue[1:] - if c == '.': - self.dot() - elif c == '-': - self.dah() - else: - self.pdah() - self.pdot() - - -def raw_input(prompt): - import sys - sys.stdout.write(prompt) - sys.stdout.flush() - return sys.stdin.readline() - -def test(): - m = MacMorse() - while 1: - try: - line = raw_input('Morse line: ') - except (EOFError, KeyboardInterrupt): - break - m.send(line) - while m.morsequeue: - pass - -if __name__ == '__main__': - test() diff --git a/Mac/Demo/sound/playaiff.py b/Mac/Demo/sound/playaiff.py deleted file mode 100644 index 087f7c9c9f2..00000000000 --- a/Mac/Demo/sound/playaiff.py +++ /dev/null @@ -1,45 +0,0 @@ -from Carbon.Sound import * -from Carbon import Snd - -import aifc, audioop - -fn = 'f:just samples:2ndbeat.aif' -af = aifc.open(fn, 'r') -print(af.getparams()) -print('nframes =', af.getnframes()) -print('nchannels =', af.getnchannels()) -print('framerate =', af.getframerate()) -nframes = min(af.getnframes(), 100000) -frames = af.readframes(nframes) -print('len(frames) =', len(frames)) -print(repr(frames[:100])) -frames = audioop.add(frames, '\x80'*len(frames), 1) -print(repr(frames[:100])) - -import struct - -header1 = struct.pack('llhhllbbl', - 0, - af.getnchannels(), - af.getframerate(),0, - 0, - 0, - 0xFF, - 60, - nframes) -print(repr(header1)) -header2 = struct.pack('llhlll', 0, 0, 0, 0, 0, 0) -header3 = struct.pack('hhlll', - af.getsampwidth()*8, - 0, - 0, - 0, - 0) -print(repr(header3)) -header = header1 + header2 + header3 - -buffer = header + frames - -chan = Snd.SndNewChannel(5,0x00C0) - -Snd.SndDoCommand(chan, (bufferCmd, 0, buffer), 0) diff --git a/Mac/Demo/textedit.html b/Mac/Demo/textedit.html deleted file mode 100644 index fcd8c973dfb..00000000000 --- a/Mac/Demo/textedit.html +++ /dev/null @@ -1,150 +0,0 @@ -Using FrameWork and TextEdit - -

Using FrameWork and TextEdit

-
- -In this document we use the FrameWork and TextEdit -modules to create a simple text editor. The functionality -of the editor is very basic: you can open multiple files, type text and use -cut/copy/paste. The main intention is to explain the use of FrameWork, really.

- -

FrameWork

- -The FrameWork module provides you with a skeleton application. It declares a -number of classes suitable for subclassing in your application, thereby -releaving you of the burden of doing all event handling, etc. yourself. For a -real understanding you will have to browse the source. Here is a short overview -of the classes and what functionality they provide. - -
-
Application -
-This is the toplevel class you will override. It maintains the menu bar and contains -the main event handling code. Normal use is to override the __init__ routine -to do your own initializations and override makeusermenus to create your menus -(your menu callback routines may be here too, but this is by no means necessary). -The event handling code can be overridden at various levels, from very low-level (the -dispatch method) to intermedeate level (do_keyDown, for instance) -to high-level (do_key). The application class knows about the Window -objects you create, and will forward events to the appropriate window (So, normally you -would have a do_key method in your window object, not your application object). - -
MenuBar, Menu and MenuItem -
-These classes (and a few friends like SubMenu) handle your menus. You would not -normally override them but use them as-is. The idiom for creating menus is a bit strange, -see the test code at the bottom of FrameWork for sample use. The apple menu is handled for you -by MenuBar and Application. - -
Window -
-The basic window. Again, a class that you normally subclass in your application, possibly -multiple times if you have different types of windows. The init call instantiates the data -structure but actually opening the window is delayed until you call open. Your -open method should call do_postopen to let the base class handle linking in to -the application object. Similarly with close and do_postclose. The -rest of the code is mainly event-oriented: you override do_postresize, -do_contentclick, do_update, do_activate -and do_key to "do your thing". When these methods are called the relevant environment -has been setup (like BeginDrawing has been called for updates, etc). - -
windowbounds -
-Not a class but a function: you pass it a width and height and it will return you a rectangle -you can use to create your window. It will take care of staggering windows and it will try -to fit the window on the screen (but the resulting rect will always have the size you -specify). - -
ControlsWindow -
-A subclass of Window which automatically handles drawing and clicking for controls. You override -the same methods as for Window (if you need to: control-related things are done automatically) and -do_controlhit. - -
ScrolledWindow -
-A subclass of ControlsWindow, a window with optional scrollbars. If you override do_activate -or do_postresize you must call the ScrolledWindow methods at the end of your override. -You call scrollbars to enable/disable scrollbars and updatescrollbars to -update them. You provide getscrollbarvalues to return the current x/y values (a helper -method scalebarvalues is available) and scrollbarcallback to update your -display after the user has used the scrollbars. - -
DialogWindow -
-A modeless dialog window initialized from a DLOG resource. See the -second Interslip example for its useage. -
- -

A sample text editor

- -Let us have a look at ped.py (in the Demo:textedit folder), the Pathetic -EDitor. It has multiple windows, cut/copy/paste and keyboard input, but that is about all. It looks -as if you can resize the window but it does not work. Still, it serves as an example. - -Ped creates two classes, TEWindow and Ped. Let us start with the latter one, -which is a subclass of FrameWork.Application and our main application. The init function -has little to do aside from the standard init: it remembers a window sequence number (for untitled windows), -and sets things up for menu disable to work. Remember, the makeusermenus is called -automatically.

- -Makeusermenus creates the File and Edit menus. It also initializes -a couple of lists that are used later to correctly enable and disable menu items (and complete menus) depending -on whether a window is open, text is selected, etc. The callback functions for the menu items are -all methods of this class.

- -Updatemenubar handles greying out (and re-enabling) of menu items depending on whether there -is a current window and its state.

- -The rest of the methods are all callbacks and simple to understand. They check whether there is an active -window (and complain loudly if there is none: the corresponding menu entry should have been disabled -in that case!) and call the appropriate window method. Only the _open method (the common code -for Open and New) deserves some mention. It instantiates a TEWindow -object and opens it with the title, filename and contents of the file to edit. Note that FrameWork takes -care of remembering the window object. A minor note on opening the file in binary mode: this is because -TextEdit expects MacOS style carriage-return terminated lines, not python/unix/C style newline-terminated -lines.

- -Oh yes: the quit callback does a little magic too. It closes all windows, and only if this -succeeds it actually quits. This gives the user a chance to cancel the operation if some files are unsaved. -

- -Lastly, there is the idle method, called by the Application base class when no event -is available. It is forwarded to the active window, so it can blink the text caret.

- -The TEWindow object handles a single window. Due to this structuring it is absolutely no -problem to have multiple windows open at the same time (although a real application should exercise care when -two windows refer to the same document). TEWindow uses the standard init code inherited from -ScrolledWindow, and sets itself up at the time of the open call. It obtains screen -coordinates, opens the window, creates rectangles for TextEdit to work in (the magical number 15 -here is the size of a normal scroll bar: unfortunately there is no symbolic constant for it), -creates the TextEdit object and initializes it with our data. Finally, the scroll bars are created (the -initial values will be obtained automatically through getscrollbarvalues) and we activate -ourselves (this is unfortunately not done automatically by the MacOS event handling code).

- -Do_idle simply calls the TextEdit routine that blinks the cursor. Getscrollbarvalues -returns the current X and Y scrollbar values, scaled to 0..32767. For X we return None, -which means "no scrollbar, please", for Y we use the scaler provided by ScrolledWindow.

- -Scrollbar_callback is called when the user uses the scrollbar. It is passed a string 'x' -or 'y', one of 'set', '-', '--', '+', '++' and (for set) an absolute -value. Note that the sign of the value passed to TEPinScroll is counter-intuitive.

- -do_activate (de)activates the scrollbars and calls the relevant TextEdit routine. Moreover, it -tells the application object if we are now the active window, and updates the menubar. The next few methods -are update and menu callbacks, and pretty straightforward. Note that do_close can -return without closing the window (if the document is changed and the users cancels out of the operation). -Also note the "magic" in menu_save_as -that set the correct window title.

- -Things get moderately interesting again at the cut/copy/paste handling, since the TextEdit scrap is -separate from the desktop scrap. For that reason there are various calls to routines that move the scrap -back and forth. Have_selection is called by the menubar update code to determine whether cut and -copy should be enabled.

- -Understanding the main program is left as an exercise to the reader.

- -


-That's all for this example, you could now continue with the next example, where we use WASTE, a more-or-less -TextEdit compatible library with more functionality, to rebuild our editor. Or you can -return to the table of contents to pick another topic.

diff --git a/Mac/Demo/textedit/ped.py b/Mac/Demo/textedit/ped.py deleted file mode 100644 index f28ae3cd59d..00000000000 --- a/Mac/Demo/textedit/ped.py +++ /dev/null @@ -1,359 +0,0 @@ -# A minimal text editor. -# -# To be done: -# - Update viewrect after resize -# - Handle horizontal scrollbar correctly -# - Functionality: find, etc. - -from Carbon.Menu import DrawMenuBar -from FrameWork import * -from Carbon import Win -from Carbon import Qd -from Carbon import TE -from Carbon import Scrap -import os -import macfs - -class TEWindow(ScrolledWindow): - def open(self, path, name, data): - self.path = path - self.name = name - r = windowbounds(400, 400) - w = Win.NewWindow(r, name, 1, 0, -1, 1, 0) - self.wid = w - x0, y0, x1, y1 = self.wid.GetWindowPort().GetPortBounds() - x0 = x0 + 4 - y0 = y0 + 4 - x1 = x1 - 20 - y1 = y1 - 20 - vr = dr = x0, y0, x1, y1 - ##vr = 4, 0, r[2]-r[0]-15, r[3]-r[1]-15 - ##dr = (0, 0, vr[2], 0) - Qd.SetPort(w) - Qd.TextFont(4) - Qd.TextSize(9) - self.ted = TE.TENew(dr, vr) - self.ted.TEAutoView(1) - self.ted.TESetText(data) - w.DrawGrowIcon() - self.scrollbars() - self.changed = 0 - self.do_postopen() - self.do_activate(1, None) - - def do_idle(self): - self.ted.TEIdle() - - def getscrollbarvalues(self): - dr = self.ted.destRect - vr = self.ted.viewRect - height = self.ted.nLines * self.ted.lineHeight - vx = self.scalebarvalue(dr[0], dr[2]-dr[0], vr[0], vr[2]) - vy = self.scalebarvalue(dr[1], dr[1]+height, vr[1], vr[3]) - print(dr, vr, height, vx, vy) - return None, vy - - def scrollbar_callback(self, which, what, value): - if which == 'y': - if what == 'set': - height = self.ted.nLines * self.ted.lineHeight - cur = self.getscrollbarvalues()[1] - delta = (cur-value)*height/32767 - if what == '-': - delta = self.ted.lineHeight - elif what == '--': - delta = (self.ted.viewRect[3]-self.ted.lineHeight) - if delta <= 0: - delta = self.ted.lineHeight - elif what == '+': - delta = -self.ted.lineHeight - elif what == '++': - delta = -(self.ted.viewRect[3]-self.ted.lineHeight) - if delta >= 0: - delta = -self.ted.lineHeight - self.ted.TEPinScroll(0, delta) - print('SCROLL Y', delta) - else: - pass # No horizontal scrolling - - def do_activate(self, onoff, evt): - print("ACTIVATE", onoff) - ScrolledWindow.do_activate(self, onoff, evt) - if onoff: - self.ted.TEActivate() - self.parent.active = self - self.parent.updatemenubar() - else: - self.ted.TEDeactivate() - - def do_update(self, wid, event): - Qd.EraseRect(wid.GetWindowPort().GetPortBounds()) - self.ted.TEUpdate(wid.GetWindowPort().GetPortBounds()) - self.updatescrollbars() - - def do_contentclick(self, local, modifiers, evt): - shifted = (modifiers & 0x200) - self.ted.TEClick(local, shifted) - self.updatescrollbars() - self.parent.updatemenubar() - - def do_char(self, ch, event): - self.ted.TESelView() - self.ted.TEKey(ord(ch)) - self.changed = 1 - self.updatescrollbars() - self.parent.updatemenubar() - - def close(self): - if self.changed: - save = EasyDialogs.AskYesNoCancel('Save window "%s" before closing?'%self.name, 1) - if save > 0: - self.menu_save() - elif save < 0: - return - if self.parent.active == self: - self.parent.active = None - self.parent.updatemenubar() - del self.ted - self.do_postclose() - - def menu_save(self): - if not self.path: - self.menu_save_as() - return # Will call us recursively - print('Saving to ', self.path) - dhandle = self.ted.TEGetText() - data = dhandle.data - fp = open(self.path, 'wb') # NOTE: wb, because data has CR for end-of-line - fp.write(data) - if data[-1] <> '\r': fp.write('\r') - fp.close() - self.changed = 0 - - def menu_save_as(self): - path = EasyDialogs.AskFileForSave(message='Save as:') - if not path: return - self.path = path - self.name = os.path.split(self.path)[-1] - self.wid.SetWTitle(self.name) - self.menu_save() - - def menu_cut(self): - self.ted.TESelView() - self.ted.TECut() - if hasattr(Scrap, 'ZeroScrap'): - Scrap.ZeroScrap() - else: - Scrap.ClearCurrentScrap() - TE.TEToScrap() - self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def menu_copy(self): - self.ted.TECopy() - if hasattr(Scrap, 'ZeroScrap'): - Scrap.ZeroScrap() - else: - Scrap.ClearCurrentScrap() - TE.TEToScrap() - self.updatescrollbars() - self.parent.updatemenubar() - - def menu_paste(self): - TE.TEFromScrap() - self.ted.TESelView() - self.ted.TEPaste() - self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def menu_clear(self): - self.ted.TESelView() - self.ted.TEDelete() - self.updatescrollbars() - self.parent.updatemenubar() - self.changed = 1 - - def have_selection(self): - return (self.ted.selStart < self.ted.selEnd) - -class Ped(Application): - def __init__(self): - Application.__init__(self) - self.num = 0 - self.active = None - self.updatemenubar() - - def makeusermenus(self): - self.filemenu = m = Menu(self.menubar, "File") - self.newitem = MenuItem(m, "New window", "N", self.open) - self.openitem = MenuItem(m, "Open...", "O", self.openfile) - self.closeitem = MenuItem(m, "Close", "W", self.closewin) - m.addseparator() - self.saveitem = MenuItem(m, "Save", "S", self.save) - self.saveasitem = MenuItem(m, "Save as...", "", self.saveas) - m.addseparator() - self.quititem = MenuItem(m, "Quit", "Q", self.quit) - - self.editmenu = m = Menu(self.menubar, "Edit") - self.undoitem = MenuItem(m, "Undo", "Z", self.undo) - self.cutitem = MenuItem(m, "Cut", "X", self.cut) - self.copyitem = MenuItem(m, "Copy", "C", self.copy) - self.pasteitem = MenuItem(m, "Paste", "V", self.paste) - self.clearitem = MenuItem(m, "Clear", "", self.clear) - - # Not yet implemented: - self.undoitem.enable(0) - - # Groups of items enabled together: - self.windowgroup = [self.closeitem, self.saveitem, self.saveasitem, self.editmenu] - self.focusgroup = [self.cutitem, self.copyitem, self.clearitem] - self.windowgroup_on = -1 - self.focusgroup_on = -1 - self.pastegroup_on = -1 - - def updatemenubar(self): - changed = 0 - on = (self.active <> None) - if on <> self.windowgroup_on: - for m in self.windowgroup: - m.enable(on) - self.windowgroup_on = on - changed = 1 - if on: - # only if we have an edit menu - on = self.active.have_selection() - if on <> self.focusgroup_on: - for m in self.focusgroup: - m.enable(on) - self.focusgroup_on = on - changed = 1 - if hasattr(Scrap, 'InfoScrap'): - on = (Scrap.InfoScrap()[0] <> 0) - else: - flavors = Scrap.GetCurrentScrap().GetScrapFlavorInfoList() - for tp, info in flavors: - if tp == 'TEXT': - on = 1 - break - else: - on = 0 - if on <> self.pastegroup_on: - self.pasteitem.enable(on) - self.pastegroup_on = on - changed = 1 - if changed: - DrawMenuBar() - - # - # Apple menu - # - - def do_about(self, id, item, window, event): - EasyDialogs.Message("A simple single-font text editor") - - # - # File menu - # - - def open(self, *args): - self._open(0) - - def openfile(self, *args): - self._open(1) - - def _open(self, askfile): - if askfile: - path = EasyDialogs.AskFileForOpen(typeList=('TEXT',)) - if not path: - return - name = os.path.split(path)[-1] - try: - fp = open(path, 'rb') # NOTE binary, we need cr as end-of-line - data = fp.read() - fp.close() - except IOError as arg: - EasyDialogs.Message("IOERROR: %r" % (arg,)) - return - else: - path = None - name = "Untitled %d"%self.num - data = '' - w = TEWindow(self) - w.open(path, name, data) - self.num = self.num + 1 - - def closewin(self, *args): - if self.active: - self.active.close() - else: - EasyDialogs.Message("No active window?") - - def save(self, *args): - if self.active: - self.active.menu_save() - else: - EasyDialogs.Message("No active window?") - - def saveas(self, *args): - if self.active: - self.active.menu_save_as() - else: - EasyDialogs.Message("No active window?") - - - def quit(self, *args): - for w in self._windows.values(): - w.close() - if self._windows: - return - self._quit() - - # - # Edit menu - # - - def undo(self, *args): - pass - - def cut(self, *args): - if self.active: - self.active.menu_cut() - else: - EasyDialogs.Message("No active window?") - - def copy(self, *args): - if self.active: - self.active.menu_copy() - else: - EasyDialogs.Message("No active window?") - - def paste(self, *args): - if self.active: - self.active.menu_paste() - else: - EasyDialogs.Message("No active window?") - - def clear(self, *args): - if self.active: - self.active.menu_clear() - else: - EasyDialogs.Message("No active window?") - - # - # Other stuff - # - - def idle(self, *args): - if self.active: - self.active.do_idle() - else: - Qd.SetCursor(Qd.GetQDGlobalsArrow()) - -def main(): - App = Ped() - App.mainloop() - -if __name__ == '__main__': - main() diff --git a/Mac/IDLE/Info.plist.in b/Mac/IDLE/IDLE.app/Contents/Info.plist similarity index 89% rename from Mac/IDLE/Info.plist.in rename to Mac/IDLE/IDLE.app/Contents/Info.plist index 58e913c5698..a097c1a74ce 100644 --- a/Mac/IDLE/Info.plist.in +++ b/Mac/IDLE/IDLE.app/Contents/Info.plist @@ -36,7 +36,7 @@ CFBundleExecutable IDLE CFBundleGetInfoString - %VERSION%, © 001-2006 Python Software Foundation + 2.6.0, © 001-2006 Python Software Foundation CFBundleIconFile IDLE.icns CFBundleIdentifier @@ -48,8 +48,10 @@ CFBundlePackageType APPL CFBundleShortVersionString - %VERSION% + 2.6.0 + CFBundleSignature + ???? CFBundleVersion - %VERSION% + 2.6.0 diff --git a/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE b/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE new file mode 100755 index 00000000000..15afffab303 --- /dev/null +++ b/Mac/IDLE/IDLE.app/Contents/MacOS/IDLE @@ -0,0 +1,23 @@ +#!/Library/Frameworks/Python.framework/Versions/3.0/Resources/Python.app/Contents/MacOS/Python + +import sys, os +execdir = os.path.dirname(sys.argv[0]) +executable = os.path.join(execdir, "Python") +resdir = os.path.join(os.path.dirname(execdir), "Resources") +libdir = os.path.join(os.path.dirname(execdir), "Frameworks") +mainprogram = os.path.join(resdir, "idlemain.py") + +sys.argv.insert(1, mainprogram) +if 0 or 0: + os.environ["PYTHONPATH"] = resdir + if 0: + os.environ["PYTHONHOME"] = resdir +else: + pypath = os.getenv("PYTHONPATH", "") + if pypath: + pypath = ":" + pypath + os.environ["PYTHONPATH"] = resdir + pypath +os.environ["PYTHONEXECUTABLE"] = executable +os.environ["DYLD_LIBRARY_PATH"] = libdir +os.environ["DYLD_FRAMEWORK_PATH"] = libdir +os.execve(executable, sys.argv, os.environ) diff --git a/Mac/IDLE/IDLE.app/Contents/MacOS/Python b/Mac/IDLE/IDLE.app/Contents/MacOS/Python new file mode 120000 index 00000000000..c8ff9490e80 --- /dev/null +++ b/Mac/IDLE/IDLE.app/Contents/MacOS/Python @@ -0,0 +1 @@ +/Library/Frameworks/Python.framework/Versions/2.6/Resources/Python.app/Contents/MacOS/Python \ No newline at end of file diff --git a/Mac/IDLE/IDLE.app/Contents/PkgInfo b/Mac/IDLE/IDLE.app/Contents/PkgInfo new file mode 100644 index 00000000000..bd04210fb49 --- /dev/null +++ b/Mac/IDLE/IDLE.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPL???? \ No newline at end of file diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns b/Mac/IDLE/IDLE.app/Contents/Resources/IDLE.icns new file mode 100644 index 0000000000000000000000000000000000000000..c12c9da52aa655ab1fd49786bfb880d456c31899 GIT binary patch literal 53456 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 literal 0 HcmV?d00001 diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns b/Mac/IDLE/IDLE.app/Contents/Resources/PythonCompiled.icns new file mode 100644 index 0000000000000000000000000000000000000000..7d9f3202c7e5344ce32a6eb5146780bf09b4d0b9 GIT binary patch literal 60777 zcmeIb2Y6e@nJ#=tb&C=uS#pV+ZftL|p>MYM{(JX6xf^>+?#51b^Tdg1$GuAwRVb=i z{TzTr>|*b|_uhMNAixH&p?9!?1sx>*Zw^3-q-aW%$hdKcQ)cFycfOf3?aaJq=zHrq}qdDPPmRX8fic2^g8z?DPmf@>FN5?$FG4yTK}ve_K-l}6fW z92)5lIOMhN&K0wvnQ@W3#eg3FjA2&0O(vs8tF^bc*Dv}Ic51cS&Q4=*Z+0+8U{~8~H1-;M9f@JEQ`^~Vb$UCkoeudEc3SWu4B9((!d|D->9zJ2 ze>FkaBMo$FG6KR*ueaA~0nyH42LOAmMypx0tJUDE1sxat;TDuw^jE7@kOFkllKP?K zAO}zr*-Z;~3|Jh_z50(BW?lLihP_^uoDdrob7O}Kw&$x(36DwZsqqh|Vvqf$uDQ3Q zq%b38A((>geXp~nqrS4P>ZaGNcL;3n`<;CQ5mi-@h5p`W!TLcbiyoTpak;mk(+#X2 zb>@frUi|2fNhzJ4VEv@?RIm?@Ur31V^h4HRhtGo3V&h|dh67078`pzVatljCIzvcn zPfA2^R!L4pXELecDV1e-i=}3t3;wS|KJn(uut;bKc8|$)fdCwu1BV!7@jR@JjpU{GEE*e z+b>(}riEuohdXxD#7~gJUArl3g}r%&y?BMaXfy2iqP`|mHNwAo*ItI~Prddpzaq{5 z{nwWLg99D2(=(q{TYjC`v#kTRxSGeDE;03Lf65K4uAMh8n zN^p0w9IwNb46}H}SJ)Tb&DTZcUN9L!g9SKD=)mEqgM$x;5)SQV9=3q*@cBvTR;-~p zpMd@WnJJUmurX-YMSqBl!vPG7KZpX> zqI@^T=>jYCiDvn3aZ?Qp{{PxAA|I;_tjyR@Q@xP4HpZZjoE$&4}8qV;t!&AD3k8uE%OIY8+c}r ziAdgr@{2S!bzR6lxx|2Vg@JPL<8H$^mrDI_OlPTeTQHu|if)_KK)yME$1*y6j~F z^JpMo9t)uE75ueif4(RL{>YGF(TG3`ee_ZR6dt@uaJYm1T&r4&uoxbBks}IwEv8z6 zFpu=JvqOD3c>@u^?OlX`eosDC}-_Kb3(6$JB{5^f0fE!503>IP+be^K{}R&N4Vr;){_?+4o!U;d1Ruq(Lt`-#0S(gBD%G<5v4g~e`UoA8 zj&gFTKjb|mi5$Hle~kvBU+NE5HKqc86o*Ewf`_rpUj+av6&md6HJDC~A^D}@QU0PF zRzu7htqKF-W&WhRiY#DShz2F6 z&5yjXgXg_tI)ph;yFU<3~^Tum*aV!hvpjYj;m`b-H(gs|R-Y=qU!H zv$=!YOKYy^q&Ji&glCt!-olO?J=M+Z>1OhHeO;Y>%%=Lv*xc~~S9k1*qo;a%T3cu% z{LZ?@?!M~Es+csLtkBgBd-AAL|KLzxuarH&Vhr*-X*Fr#0~}@n;fg(V)QQ>8Xm1w{ z_R$-e!Wvp(s;{Gi^JUM^T}VGZpT|>(c|5LAGBn7jO7-*c3-CVYf<1lIiPh6cqlv{S ziEV>@tn$>d*3{IPgaW76smOCcBo+zBrDvu_oMYoFuJp4RbXrHt$ybr*`C%rbnJyn9 zvSPnF?eN)Kt&+<6+LE5rX3vr7X{EBSuO>b==oA$sZk!K9fSZbouLZSNyyvsR`);+(GUI(({slO}qKU=f{bV zz`*b%5C5pBK$q?YfyGleG2wOY)a8)WloPK4f|2Bc?{rY9#S1O+6-1n^~wEB}Ggc}XZ9>hw+s%Z|PsnO#y= zR^5@6-^(4pX7&^*B%+4w+N|i9gzDPb>iYT;4v#;v=qZ*AiL}y;@HqeMg5qM%Y(JmJ zoVo!a4;{TE8kI`KbCU&SWf?asjeZ;rF4!hiB2S1DJV!@WDq0(>KQFg2U#b<#q{3;7 zr&uz~=P6ZOMrBn~ekDt!9bmHuNY8CYFNsHS*&)sJ*r<4XTBZ;ybYihgJYxwdk+4Tb zX2xX#=Ge59$CT)YhPcC|CnzKvosdsx!FPN{JvJsCGvJbKV~d_*F@KmpJtk#JrPESA zQ)fk;<8>@Y`6zscK zlLmX&tVu%~P?J&~x+XPj)ueB%N%@;rlf-M*B>h%RdZ<3>;c8On=JZKZTYb{qK56r6 z(%OB}ccdnrBxixP!z>WC?WnVx`yJzU`8SVSS>7AXmtFtXz2wDla-4DF*<}K|-()YC z-)qcg-AKkVf!)6wS>|ujt16ZX+~aSWpD$V>aIZhSffe2rSk2#L%zJK8$<_VGd=FU! zR`oaOx_`C9oc`7Q7v!JAyEZbb`T;_~33-{vAF)4zr-vzcsyPf+d*+m=Gn; znE8AYxnQr6=NHJcEqUHWp0|-_D|EKvllNE1Gjmj9_NBp^2{gC zO7e_ml1(t9i_Qz=*+vVy-2_2x9E=9(9vW%GN69l z5*$DvUD5peQg^d68)np(xx+lX*`PS;?&2eN^Zfd~?p{Ynae;ho@?G?}FLshIC-d^dn2NBYc`35IT{x2*YWup7L zRok4g4|0Zf2v#xnkgFIbmiobQXe>3 zmP7ztqq18q0LYW-kV!BrW{2k3b+G=jS^$KPaLs23fYJez{UE<;0HZycEC&NK-^d_& z6vEzK1p(9=`xR+G@(9olP30p=@_^+Ca@_-#23926ERV!s!2rox^nsNww2Y$D+b=Fr zn2QF;uP|n{(87e-+*vas1DNpv7xYoV`UPl)R%XzTp5f!)UYIC z2ic02UNrZ}-_ge&7MIY%4y<38m#a`(?6f4YX0c!+eNZZqJ~{$Z8DNzQi~&|OKrvL9 z?vY0sN#+kM&A`eLS|u_p%A-fO690}qb|4O1Adn{vi_Z@haaPKc8E9D-f(0N_oheg^2=z&CMuvw9w@~09EF^kWe0u{@8cCuQK;?zt zXz|ky3dw5v=*V0oSIyA!6D+i$vOvn)*)7xGfXa{B+ys#_NDOp=0*zM8pq#HJ52Y7r z17gU)84^p%qldW+pM1V*djh2uXjCX~QLd2ifWMkN=wq%OAddmM6+(D`f7$N8m^ywF=fw!JtJ@&<8C5qVl$iJh_ey@}%Za9^g5X z^3ckxB7a98qyUr#lrc-(R>6manHMNQFH#Tl6NZxWqF|8uMB<|I2 z@5KiYFc3A$CwOis0cO3x0lP=uvWSWji;{ul%?C==N_nzAlJFRc0pX$($|2+mw=3{b z9bMBbZyy%EVd3@eYOHa7v2A{^>%xPH-6Q329IfI${%=%l+y8l+z+JE6m#r>d#LsO% zfBuH+>p|GI8+!U1Yl?FdJo9~D_s6!q=_`^D^ut|3 zerJ2zNON-|v#z?dI>N8M!0+|j*mK}LOsDtJ>4U-^W^-3-bN@hVOKEwGPt8!C-|K$Z z^Kbf!NBSB4L;XWyx}cLuZ(|L&x7F6BdY8@gfrKx_a9h$tWgL+(#9g$`4u~VKzAWu_ zj$y1n*Y9;7>?ruNnGE4(J;}U@AbMj_CMbAmx%-{!N`bI zIwBb6b9)86eohCiDl$f`*G_Yaf?xN-ehNb3-rlNSnoQQ+-6>!&x&$p9E!}w`*REZ3 zcJa^3@P6GB)bW?|@UCZjyEyXR!RCR^&LL52XJc1xxDS5vxTBNH)nMn>J+K{b`j3u} zj=CxK%4IT%Si~QpSEPjDfjfeNBf`Bu_rP9!GjNPWZ{zj1jVf9dm6^qj^xo#`q?(4T znv#gz_~_`sjNs#>*!Uo$X}GQ6G7LR>2dK zlyQ9Q$>1w$A(57om6==R4385%?p}IR;@b!+cv3Rh*)z~NG124piDB|jC$3z(e&hT* zH6lSvQ$xjISzVSr5(}A<(rA61oubL!5Kn&>SNAhte(}j$?^FmRZLJkGy_IeG@1O*R zOwA~jl&PmCo1=YwLj%q_o^<%^FA_Pd^#WmlGg4;35)L!@!x>2>d3kB+$#JPSK0f}{ z=ME)RbvcdgUEM953bUA!JHj3bq0Y+KJuT%~abed#bv*Ue*BLD`c6bwm-o>we4`~*r zR4O>#Z&0#5uQ{JSb>i5UCoU6i7cXb}q^1W&a|GSoI*XWuI~enqPfncp>eOWy4{sm; zu%s9q&-4xradD%|X~PW`F(3AZVbbWAj?Y$paf=Z1&JMBb+MkM{L6edvMN z{4rvBW{mIabnfh#8v%IWV*yC@8O$!Brz|&_=IXaZblt{QktX{m!rZy}rG9uV> zU}})nhR{H4LOK$4=IT{vm(tLxy!4cWxY+2Z;NXa`umHb7>5#nLA~rWM(SFfC!ab%k zE-Ex6BrGyICMGs6xj6fFl5|X_q>*AF(?TJ8())IDP;gy*cxXg&NktW`;n%fwm;1G{ z*{tcVPss;Atq`)LbUzQT#PZni*w~cJ?1KEF{L1{y@InSh*fT-5h^gk}bF(6zSXdev znGzdPSl3+HSWO=oV2vsibK*J1qL@&~5pr}|esM@-LbQKMQF>NwVZTbn8{`hExST~X zB?qK9lX_uEN={aKjOXPNdGR&+w3^539aIb{x&dw5n<3Lis$sug-&{#=YpKn;-fk+p zsUkFl+FFGKegXnw&cKw2BQmg*X&pV?jONUUq=1S(sRke3(W~y0ATcQ1(_(J#=m3Zf zOg0u|6xP(1CPdT?_Di)RBVB!CW-%z-(?;VwVI&N@=cGdnI+H)4#&v{t2O6RET7V?H z!Cs(J&vV5CN-;~W1D^eqkR{i%8BC^@DP0tkTEut~h<9Mr$mR4*4GhTjoNgv_f+a<2 zSwno31-E%BL`dkj!!QK79s<{yalUk1IzBHM9J|e{Io`_REpI`I4MU*jYg$ygTLA=~%;<6Ccq{E_&B^`G8+-V5eJBX?Tu+Eav4u^p(N zxq5?ob^GOumzQ=mPou7e$LEq=&A?(;Q~YDT?)y@6r>9x-rAG1Hc&X`H`BL)(?P;3tzSMlrdYT{hOU)0iry0KUQiFOLm!)qs z8bXI}z0sK8XpWN%xjl#>2WHQ!?|k&}O7q@pPa-uE&0{j zhr4cD`ExffR=eBEpVe~ZuG^11e_oE7UWK!}#L3Y8o2BjB(OZL3*;+-d>o|r?s^-)>f656l7;)Higw=Rzjhx0231T4c3Z+73XE8rd0>jVT901 zAjAa(1hnF>5g~)o(bm#XQ(0P&lb)PW<5-KiKu7__9FE}O+-)dzu)MICDUYMnF}gb2 zTI#DIzKoQF!dk}~j4H%fxX`MHgQFXP6_Zc!Y`NT42+d+bo^}lm^t9kiGIVWQM{83_ zRcS#|N_8#GAVgV~RhEL(y#<#|EiX)nbn__YXY4MdQWbmZ2 z$i|Y}Q8lSluat;OVGVVTRTx!d8!Hkei)fW1S_yp28!LqD`Z=S3ThPVHYZ)1C${8+f z7>pV~4=22@Dx<47roJ-CC(X?#Jg1}1u@V6OF95`%(C`xh0IU@A+Y5OGt=#+;_6Pvv zG!BNr>JO6{+*g%KFO6-gP4>&6dIx*;0YU{J>>*XCZv_NggvH{*R|Nc#G+ycuLSQ%N z4A+(qMGqo~$o`_Tp0b4Iy7b!_ey%}hIRN2Mj!{ImCCMcNy(N%}yo~yRlH_6%q^Yox zSCg96+LD!AF;bM%PL|H*jNHEJ#E7iCK##yg;%n+42~vgyhzKDDsVB%Xb`;9kVtIzN z!-MN=sV&J#jtul_mq3VGhf*w1Oo%WjE8Ed`#g=l35B~%`Z_u^Bue+@_b z!W^aq3tA%#6y+X9dt+rmT1=2<;hZ_l@nVc3wrwqG759}?i3dv>#Nw)wK3x3wB2j&Y zP|%Uf;Exm*3~@{IX{as@wPokCy3^A-T4TctQe3|FOw}&}6=8(<054OV$x9YDv<|kG zh+7-P$pj$v#)^d9MIHPcCNsOCnj1&f%ILwes+9J>+Qbzl;b+uSk;xspfbgMo13O zOC_cBcnMs{J4rl6^7rC6u~<~xDU9LsqoDvqk@Y)#xG^V`*&pcN-aySwI_VW^T12Wo zUVxDL0jWPlLa#7IJIvsGjXahnP3rZ&g zS_U9YaA>TNp)Oi~cSB`WUZ@Y@M!ADi>yV3CNu{n5OzI~g#8x5^)NcU+;SNGLcvM4! z%wAe+O>styzbkb~upA7RxkxeDZCJ3g5{scmKoP?r+yN90o-nhI(Nk^nO zj3V1#7$TDvc4Uuql$Uo57bZ}pwyBI%X>~kZLQg3X4`j6F;(|kbepz%Iw>~eox;8YS zF^B4N-ox!K(1}dYXJ3L$mL_A=q@jx}fsh@NGRvf8OlcWI0?%4pMH3}M;$GtO3){GH zoRJt-RYGHUbmAE={NkB2r|_@OT}sF)?h!+Mt8&c1sPdN+m{ z=>WM8u+rqsokeVR5r9+Vj|;P9*+K*;1Hkr1NivjaKrCwKXZ7}^4^}6)B!{Ou2i&^( z^|?QueE*|A9XtN+xr^`I#EI&1$21I65OUj!vMXg*^Q6XZ3g(A1@tmu?CXBRRU zg;`C~>e7B({Bx18ExFCO^F*z!;F2pl9)Yt9imD3-7eD3T=ADwgl;zI}5uburX zPNrg1MT8ue;ZiG!1Q$Pvwp}3kIKu-y9gP)vsZl{b?o{Fiaoy&|4V>cY?%{pgKc?dI z6wFnD$q7Xege9aH1U+I73Ji>azOLq);>@I|V1FM^+ylS0*Tcip+vm1_P-tjET?*zo z8mzFAK`<+c2p40J1GWO#>S3_IyS<^JAR{?8GL#6$L$(D6hlJpvJ0c>ZqOyyVG0G@j zxp%Zaqj$77w{nzQoK967DUMbsS}KY~jF`~O*s#Pb*aM)XAOnwiA<{FE+me{k(-`4Z zUYHFu2Dgj;@%~pS3DGwQkGSin@p$XR+TSK&#OPjb$!H08w6b?}w6_u;#gbeU|B|Fo zq|3`aeG_WvBO;*$##C~dL?9et)I_>wH)S!qXv}ZI25sE+ zh}uMLe5s+1HbT5RFu)9?!STTG#f`$*wG~^gaeKqO$$M zN=m~0vYH}eQ|cqGh31tO6_zGpUgMr)wxiOhKlnwQVVV}2k44rL6ySw;!IAueg8aPP ztUBM<&vnL5d;nPAr76Icpm;w5IayvX_V<@0A!8!Ej&K5^mF1!t!- zr%#=9bU60qXCM9L-FM#lkQqaWo)8LR_-zH;mV6kTK(Ct3%BW^^b+j%81za=e-!Q8c z#aC{6``);G?efJ-RChPZ^-IoYP6O;o;6{D=;a?D_m~0bbg&lH|drV16coT-7@DNvg_`8QdkNv^j-qC(uRUvu>j4D|QCMY-&BiiACmw0-L% zR;)xO#U+O`xy3yK7z%Q^k*M>I9$>=rhXr$zKa92QE{* ze0{y39rE(__VjS4UU52k5^~`LkitHG|Lu=p+Yy;eDv|K3Xu{5-!rFc)tL*Mv#t;IA zOi)31&@IG#A+aQxU8pMLb0 z&j!UZXpxTqqXsB^W*D-dLf1aPMCxFJxN_geB>^|D<8Dvju2lTmm8(}T ze|`1Jl}lGHUq1HMhsTbez#U#Ze(cN7Kl$+Uk*6Y}t>Aw23l$8|b=VYZN27K}H zG2G#$2#&^i~st#Zq*;r%f?Jqf69fxaHDH?Lked+OL{$4{O*a~41M z)3d-3{Ne<|??P;QO>K2mWqE_oDSAE{5ew1q6@fz|F!v{BBXh31w0d|v`Q7(^@74l} zW@Mzqg!+5AQf^+qa`BwgDJT%f9ZsG(>wMvBpiEx7eBrdiSB}X6S6mB<^73-BGxPmV zhVZ1-W&L7!FM+`$kDG*f%>B)b^7=a;{MjKXDKb3B{i^e6sO={l9Z#NumgKDSx$_q; zUb=i0I&<9Rr^K}jr;a%?>hbG=sYywR@o@>9>@@F# zzkKlFyQkf#*UvegKw!@20qM$B{2G4!f5Pa1pt`tw`uKXe5tp4#oa(NpxOxObTN@r8 zfM32ylRyQ78fHd?GOVJ^Jv*zceD}TgKl<$BW2aA@c0T6}%3Ztynz^{Ry0{RoFG9QO z*$pF^-0F5f_77pVO{KJfGP^A8M-h>1^(3-@&aV4tjTcfX*ph{%Z00B=w~ zoL5sJm$jF*K_-ZVP{dUKW2#J5HYI8rnz;OzkH0v6%8YyV+=VN+tA`iB1&0u!zYGhH zhyv84oD<6@&iU>NuHX}`oAFaHpTEIKkG zB+$o=f)B_NM|&#dJ?vA@1bfppmm4Z|K({qa4DCrHEAwlNJc@CTQQ}`rnsb{t~HYqKR9Kq@grjPlSsF{JThg9 z@v*T{Twx7Rke6yV%}&*f;=-9TPDnQ=fINQ%cX6Qv6;{+&W zMwd*?AB+vdV-BFg9};-m+cQ=+Hg1Nrk^>@D19MH9$EL2v@$Sa%E_-E7pN<1i9W!feSe zHww9hn$E0Y#ktd`38#OBvBT-pXU?8G9}%4Gc^NO|$kB6zAwHi6<0mwH>g{N4Ywc=_ z4vhgGG6@~z=jBmQm^?9=)t`y5Q3l{z8)=KSMWSsQR-A>Jk30S13>rni1G`xt>~Z~O zy>x&9lWTMuV#+r+Hq_Tc&kK!TeSJc33?BVN6e@0^@R&TRWhoQvnh9w2fU|4H{yQFE z^R&$)ifbo9TPMhmGtfjko~Y>Z#;+x_+FDwgVGLVe2Y?mjrKKf!@s6UR(xUhfBKk>$ z909ou&~$mq6su;krXTWp6rfeO_J7V)Xe(v_dhE92X(!b5T>w7yNyk$i%~UtfqJ|2< zD=8^1L_^b@>}))9XGVHjT5?nv9(@FI1CYZ)g9Cg#J=u!XDMi6#featV#*o^C_LZTQ zA#GoI4Kvd5%(+Wfuiv0t172%s;8!VasnSmTDxg?Yvv~FPdY(?#a)k3Z(crkx_}k#6&wZa z3Shw?Ha41wbc=c#o*5_^85J9!5FZV>>*G-(8K0V-o`P|T^~5+rny_)R%9SBwqr?UBJuETsM6!HSR4^+4LoiryRmVJsTo=6$x;5WFCR-W zsl=zPlz?kBLBdjXu%)3+r=FJjpS|wp9T*A?r|Zp&rL5R6C`ggvVPWBLL`22L#V100 zNKL_$52mD~re)@plow~k2l;wNb4RBrfT_eMu?f(07FYqTPwBdfxpRHt&ez?1!(!v2 z0zIi$+*t`xF)?@)9$^bDUTj=aYI*~jKtvuCKyUS%)@8IaTm=GV=t6r>Rgp5Vv5jK(0aS3Tz zxdlbVrR5cP6;@4DJzHHg(aw8Q2znaVJ;!g=wesPone9oV z;J18GR(QDpbSe<%qlk$8C=XJy3rZ_%>zi6yTZuMG>*1DWDADy5nX$p%g+=3a!?T&Q zGwJxWHQ**;uTH~9f)Nvn$~SeV3;j<+3L$EtV|uk#U&b6shyE!7KoemA78#ckpPX7iEyv36@@-}1 z<%M{hG z22I0@tLiC@l!on%kg07%>#p{$K8|c$IYXJF&RPQwz)X7Sf2!4}rYA?`FncvNJ|;

h*JU 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 Z)&Sy;2m3nS3K{E-Hze+zSFOdH{~yOYKDqz^ literal 0 HcmV?d00001 diff --git a/Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns b/Mac/IDLE/IDLE.app/Contents/Resources/PythonSource.icns new file mode 100644 index 0000000000000000000000000000000000000000..9e35c1ecbe9507c78e4c5103cfb4e29a1b678d6f GIT binary patch literal 54522 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 Info.plist - diff --git a/Mac/IDLE/config-extensions.def b/Mac/IDLE/config-extensions.def deleted file mode 100644 index c17f068e2d6..00000000000 --- a/Mac/IDLE/config-extensions.def +++ /dev/null @@ -1,88 +0,0 @@ -# config-extensions.def -# -# IDLE reads several config files to determine user preferences. This -# file is the default configuration file for IDLE extensions settings. -# -# Each extension must have at least one section, named after the extension -# module. This section must contain an 'enable' item (=1 to enable the -# extension, =0 to disable it), it may contain 'enable_editor' or 'enable_shell' -# items, to apply it only to editor/shell windows, and may also contain any -# other general configuration items for the extension. -# -# Each extension must define at least one section named ExtensionName_bindings -# or ExtensionName_cfgBindings. If present, ExtensionName_bindings defines -# virtual event bindings for the extension that are not user re-configurable. -# If present, ExtensionName_cfgBindings defines virtual event bindings for the -# extension that may be sensibly re-configured. -# -# If there are no keybindings for a menus' virtual events, include lines like -# <>= (See [CodeContext], below.) -# -# Currently it is necessary to manually modify this file to change extension -# key bindings and default values. To customize, create -# ~/.idlerc/config-extensions.cfg and append the appropriate customized -# section(s). Those sections will override the defaults in this file. -# -# Note: If a keybinding is already in use when the extension is -# loaded, the extension's virtual event's keybinding will be set to ''. -# -# See config-keys.def for notes on specifying keys and extend.txt for -# information on creating IDLE extensions. - -[FormatParagraph] -enable=1 -[FormatParagraph_cfgBindings] -format-paragraph= - -[AutoExpand] -enable=1 -[AutoExpand_cfgBindings] -expand-word= - -[ZoomHeight] -enable=1 -[ZoomHeight_cfgBindings] -zoom-height= - -[ScriptBinding] -enable=1 -[ScriptBinding_cfgBindings] -run-module= -check-module= - -[CallTips] -enable=1 -[CallTips_cfgBindings] -force-open-calltip= -[CallTips_bindings] -try-open-calltip= -refresh-calltip= - -[ParenMatch] -enable=1 -style= expression -flash-delay= 500 -bell= 1 -[ParenMatch_cfgBindings] -flash-paren= -[ParenMatch_bindings] -paren-closed= - -[AutoComplete] -enable=1 -popupwait=2000 -[AutoComplete_cfgBindings] -force-open-completions= -[AutoComplete_bindings] -autocomplete= -try-open-completions= - -[CodeContext] -enable=1 -enable_shell=0 -numlines=3 -visible=0 -bgcolor=LightGray -fgcolor=Black -[CodeContext_bindings] -toggle-code-context= diff --git a/Mac/IDLE/config-main.def b/Mac/IDLE/config-main.def deleted file mode 100644 index 4691a852909..00000000000 --- a/Mac/IDLE/config-main.def +++ /dev/null @@ -1,79 +0,0 @@ -# IDLE reads several config files to determine user preferences. This -# file is the default config file for general idle settings. -# -# When IDLE starts, it will look in -# the following two sets of files, in order: -# -# default configuration -# --------------------- -# config-main.def the default general config file -# config-extensions.def the default extension config file -# config-highlight.def the default highlighting config file -# config-keys.def the default keybinding config file -# -# user configuration -# ------------------- -# ~/.idlerc/config-main.cfg the user general config file -# ~/.idlerc/config-extensions.cfg the user extension config file -# ~/.idlerc/config-highlight.cfg the user highlighting config file -# ~/.idlerc/config-keys.cfg the user keybinding config file -# -# On Windows2000 and Windows XP the .idlerc directory is at -# Documents and Settings\\.idlerc -# -# On Windows98 it is at c:\.idlerc -# -# Any options the user saves through the config dialog will be saved to -# the relevant user config file. Reverting any general setting to the -# default causes that entry to be wiped from the user file and re-read -# from the default file. User highlighting themes or keybinding sets are -# retained unless specifically deleted within the config dialog. Choosing -# one of the default themes or keysets just applies the relevant settings -# from the default file. -# -# Additional help sources are listed in the [HelpFiles] section and must be -# viewable by a web browser (or the Windows Help viewer in the case of .chm -# files). These sources will be listed on the Help menu. The pattern is -# -# You can't use a semi-colon in a menu item or path. The path will be platform -# specific because of path separators, drive specs etc. -# -# It is best to use the Configuration GUI to set up additional help sources! -# Example: -#1 = My Extra Help Source;/usr/share/doc/foo/index.html -#2 = Another Help Source;/path/to/another.pdf - -[General] -editor-on-startup= 0 -autosave= 0 -print-command-posix=lpr %s -print-command-win=start /min notepad /p %s -delete-exitfunc= 1 - -[EditorWindow] -width= 80 -height= 40 -font= courier -font-size= 10 -font-bold= 0 -encoding= none - -[FormatParagraph] -paragraph=70 - -[Indent] -use-spaces= 1 -num-spaces= 4 - -[Theme] -default= 1 -name= IDLE Classic - -[Keys] -default= 1 -name= IDLE Classic OSX - -[History] -cyclic=1 - -[HelpFiles] diff --git a/Mac/Makefile.in b/Mac/Makefile.in index 01b8cd5cf84..f4bf9af551b 100644 --- a/Mac/Makefile.in +++ b/Mac/Makefile.in @@ -45,8 +45,8 @@ DOCDIR=$(srcdir)/Resources/app/Resources/English.lproj/Documentation DOCINDEX=$(DOCDIR)/"Documentation idx" compileall=$(srcdir)/../Lib/compileall.py -installapps: install_Python install_BuildApplet install_PythonLauncher \ - install_IDLE checkapplepython install_pythonw install_versionedtools +installapps: install_PythonLauncher install_IDLE checkapplepython install_pythonw \ + install_versionedtools install_pythonw: pythonw $(INSTALL_PROGRAM) $(STRIPFLAG) pythonw "$(DESTDIR)$(prefix)/bin/pythonw$(VERSION)" @@ -159,73 +159,10 @@ install_Python: $(INSTALL_PROGRAM) $(STRIPFLAG) $(BUILDPYTHON) "$(DESTDIR)$(APPINSTALLDIR)/Contents/MacOS/$(PYTHONFRAMEWORK)" install_IDLE: - cd IDLE && make install - -install_BuildApplet: - $(RUNSHARED) $(BUILDPYTHON) $(srcdir)/scripts/BuildApplet.py \ - --destroot "$(DESTDIR)" \ - --python $(INSTALLED_PYTHONAPP) \ - --output "$(DESTDIR)$(PYTHONAPPSDIR)/Build Applet.app" \ - $(srcdir)/scripts/BuildApplet.py - -MACLIBDEST=$(LIBDEST)/plat-mac -MACTOOLSDEST=$(prefix)/Mac/Tools -MACTOOLSSRC=$(srcdir)/Mac/Tools -MACTOOLSSUBDIRS=IDE - -installmacsubtree: - @for i in $(MACTOOLSDEST); \ - do \ - if test ! -d $(DESTDIR)$$i; then \ - echo "Creating directory $(DESTDIR)$$i"; \ - $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ - else true; \ - fi; \ - done - @for d in $(MACTOOLSSUBDIRS); \ - do \ - a=$(MACTOOLSSRC)/$$d; \ - if test ! -d $$a; then continue; else true; fi; \ - b=$(DESTDIR)$(MACTOOLSDEST)/$$d; \ - if test ! -d $$b; then \ - echo "Creating directory $$b"; \ - $(INSTALL) -d -m $(DIRMODE) $$b; \ - else true; \ - fi; \ - done - @for d in $(MACTOOLSSUBDIRS); \ - do \ - a=$(MACTOOLSSRC)/$$d; \ - if test ! -d $$a; then continue; else true; fi; \ - b=$(DESTDIR)$(MACTOOLSDEST)/$$d; \ - for i in $$a/*; \ - do \ - case $$i in \ - *CVS) ;; \ - *.svn) ;; \ - *.py[co]) ;; \ - *.orig) ;; \ - *~) ;; \ - *.rsrc) \ - echo $(CPMAC) $$i $$b ; \ - $(CPMAC) $$i $$b ; \ - ;; \ - *) \ - if test -d $$i; then continue; fi; \ - if test -x $$i; then \ - echo $(INSTALL_SCRIPT) $$i $$b; \ - $(INSTALL_SCRIPT) $$i $$b; \ - else \ - echo $(INSTALL_DATA) $$i $$b; \ - $(INSTALL_DATA) $$i $$b; \ - fi;; \ - esac; \ - done; \ - done - - - $(RUNSHARED) $(BUILDPYTHON) -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) - $(RUNSHARED) $(BUILDPYTHON) -O -Wi $(compileall) -d $(MACTOOLSDEST) -x badsyntax $(DESTDIR)$(MACTOOLSDEST) + test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" + -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" + cp -PR IDLE/IDLE.app "$(DESTDIR)$(PYTHONAPPSDIR)" + touch "$(DESTDIR)$(PYTHONAPPSDIR)/IDLE.app" $(INSTALLED_PYTHONAPP): install_Python @@ -248,7 +185,6 @@ checkapplepython: $(srcdir)/Tools/fixapplepython23.py clean: rm pythonw cd PythonLauncher && make clean - cd IDLE && make clean Makefile: $(srcdir)/Makefile.in ../config.status cd .. && CONFIG_FILES=Mac/Makefile CONFIG_HEADERS= $(SHELL) ./config.status diff --git a/Mac/PythonLauncher/Makefile.in b/Mac/PythonLauncher/Makefile.in index 4a864f32e5c..0b09e2ae4c6 100644 --- a/Mac/PythonLauncher/Makefile.in +++ b/Mac/PythonLauncher/Makefile.in @@ -24,59 +24,8 @@ BUNDLEBULDER=$(srcdir)/../../Lib/plat-mac/bundlebuilder.py PYTHONAPPSDIR=/Applications/$(PYTHONFRAMEWORK) $(VERSION) OBJECTS=FileSettings.o MyAppDelegate.o MyDocument.o PreferencesWindowController.o doscript.o main.o -all: Python\ Launcher.app - -install: Python\ Launcher.app +install: test -d "$(DESTDIR)$(PYTHONAPPSDIR)" || mkdir -p "$(DESTDIR)$(PYTHONAPPSDIR)" -test -d "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" && rm -r "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" cp -r "Python Launcher.app" "$(DESTDIR)$(PYTHONAPPSDIR)" touch "$(DESTDIR)$(PYTHONAPPSDIR)/Python Launcher.app" - -clean: - rm -f *.o "Python Launcher" - rm -rf "Python Launcher.app" - -Python\ Launcher.app: Info.plist \ - Python\ Launcher $(srcdir)/../Icons/PythonLauncher.icns \ - $(srcdir)/../Icons/PythonSource.icns \ - $(srcdir)/../Icons/PythonCompiled.icns \ - $(srcdir)/factorySettings.plist - rm -fr "Python Launcher.app" - $(RUNSHARED) $(BUILDPYTHON) $(BUNDLEBULDER) \ - --builddir=. \ - --name="Python Launcher" \ - --executable="Python Launcher" \ - --iconfile=$(srcdir)/../Icons/PythonLauncher.icns \ - --bundle-id=org.python.PythonLauncher \ - --resource=$(srcdir)/../Icons/PythonSource.icns \ - --resource=$(srcdir)/../Icons/PythonCompiled.icns \ - --resource=$(srcdir)/English.lproj \ - --resource=$(srcdir)/factorySettings.plist \ - --plist Info.plist \ - build - find "Python Launcher.app" -name '.svn' -print0 | xargs -0 rm -r - - -FileSettings.o: $(srcdir)/FileSettings.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/FileSettings.m - -MyAppDelegate.o: $(srcdir)/MyAppDelegate.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyAppDelegate.m - -MyDocument.o: $(srcdir)/MyDocument.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/MyDocument.m - -PreferencesWindowController.o: $(srcdir)/PreferencesWindowController.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/PreferencesWindowController.m - -doscript.o: $(srcdir)/doscript.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/doscript.m - -main.o: $(srcdir)/main.m - $(CC) $(CFLAGS) -o $@ -c $(srcdir)/main.m - -Python\ Launcher: $(OBJECTS) - $(CC) $(LDFLAGS) -o "Python Launcher" $(OBJECTS) -framework AppKit -framework Carbon - -Info.plist: $(srcdir)/Info.plist.in - sed 's/%VERSION%/'"`$(RUNSHARED) $(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`"'/g' < $(srcdir)/Info.plist.in > Info.plist diff --git a/Mac/scripts/BuildApplet.plist b/Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist similarity index 51% rename from Mac/scripts/BuildApplet.plist rename to Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist index 0f142c9eb5c..0367b49e314 100644 --- a/Mac/scripts/BuildApplet.plist +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Info.plist @@ -10,46 +10,56 @@ CFBundleTypeExtensions py + pyw CFBundleTypeIconFile PythonSource.icns CFBundleTypeName - Python Module - CFBundleTypeOSTypes - - TEXT - + Python Script CFBundleTypeRole Viewer + NSDocumentClass + MyDocument + + + CFBundleTypeExtensions + + pyc + pyo + + CFBundleTypeIconFile + PythonCompiled.icns + CFBundleTypeName + Python Bytecode Document + CFBundleTypeRole + Viewer + NSDocumentClass + MyDocument CFBundleExecutable - BuildApplet + Python Launcher CFBundleGetInfoString - 2.5alpha0, (c) 2004 Python Software Foundation. + 2.6.0, © 001-2006 Python Software Foundation CFBundleIconFile - BuildApplet.icns + PythonLauncher.icns CFBundleIdentifier - org.python.buildapplet + org.python.PythonLauncher CFBundleInfoDictionaryVersion 6.0 - CFBundleLongVersionString - 2.5alpha0, (c) 2004 Python Software Foundation. CFBundleName - PythonIDE + Python Launcher CFBundlePackageType APPL CFBundleShortVersionString - 2.5alpha0 + 2.6.0 CFBundleSignature - Pide + PytL CFBundleVersion - 2.5alpha0 - CSResourcesFileMapped - - LSRequiresCarbon - - NSHumanReadableCopyright - (c) 2004 Python Software Foundation. + 2.6.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo b/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo new file mode 100644 index 00000000000..fd57c954b4b --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/PkgInfo @@ -0,0 +1 @@ +APPLPytL \ No newline at end of file diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf new file mode 100644 index 00000000000..930ca221a12 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/Credits.rtf @@ -0,0 +1,30 @@ +{\rtf1\mac\ansicpg10000\cocoartf100 +{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;} +{\colortbl;\red255\green255\blue255;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural + +\f0\b\fs24 \cf0 Engineering: +\f1\b0 \ + Jack Jansen\ +\ + +\f0\b Human Interface Design: +\f1\b0 \ + Jack Jansen\ +\ + +\f0\b Testing: +\f1\b0 \ + Jack Jansen\ + Pythonmac-SIG@python.org\ +\ + +\f0\b Documentation: +\f1\b0 \ + Missing\ +\ + +\f0\b With special thanks to: +\f1\b0 \ + Guido, of course\ +} \ No newline at end of file diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib new file mode 100644 index 00000000000..47b40aba31c --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/classes.nib @@ -0,0 +1,12 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {showPreferences = id; }; + CLASS = MyAppDelegate; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib new file mode 100644 index 00000000000..b96759af1c2 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MainMenu.nib/info.nib @@ -0,0 +1,21 @@ + + + + + IBDocumentLocation + 99 33 356 240 0 0 800 578 + IBEditorPositions + + 29 + 82 396 318 44 0 0 800 578 + + IBFramework Version + 263.2 + IBOpenObjects + + 29 + + IBSystem Version + 5S66 + + diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib new file mode 100644 index 00000000000..bcdc0cdf088 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/classes.nib @@ -0,0 +1,26 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {"do_apply" = id; "do_cancel" = id; "do_reset" = id; "do_run" = id; }; + CLASS = MyDocument; + LANGUAGE = ObjC; + OUTLETS = { + commandline = NSTextField; + debug = NSButton; + honourhashbang = NSButton; + inspect = NSButton; + interpreter = NSTextField; + nosite = NSButton; + optimize = NSButton; + others = NSTextField; + scriptargs = NSTextField; + tabs = NSButton; + verbose = NSButton; + "with_terminal" = NSButton; + }; + SUPERCLASS = NSDocument; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib new file mode 100644 index 00000000000..e258c7220a4 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/MyDocument.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 398 60 356 240 0 0 1024 746 + IBFramework Version + 291.0 + IBOpenObjects + + 5 + + IBSystem Version + 6L60 + + diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib new file mode 100644 index 00000000000..467aa8b2612 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/classes.nib @@ -0,0 +1,26 @@ +{ + IBClasses = ( + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + { + ACTIONS = {"do_apply" = id; "do_filetype" = id; "do_reset" = id; }; + CLASS = PreferencesWindowController; + LANGUAGE = ObjC; + OUTLETS = { + commandline = NSTextField; + debug = NSButton; + filetype = NSPopUpButton; + honourhashbang = NSButton; + inspect = NSButton; + interpreter = NSTextField; + nosite = NSButton; + optimize = NSButton; + others = NSTextField; + tabs = NSButton; + verbose = NSButton; + "with_terminal" = NSButton; + }; + SUPERCLASS = NSWindowController; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib new file mode 100644 index 00000000000..bc558f7e828 --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/English.lproj/PreferenceWindow.nib/info.nib @@ -0,0 +1,16 @@ + + + + + IBDocumentLocation + 565 235 519 534 0 0 1280 1002 + IBFramework Version + 364.0 + IBOpenObjects + + 5 + + IBSystem Version + 7H63 + + diff --git a/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist new file mode 100644 index 00000000000..120242135ce --- /dev/null +++ b/Mac/PythonLauncher/Python Launcher.app/Contents/Resources/factorySettings.plist @@ -0,0 +1,87 @@ + + + + + Python GUI Script + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/bin/pythonw + /sw/bin/pythonw + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + Python Script + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/local/bin/python + /usr/bin/pythonw + /usr/bin/python + /sw/bin/pythonw + /sw/bin/python + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + Python Bytecode Document + + debug + + inspect + + interpreter_list + + /usr/local/bin/pythonw + /usr/local/bin/python + /usr/bin/pythonw + /usr/bin/python + /sw/bin/pythonw + /sw/bin/python + + honourhashbang + + nosite + + optimize + + others + + verbose + + with_terminal + + + + diff --git a/Mac/README b/Mac/README index 5e74d7bde37..ec63156e262 100644 --- a/Mac/README +++ b/Mac/README @@ -123,11 +123,6 @@ GUI-things. Keep the "alt" key depressed while dragging or double-clicking a script to set runtime options. These options can be set once and for all through PythonLauncher's preferences dialog. -"BuildApplet.app" creates an applet from a Python script. Drop the script on it -and out comes a full-featured MacOS application. There is much more to this, -to be supplied later. Some useful (but outdated) info can be found in -Mac/Demo. - The commandline scripts /usr/local/bin/python and pythonw can be used to run non-GUI and GUI python scripts from the command line, respectively. diff --git a/Mac/Tools/fixapplepython23.py b/Mac/Tools/fixapplepython23.py index b0916e81cb0..a6db699b110 100644 --- a/Mac/Tools/fixapplepython23.py +++ b/Mac/Tools/fixapplepython23.py @@ -14,7 +14,7 @@ status also when nothing needs to be fixed. """ import sys import os -import gestalt +import gestalt as _gestalt MAKEFILE='/System/Library/Frameworks/Python.framework/Versions/2.3/lib/python2.3/config/Makefile' CHANGES=(( diff --git a/Mac/scripts/BuildApplet.icns b/Mac/scripts/BuildApplet.icns deleted file mode 100644 index ea0214c6746924a434b4204bac3da8406fdc1407..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120107 zcmeEvcU%-#_xI2(*o{fl#5`$F5==B2qp2p*B&PZ#MvRGF6r}fFW*4OQUZwXcy|Z+L zrFU4CrFX>&yNB(EBm=H0B6)P|+AYQz!jj^5}SZyfWo@ckQ%G*Y6&y%-pw+Rjt z0%WYhn9MRJK`=0JW>(y70>i|2WM;O{!~aZXdF2BPW5Q+S{3scaL^41*4q=$UDuQ@0 zH8mwEDLFO6O@SO_7?-3X9*mEVPn^^_E+Ii9BOZ)n*m0kdpoz(eC=~Gk8`sg%2?`Pv zz~<2HjHD#43k*-4lAHm8sOj06X-N<QmEau?GY(52+L56B~a&wMuFq6mb^F$H({Ymza>4 zItA64hI?#cY8?HWoC0|$L`6lRBkC+-xFlRt+rJOP1e4Za*!GC%KwnS4SPc^ld&h(j z81Od6*1kSGHdsZfG3Du)UUlsCxQGM*Hi^N@||Mus7v2_0;KR7RGwIx=LSz*uz5&w~`}n zCgqpjQv-HJ#Nh4b((IZ>kKrO3_C-3;+1bskzkk!^=JYlU+b}fI-O=0C8xuL;-5iHu zKNELG$9jsA3+kB>KKC%plDL0=juXwEpSU}klZj!kyoJBBO5)(YcO)eC9Q5zG zH~%0H1BH_w7om#sTKZ%abxjP_zvWdiDmf+p=G}!VmZY=WzA0wWupdzshco=k9E{FQ zyg^lwGu#nRrxzb}4y3Ahw>Q9r*_{v8nOaEZ2aZQf@70E3=aV!|W4?A8_ommo$8R zY(4!0LR4h~v{6S|omDh*@bPtYGClqKPh>3(G)ye4O!TiC$sFOKNEvt_~I==3}e_ezWcdy3|phW7!kY^7^p7Z=OX?Ei}%DvSm>tt?maN< z2fkYZmM$0mdsv7*IQ~5^d?8nb81jV|u;rLE-2z*SnVEn09`j6 zW4r^=bB{UrKYy4yP=4|n8Ui)AI2_ou%krR91Yz~#s)x3Af(mme8AAEuy*N@FNYkKz z(ixy4kS5{X!yV|1_J#X$Edx+J6bD4lDr!>@Z)4r&(St@B0p-KHXO=VDMxa>SdoeA8 zw$YJI8_E0m5oS55z?hj#HV}-U8z>DK2@)TWiPR}$;hs`~i}z$Y8`bdv8)S3yjKDoH zCypwI0t4L=94Ie&$HXepJsLxBFV4(hf^J1xlS*GVSVgt~+>2w(EJk+ur{a(dS`^x+ zjF}tFj6@ZnbYnU59TqbI380!+d~;SCvoy1ecb}WZV79fffB^^P7tdgU5V8fyA-s+S zMPOj4MHwia8`d!hf>P4lGu7g#lvH5zE*|?I#=#*B6NYgBVRjl6EsYB3>fv0IJi+Au ziHU~^Bth>|K|*2zlS!xYJXT*4IE*jJkB$430B;m3bcEKffd?C2{`uKi$w`T+AYEQKx%=IBcTY~v%+Agu z{tw{cg+_x%9eA=KgXHuyPPX<8T8!W+2tDSI&pAK?0X^_QC+O?b_|hSgN~H*Zr{+RB z#f;>Do|br>IYaTEhh)TWmK1|TQ4zB=8d*Ll!W1-!#3XvOA|I|MQ8!?V>n}XEp+NQy zkU`qMeemFf3QvX^Zud(}LLxkkNr-(RH8FuLG$7S|(Bwb>B$Ka8noE83`l5h|h2b-? zZ~wkY!TrII3v?$^H9R?Qi{f)jnzrfq3+wh?2$Dd_t3$K*Q(M%=9Ys z$crX2S$UK!an^jA;w3Q&-88iyrPHX^K}6HEDW0hD3CU9u*9$1pEnF_qvX0PG(w4(b&DXsA)pi0uu-zXg%wvl8^0sOJetlnhpm=THXb7OdycJ z`!){Fev+KHdjDR*Ym@0-o;Qjl%&_MIiT>U(g1G$WwY`T9?z}YK!D2VHe+CIbMBnsy zda9SKfz_vbw@W{`*U#y?d&mr1A43oWM+8^B`tDnA?s^G3jT1r>cZttUupQ!(zd7XI zay}|8ub`x&rm1noqOP($Hz`@^x8rMR*p63d`tp~q8Ttl>Mc+(HO-W1+z;)GCbiy|7PgMAo<6=eyxg7a zEU)8wvMOq1@-96M>5H-o>iR||7S?t)7N#_PEmgUzXQdRi5c3z6q|fUb>0CG^tE;N6 zuBoM=t|WI&SzGtawX0j{*o&fq;e(BhWqG$UZzkMK%}PvQ6c(2k&*6e1CfK%D=kN6O z4vh4a78Ms2MJQ@PdAxjLdpcElh(1JI5UsI$mnXyo=A6ZZYDmtjy)evaJo7> zIGrs;Ik~9`nc3`kW%H~S!V;3&iB6Q%-q~5#T9=zk)PCh2=UPRSn_w@#ON@4RlZo9G zO}B@M+h&d}nb#BhAG~FZy?Bl2>LF7*ddn@ciDtcQf@pPcE+x(xW7`9XuHK$*7&;vs zb|=A9HI8Gn5^c0ZqE?TNZD$cZy(qb}qr0ET(#&d4bhr16F)$oOQ)}m&#J#>gNbc?& zV0r7Bmkf1w_q61OJDItsC5hqK4jH0vaG)PZ2KuekyqkvGL7TEWdRdVnw^V2tmS#p^ zBNl}4aLUl_^*APQ=!ogpf8$s}1hUS1VFDu0`C@;24s7PlfsUT8 z?!NX`{yETjn{%tUuxfBPo_`M9xn-uSs-kSx)XJR$Fw~(E{r3!O%l}YU{*Tkhk~uIk zN4Pq9s;H};v%b^Q-nK9Y?%yddOLGs5)Rh0zeqx}%yX)>jm>e(%?pU0^prER7?b3yB ztcjkUI}_9#I0bW{Fi_pX+Q!z--ocLUQ<{;Gl9r4Df z^fI9tsL4rRxQM?@4su0h4P68J;v6ue8|i3XaCbRJ&H;5rbv+{!m>}Fa;B0Scit9-w z#h%#?xp(PnNnesv&@fn-0|r`Z@>kEDmDWbgUsRSM=fLm0IiRK_E3cxh`=^Zb@^he| zw5jkhbD)q2^q81jG6!-C3to%> zF}Wv=PZRVF-Wg})=7xp^xx~y91Fel*O)zkKgwZC&+xlp>%TDqd04F}HR0 z1Z5B!6yV|&;B6o+qpCtF0yRYyO&I3pHV)2io*piawiYHvdOGs&ysxkm%@K7aO?}+d z+TPj2+c&`9$J5op+Kg_f`ThYFG)G_($Xu3J(lVl(S=%|K!o^=FP#L8l3N)a zZM8XH9^kY;GzkjR;tOi>h|sTIRi0it3A)*|3wU(&Wp$RrhKDD??K~+Z1HD6H7qV-f z`-33fUaAPHye+lgcuwZJmeEnnjgVV13A%1)U)ubm3tdBxuCo1zzvHhoDg z`${5R%#{_rY!U*OPJ+AT$KTTG8S3cnZLi4kpcy$U2``-l2A7ft2gpgl>Fu|>)L_In z38wWkhz(0M!M8vBY^4DxJ{g=desVq02|WpS~c8k6_t!0xVVBuzb2K zFB!w&W%bc;iI*<0wdT=OP~GCB5eeJgHqL!aUrIH5kMk;GacXHa|DEy^(zQ_fN&Xy5 zuQgCQ49mv_J(T_{n1Poen7cy|N+^BXFN!0}q|Yb*EWaD2gIROgr)+qS7oyUyER!9g z-ltMAEOhyFV_tgK^6AywblzLiBUCR@1k#Tra3ii!>4A?+zpXX7mpTBPnq+hbSZn8|Et1yYEwTQvv!Y;z?aYp1}YKsiI^I2Q0nF zFo^-rF$@Eq=xoHjrcwzqn8CvxDFtyxML~wASNP6jM#$7uh0X%*=qx0D7|vqihr!+{ zz8=olPEmB;E4l&B7rp=+rT{JqXEE^BfGrb>0>a_UL1(B81UvHFPM-PJEAk#rP!=c# zoS{hQjFV>udFGI3kOA??;)+aP=sZuJiN~Hv!N?{GZLw?dJVjprh4T)SHx3zMNn0-O z%phYJq!j9mY_9}qfdz@A+^I*;yAaLPE;tcWyWm7j?Sd15?5<>=L5pdlW?OPb;|Q#- z!sPqn6p zLdf{GHYoUl&^8zx-14BvQNB{Ksd!?ZTXx<*(iRPMegN|pwIeTpNtq02F<6LS7surF zFb74G^b9yhi!<6OdK8Z_C@zd62~1u?SCR2#1}4UCsX`tL6c{KT4B=&9oG%|P`;<2p zQ8d`H!G4{Y`yOjuq&QU|s@p*_i^<%P!D0q7&|-?LY*YYmK`um>CuC9uC5sP9AXs7q zO4afSvmMcsD-_DY1dDnbi&+*)%?=KVgCL$O0TSBUTHBb69H1wQkK*IA7*Hk{Ni4F) z3`7i}YzUd!AwUA6r(!Yj5f-;C%2~+B&MiI$#pgDvcpC!-7O$AxZ0KJ(YPtEvuH{{g zl#>Gym@N&n%RXlTP1{nse{u)w&>^t)k# z&BC+GQbVV5?W)MON(RzBFgYc`vzRtH9(0_t{ z@=m}NYD=*0Q=SrpOQFIn<)@)MHH+RD(&IuB(?}o7BlHvj$&@;g5u_W2PM>|0|KsUr zwSElwEA%vd1KK0>h&{J3yt*Qf6IEaE6fKk=+6R0_5XckR8q|sM6QTsvBn$Mj$ghML zK|EaZ2cRXJ4RKl=6Z1qAbPDPhOji-TKk%P@pCCihp!z4KKxRYRRVVbURF?VYBG_O6m&9w4A+A3~!S0-CX zo!`HI$&g-1c-+PO;`;D7lK(>dH5ugf+&pT639kO^GyD_$*8beE;5^vC-kd{@$+6o}uC1#*&IZov|0+7#{8JK~5`9JDb(g*ic_v zS6^S59e?Y4Crt45fgxJw7Vx4$Qd47nZB2bcLw#9DT>mGIkT^I@@7eAku*b;(ng+)@tPK=SBq<6hDJ2VZ_kB))(jTz5!fXUYg8)cc0FV_e8uYeaB| z*1xK+Z}{HPAMb_ipdVcOviEEQv!t{%KQsFkAb4Z!4&J}LZ{YUi{AujvZLhoqjd|eJ zV4?%sptY&7aJx13${Tm?4G#3(CGHN5r3c&yPO*D`|G@*VfG4+y!(q2|*6aY9UH9$} z4vddGo%rdvtfs1}_LUC~96Ycqgm^G_r?aEIm$l6jTPGq4Hm@0iki#}TzilhNMQqda z|9x2Jse{cpbk!u0pkr~f#8`u9`cgbj9g zcD9w>D$n}io8#Y#U&sD^PESQsRa4i<1i*=5k+JcKDQOw$X~~HRfo@K=7N*9A+Nye5 za{32=^sK79qLPY+mOhPcYGGyT;N z9etdB-NM?|!P(W_!_xzZ9c(Slz^|sOr7iXIFDJD3U&l5*N{V}KULZBp)inG;+3kql zJ|0)i6}W0DNS?l=1*E`LRz+J2e9l(jl5=(U@%6(4H~aZ|d$>B8fdIE6A!q z0sehKOGEa=xeHQK;LpCIsHUc&sim!@uBNJ_a7|k3(z)~J&;5KxMOyFU>)3{0R29$3 zTbNmzEBt=?q?(~JuDVr4RZUF=yqO9L@=AtuYZFPus|s&i$KDiLBlc14tukgsIU_r} zAUP&3E;c$fJ2O2!Ei*eaH$N|@U|dRcji?3oiXPG4(aGuP?(St5=H=(*<-#c|J)?}( zQd!qjTTP@}V{5C4j;_wm4)9yE3i15SdAYecS(Oc0`K>KCqg$G)`-wL!u~%Ou?sE_g zr@f;!pOFtljI7Lo*;{Ef!_^LqwweY)(Gn9pOZ4HLJ1MfN>>NgJRxTrhS(}kR!tt~4 zt8K0#k^#ctMc`d8lM>rG9km6FoPzYE%Wdq+e2Xxm6#!#q)R(xR+B z%qqUMj_?OMNdhJ}a-~z%=qkB2Nwg0UM4GB|PDN?BgJ&6Qt{X5D4gjUtMezg4UA6A| zL6gKxyh&2;-8=1Z7OpYH&BTXhm{1wG*YTds3zThn-b~`Y*JY1xoLD{IAK>g+**c=R z@jCX_wg+>_6OV+0GrohqH9h~;@z$)4HCp|y##*{r6DY#SR_1rLUTG4{gddviVDG3Sxq zi#efV5?tNU-iEh|x3o03w6wMryOzYpd%+t29Wh25*w&9=0zf|;Z#7zOCo-_0j`#|U?g9RUaDGZAk!_3#d~tz(k$y?+;-yO$FG^jxY<)@e^40IdYb}2X z#{{+R8$@72&!uFpkH7>r{Hp_dtS2|TTUF1fu_m;Ax6OVDBox}@&Es7sKd zffcy5xfx6$kLZ$4&cN7US39SFY=r%&F1g(l;_dF>=Lh zkm1^gb;14C`bjjU2Nj4T1 z9)3PvzV-lbQaF<}3+R>}q)VQ pU#$volzr;IGDbQjN`IVXMf%BAD^fP-ltx<57v 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 diff --git a/Mac/scripts/buildpkg.py b/Mac/scripts/buildpkg.py deleted file mode 100644 index c5925881e06..00000000000 --- a/Mac/scripts/buildpkg.py +++ /dev/null @@ -1,484 +0,0 @@ -#!/usr/bin/env python - -"""buildpkg.py -- Build OS X packages for Apple's Installer.app. - -This is an experimental command-line tool for building packages to be -installed with the Mac OS X Installer.app application. - -It is much inspired by Apple's GUI tool called PackageMaker.app, that -seems to be part of the OS X developer tools installed in the folder -/Developer/Applications. But apparently there are other free tools to -do the same thing which are also named PackageMaker like Brian Hill's -one: - - http://personalpages.tds.net/~brian_hill/packagemaker.html - -Beware of the multi-package features of Installer.app (which are not -yet supported here) that can potentially screw-up your installation -and are discussed in these articles on Stepwise: - - http://www.stepwise.com/Articles/Technical/Packages/InstallerWoes.html - http://www.stepwise.com/Articles/Technical/Packages/InstallerOnX.html - -Beside using the PackageMaker class directly, by importing it inside -another module, say, there are additional ways of using this module: -the top-level buildPackage() function provides a shortcut to the same -feature and is also called when using this module from the command- -line. - - **************************************************************** - NOTE: For now you should be able to run this even on a non-OS X - system and get something similar to a package, but without - the real archive (needs pax) and bom files (needs mkbom) - inside! This is only for providing a chance for testing to - folks without OS X. - **************************************************************** - -TODO: - - test pre-process and post-process scripts (Python ones?) - - handle multi-volume packages (?) - - integrate into distutils (?) - -Dinu C. Gherman, -gherman@europemail.com -November 2001 - -!! USE AT YOUR OWN RISK !! -""" - -__version__ = 0.2 -__license__ = "FreeBSD" - - -import os, sys, glob, fnmatch, shutil, string, copy, getopt -from os.path import basename, dirname, join, islink, isdir, isfile - -Error = "buildpkg.Error" - -PKG_INFO_FIELDS = """\ -Title -Version -Description -DefaultLocation -DeleteWarning -NeedsAuthorization -DisableStop -UseUserMask -Application -Relocatable -Required -InstallOnly -RequiresReboot -RootVolumeOnly -LongFilenames -LibrarySubdirectory -AllowBackRev -OverwritePermissions -InstallFat\ -""" - -###################################################################### -# Helpers -###################################################################### - -# Convenience class, as suggested by /F. - -class GlobDirectoryWalker: - "A forward iterator that traverses files in a directory tree." - - def __init__(self, directory, pattern="*"): - self.stack = [directory] - self.pattern = pattern - self.files = [] - self.index = 0 - - - def __getitem__(self, index): - while 1: - try: - file = self.files[self.index] - self.index = self.index + 1 - except IndexError: - # pop next directory from stack - self.directory = self.stack.pop() - self.files = os.listdir(self.directory) - self.index = 0 - else: - # got a filename - fullname = join(self.directory, file) - if isdir(fullname) and not islink(fullname): - self.stack.append(fullname) - if fnmatch.fnmatch(file, self.pattern): - return fullname - - -###################################################################### -# The real thing -###################################################################### - -class PackageMaker: - """A class to generate packages for Mac OS X. - - This is intended to create OS X packages (with extension .pkg) - containing archives of arbitrary files that the Installer.app - will be able to handle. - - As of now, PackageMaker instances need to be created with the - title, version and description of the package to be built. - The package is built after calling the instance method - build(root, **options). It has the same name as the constructor's - title argument plus a '.pkg' extension and is located in the same - parent folder that contains the root folder. - - E.g. this will create a package folder /my/space/distutils.pkg/: - - pm = PackageMaker("distutils", "1.0.2", "Python distutils.") - pm.build("/my/space/distutils") - """ - - packageInfoDefaults = { - 'Title': None, - 'Version': None, - 'Description': '', - 'DefaultLocation': '/', - 'DeleteWarning': '', - 'NeedsAuthorization': 'NO', - 'DisableStop': 'NO', - 'UseUserMask': 'YES', - 'Application': 'NO', - 'Relocatable': 'YES', - 'Required': 'NO', - 'InstallOnly': 'NO', - 'RequiresReboot': 'NO', - 'RootVolumeOnly' : 'NO', - 'InstallFat': 'NO', - 'LongFilenames': 'YES', - 'LibrarySubdirectory': 'Standard', - 'AllowBackRev': 'YES', - 'OverwritePermissions': 'NO', - } - - - def __init__(self, title, version, desc): - "Init. with mandatory title/version/description arguments." - - info = {"Title": title, "Version": version, "Description": desc} - self.packageInfo = copy.deepcopy(self.packageInfoDefaults) - self.packageInfo.update(info) - - # variables set later - self.packageRootFolder = None - self.packageResourceFolder = None - self.sourceFolder = None - self.resourceFolder = None - - - def build(self, root, resources=None, **options): - """Create a package for some given root folder. - - With no 'resources' argument set it is assumed to be the same - as the root directory. Option items replace the default ones - in the package info. - """ - - # set folder attributes - self.sourceFolder = root - if resources is None: - self.resourceFolder = root - else: - self.resourceFolder = resources - - # replace default option settings with user ones if provided - fields = self. packageInfoDefaults.keys() - for k, v in options.items(): - if k in fields: - self.packageInfo[k] = v - elif not k in ["OutputDir"]: - raise Error("Unknown package option: %s" % k) - - # Check where we should leave the output. Default is current directory - outputdir = options.get("OutputDir", os.getcwd()) - packageName = self.packageInfo["Title"] - self.PackageRootFolder = os.path.join(outputdir, packageName + ".pkg") - - # do what needs to be done - self._makeFolders() - self._addInfo() - self._addBom() - self._addArchive() - self._addResources() - self._addSizes() - self._addLoc() - - - def _makeFolders(self): - "Create package folder structure." - - # Not sure if the package name should contain the version or not... - # packageName = "%s-%s" % (self.packageInfo["Title"], - # self.packageInfo["Version"]) # ?? - - contFolder = join(self.PackageRootFolder, "Contents") - self.packageResourceFolder = join(contFolder, "Resources") - os.mkdir(self.PackageRootFolder) - os.mkdir(contFolder) - os.mkdir(self.packageResourceFolder) - - def _addInfo(self): - "Write .info file containing installing options." - - # Not sure if options in PKG_INFO_FIELDS are complete... - - info = "" - for f in string.split(PKG_INFO_FIELDS, "\n"): - if self.packageInfo.has_key(f): - info = info + "%s %%(%s)s\n" % (f, f) - info = info % self.packageInfo - base = self.packageInfo["Title"] + ".info" - path = join(self.packageResourceFolder, base) - f = open(path, "w") - f.write(info) - - - def _addBom(self): - "Write .bom file containing 'Bill of Materials'." - - # Currently ignores if the 'mkbom' tool is not available. - - try: - base = self.packageInfo["Title"] + ".bom" - bomPath = join(self.packageResourceFolder, base) - cmd = "mkbom %s %s" % (self.sourceFolder, bomPath) - res = os.system(cmd) - except: - pass - - - def _addArchive(self): - "Write .pax.gz file, a compressed archive using pax/gzip." - - # Currently ignores if the 'pax' tool is not available. - - cwd = os.getcwd() - - # create archive - os.chdir(self.sourceFolder) - base = basename(self.packageInfo["Title"]) + ".pax" - self.archPath = join(self.packageResourceFolder, base) - cmd = "pax -w -f %s %s" % (self.archPath, ".") - res = os.system(cmd) - - # compress archive - cmd = "gzip %s" % self.archPath - res = os.system(cmd) - os.chdir(cwd) - - - def _addResources(self): - "Add Welcome/ReadMe/License files, .lproj folders and scripts." - - # Currently we just copy everything that matches the allowed - # filenames. So, it's left to Installer.app to deal with the - # same file available in multiple formats... - - if not self.resourceFolder: - return - - # find candidate resource files (txt html rtf rtfd/ or lproj/) - allFiles = [] - for pat in string.split("*.txt *.html *.rtf *.rtfd *.lproj", " "): - pattern = join(self.resourceFolder, pat) - allFiles = allFiles + glob.glob(pattern) - - # find pre-process and post-process scripts - # naming convention: packageName.{pre,post}_{upgrade,install} - # Alternatively the filenames can be {pre,post}_{upgrade,install} - # in which case we prepend the package name - packageName = self.packageInfo["Title"] - for pat in ("*upgrade", "*install", "*flight"): - pattern = join(self.resourceFolder, packageName + pat) - pattern2 = join(self.resourceFolder, pat) - allFiles = allFiles + glob.glob(pattern) - allFiles = allFiles + glob.glob(pattern2) - - # check name patterns - files = [] - for f in allFiles: - for s in ("Welcome", "License", "ReadMe"): - if string.find(basename(f), s) == 0: - files.append((f, f)) - if f[-6:] == ".lproj": - files.append((f, f)) - elif basename(f) in ["pre_upgrade", "pre_install", "post_upgrade", "post_install"]: - files.append((f, packageName+"."+basename(f))) - elif basename(f) in ["preflight", "postflight"]: - files.append((f, f)) - elif f[-8:] == "_upgrade": - files.append((f,f)) - elif f[-8:] == "_install": - files.append((f,f)) - - # copy files - for src, dst in files: - src = basename(src) - dst = basename(dst) - f = join(self.resourceFolder, src) - if isfile(f): - shutil.copy(f, os.path.join(self.packageResourceFolder, dst)) - elif isdir(f): - # special case for .rtfd and .lproj folders... - d = join(self.packageResourceFolder, dst) - os.mkdir(d) - files = GlobDirectoryWalker(f) - for file in files: - shutil.copy(file, d) - - - def _addSizes(self): - "Write .sizes file with info about number and size of files." - - # Not sure if this is correct, but 'installedSize' and - # 'zippedSize' are now in Bytes. Maybe blocks are needed? - # Well, Installer.app doesn't seem to care anyway, saying - # the installation needs 100+ MB... - - numFiles = 0 - installedSize = 0 - zippedSize = 0 - - files = GlobDirectoryWalker(self.sourceFolder) - for f in files: - numFiles = numFiles + 1 - installedSize = installedSize + os.lstat(f)[6] - - try: - zippedSize = os.stat(self.archPath+ ".gz")[6] - except OSError: # ignore error - pass - base = self.packageInfo["Title"] + ".sizes" - f = open(join(self.packageResourceFolder, base), "w") - format = "NumFiles %d\nInstalledSize %d\nCompressedSize %d\n" - f.write(format % (numFiles, installedSize, zippedSize)) - - def _addLoc(self): - "Write .loc file." - base = self.packageInfo["Title"] + ".loc" - f = open(join(self.packageResourceFolder, base), "w") - f.write('/') - -# Shortcut function interface - -def buildPackage(*args, **options): - "A Shortcut function for building a package." - - o = options - title, version, desc = o["Title"], o["Version"], o["Description"] - pm = PackageMaker(title, version, desc) - pm.build(*args, **options) - - -###################################################################### -# Tests -###################################################################### - -def test0(): - "Vanilla test for the distutils distribution." - - pm = PackageMaker("distutils2", "1.0.2", "Python distutils package.") - pm.build("/Users/dinu/Desktop/distutils2") - - -def test1(): - "Test for the reportlab distribution with modified options." - - pm = PackageMaker("reportlab", "1.10", - "ReportLab's Open Source PDF toolkit.") - pm.build(root="/Users/dinu/Desktop/reportlab", - DefaultLocation="/Applications/ReportLab", - Relocatable="YES") - -def test2(): - "Shortcut test for the reportlab distribution with modified options." - - buildPackage( - "/Users/dinu/Desktop/reportlab", - Title="reportlab", - Version="1.10", - Description="ReportLab's Open Source PDF toolkit.", - DefaultLocation="/Applications/ReportLab", - Relocatable="YES") - - -###################################################################### -# Command-line interface -###################################################################### - -def printUsage(): - "Print usage message." - - format = "Usage: %s [] []" - print(format % basename(sys.argv[0])) - print() - print(" with arguments:") - print(" (mandatory) root: the package root folder") - print(" (optional) resources: the package resources folder") - print() - print(" and options:") - print(" (mandatory) opts1:") - mandatoryKeys = string.split("Title Version Description", " ") - for k in mandatoryKeys: - print(" --%s" % k) - print(" (optional) opts2: (with default values)") - - pmDefaults = PackageMaker.packageInfoDefaults - optionalKeys = pmDefaults.keys() - for k in mandatoryKeys: - optionalKeys.remove(k) - optionalKeys.sort() - maxKeyLen = max(map(len, optionalKeys)) - for k in optionalKeys: - format = " --%%s:%s %%s" - format = format % (" " * (maxKeyLen-len(k))) - print(format % (k, repr(pmDefaults[k]))) - - -def main(): - "Command-line interface." - - shortOpts = "" - keys = PackageMaker.packageInfoDefaults.keys() - longOpts = map(lambda k: k+"=", keys) - - try: - opts, args = getopt.getopt(sys.argv[1:], shortOpts, longOpts) - except getopt.GetoptError as details: - print(details) - printUsage() - return - - optsDict = {} - for k, v in opts: - optsDict[k[2:]] = v - - ok = optsDict.keys() - if not (1 <= len(args) <= 2): - print("No argument given!") - elif not ("Title" in ok and \ - "Version" in ok and \ - "Description" in ok): - print("Missing mandatory option!") - else: - buildPackage(*args, **optsDict) - return - - printUsage() - - # sample use: - # buildpkg.py --Title=distutils \ - # --Version=1.0.2 \ - # --Description="Python distutils package." \ - # /Users/dinu/Desktop/distutils - - -if __name__ == "__main__": - main() diff --git a/Mac/scripts/zappycfiles.py b/Mac/scripts/zappycfiles.py deleted file mode 100644 index b377e0d9a8a..00000000000 --- a/Mac/scripts/zappycfiles.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/local/bin/python -"""Recursively zap all .pyc and .pyo files""" -import os -import sys - -# set doit true to actually delete files -# set doit false to just print what would be deleted -doit = 1 - -def main(): - if not sys.argv[1:]: - if os.name == 'mac': - import EasyDialogs - dir = EasyDialogs.AskFolder(message='Directory to zap pyc files in') - if not dir: - sys.exit(0) - zappyc(dir) - else: - print('Usage: zappyc dir ...') - sys.exit(1) - for dir in sys.argv[1:]: - zappyc(dir) - -def zappyc(dir): - os.walk(dir, walker, None) - -def walker(dummy, top, names): - for name in names: - if name[-4:] in ('.pyc', '.pyo'): - path = os.path.join(top, name) - print('Zapping', path) - if doit: - os.unlink(path) - -if __name__ == '__main__': - main() diff --git a/Makefile.pre.in b/Makefile.pre.in index 25490cf09f7..a6a49509a28 100644 --- a/Makefile.pre.in +++ b/Makefile.pre.in @@ -1026,7 +1026,6 @@ frameworkinstallstructure: $(LDLIBRARY) # install (which includes python-config) happy. frameworkinstallmaclib: ln -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/python$(VERSION)/config/libpython$(VERSION).a" - cd Mac && $(MAKE) installmacsubtree DESTDIR="$(DESTDIR)" # This installs the IDE, the Launcher and other apps into /Applications frameworkinstallapps: diff --git a/Misc/NEWS b/Misc/NEWS index b3d4f30c66e..9914858c17f 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,6 +21,14 @@ Library code of every single module of the standard library, including invalid files used in the test suite. +Tools/Demos +----------- + +- The Mac/Demos directory has been removed + +- All of the Mac scripts have been removed (including BuildApplet.py) + + What's new in Python 3.0b1? =========================== diff --git a/configure b/configure index abe60a77c5a..3ec382c4c08 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Revision: 63697 . +# From configure.in Revision: 64085 . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for python 3.0. # @@ -1938,8 +1938,6 @@ if test "${enable_framework+set}" = set; then ac_config_files="$ac_config_files Mac/PythonLauncher/Makefile" - ac_config_files="$ac_config_files Mac/IDLE/Makefile" - ac_config_files="$ac_config_files Mac/Resources/framework/Info.plist" ac_config_files="$ac_config_files Mac/Resources/app/Info.plist" @@ -2021,7 +2019,7 @@ case $ac_sys_system/$ac_sys_release in # On OpenBSD, select(2) is not available if _XOPEN_SOURCE is defined, # even though select is a POSIX function. Reported by J. Ribbens. # Reconfirmed for OpenBSD 3.3 by Zachary Hamm, for 3.4 by Jason Ish. - OpenBSD/2.* | OpenBSD/3.[0123456789] | OpenBSD/4.[0]) + OpenBSD/2.* | OpenBSD/3.[0123456789] | OpenBSD/4.[0123]) define_xopen_source=no # OpenBSD undoes our definition of __BSD_VISIBLE if _XOPEN_SOURCE is # also defined. This can be overridden by defining _BSD_SOURCE @@ -2073,6 +2071,11 @@ _ACEOF Darwin/[789].*) define_xopen_source=no ;; + # On QNX 6.3.2, defining _XOPEN_SOURCE prevents netdb.h from + # defining NI_NUMERICHOST. + QNX/6.3.2) + define_xopen_source=no + ;; esac @@ -3871,6 +3874,10 @@ then LINKCC="\$(srcdir)/Modules/makexp_aix Modules/python.exp $exp_extra \$(LIBRARY); $LINKCC";; Monterey64*) LINKCC="$LINKCC -L/usr/lib/ia64l64";; + QNX*) + # qcc must be used because the other compilers do not + # support -N. + LINKCC=qcc;; esac fi { echo "$as_me:$LINENO: result: $LINKCC" >&5 @@ -5406,6 +5413,7 @@ done + for ac_header in asm/types.h conio.h curses.h direct.h dlfcn.h errno.h \ @@ -5416,7 +5424,7 @@ unistd.h utime.h \ sys/audioio.h sys/bsdtty.h sys/epoll.h sys/event.h sys/file.h sys/loadavg.h \ sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/poll.h sys/select.h sys/socket.h sys/statvfs.h sys/stat.h \ -sys/time.h \ +sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/un.h sys/utsname.h sys/wait.h pty.h libutil.h \ sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \ bluetooth/bluetooth.h linux/tipc.h @@ -12891,7 +12899,7 @@ then fi fi ;; - Linux*|GNU*) LDSHARED='$(CC) -shared';; + Linux*|GNU*|QNX*) LDSHARED='$(CC) -shared';; BSD/OS*/4*) LDSHARED="gcc -shared";; FreeBSD*) if [ "`$CC -dM -E - &5 @@ -24736,7 +24751,6 @@ do "pyconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS pyconfig.h" ;; "Mac/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/Makefile" ;; "Mac/PythonLauncher/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/PythonLauncher/Makefile" ;; - "Mac/IDLE/Makefile") CONFIG_FILES="$CONFIG_FILES Mac/IDLE/Makefile" ;; "Mac/Resources/framework/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/framework/Info.plist" ;; "Mac/Resources/app/Info.plist") CONFIG_FILES="$CONFIG_FILES Mac/Resources/app/Info.plist" ;; "Makefile.pre") CONFIG_FILES="$CONFIG_FILES Makefile.pre" ;; diff --git a/configure.in b/configure.in index baa305c1a66..1674c40a600 100644 --- a/configure.in +++ b/configure.in @@ -141,7 +141,6 @@ AC_ARG_ENABLE(framework, # files: AC_CONFIG_FILES(Mac/Makefile) AC_CONFIG_FILES(Mac/PythonLauncher/Makefile) - AC_CONFIG_FILES(Mac/IDLE/Makefile) AC_CONFIG_FILES(Mac/Resources/framework/Info.plist) AC_CONFIG_FILES(Mac/Resources/app/Info.plist) esac