179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# This script generates a Python interface for an Apple Macintosh Manager. 279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# It uses the "bgen" package to generate C code. 379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The function specifications are generated by scanning the mamager's header file, 479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# using the "scantools" package (customized for this particular manager). 579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum#error missing SetActionFilter 779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumimport string 979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Declarations that change for each manager 11182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_CG' # The name of the module 1279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The following is *usually* unchanged but may still require tuning 14182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'CG' # The prefix for module-wide routines 1579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner 16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = MODNAME + "module.c" # The file generated by this program 1779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 1879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumfrom macsupport import * 1979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2038b504e9e3ef3049815779e8c18b62f690ec4ed2Just van RossumCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj") 21dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van RossumRgnHandle = OpaqueByValueType("RgnHandle", "ResObj") 2279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Create the type objects 2479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumincludestuff = includestuff + """ 264f6c05857fba17d3c2f65bd2438a8d1cebdae43aJust van Rossum#include <ApplicationServices/ApplicationServices.h> 2779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 2879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumextern int GrafObj_Convert(PyObject *, GrafPtr *); 2979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 3079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum/* 3179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum** Manual converters 3279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum*/ 3379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 3479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGPoint_New(CGPoint *itself) 3579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 3679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 37182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return Py_BuildValue("(ff)", 38182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->x, 39182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->y); 4079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 4179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 4279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 4379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPoint_Convert(PyObject *v, CGPoint *p_itself) 4479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 45182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if( !PyArg_Parse(v, "(ff)", 46182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->x, 47182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->y) ) 48182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 0; 49182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 1; 5079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 5179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 5279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGRect_New(CGRect *itself) 5379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 5479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 55182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return Py_BuildValue("(ffff)", 56182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->origin.x, 57182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->origin.y, 58182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->size.width, 59182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->size.height); 6079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 6179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 6279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 6379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGRect_Convert(PyObject *v, CGRect *p_itself) 6479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 65182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if( !PyArg_Parse(v, "(ffff)", 66182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->origin.x, 67182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->origin.y, 68182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->size.width, 69182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->size.height) ) 70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 0; 71182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 1; 7279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 7379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 7479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumPyObject *CGAffineTransform_New(CGAffineTransform *itself) 7579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 7679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 77182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return Py_BuildValue("(ffffff)", 78182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->a, 79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->b, 80182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->c, 81182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->d, 82182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->tx, 83182b5aca27d376b08a2904bed42b751496f932f3Tim Peters itself->ty); 8479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 8579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 8679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumint 8779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGAffineTransform_Convert(PyObject *v, CGAffineTransform *p_itself) 8879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum{ 89182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if( !PyArg_Parse(v, "(ffffff)", 90182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->a, 91182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->b, 92182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->c, 93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->d, 94182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->tx, 95182b5aca27d376b08a2904bed42b751496f932f3Tim Peters &p_itself->ty) ) 96182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 0; 97182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return 1; 9879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum} 9979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum""" 10079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 10179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumclass MyOpaqueByValueType(OpaqueByValueType): 102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters """Sort of a mix between OpaqueByValueType and OpaqueType.""" 103182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def mkvalueArgs(self, name): 104182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return "%s, &%s" % (self.new, name) 10579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 10679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPoint = MyOpaqueByValueType('CGPoint', 'CGPoint') 10779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGRect = MyOpaqueByValueType('CGRect', 'CGRect') 10879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGAffineTransform = MyOpaqueByValueType('CGAffineTransform', 'CGAffineTransform') 10979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumchar_ptr = Type("char *", "s") 11179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGTextEncoding = int 11379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGLineCap = int 11479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGLineJoin = int 11579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGTextDrawingMode = int 11679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGPathDrawingMode = int 117da6081fccb71541004e3f36f57a9c0971a969e3bJack JansenCGInterpolationQuality = int 11879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 11979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# The real objects 12079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef = OpaqueByValueType("CGContextRef", "CGContextRefObj") 12179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12396cebde909bbb8034af576d8f31f465bbad90374Jack Jansenclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition): 124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def outputStructMembers(self): 125182b5aca27d376b08a2904bed42b751496f932f3Tim Peters ObjectDefinition.outputStructMembers(self) 126182b5aca27d376b08a2904bed42b751496f932f3Tim Peters def outputCleanupStructMembers(self): 127182b5aca27d376b08a2904bed42b751496f932f3Tim Peters Output("CGContextRelease(self->ob_itself);") 12879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 12979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# Create the generator groups and link them 13179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) 13279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef_object = MyObjectDefinition('CGContextRef', 'CGContextRefObj', 'CGContextRef') 13479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD object here 13779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 13879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.addobject(CGContextRef_object) 13979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumFunction = FunctionGenerator 14379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumMethod = MethodGenerator 14479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef_methods = [] 14679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 14779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD _methods initializer here 14879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumexecfile(INPUTFILE) 14979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 15038b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum# manual method, lives in Quickdraw.h 15138b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossumf = Method(void, 'SyncCGContextOriginWithPort', 15238b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum (CGContextRef, 'ctx', InMode), 15338b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum (CGrafPtr, 'port', InMode), 15438b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum) 15538b504e9e3ef3049815779e8c18b62f690ec4ed2Just van RossumCGContextRef_methods.append(f) 15638b504e9e3ef3049815779e8c18b62f690ec4ed2Just van Rossum 157dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum# manual method, lives in Quickdraw.h 158dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossumf = Method(void, 'ClipCGContextToRegion', 159dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (CGContextRef, 'ctx', InMode), 160dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (Rect, 'portRect', InMode), 161dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum (RgnHandle, 'region', InMode), 162dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum) 163dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van RossumCGContextRef_methods.append(f) 164dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum 165dd989e1ce795dac837b51e40883dbd6f38dd9dd8Just van Rossum 16679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCreateCGContextForPort_body = """\ 16779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumGrafPtr port; 16879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumCGContextRef ctx; 16979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumOSStatus _err; 17079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 17179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumif (!PyArg_ParseTuple(_args, "O&", GrafObj_Convert, &port)) 172182b5aca27d376b08a2904bed42b751496f932f3Tim Peters return NULL; 17379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 17479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum_err = CreateCGContextForPort(port, &ctx); 17579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumif (_err != noErr) 176182b5aca27d376b08a2904bed42b751496f932f3Tim Peters if (_err != noErr) return PyMac_Error(_err); 17779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum_res = Py_BuildValue("O&", CGContextRefObj_New, ctx); 17879e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumreturn _res; 17979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum""" 18079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumf = ManualGenerator("CreateCGContextForPort", CreateCGContextForPort_body); 18279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumf.docstring = lambda: "(CGrafPtr) -> CGContextRef" 18379e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.add(f) 18479e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18579e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 18679e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# ADD add forloop here 18779e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossumfor f in CGContextRef_methods: 188182b5aca27d376b08a2904bed42b751496f932f3Tim Peters CGContextRef_object.add(f) 18979e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum 19079e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossum# generate output (open the output file as late as possible) 19179e71f73e7a62c24e82dabdafcc9b3e71042de22Just van RossumSetOutputFileName(OUTPUTFILE) 19279e71f73e7a62c24e82dabdafcc9b3e71042de22Just van Rossummodule.generate() 193