Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8208676

Browse files
committed
Patch #494553 by Donovan Preston: initial implementation
for GetEventParameter().
1 parent 4befff9 commit 8208676

2 files changed

Lines changed: 84 additions & 4 deletions

File tree

Mac/Modules/carbonevt/CarbonEvtsupport.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ def precheck(self):
105105
static int
106106
EventTypeSpec_Convert(PyObject *v, EventTypeSpec *out)
107107
{
108-
if (PyArg_Parse(v, "(O&l)", PyMac_GetOSType, &(out->eventClass), &(out->eventKind)))
108+
if (PyArg_Parse(v, "(O&l)",
109+
PyMac_GetOSType, &(out->eventClass),
110+
&(out->eventKind)))
109111
return 1;
110112
return NULL;
111113
}
@@ -164,7 +166,9 @@ def precheck(self):
164166
PyEval_RestoreThread(_save);
165167
#endif /* USE_MAC_MP_MULTITHREADING */
166168
167-
retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&", EventHandlerCallRef_New, handlerRef, EventRef_New, event);
169+
retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&",
170+
EventHandlerCallRef_New, handlerRef,
171+
EventRef_New, event);
168172
if (retValue == NULL) {
169173
PySys_WriteStderr("Error in event handler callback:\n");
170174
PyErr_Print(); /* this also clears the error */
@@ -285,6 +289,42 @@ def outputFreeIt(self, name):
285289
f.docstring = lambda: "(EventTypeSpec inSpec, Method callback) -> (EventHandlerRef outRef)"
286290
EventTargetRefobject.add(f)
287291

292+
# This may not be the best, but at least it lets you get the raw data back into python as a string. You'll have to cut it up yourself and parse the result.
293+
294+
geteventparameter = """
295+
UInt32 bufferSize;
296+
EventParamName inName;
297+
EventParamType inType;
298+
OSErr _err;
299+
void * buffer;
300+
301+
if (!PyArg_ParseTuple(_args, "O&O&", PyMac_GetOSType, &inName, PyMac_GetOSType, &inType))
302+
return NULL;
303+
304+
/* Figure out the size by passing a null buffer to GetEventParameter */
305+
_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, 0, &bufferSize, NULL);
306+
307+
if (_err != noErr)
308+
return PyMac_Error(_err);
309+
buffer = PyMem_NEW(char, bufferSize);
310+
if (buffer == NULL)
311+
return PyErr_NoMemory();
312+
313+
_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, bufferSize, NULL, buffer);
314+
315+
if (_err != noErr) {
316+
PyMem_DEL(buffer);
317+
return PyMac_Error(_err);
318+
}
319+
_res = Py_BuildValue("s#", buffer, bufferSize);
320+
PyMem_DEL(buffer);
321+
return _res;
322+
"""
323+
324+
f = ManualGenerator("GetEventParameter", geteventparameter);
325+
f.docstring = lambda: "(EventParamName eventName, EventParamType eventType) -> (String eventParamData)"
326+
EventRefobject.add(f)
327+
288328
runappeventloop = """
289329
#if USE_MAC_MP_MULTITHREADING
290330
if (MPCreateCriticalRegion(&reentrantLock) != noErr) {

Mac/Modules/carbonevt/_CarbonEvtmodule.c

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,9 @@ EventTypeSpec_New(EventTypeSpec *in)
4747
static int
4848
EventTypeSpec_Convert(PyObject *v, EventTypeSpec *out)
4949
{
50-
if (PyArg_Parse(v, "(O&l)", PyMac_GetOSType, &(out->eventClass), &(out->eventKind)))
50+
if (PyArg_Parse(v, "(O&l)",
51+
PyMac_GetOSType, &(out->eventClass),
52+
&(out->eventKind)))
5153
return 1;
5254
return NULL;
5355
}
@@ -106,7 +108,9 @@ myEventHandler(EventHandlerCallRef handlerRef, EventRef event, void *outPyObject
106108
PyEval_RestoreThread(_save);
107109
#endif /* USE_MAC_MP_MULTITHREADING */
108110

109-
retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&", EventHandlerCallRef_New, handlerRef, EventRef_New, event);
111+
retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&",
112+
EventHandlerCallRef_New, handlerRef,
113+
EventRef_New, event);
110114
if (retValue == NULL) {
111115
PySys_WriteStderr("Error in event handler callback:\n");
112116
PyErr_Print(); /* this also clears the error */
@@ -340,6 +344,40 @@ static PyObject *EventRef_SendEventToEventTarget(EventRefObject *_self, PyObject
340344
return _res;
341345
}
342346

347+
static PyObject *EventRef_GetEventParameter(EventRefObject *_self, PyObject *_args)
348+
{
349+
PyObject *_res = NULL;
350+
351+
UInt32 bufferSize;
352+
EventParamName inName;
353+
EventParamType inType;
354+
OSErr _err;
355+
void * buffer;
356+
357+
if (!PyArg_ParseTuple(_args, "O&O&", PyMac_GetOSType, &inName, PyMac_GetOSType, &inType))
358+
return NULL;
359+
360+
/* Figure out the size by passing a null buffer to GetEventParameter */
361+
_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, 0, &bufferSize, NULL);
362+
363+
if (_err != noErr)
364+
return PyMac_Error(_err);
365+
buffer = PyMem_NEW(char, bufferSize);
366+
if (buffer == NULL)
367+
return PyErr_NoMemory();
368+
369+
_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, bufferSize, NULL, buffer);
370+
371+
if (_err != noErr) {
372+
PyMem_DEL(buffer);
373+
return PyMac_Error(_err);
374+
}
375+
_res = Py_BuildValue("s#", buffer, bufferSize);
376+
PyMem_DEL(buffer);
377+
return _res;
378+
379+
}
380+
343381
static PyMethodDef EventRef_methods[] = {
344382
{"RetainEvent", (PyCFunction)EventRef_RetainEvent, 1,
345383
"() -> (EventRef _rv)"},
@@ -365,6 +403,8 @@ static PyMethodDef EventRef_methods[] = {
365403
"(UInt16 inMask) -> (Boolean _rv)"},
366404
{"SendEventToEventTarget", (PyCFunction)EventRef_SendEventToEventTarget, 1,
367405
"(EventTargetRef inTarget) -> None"},
406+
{"GetEventParameter", (PyCFunction)EventRef_GetEventParameter, 1,
407+
"(EventParamName eventName, EventParamType eventType) -> (String eventParamData)"},
368408
{NULL, NULL, 0}
369409
};
370410

0 commit comments

Comments
 (0)