1a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# This script generates a Python interface for an Apple Macintosh Manager.
2a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# It uses the "bgen" package to generate C code.
3a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# The function specifications are generated by scanning the mamager's header file,
4a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# using the "scantools" package (customized for this particular manager).
5a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
6a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenimport string
7a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
8a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# Declarations that change for each manager
9182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMACHEADERFILE = 'Lists.h'               # The Apple header file
10182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_List'                               # The name of the module
11182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTNAME = 'List'                     # The basic name of the objects used here
12182b5aca27d376b08a2904bed42b751496f932f3Tim PetersKIND = 'Handle'                         # Usually 'Ptr' or 'Handle'
13a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
14a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# The following is *usually* unchanged but may still require tuning
15182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'List'                      # The prefix for module-wide routines
16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTTYPE = "ListHandle"               # The C type used to represent them
17182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTPREFIX = MODPREFIX + 'Obj'        # The prefix for object methods
18a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack JansenINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
19182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = MODNAME + "module.c"       # The file generated by this program
20a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
21a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenfrom macsupport import *
22a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
23a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# Create the type objects
2421f96872f20080d5f07a72ea4141fac137ac9b15Jack JansenListHandle = OpaqueByValueType("ListHandle", "ListObj")
25f7d5aa61d34cb7816ead2757860e5a66f7da0dcbJack JansenListRef = ListHandle # Obsolete, but used in Lists.h
26a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack JansenCell = Point
27f7d5aa61d34cb7816ead2757860e5a66f7da0dcbJack JansenListBounds = Rect
28f7d5aa61d34cb7816ead2757860e5a66f7da0dcbJack JansenListBounds_ptr = Rect_ptr
29dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
30dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumListDefSpec = ListDefSpec_ptr = OpaqueType("ListDefSpec", "PyMac_BuildListDefSpec", "PyMac_GetListDefSpec")
31dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
32182b5aca27d376b08a2904bed42b751496f932f3Tim PetersVarOutBufferShortsize = VarHeapOutputBufferType('char', 'short', 's')   # (buf, &len)
33182b5aca27d376b08a2904bed42b751496f932f3Tim PetersInBufferShortsize = VarInputBufferType('char', 'short', 's')            # (buf, len)
34a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
352b72417da0af053f6efc1b3574361744eb22d2a7Jack JansenRgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
36f7d5aa61d34cb7816ead2757860e5a66f7da0dcbJack JansenDataHandle = OpaqueByValueType("DataHandle", "ResObj")
37a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack JansenHandle = OpaqueByValueType("Handle", "ResObj")
38f7d5aa61d34cb7816ead2757860e5a66f7da0dcbJack JansenCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
392168e9d602cffbb6975a11353707a921455c05f7Jack JansenEventModifiers = Type("EventModifiers", "H")
40a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
41a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenincludestuff = includestuff + """
42fa77e1a1b1ec479600a0f3a1dbc3faf28140d31fJack Jansen#include <Carbon/Carbon.h>
430e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen
440e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen#ifdef USE_TOOLBOX_OBJECT_GLUE
450e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansenextern PyObject *_ListObj_New(ListHandle);
460e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansenextern int _ListObj_Convert(PyObject *, ListHandle *);
470e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen
480e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen#define ListObj_New _ListObj_New
490e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen#define ListObj_Convert _ListObj_Convert
500e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen#endif
510e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen
52a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansen#define as_List(x) ((ListHandle)x)
53a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansen#define as_Resource(lh) ((Handle)lh)
54dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
55dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumstatic ListDefUPP myListDefFunctionUPP;
56dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
57a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen"""
58a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
590e04eecdbf8467cf3fe055e41e96fa48507b998cJack Janseninitstuff = initstuff + """
60dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossummyListDefFunctionUPP = NewListDefUPP((ListDefProcPtr)myListDefFunction);
61dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
62dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumPyMac_INIT_TOOLBOX_OBJECT_NEW(ListHandle, ListObj_New);
63dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumPyMac_INIT_TOOLBOX_OBJECT_CONVERT(ListHandle, ListObj_Convert);
640e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen"""
650e04eecdbf8467cf3fe055e41e96fa48507b998cJack Jansen
66a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenclass ListMethodGenerator(MethodGenerator):
67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    """Similar to MethodGenerator, but has self as last argument"""
68a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def parseArgumentList(self, args):
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        args, a0 = args[:-1], args[-1]
71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        t0, n0, m0 = a0
72182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if m0 != InMode:
73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            raise ValueError, "method's 'self' must be 'InMode'"
74182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.itself = Variable(t0, "_self->ob_itself", SelfMode)
75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        FunctionGenerator.parseArgumentList(self, args)
76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self.argumentList.append(self.itself)
77a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
7896cebde909bbb8034af576d8f31f465bbad90374Jack Jansenclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    # XXXX Should inherit from Resource
80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    getsetlist = [(
81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'listFlags',
82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'return Py_BuildValue("l", (long)GetListFlags(self->ob_itself) & 0xff);',
83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'if (!PyArg_Parse(v, "B", &(*self->ob_itself)->listFlags)) return -1;',
84182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            None,
85182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            ), (
86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'selFlags',
87182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'return Py_BuildValue("l", (long)GetListSelectionFlags(self->ob_itself) & 0xff);',
88182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'if (!PyArg_Parse(v, "B", &(*self->ob_itself)->selFlags)) return -1;',
89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            None,
90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            ), (
91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'cellSize',
92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'return Py_BuildValue("O&", PyMac_BuildPoint, (*self->ob_itself)->cellSize);',
93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            'if (!PyArg_Parse(v, "O&", PyMac_GetPoint, &(*self->ob_itself)->cellSize)) return -1;',
94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            None
95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters            )]
96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputStructMembers(self):
98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        ObjectDefinition.outputStructMembers(self)
99182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("PyObject *ob_ldef_func;")
100182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("int ob_must_be_disposed;")
101182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputCheckNewArg(self):
103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("""if (itself == NULL) {
104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                PyErr_SetString(List_Error,"Cannot create null List");
105182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                return NULL;
106182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                        }""")
107182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
108182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputInitStructMembers(self):
109182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        ObjectDefinition.outputInitStructMembers(self)
110182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("it->ob_ldef_func = NULL;")
111182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("it->ob_must_be_disposed = 1;")
112182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("SetListRefCon(itself, (long)it);")
113182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
114182b5aca27d376b08a2904bed42b751496f932f3Tim Peters    def outputFreeIt(self, itselfname):
115182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("Py_XDECREF(self->ob_ldef_func);")
116182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("self->ob_ldef_func = NULL;")
117182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("SetListRefCon(self->ob_itself, (long)0);")
118182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        Output("if (self->ob_must_be_disposed && %s) LDispose(%s);", itselfname, itselfname)
119182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
120a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# From here on it's basically all boiler plate...
121a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
122dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumfinalstuff = finalstuff + """
123dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumstatic void myListDefFunction(SInt16 message,
124dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                       Boolean selected,
125dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                       Rect *cellRect,
126dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                       Cell theCell,
127dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                       SInt16 dataOffset,
128dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                       SInt16 dataLen,
129182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                       ListHandle theList)
130dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum{
131182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        PyObject *listDefFunc, *args, *rv=NULL;
132182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        ListObject *self;
133182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
134182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        self = (ListObject*)GetListRefCon(theList);
135182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if (self == NULL || self->ob_itself != theList)
136182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                return;  /* nothing we can do */
137182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        listDefFunc = self->ob_ldef_func;
138182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if (listDefFunc == NULL)
139182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                return;  /* nothing we can do */
140182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        args = Py_BuildValue("hbO&O&hhO", message,
141182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          selected,
142182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          PyMac_BuildRect, cellRect,
143182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          PyMac_BuildPoint, theCell,
144182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          dataOffset,
145182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          dataLen,
146182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                                          self);
147182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if (args != NULL) {
148182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                rv = PyEval_CallObject(listDefFunc, args);
149182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                Py_DECREF(args);
150182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        }
151182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        if (rv == NULL) {
152182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                PySys_WriteStderr("error in list definition callback:\\n");
153182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                PyErr_Print();
154182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        } else {
155182b5aca27d376b08a2904bed42b751496f932f3Tim Peters                Py_DECREF(rv);
156182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        }
157dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum}
158dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum"""
159dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
160a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# Create the generator groups and link them
161a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenmodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
162a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenobject = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE)
163a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenmodule.addobject(object)
164a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
165a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# Create the generator classes used to populate the lists
166a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack JansenFunction = FunctionGenerator
167a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack JansenMethod = ListMethodGenerator
168a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
169a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# Create and populate the lists
170a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenfunctions = []
171a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenmethods = []
172a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenexecfile(INPUTFILE)
173a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
174a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansen# Function to convert any handle to a list and vv.
1753d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansen##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode))
1763d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenas_List_body = """
1773d6163ad2d2ad255f19fb9a2c643c602b3155728Jack JansenHandle h;
1783d6163ad2d2ad255f19fb9a2c643c602b3155728Jack JansenListObject *l;
1793d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenif (!PyArg_ParseTuple(_args, "O&", ResObj_Convert, &h))
180182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return NULL;
1813d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenl = (ListObject *)ListObj_New(as_List(h));
1823d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenl->ob_must_be_disposed = 0;
183fd064863ebbe90adc24c60df4c3dbf630ec3a6c4Jack Jansen_res = Py_BuildValue("O", l);
184fd064863ebbe90adc24c60df4c3dbf630ec3a6c4Jack Jansenreturn _res;
1853d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansen"""
1863d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenf = ManualGenerator("as_List", as_List_body)
1873d6163ad2d2ad255f19fb9a2c643c602b3155728Jack Jansenf.docstring = lambda: "(Resource)->List.\nReturns List object (which is not auto-freed!)"
188a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansenfunctions.append(f)
189a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansen
190a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansenf = Method(Handle, 'as_Resource', (ListHandle, 'lh', InMode))
191a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansenmethods.append(f)
192a1a0fef2ea9ece5b16f9e6c37800778c64844e69Jack Jansen
193dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum# Manual generator for CreateCustomList, due to callback ideosyncracies
194dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumCreateCustomList_body = """\
195dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumRect rView;
196dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumRect dataBounds;
197dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumPoint cellSize;
198dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
199dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumPyObject *listDefFunc;
200dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumListDefSpec theSpec;
201dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumWindowPtr theWindow;
202dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumBoolean drawIt;
203dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumBoolean hasGrow;
204dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumBoolean scrollHoriz;
205dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumBoolean scrollVert;
206dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumListHandle outList;
207dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
208dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumif (!PyArg_ParseTuple(_args, "O&O&O&(iO)O&bbbb",
209dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      PyMac_GetRect, &rView,
210dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      PyMac_GetRect, &dataBounds,
211dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      PyMac_GetPoint, &cellSize,
212dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      &theSpec.defType, &listDefFunc,
213dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      WinObj_Convert, &theWindow,
214dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      &drawIt,
215dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      &hasGrow,
216dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      &scrollHoriz,
217dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                      &scrollVert))
218182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return NULL;
219dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
220dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
221182b5aca27d376b08a2904bed42b751496f932f3Tim Peters/* Carbon applications use the CreateCustomList API */
222dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumtheSpec.u.userProc = myListDefFunctionUPP;
223dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumCreateCustomList(&rView,
224dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 &dataBounds,
225dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 cellSize,
226dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 &theSpec,
227dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 theWindow,
228dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 drawIt,
229dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 hasGrow,
230dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 scrollHoriz,
231dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 scrollVert,
232dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum                 &outList);
233dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
234dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
235dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum_res = ListObj_New(outList);
236dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumif (_res == NULL)
237182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return NULL;
238dd4830ac1dffd95d1f17e080421483a9010720f6Just van RossumPy_INCREF(listDefFunc);
239dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum((ListObject*)_res)->ob_ldef_func = listDefFunc;
240dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumreturn _res;\
241dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum"""
242dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
243dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumf = ManualGenerator("CreateCustomList", CreateCustomList_body);
244dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossumf.docstring = lambda: "(Rect rView, Rect dataBounds, Point cellSize, ListDefSpec theSpec, WindowPtr theWindow, Boolean drawIt, Boolean hasGrow, Boolean scrollHoriz, Boolean scrollVert) -> (ListHandle outList)"
245dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossummodule.add(f)
246dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
247a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# add the populated lists to the generator groups
248a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# (in a different wordl the scan program would generate this)
249a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenfor f in functions: module.add(f)
250a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenfor f in methods: object.add(f)
251a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen
252dd4830ac1dffd95d1f17e080421483a9010720f6Just van Rossum
253a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansen# generate output (open the output file as late as possible)
254a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack JansenSetOutputFileName(OUTPUTFILE)
255a4b1d0030ef5ea1c45f29fe52048e4470740be68Jack Jansenmodule.generate()
256