169 lines
4.4 KiB
Python
169 lines
4.4 KiB
Python
|
# This script will generate the AppleEvents interface for Python.
|
||
|
# It uses the "bgen" package to generate C code.
|
||
|
# It execs the file aegen.py which contain the function definitions
|
||
|
# (aegen.py was generated by aescan.py, scanning the <AppleEvents.h> header file).
|
||
|
|
||
|
|
||
|
from macsupport import *
|
||
|
|
||
|
|
||
|
AEArrayType = Type("AEArrayType", "c")
|
||
|
AESendMode = Type("AESendMode", "l")
|
||
|
AESendPriority = Type("AESendPriority", "h")
|
||
|
AEInteractAllowed = Type("AEInteractAllowed", "b")
|
||
|
|
||
|
|
||
|
AEEventClass = OSTypeType('AEEventClass')
|
||
|
AEEventID = OSTypeType('AEEventID')
|
||
|
AEKeyword = OSTypeType('AEKeyword')
|
||
|
DescType = OSTypeType('DescType')
|
||
|
|
||
|
|
||
|
AEDesc = OpaqueType('AEDesc')
|
||
|
AEDesc_ptr = OpaqueType('AEDesc')
|
||
|
|
||
|
AEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
|
||
|
AEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
|
||
|
|
||
|
AEDescList = OpaqueType('AEDescList', 'AEDesc')
|
||
|
AEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
|
||
|
|
||
|
AERecord = OpaqueType('AERecord', 'AEDesc')
|
||
|
AERecord_ptr = OpaqueType('AERecord', 'AEDesc')
|
||
|
|
||
|
AppleEvent = OpaqueType('AppleEvent', 'AEDesc')
|
||
|
AppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
|
||
|
|
||
|
|
||
|
class EHType(Type):
|
||
|
def __init__(self, name = 'EventHandler', format = ''):
|
||
|
Type.__init__(self, name, format)
|
||
|
def declare(self, name):
|
||
|
Output("AEEventHandlerProcPtr %s__proc__ = GenericEventHandler;", name)
|
||
|
Output("PyObject *%s;", name)
|
||
|
def getargsFormat(self):
|
||
|
return "O"
|
||
|
def getargsArgs(self, name):
|
||
|
return "&%s" % name
|
||
|
def passInput(self, name):
|
||
|
return "%s__proc__, (long)%s" % (name, name)
|
||
|
def passOutput(self, name):
|
||
|
return "&%s__proc__, (long *)&%s" % (name, name)
|
||
|
def mkvalueFormat(self):
|
||
|
return "O"
|
||
|
def mkvalueArgs(self, name):
|
||
|
return name
|
||
|
|
||
|
class EHNoRefConType(EHType):
|
||
|
def passInput(self, name):
|
||
|
return "GenericEventHandler"
|
||
|
|
||
|
EventHandler = EHType()
|
||
|
EventHandlerNoRefCon = EHNoRefConType()
|
||
|
|
||
|
|
||
|
IdleProcPtr = FakeType("AEIdleProc")
|
||
|
EventFilterProcPtr = FakeType("(AEFilterProcPtr)0")
|
||
|
NMRecPtr = FakeType("(NMRecPtr)0")
|
||
|
EventHandlerProcPtr = FakeType("GenericEventHandler")
|
||
|
AlwaysFalse = FakeType("0")
|
||
|
|
||
|
|
||
|
AEFunction = OSErrFunctionGenerator
|
||
|
AEMethod = OSErrMethodGenerator
|
||
|
|
||
|
|
||
|
includestuff = includestuff + """
|
||
|
#include <AppleEvents.h>
|
||
|
|
||
|
#ifdef THINK_C
|
||
|
#define AEFilterProcPtr EventFilterProcPtr
|
||
|
#define AEEventHandlerProcPtr EventHandlerProcPtr
|
||
|
#endif
|
||
|
|
||
|
static pascal OSErr GenericEventHandler(); /* Forward */
|
||
|
|
||
|
static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
|
||
|
{
|
||
|
return !PyMac_Idle();
|
||
|
}
|
||
|
"""
|
||
|
|
||
|
finalstuff = finalstuff + """
|
||
|
static pascal OSErr
|
||
|
GenericEventHandler(const AppleEvent *request, AppleEvent *reply, long refcon)
|
||
|
{
|
||
|
PyObject *handler = (PyObject *)refcon;
|
||
|
AEDescObject *requestObject, *replyObject;
|
||
|
PyObject *args, *res;
|
||
|
if ((requestObject = (AEDescObject *)AEDesc_New(request)) == NULL) {
|
||
|
return -1;
|
||
|
}
|
||
|
if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) {
|
||
|
Py_DECREF(requestObject);
|
||
|
return -1;
|
||
|
}
|
||
|
if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) {
|
||
|
Py_DECREF(requestObject);
|
||
|
Py_DECREF(replyObject);
|
||
|
return -1;
|
||
|
}
|
||
|
res = PyEval_CallObject(handler, args);
|
||
|
requestObject->ob_itself.descriptorType = 'null';
|
||
|
requestObject->ob_itself.dataHandle = NULL;
|
||
|
replyObject->ob_itself.descriptorType = 'null';
|
||
|
replyObject->ob_itself.dataHandle = NULL;
|
||
|
Py_DECREF(args);
|
||
|
if (res == NULL)
|
||
|
return -1;
|
||
|
Py_DECREF(res);
|
||
|
return noErr;
|
||
|
}
|
||
|
"""
|
||
|
|
||
|
module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
|
||
|
|
||
|
class AEDescDefiniton(ObjectDefinition):
|
||
|
|
||
|
def __init__(self, name, prefix = None, itselftype = None):
|
||
|
ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
|
||
|
self.argref = "*"
|
||
|
|
||
|
def outputFreeIt(self, name):
|
||
|
Output("AEDisposeDesc(&%s);", name)
|
||
|
|
||
|
def outputGetattrHook(self):
|
||
|
Output("""
|
||
|
if (strcmp(name, "type") == 0)
|
||
|
return PyMac_BuildOSType(self->ob_itself.descriptorType);
|
||
|
if (strcmp(name, "data") == 0) {
|
||
|
PyObject *res;
|
||
|
char state;
|
||
|
state = HGetState(self->ob_itself.dataHandle);
|
||
|
HLock(self->ob_itself.dataHandle);
|
||
|
res = PyString_FromStringAndSize(
|
||
|
*self->ob_itself.dataHandle,
|
||
|
GetHandleSize(self->ob_itself.dataHandle));
|
||
|
HUnlock(self->ob_itself.dataHandle);
|
||
|
HSetState(self->ob_itself.dataHandle, state);
|
||
|
return res;
|
||
|
}
|
||
|
if (strcmp(name, "__members__") == 0)
|
||
|
return Py_BuildValue("[ss]", "data", "type");
|
||
|
""")
|
||
|
|
||
|
|
||
|
aedescobject = AEDescDefiniton('AEDesc')
|
||
|
module.addobject(aedescobject)
|
||
|
|
||
|
functions = []
|
||
|
aedescmethods = []
|
||
|
|
||
|
execfile('aegen.py')
|
||
|
|
||
|
for f in functions: module.add(f)
|
||
|
for f in aedescmethods: aedescobject.add(f)
|
||
|
|
||
|
SetOutputFileName('AEmodule.c')
|
||
|
module.generate()
|