Changes in 2.0 since 1.5.2
--------------------------

These release notes refer to Mac-specific changes only. See NEWS (in the Misc folder)
for machine-independent changes.

Unfortunately I have messed my administration up, so I can't give complete
Mac-specific release notes for the changes in this release. So, I will
have to leave it at the highlights:

- 68K support has been dropped, this release is PPC only.
- Threads support (through standard Python threads module).
- Tkinter works again! At least: it doesn't immedeately crash in obvious ways.
- Appearance support through App module and added calls in many other modules.
  Most dialogs and applets have also been converted to Appearance. There's also a
  ControlAccessor module that handles [GS]etControlData with their plethora of
  argument types.
- Navigation Services support, with macfs StandardFile calls transparently
  replaced by their NavServices counterparts.
- Offscreen QuickDraw and GWorld support through Qdoffs module.
- Drag manager support (Drag module).
- Much better CGI support and examples, see :Mac:Tools:CGI.
- Better OSA/AppleEvent support.
- Up/downcasting of handle-based types is now unified and implemented in the
  inherting module, e.g.
  handleobj = ctlobj.as_Resource()
  ctlobj = Ctl.as_Control(handle)
- Added macos.FreeMem(), MaxBlock() and CompactMem(), mainly so apps in Python can
  give low-memory warnings.
- MediaDescr module parses some QuickTime media descriptions (but definitely not all).
- A new method EasyDialogs.GetArgv() which makes it easy for the end-user to provide
  unix-style sys.argv arguments. (new since 2.0b1)
- There's a new package, mkcwproject, that creates and builds CodeWarrior
  projects. (new since 2.0b1)
- The "keep console open" options are now always, never, on error and on
  unseen output. The latter is the new default. There is also a call
  MacOS.KeepConsole() which allows programs to override the behaviour, and
  a call MacOS.OutputSeen() which acknowledges all output until now.
  (new since 2.0b1)
- Missing Numeric modules are included. They may not be on sys.path, however. (new since 2.0b1)
- gdbm works again. (new since 2.0b1)
- Command-. and threads don't bite each other as badly anymore. (new since 2.0c1)
- InstallPython will optionally copy PythonCore in stead of creating an alias, when
  needed. (new since 2.0c1)
- All bugs reported to the pythonmac-sig in the 2.0c1 period have been fixed.


What is not in this distribution
--------------------------------

- The garbage collection mods to 2.0 have not been enabled, mainly due to lack of test-time.
- Stackless Python/microthreads hasn't been ported to 2.0 yet. If/when it becomes available
  Just will undoubtedly announce it on pythonmac-sig and the MacPython homepage.
- Carbon support is not in here, but should be happening as soon as GUSI is ready.
- Distutils is incomplete for the Mac, unfortunately. A newer version should be available
  soon and will be announced on pythonmac-sig and the MacPython homepage.

Known problems
--------------

This list is far from complete, more problems may be listed on the MacPython homepage,
http://www.cwi.nl/~jack/macpython.html.

- The IDE and Tkinter do not work together. Run tkinter programs under PythonInterpreter.
- Aliases do not work in sys.path entries.
