Changes in 2.0c1 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.
  (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)


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.
- Once you have used multiple threads you cannot raise KeyboardInterrupt anymore:
  typing command-. will immedeately exit the interpreter.
