more think/mw changes

This commit is contained in:
Guido van Rossum 1995-02-05 16:58:33 +00:00
parent d9ff26b1a0
commit b19a645b69
2 changed files with 71 additions and 12 deletions

View File

@ -30,21 +30,45 @@ extern int MenuObj_Convert(PyObject *, MenuHandle *);
extern PyObject *CtlObj_New(ControlHandle); extern PyObject *CtlObj_New(ControlHandle);
extern int CtlObj_Convert(PyObject *, ControlHandle *); extern int CtlObj_Convert(PyObject *, ControlHandle *);
extern PyObject *WinObj_WhichWindow(WindowPtr);
#include <AppleEvents.h> #include <AppleEvents.h>
#ifdef THINK_C #ifdef THINK_C
#define AEIdleProcPtr IdleProcPtr
#define AEFilterProcPtr EventFilterProcPtr #define AEFilterProcPtr EventFilterProcPtr
#define AEEventHandlerProcPtr EventHandlerProcPtr #define AEEventHandlerProcPtr EventHandlerProcPtr
#endif #endif
#ifndef __MWERKS__
/* Actually, this is "if not universal headers".
** I'm trying to setup the code here so that is easily automated,
** as follows:
** - Use the UPP in the source
** - for pre-universal headers, #define each UPP as the corresponding ProcPtr
** - for each routine we pass we declare a upp_xxx that
** we initialize to the correct value in the init routine.
*/
#define AEIdleUPP AEIdleProcPtr
#define AEFilterUPP AEFilterProcPtr
#define AEEventHandlerUPP AEEventHandlerProcPtr
#define NewAEIdleProc(x) (x)
#define NewAEFilterProc(x) (x)
#define NewAEEventHandlerProc(x) (x)
#endif
static pascal OSErr GenericEventHandler(); /* Forward */ static pascal OSErr GenericEventHandler(); /* Forward */
AEEventHandlerUPP upp_GenericEventHandler;
static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn) static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
{ {
(void) PyMac_Idle(); (void) PyMac_Idle();
return 0; return 0;
} }
AEIdleUPP upp_AEIdleProc;
static PyObject *AE_Error; static PyObject *AE_Error;
/* ----------------------- Object type AEDesc ----------------------- */ /* ----------------------- Object type AEDesc ----------------------- */
@ -733,8 +757,8 @@ static PyObject *AEDesc_AESend(_self, _args)
sendMode, sendMode,
sendPriority, sendPriority,
timeOutInTicks, timeOutInTicks,
AEIdleProc, upp_AEIdleProc,
(AEFilterProcPtr)0); (AEFilterUPP)0);
if (_err != noErr) return PyMac_Error(_err); if (_err != noErr) return PyMac_Error(_err);
_res = Py_BuildValue("O&", _res = Py_BuildValue("O&",
AEDesc_New, &reply); AEDesc_New, &reply);
@ -778,7 +802,7 @@ static PyObject *AEDesc_AEResumeTheCurrentEvent(_self, _args)
PyObject *_res = NULL; PyObject *_res = NULL;
OSErr _err; OSErr _err;
AppleEvent reply; AppleEvent reply;
AEEventHandlerProcPtr dispatcher__proc__ = GenericEventHandler; AEEventHandlerUPP dispatcher__proc__ = upp_GenericEventHandler;
PyObject *dispatcher; PyObject *dispatcher;
if (!PyArg_ParseTuple(_args, "O&O", if (!PyArg_ParseTuple(_args, "O&O",
AEDesc_Convert, &reply, AEDesc_Convert, &reply,
@ -790,6 +814,7 @@ static PyObject *AEDesc_AEResumeTheCurrentEvent(_self, _args)
if (_err != noErr) return PyMac_Error(_err); if (_err != noErr) return PyMac_Error(_err);
Py_INCREF(Py_None); Py_INCREF(Py_None);
_res = Py_None; _res = Py_None;
Py_INCREF(dispatcher); /* XXX leak, but needed */
return _res; return _res;
} }
@ -1103,7 +1128,7 @@ static PyObject *AE_AEInteractWithUser(_self, _args)
return NULL; return NULL;
_err = AEInteractWithUser(timeOutInTicks, _err = AEInteractWithUser(timeOutInTicks,
(NMRecPtr)0, (NMRecPtr)0,
AEIdleProc); upp_AEIdleProc);
if (_err != noErr) return PyMac_Error(_err); if (_err != noErr) return PyMac_Error(_err);
Py_INCREF(Py_None); Py_INCREF(Py_None);
_res = Py_None; _res = Py_None;
@ -1118,7 +1143,7 @@ static PyObject *AE_AEInstallEventHandler(_self, _args)
OSErr _err; OSErr _err;
AEEventClass theAEEventClass; AEEventClass theAEEventClass;
AEEventID theAEEventID; AEEventID theAEEventID;
AEEventHandlerProcPtr handler__proc__ = GenericEventHandler; AEEventHandlerUPP handler__proc__ = upp_GenericEventHandler;
PyObject *handler; PyObject *handler;
if (!PyArg_ParseTuple(_args, "O&O&O", if (!PyArg_ParseTuple(_args, "O&O&O",
PyMac_GetOSType, &theAEEventClass, PyMac_GetOSType, &theAEEventClass,
@ -1132,6 +1157,7 @@ static PyObject *AE_AEInstallEventHandler(_self, _args)
if (_err != noErr) return PyMac_Error(_err); if (_err != noErr) return PyMac_Error(_err);
Py_INCREF(Py_None); Py_INCREF(Py_None);
_res = Py_None; _res = Py_None;
Py_INCREF(handler); /* XXX leak, but needed */
return _res; return _res;
} }
@ -1149,7 +1175,7 @@ static PyObject *AE_AERemoveEventHandler(_self, _args)
return NULL; return NULL;
_err = AERemoveEventHandler(theAEEventClass, _err = AERemoveEventHandler(theAEEventClass,
theAEEventID, theAEEventID,
GenericEventHandler, upp_GenericEventHandler,
0); 0);
if (_err != noErr) return PyMac_Error(_err); if (_err != noErr) return PyMac_Error(_err);
Py_INCREF(Py_None); Py_INCREF(Py_None);
@ -1244,6 +1270,9 @@ void initAE()
upp_AEIdleProc = NewAEIdleProc(AEIdleProc);
upp_GenericEventHandler = NewAEEventHandlerProc(GenericEventHandler);
m = Py_InitModule("AE", AE_methods); m = Py_InitModule("AE", AE_methods);
d = PyModule_GetDict(m); d = PyModule_GetDict(m);

View File

@ -39,7 +39,7 @@ class EHType(Type):
def __init__(self, name = 'EventHandler', format = ''): def __init__(self, name = 'EventHandler', format = ''):
Type.__init__(self, name, format) Type.__init__(self, name, format)
def declare(self, name): def declare(self, name):
Output("AEEventHandlerProcPtr %s__proc__ = GenericEventHandler;", name) Output("AEEventHandlerUPP %s__proc__ = upp_GenericEventHandler;", name)
Output("PyObject *%s;", name) Output("PyObject *%s;", name)
def getargsFormat(self): def getargsFormat(self):
return "O" return "O"
@ -53,19 +53,21 @@ class EHType(Type):
return "O" return "O"
def mkvalueArgs(self, name): def mkvalueArgs(self, name):
return name return name
def cleanup(self, name):
Output("Py_INCREF(%s); /* XXX leak, but needed */", name)
class EHNoRefConType(EHType): class EHNoRefConType(EHType):
def passInput(self, name): def passInput(self, name):
return "GenericEventHandler" return "upp_GenericEventHandler"
EventHandler = EHType() EventHandler = EHType()
EventHandlerNoRefCon = EHNoRefConType() EventHandlerNoRefCon = EHNoRefConType()
IdleProcPtr = FakeType("AEIdleProc") IdleProcPtr = FakeType("upp_AEIdleProc")
EventFilterProcPtr = FakeType("(AEFilterProcPtr)0") EventFilterProcPtr = FakeType("(AEFilterUPP)0")
NMRecPtr = FakeType("(NMRecPtr)0") NMRecPtr = FakeType("(NMRecPtr)0")
EventHandlerProcPtr = FakeType("GenericEventHandler") EventHandlerProcPtr = FakeType("upp_GenericEventHandler")
AlwaysFalse = FakeType("0") AlwaysFalse = FakeType("0")
@ -77,16 +79,39 @@ includestuff = includestuff + """
#include <AppleEvents.h> #include <AppleEvents.h>
#ifdef THINK_C #ifdef THINK_C
#define AEIdleProcPtr IdleProcPtr
#define AEFilterProcPtr EventFilterProcPtr #define AEFilterProcPtr EventFilterProcPtr
#define AEEventHandlerProcPtr EventHandlerProcPtr #define AEEventHandlerProcPtr EventHandlerProcPtr
#endif #endif
#ifndef __MWERKS__
/* Actually, this is "if not universal headers".
** I'm trying to setup the code here so that is easily automated,
** as follows:
** - Use the UPP in the source
** - for pre-universal headers, #define each UPP as the corresponding ProcPtr
** - for each routine we pass we declare a upp_xxx that
** we initialize to the correct value in the init routine.
*/
#define AEIdleUPP AEIdleProcPtr
#define AEFilterUPP AEFilterProcPtr
#define AEEventHandlerUPP AEEventHandlerProcPtr
#define NewAEIdleProc(x) (x)
#define NewAEFilterProc(x) (x)
#define NewAEEventHandlerProc(x) (x)
#endif
static pascal OSErr GenericEventHandler(); /* Forward */ static pascal OSErr GenericEventHandler(); /* Forward */
AEEventHandlerUPP upp_GenericEventHandler;
static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn) static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
{ {
return !PyMac_Idle(); (void) PyMac_Idle();
return 0;
} }
AEIdleUPP upp_AEIdleProc;
""" """
finalstuff = finalstuff + """ finalstuff = finalstuff + """
@ -121,6 +146,11 @@ GenericEventHandler(const AppleEvent *request, AppleEvent *reply, long refcon)
} }
""" """
initstuff = initstuff + """
upp_AEIdleProc = NewAEIdleProc(AEIdleProc);
upp_GenericEventHandler = NewAEEventHandlerProc(GenericEventHandler);
"""
module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff) module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
class AEDescDefiniton(ObjectDefinition): class AEDescDefiniton(ObjectDefinition):