117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# This script generates a Python interface for an Apple Macintosh Manager.
217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# It uses the "bgen" package to generate C code.
317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# The function specifications are generated by scanning the mamager's header file,
417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# using the "scantools" package (customized for this particular manager).
517448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumimport string
717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
817448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Declarations that change for each manager
9182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMACHEADERFILE = 'Events.h'              # The Apple header file
10182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODNAME = '_Evt'                                # The name of the module
11182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTNAME = 'Event'                    # The basic name of the objects used here
12182b5aca27d376b08a2904bed42b751496f932f3Tim PetersKIND = 'Record'                         # Usually 'Ptr' or 'Handle'
1317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
1417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# The following is *usually* unchanged but may still require tuning
15182b5aca27d376b08a2904bed42b751496f932f3Tim PetersMODPREFIX = 'Evt'                       # The prefix for module-wide routines
16182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTTYPE = OBJECTNAME + KIND          # The C type used to represent them
17182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOBJECTPREFIX = MODPREFIX + 'Obj'        # The prefix for object methods
1817448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
19182b5aca27d376b08a2904bed42b751496f932f3Tim PetersOUTPUTFILE = MODNAME + "module.c"       # The file generated by this program
2017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
2117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfrom macsupport import *
2217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
2317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the type objects
2417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
25e26c263e71f9f46d3a6fc7b5c69b6a8e81c1997cGuido van Rossum#WindowPeek = OpaqueByValueType("WindowPeek", OBJECTPREFIX)
2617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
272b72417da0af053f6efc1b3574361744eb22d2a7Jack JansenRgnHandle = FakeType("(RgnHandle)0")
282b72417da0af053f6efc1b3574361744eb22d2a7Jack Jansen# XXXX Should be next, but this will break a lot of code...
292b72417da0af053f6efc1b3574361744eb22d2a7Jack Jansen# RgnHandle = OpaqueByValueType("RgnHandle", "OptResObj")
3017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
3117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumKeyMap = ArrayOutputBufferType("KeyMap")
320b13e7c1531351452703d6b9770194e53a3d3f69Jack Jansen##MacOSEventKind = Type("MacOSEventKind", "h") # Old-style
330b13e7c1531351452703d6b9770194e53a3d3f69Jack Jansen##MacOSEventMask = Type("MacOSEventMask", "h") # Old-style
340b13e7c1531351452703d6b9770194e53a3d3f69Jack JansenEventMask = Type("EventMask", "H")
350b13e7c1531351452703d6b9770194e53a3d3f69Jack JansenEventKind = Type("EventKind", "H")
3617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
3717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumincludestuff = includestuff + """
38fa77e1a1b1ec479600a0f3a1dbc3faf28140d31fJack Jansen#include <Carbon/Carbon.h>
39fa77e1a1b1ec479600a0f3a1dbc3faf28140d31fJack Jansen
4017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum"""
4117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
4217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# From here on it's basically all boiler plate...
4317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
4417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the generator groups and link them
4517448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossummodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
4617448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
4717448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create the generator classes used to populate the lists
48714d7268d5dcd9233bb8b3580cd9bce5a5a9fc50Jack JansenFunction = OSErrWeakLinkFunctionGenerator
49714d7268d5dcd9233bb8b3580cd9bce5a5a9fc50Jack Jansen##Method = OSErrWeakLinkMethodGenerator
5017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
5117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# Create and populate the lists
5217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfunctions = []
5317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumexecfile(INPUTFILE)
5417448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
55ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen# Move TickCount here, for convenience
56ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansenf = Function(UInt32, 'TickCount',
57ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen)
58ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansenfunctions.append(f)
59ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen
6017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# add the populated lists to the generator groups
6117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# (in a different wordl the scan program would generate this)
6217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossumfor f in functions: module.add(f)
6317448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum
6491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenWaitNextEvent_body = """
6591b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenBoolean _rv;
6691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenEventMask eventMask;
6791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenEventRecord theEvent;
6891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenUInt32 sleep;
6991b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack JansenHandle mouseregion = (Handle)0;
7091b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen
714fb67f46595e53f8637b8aea2afa5e852f26abc7Jack Jansenif (!PyArg_ParseTuple(_args, "Hl|O&",
7291b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                      &eventMask,
7391b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                      &sleep,
7491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                      OptResObj_Convert, &mouseregion))
75182b5aca27d376b08a2904bed42b751496f932f3Tim Peters        return NULL;
7691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen_rv = WaitNextEvent(eventMask,
7791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                    &theEvent,
7891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                    sleep,
7991b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                    (RgnHandle)mouseregion);
8091b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen_res = Py_BuildValue("bO&",
8191b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                     _rv,
8291b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen                     PyMac_BuildEventRecord, &theEvent);
8391b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenreturn _res;
8491b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen"""
8591b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenf = ManualGenerator("WaitNextEvent", WaitNextEvent_body);
8691b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenf.docstring = lambda: "(EventMask eventMask, UInt32 sleep [,RegionHandle]) -> (Boolean _rv, EventRecord theEvent)"
8791b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansenmodule.add(f)
8891b5bedf1cf35911e5b7e92af0bf4626dbd90da9Jack Jansen
89ec982e2739f6d7992d530c0940965f6eeb73a467Jack Jansen
9017448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossum# generate output (open the output file as late as possible)
9117448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van RossumSetOutputFileName(OUTPUTFILE)
9217448e24081eb713ac00d7bcb681f4f0d8abfcbfGuido van Rossummodule.generate()
93