Added support for GrafPort object
diff --git a/Mac/Modules/win/Winmodule.c b/Mac/Modules/win/Winmodule.c
index 61afed4..286ef34 100644
--- a/Mac/Modules/win/Winmodule.c
+++ b/Mac/Modules/win/Winmodule.c
@@ -19,6 +19,8 @@
 
 extern PyObject *WinObj_New(WindowPtr);
 extern int WinObj_Convert(PyObject *, WindowPtr *);
+extern PyTypeObject Window_Type;
+#define WinObj_Check(x) ((x)->ob_type == &Window_Type)
 
 extern PyObject *DlgObj_New(DialogPtr);
 extern int DlgObj_Convert(PyObject *, DialogPtr *);
@@ -31,6 +33,9 @@
 extern PyObject *CtlObj_New(ControlHandle);
 extern int CtlObj_Convert(PyObject *, ControlHandle *);
 
+extern PyObject *GrafObj_New(GrafPtr);
+extern int GrafObj_Convert(PyObject *, GrafPtr *);
+
 extern PyObject *WinObj_WhichWindow(WindowPtr);
 
 #include <Windows.h>
@@ -412,6 +417,38 @@
 	return _res;
 }
 
+static PyObject *WinObj_PaintOne(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle clobberedRgn;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &clobberedRgn))
+		return NULL;
+	PaintOne(_self->ob_itself,
+	         clobberedRgn);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
+static PyObject *WinObj_PaintBehind(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle clobberedRgn;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &clobberedRgn))
+		return NULL;
+	PaintBehind(_self->ob_itself,
+	            clobberedRgn);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
 static PyObject *WinObj_CalcVis(_self, _args)
 	WindowObject *_self;
 	PyObject *_args;
@@ -425,6 +462,22 @@
 	return _res;
 }
 
+static PyObject *WinObj_CalcVisBehind(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle clobberedRgn;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &clobberedRgn))
+		return NULL;
+	CalcVisBehind(_self->ob_itself,
+	              clobberedRgn);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
 static PyObject *WinObj_GrowWindow(_self, _args)
 	WindowObject *_self;
 	PyObject *_args;
@@ -531,6 +584,20 @@
 	return _res;
 }
 
+static PyObject *WinObj_GetWindowPort(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	CGrafPtr _rv;
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
+	_rv = GetWindowPort(_self->ob_itself);
+	_res = Py_BuildValue("O&",
+	                     GrafObj_New, _rv);
+	return _res;
+}
+
 static PyObject *WinObj_SetPortWindowPort(_self, _args)
 	WindowObject *_self;
 	PyObject *_args;
@@ -630,6 +697,54 @@
 	return _res;
 }
 
+static PyObject *WinObj_GetWindowStructureRgn(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle r;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &r))
+		return NULL;
+	GetWindowStructureRgn(_self->ob_itself,
+	                      r);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
+static PyObject *WinObj_GetWindowContentRgn(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle r;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &r))
+		return NULL;
+	GetWindowContentRgn(_self->ob_itself,
+	                    r);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
+static PyObject *WinObj_GetWindowUpdateRgn(_self, _args)
+	WindowObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle r;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &r))
+		return NULL;
+	GetWindowUpdateRgn(_self->ob_itself,
+	                   r);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
 static PyObject *WinObj_GetWindowTitleWidth(_self, _args)
 	WindowObject *_self;
 	PyObject *_args;
@@ -763,8 +878,14 @@
 	 "() -> None"},
 	{"DrawNew", (PyCFunction)WinObj_DrawNew, 1,
 	 "(Boolean update) -> None"},
+	{"PaintOne", (PyCFunction)WinObj_PaintOne, 1,
+	 "(RgnHandle clobberedRgn) -> None"},
+	{"PaintBehind", (PyCFunction)WinObj_PaintBehind, 1,
+	 "(RgnHandle clobberedRgn) -> None"},
 	{"CalcVis", (PyCFunction)WinObj_CalcVis, 1,
 	 "() -> None"},
+	{"CalcVisBehind", (PyCFunction)WinObj_CalcVisBehind, 1,
+	 "(RgnHandle clobberedRgn) -> None"},
 	{"GrowWindow", (PyCFunction)WinObj_GrowWindow, 1,
 	 "(Point startPt, Rect bBox) -> (long _rv)"},
 	{"TrackBox", (PyCFunction)WinObj_TrackBox, 1,
@@ -777,6 +898,8 @@
 	 "(Point thePt) -> (Boolean _rv)"},
 	{"DragWindow", (PyCFunction)WinObj_DragWindow, 1,
 	 "(Point startPt, Rect boundsRect) -> None"},
+	{"GetWindowPort", (PyCFunction)WinObj_GetWindowPort, 1,
+	 "() -> (CGrafPtr _rv)"},
 	{"SetPortWindowPort", (PyCFunction)WinObj_SetPortWindowPort, 1,
 	 "() -> None"},
 	{"GetWindowKind", (PyCFunction)WinObj_GetWindowKind, 1,
@@ -791,6 +914,12 @@
 	 "() -> (Boolean _rv)"},
 	{"GetWindowZoomFlag", (PyCFunction)WinObj_GetWindowZoomFlag, 1,
 	 "() -> (Boolean _rv)"},
+	{"GetWindowStructureRgn", (PyCFunction)WinObj_GetWindowStructureRgn, 1,
+	 "(RgnHandle r) -> None"},
+	{"GetWindowContentRgn", (PyCFunction)WinObj_GetWindowContentRgn, 1,
+	 "(RgnHandle r) -> None"},
+	{"GetWindowUpdateRgn", (PyCFunction)WinObj_GetWindowUpdateRgn, 1,
+	 "(RgnHandle r) -> None"},
 	{"GetWindowTitleWidth", (PyCFunction)WinObj_GetWindowTitleWidth, 1,
 	 "() -> (short _rv)"},
 	{"GetNextWindow", (PyCFunction)WinObj_GetNextWindow, 1,
@@ -833,6 +962,20 @@
 /* --------------------- End object type Window --------------------- */
 
 
+static PyObject *Win_GetGrayRgn(_self, _args)
+	PyObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle _rv;
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
+	_rv = GetGrayRgn();
+	_res = Py_BuildValue("O&",
+	                     ResObj_New, _rv);
+	return _res;
+}
+
 static PyObject *Win_InitWindows(_self, _args)
 	PyObject *_self;
 	PyObject *_args;
@@ -846,6 +989,20 @@
 	return _res;
 }
 
+static PyObject *Win_GetWMgrPort(_self, _args)
+	PyObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	GrafPtr wPort;
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
+	GetWMgrPort(&wPort);
+	_res = Py_BuildValue("O&",
+	                     GrafObj_New, wPort);
+	return _res;
+}
+
 static PyObject *Win_NewWindow(_self, _args)
 	PyObject *_self;
 	PyObject *_args;
@@ -930,6 +1087,21 @@
 	return _res;
 }
 
+static PyObject *Win_InvalRgn(_self, _args)
+	PyObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle badRgn;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &badRgn))
+		return NULL;
+	InvalRgn(badRgn);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
 static PyObject *Win_ValidRect(_self, _args)
 	PyObject *_self;
 	PyObject *_args;
@@ -945,6 +1117,21 @@
 	return _res;
 }
 
+static PyObject *Win_ValidRgn(_self, _args)
+	PyObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	RgnHandle goodRgn;
+	if (!PyArg_ParseTuple(_args, "O&",
+	                      ResObj_Convert, &goodRgn))
+		return NULL;
+	ValidRgn(goodRgn);
+	Py_INCREF(Py_None);
+	_res = Py_None;
+	return _res;
+}
+
 static PyObject *Win_CheckUpdate(_self, _args)
 	PyObject *_self;
 	PyObject *_args;
@@ -999,6 +1186,20 @@
 	return _res;
 }
 
+static PyObject *Win_GetCWMgrPort(_self, _args)
+	PyObject *_self;
+	PyObject *_args;
+{
+	PyObject *_res = NULL;
+	CGrafPtr wMgrCPort;
+	if (!PyArg_ParseTuple(_args, ""))
+		return NULL;
+	GetCWMgrPort(&wMgrCPort);
+	_res = Py_BuildValue("O&",
+	                     GrafObj_New, wMgrCPort);
+	return _res;
+}
+
 static PyObject *Win_NewCWindow(_self, _args)
 	PyObject *_self;
 	PyObject *_args;
@@ -1069,8 +1270,12 @@
 }
 
 static PyMethodDef Win_methods[] = {
+	{"GetGrayRgn", (PyCFunction)Win_GetGrayRgn, 1,
+	 "() -> (RgnHandle _rv)"},
 	{"InitWindows", (PyCFunction)Win_InitWindows, 1,
 	 "() -> None"},
+	{"GetWMgrPort", (PyCFunction)Win_GetWMgrPort, 1,
+	 "() -> (GrafPtr wPort)"},
 	{"NewWindow", (PyCFunction)Win_NewWindow, 1,
 	 "(Rect boundsRect, Str255 title, Boolean visible, short theProc, WindowPtr behind, Boolean goAwayFlag, long refCon) -> (WindowPtr _rv)"},
 	{"GetNewWindow", (PyCFunction)Win_GetNewWindow, 1,
@@ -1079,14 +1284,20 @@
 	 "() -> (WindowPtr _rv)"},
 	{"InvalRect", (PyCFunction)Win_InvalRect, 1,
 	 "(Rect badRect) -> None"},
+	{"InvalRgn", (PyCFunction)Win_InvalRgn, 1,
+	 "(RgnHandle badRgn) -> None"},
 	{"ValidRect", (PyCFunction)Win_ValidRect, 1,
 	 "(Rect goodRect) -> None"},
+	{"ValidRgn", (PyCFunction)Win_ValidRgn, 1,
+	 "(RgnHandle goodRgn) -> None"},
 	{"CheckUpdate", (PyCFunction)Win_CheckUpdate, 1,
 	 "() -> (Boolean _rv, EventRecord theEvent)"},
 	{"FindWindow", (PyCFunction)Win_FindWindow, 1,
 	 "(Point thePoint) -> (short _rv, WindowPtr theWindow)"},
 	{"PinRect", (PyCFunction)Win_PinRect, 1,
 	 "(Rect theRect, Point thePt) -> (long _rv)"},
+	{"GetCWMgrPort", (PyCFunction)Win_GetCWMgrPort, 1,
+	 "() -> (CGrafPtr wMgrCPort)"},
 	{"NewCWindow", (PyCFunction)Win_NewCWindow, 1,
 	 "(Rect boundsRect, Str255 title, Boolean visible, short procID, WindowPtr behind, Boolean goAwayFlag, long refCon) -> (WindowPtr _rv)"},
 	{"GetNewCWindow", (PyCFunction)Win_GetNewCWindow, 1,
diff --git a/Mac/Modules/win/winedit.py b/Mac/Modules/win/winedit.py
index 08be8bd..a5812f1 100644
--- a/Mac/Modules/win/winedit.py
+++ b/Mac/Modules/win/winedit.py
@@ -1,6 +1,11 @@
 # These are inline-routines/defines, so we do them "by hand"
 #
 
+f = Method(CGrafPtr, 'GetWindowPort',
+    (WindowRef, 'theWindow', InMode),
+)
+methods.append(f)
+
 f = Method(void, 'SetPortWindowPort',
     (WindowRef, 'theWindow', InMode),
 )
@@ -38,25 +43,23 @@
 )
 methods.append(f)
 
-if 0:
-	# Regions are not implemented yet..
-	f = Method(void, 'GetWindowStructureRgn',
-		(WindowRef, 'theWindow', InMode),
-		(RgnHandle, 'r', InMode),
-	)
-	methods.append(f)
-	
-	f = Method(void, 'GetWindowContentRgn',
-		(WindowRef, 'theWindow', InMode),
-		(RgnHandle, 'r', InMode),
-	)
-	methods.append(f)
-	
-	f = Method(void, 'GetWindowUpdateRgn',
-		(WindowRef, 'theWindow', InMode),
-		(RgnHandle, 'r', InMode),
-	)
-	methods.append(f)
+f = Method(void, 'GetWindowStructureRgn',
+	(WindowRef, 'theWindow', InMode),
+	(RgnHandle, 'r', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetWindowContentRgn',
+	(WindowRef, 'theWindow', InMode),
+	(RgnHandle, 'r', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'GetWindowUpdateRgn',
+	(WindowRef, 'theWindow', InMode),
+	(RgnHandle, 'r', InMode),
+)
+methods.append(f)
 
 f = Method(short, 'GetWindowTitleWidth',
     (WindowRef, 'theWindow', InMode),
diff --git a/Mac/Modules/win/wingen.py b/Mac/Modules/win/wingen.py
index 1d0a875..8841b1e 100644
--- a/Mac/Modules/win/wingen.py
+++ b/Mac/Modules/win/wingen.py
@@ -1,9 +1,18 @@
 # Generated from 'Sap:CodeWarrior7:Metrowerks CodeWarrior:MacOS Support:Headers:Universal Headers:Windows.h'
 
+f = Function(RgnHandle, 'GetGrayRgn',
+)
+functions.append(f)
+
 f = Function(void, 'InitWindows',
 )
 functions.append(f)
 
+f = Function(void, 'GetWMgrPort',
+    (GrafPtr, 'wPort', OutMode),
+)
+functions.append(f)
+
 f = Function(WindowRef, 'NewWindow',
     (NullStorage, 'wStorage', InMode),
     (Rect_ptr, 'boundsRect', InMode),
@@ -104,11 +113,21 @@
 )
 functions.append(f)
 
+f = Function(void, 'InvalRgn',
+    (RgnHandle, 'badRgn', InMode),
+)
+functions.append(f)
+
 f = Function(void, 'ValidRect',
     (Rect_ptr, 'goodRect', InMode),
 )
 functions.append(f)
 
+f = Function(void, 'ValidRgn',
+    (RgnHandle, 'goodRgn', InMode),
+)
+functions.append(f)
+
 f = Method(void, 'BeginUpdate',
     (WindowRef, 'theWindow', InMode),
 )
@@ -162,11 +181,29 @@
 )
 methods.append(f)
 
+f = Method(void, 'PaintOne',
+    (WindowRef, 'window', InMode),
+    (RgnHandle, 'clobberedRgn', InMode),
+)
+methods.append(f)
+
+f = Method(void, 'PaintBehind',
+    (WindowRef, 'startWindow', InMode),
+    (RgnHandle, 'clobberedRgn', InMode),
+)
+methods.append(f)
+
 f = Method(void, 'CalcVis',
     (WindowRef, 'window', InMode),
 )
 methods.append(f)
 
+f = Method(void, 'CalcVisBehind',
+    (WindowRef, 'startWindow', InMode),
+    (RgnHandle, 'clobberedRgn', InMode),
+)
+methods.append(f)
+
 f = Method(long, 'GrowWindow',
     (WindowRef, 'theWindow', InMode),
     (Point, 'startPt', InMode),
@@ -193,6 +230,11 @@
 )
 methods.append(f)
 
+f = Function(void, 'GetCWMgrPort',
+    (CGrafPtr, 'wMgrCPort', OutMode),
+)
+functions.append(f)
+
 f = Function(WindowRef, 'NewCWindow',
     (NullStorage, 'wStorage', InMode),
     (Rect_ptr, 'boundsRect', InMode),
diff --git a/Mac/Modules/win/winscan.py b/Mac/Modules/win/winscan.py
index dd3319b..20771b0 100644
--- a/Mac/Modules/win/winscan.py
+++ b/Mac/Modules/win/winscan.py
@@ -36,13 +36,10 @@
 	def makeblacklisttypes(self):
 		return [
 			'ProcPtr',
-			'GrafPtr',
-			'CGrafPtr',
-			'RgnHandle',
-##			'PicHandle',
 			'WCTabHandle',
 			'AuxWinHandle',
 			'PixPatHandle',
+			'DragGrayRgnUPP',
 			]
 
 	def makerepairinstructions(self):
diff --git a/Mac/Modules/win/winsupport.py b/Mac/Modules/win/winsupport.py
index 39d4b7a..9aed179 100644
--- a/Mac/Modules/win/winsupport.py
+++ b/Mac/Modules/win/winsupport.py
@@ -29,9 +29,10 @@
 WindowRef = WindowPtr
 WindowPeek = OpaqueByValueType("WindowPeek", OBJECTPREFIX)
 WindowPeek.passInput = lambda name: "(WindowPeek)(%s)" % name
-CGrafPtr = WindowPtr
+CGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
+GrafPtr = OpaqueByValueType("GrafPtr", "GrafObj")
 
-#RgnHandle = OpaqueByValueType("RgnHandle", "RgnObj")
+RgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
 PicHandle = OpaqueByValueType("PicHandle", "ResObj")
 
 includestuff = includestuff + """
@@ -83,7 +84,6 @@
 		""")
 	def outputFreeIt(self, itselfname):
 		Output("DisposeWindow(%s);", itselfname)
-
 # From here on it's basically all boiler plate...
 
 # Create the generator groups and link them