mirror of
https://github.com/python/cpython.git
synced 2024-11-26 11:24:40 +08:00
added high level event interface (requires stdwin patch)
This commit is contained in:
parent
8f69179f97
commit
f74d4e2a0e
@ -493,15 +493,111 @@ MacOS_SndControl(PyObject *self, PyObject *args)
|
||||
return Py_BuildValue("(hhl)", c.cmd, c.param1, c.param2);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------*/
|
||||
/* STDWIN High Level Event interface */
|
||||
|
||||
#include <EPPC.h>
|
||||
#include <Events.h>
|
||||
|
||||
#ifdef USE_STDWIN
|
||||
|
||||
extern void (*_w_high_level_event_proc)(EventRecord *);
|
||||
|
||||
static PyObject *MacOS_HighLevelEventHandler = NULL;
|
||||
|
||||
static void
|
||||
MacOS_HighLevelEventProc(EventRecord *erp)
|
||||
{
|
||||
if (MacOS_HighLevelEventHandler != NULL) {
|
||||
PyObject *args = Py_BuildValue("(s#)", (char *)erp, (int)sizeof(*erp));
|
||||
PyObject *res;
|
||||
if (args == NULL)
|
||||
res = NULL;
|
||||
else {
|
||||
res = PyEval_CallObject(MacOS_HighLevelEventHandler, args);
|
||||
Py_DECREF(args);
|
||||
}
|
||||
if (res == NULL) {
|
||||
fprintf(stderr, "Exception in MacOS_HighLevelEventProc:\n");
|
||||
PyErr_Print();
|
||||
}
|
||||
else
|
||||
Py_DECREF(res);
|
||||
}
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
MacOS_SetHighLevelEventHandler(self, args)
|
||||
PyObject *self;
|
||||
PyObject *args;
|
||||
{
|
||||
PyObject *previous = MacOS_HighLevelEventHandler;
|
||||
PyObject *next = NULL;
|
||||
if (!PyArg_ParseTuple(args, "|O", &next))
|
||||
return NULL;
|
||||
if (next == Py_None)
|
||||
next = NULL;
|
||||
Py_INCREF(next);
|
||||
MacOS_HighLevelEventHandler = next;
|
||||
if (next == NULL)
|
||||
_w_high_level_event_proc = NULL;
|
||||
else
|
||||
_w_high_level_event_proc = MacOS_HighLevelEventProc;
|
||||
if (previous == NULL) {
|
||||
Py_INCREF(Py_None);
|
||||
previous = Py_None;
|
||||
}
|
||||
return previous;
|
||||
}
|
||||
|
||||
#endif /* USE_STDWIN */
|
||||
|
||||
static PyObject *
|
||||
MacOS_AcceptHighLevelEvent(self, args)
|
||||
PyObject *self;
|
||||
PyObject *args;
|
||||
{
|
||||
TargetID sender;
|
||||
unsigned long refcon;
|
||||
Ptr buf;
|
||||
unsigned long len;
|
||||
OSErr err;
|
||||
PyObject *res;
|
||||
|
||||
buf = NULL;
|
||||
len = 0;
|
||||
err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
|
||||
if (err == bufferIsSmall) {
|
||||
buf = malloc(len);
|
||||
if (buf == NULL)
|
||||
return PyErr_NoMemory();
|
||||
err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
|
||||
if (err != noErr) {
|
||||
free(buf);
|
||||
return PyErr_Mac(MacOS_Error, (int)err);
|
||||
}
|
||||
}
|
||||
else if (err != noErr)
|
||||
return PyErr_Mac(MacOS_Error, (int)err);
|
||||
res = Py_BuildValue("s#ls#",
|
||||
(char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
|
||||
free(buf);
|
||||
return res;
|
||||
}
|
||||
|
||||
static PyMethodDef MacOS_Methods[] = {
|
||||
{"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1},
|
||||
{"GetResource", MacOS_GetResource, 1},
|
||||
{"GetNamedResource", MacOS_GetNamedResource, 1},
|
||||
{"GetNamedResource", MacOS_GetNamedResource, 1},
|
||||
{"GetFileType", MacOS_GetFileType, 1},
|
||||
{"SetFileType", MacOS_SetFileType, 1},
|
||||
{"SndNewChannel", MacOS_SndNewChannel, 1},
|
||||
{"SndPlay", MacOS_SndPlay, 1},
|
||||
{"SndPlay", MacOS_SndPlay, 1},
|
||||
{"SndControl", MacOS_SndControl, 1},
|
||||
{NULL, NULL} /* Sentinel */
|
||||
#ifdef USE_STDWIN
|
||||
{"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
|
||||
#endif
|
||||
{NULL, NULL} /* Sentinel */
|
||||
};
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user