	Changes between 1.4b3 and 1.3.3
	-------------------------------

Aside from all the changes Guido made to the machine-independent part
of Python the following mac-specific changes have been made:

- The standard 68K Python is built for CFM68K. This means that PPC and
  68K Python are now largely compatible, both supporting dynamically
  loaded modules, python applets, etc.
  As a result of this there have been numerous subtle changes in
  filenames for PPC plugin modules and such, but these changes should
  be transparent to Python programs.
  The one missing module in cfm68k is Macspeech, for which no CFM68K
  interface library is available (yet?).
- Raise MemoryError on stack overflow.
- Python now always uses 8-byte doubles.
- Removed mactcp, macdnr and stdwin modules from standard
  distribution.
- New releases of Tcl/Tk (4.1p1), CWGUSI (1.7.2) and Waste (1.2f) have
  been incorporated.
- Macfs.SetFolder method added, which sets initial folder for standard
  file dialogs.
- New py_resource module to handle PYC resources.
- List mgr objects "selFlags" and "listFlags" members now accessible.
- QuickDraw got a few new symbolic constants.
- Qt and Cm modules now live in a separate dynamically loadable
  module, so other toolbox modules work if you don't have QuickTime
  installed.
- Old sound mgr calls {Set,Get}SoundVol removed, version number
  interface changed.
- Added convenience routines setarrowcursor and setwatchcursor to
  FrameWork.
- Bugfixes to time.sleep(), FrameWork, macostools,
- Minor fixes/additions/updates to demos and documentation in the Demo
  folder.
- Internal changes:
  - Ported to CW9
  - mwerks_????_config.h organization rationalized
  - Projects renamed to reflect architecture (ppc, cfm68k, 68k).
  - various defines (HAVE_CONFIG_H, USE_MAC_DYNAMIC_LOADING) no longer
    needed.
  - shared-library architecture made more conforming to metrowerks
    documentation. Check xx plugin projects if you have built your own
    dynamically loaded modules.
  
	
	Changes between 1.3.3 and 1.3.2
	--------------------------------

A major change since 1.3.2 is in the organization of the files: The
Mac folder has mac-specific demo programs, attempts at documentation and
more. Browse the HTML files in Mac:Demo for more info.

Also, Toolbox:bgen is not needed anymore for normal use: the relevant
python modules have been moved to Mac:Lib:toolbox.

Other changes:
- Uses final Tk 4.1 and Tcl 7.5 distributions.
- Override preferences (stored in the interpreter/applet application)
  allow overriding of system-wide preferences. Explained in
  "using.html".
- New functionality in FrameWork.py:
  - ScrolledWindow class
  - enable(), settext(), setitem(), setmark(), seticon(),
    checkmenu() and delete() methods for menu entries.
  - event parameter added to idle() method
  - windowbounds() function helps programmer with staggering windows.
  - Erase only visRgn on an update event.
- TextEdit interface module added
- Waste interface module added
- Demos for waste, including skeleton for html editor
- Scrap manager interface added
- Ctl.FindControl() could return reference to deleted object. Fixed.
- GrafPorts have an _id attribute (address of grafport) allowing them
  to be compared (since a new python object is created each time).
- Standard File folder no longer changed on chdir() (this was
  introduced in 1.3.2).
- sys.argv can now be set if you option-drag or option-click a python
  source.
- Various dialogs now have sensible defaults.
- binhextree is now a bit more intelligent about when to binhex.
- gensuitemodule fixed to hand '****' type arguments.

	Changes between 1.3.2 and 1.3.1
	-------------------------------

The main reason for the 1.3.2 distribution is the availability of Tk
for the mac. The Tk port and its integration in Python is definitely
not bug-free, hence this distribution should be treated as beta
software at best.

Another major change in this release is that the Python I/O system is
now based on the GUSI library. This is an I/O library that attempts to
mimic a Posix I/O system. Hence, modules like socket and select are
now available in MacPython. If you build dynamically loaded modules
and you use any unix-like feature such as stat() calls you should
compile using the GUSI include files.

A third major change is that the MacOS creator code has been changed
from 'PYTH' to 'Pyth', due to a conflict. This means that you will
have to change the creator of all your old python programs. The
distribution contains a script "FixCreator.py" that does this
recursively for a whole folder.

Here are all the changes since 1.3.1, in no particular order:
- complex number support added
- cmath module added
- startup options ("option-drag" dialog) can be retrieved from the
  preferences file. EditPythonPrefs hasn't been updated yet, though.
- Creator changed from PYTH to Pyth
- {mac,os}.unlink is now also called {mac,os}.remove
- {mac,os}.mkdir second arg optional
- dup and fdopen calls added
- select module added
- socket module added
- open(file, '*r') for opening resource forks has been removed. It is
  replaced by MacOS.openrf(file, 'r'), which returns a simple
  file-like object to read (or write) resource forks.
- Added AppleEvent URL suite
- Added AppleEvent netscape suite
- QuickDraw globals are now all accessible, as Qd.qd.xxxx


	Mac-specific changes between 1.3 and 1.3.1
	--------------------------------------

Aside from the changes mentioned here there have also been some
changes in the core python, but these are not documented here.
However, these changes are mainly bugfixes, so there shouldn't be any
incompatabilities.

- imgsgi and imgpbm modules added
- Various hooks installed to allow integration with MacTk (currently
  disabled)
- Added support for MacOS Fixed type in toolbox arguments (represented
  as floats in python)
- Added option to keep output window open on normal termination
- Decreased minimum heapsize to run interpreter
- Added progress-bar to EasyDialogs
- Fixed socket.getportname()
- Renamed MACTCP.py to MACTCPconst.py

- Many fixes to FrameWork.py:
  - Added window.SetPort() method
  - Added optional bounds and resid parameters to Window.open()
  - Fixed apple-menu DA handling
  - Fixed activate-event handling
  - Added default Application.makeusermenus() (File:Quit only)
  - Fixed bug with keyboard input handling
  - added idle() method, called from event loop if there are no events
    pending

Toolbox modules:
- component manager module added
- quicktime module added
- font manager module added
- Added color window support
- Added support to obtain pixmap from a window
- Added BitMap type
- Added GrafPort type
- Added support for PenState, Patterns, FontInfo, RGB colors,
- Fixed GetPen and SetPt arguments
- Added read access to members of {C}GrafPort objects
- Added support for cursors
- Provide access to some QuickDraw globals
- Fixed InsetRect, OffsetRect, MapRect
- Added support for various handles such as PatHandle, CursHandle
- Added functions to access members of Window objects



