ยปCore Development>Code coverage>Mac/Modules/carbonevt/CarbonEvtsupport.py

Python code coverage for Mac/Modules/carbonevt/CarbonEvtsupport.py

#countcontent
1n/a# IBCarbonsupport.py
2n/a
3n/afrom macsupport import *
4n/a
5n/afrom CarbonEvtscan import RefObjectTypes
6n/a
7n/a# where should this go? macsupport.py?
8n/aCFStringRef = OpaqueByValueType('CFStringRef')
9n/a
10n/afor typ in RefObjectTypes:
11n/a execstr = "%(name)s = OpaqueByValueType('%(name)s')" % {"name": typ}
12n/a exec execstr
13n/a
14n/a
15n/aif 0:
16n/a # these types will have no methods and will merely be opaque blobs
17n/a # should write getattr and setattr for them?
18n/a
19n/a StructObjectTypes = ["EventTypeSpec",
20n/a "HIPoint",
21n/a "HICommand",
22n/a "EventHotKeyID",
23n/a ]
24n/a
25n/a for typ in StructObjectTypes:
26n/a execstr = "%(name)s = OpaqueType('%(name)s')" % {"name": typ}
27n/a exec execstr
28n/a
29n/aEventHotKeyID = OpaqueByValueType("EventHotKeyID", "EventHotKeyID")
30n/aEventTypeSpec_ptr = OpaqueType("EventTypeSpec", "EventTypeSpec")
31n/a
32n/a# is this the right type for the void * in GetEventParameter
33n/a#void_ptr = FixedInputBufferType(1024)
34n/avoid_ptr = stringptr
35n/a# here are some types that are really other types
36n/a
37n/aclass MyVarInputBufferType(VarInputBufferType):
38n/a def passInput(self, name):
39n/a return "%s__len__, %s__in__" % (name, name)
40n/a
41n/aMyInBuffer = MyVarInputBufferType('char', 'long', 'l') # (buf, len)
42n/a
43n/aEventTime = double
44n/aEventTimeout = EventTime
45n/aEventTimerInterval = EventTime
46n/aEventAttributes = UInt32
47n/aEventParamName = OSType
48n/aEventParamType = OSType
49n/aEventPriority = SInt16
50n/aEventMask = UInt16
51n/a
52n/aEventComparatorUPP = FakeType("(EventComparatorUPP)0")
53n/aEventLoopTimerUPP = FakeType("(EventLoopTimerUPP)0")
54n/aEventHandlerUPP = FakeType("(EventHandlerUPP)0")
55n/aEventHandlerUPP = FakeType("(EventHandlerUPP)0")
56n/aEventComparatorProcPtr = FakeType("(EventComparatorProcPtr)0")
57n/aEventLoopTimerProcPtr = FakeType("(EventLoopTimerProcPtr)0")
58n/aEventHandlerProcPtr = FakeType("(EventHandlerProcPtr)0")
59n/a
60n/aCarbonEventsFunction = OSErrFunctionGenerator
61n/aCarbonEventsMethod = OSErrMethodGenerator
62n/a
63n/aclass EventHandlerRefMethod(OSErrMethodGenerator):
64n/a def precheck(self):
65n/a OutLbrace('if (_self->ob_itself == NULL)')
66n/a Output('PyErr_SetString(CarbonEvents_Error, "Handler has been removed");')
67n/a Output('return NULL;')
68n/a OutRbrace()
69n/a
70n/a
71n/aRgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
72n/aGrafPtr = OpaqueByValueType("GrafPtr", "GrafObj")
73n/aMouseTrackingResult = UInt16
74n/a
75n/a
76n/aincludestuff = includestuff + r"""
77n/a#include <Carbon/Carbon.h>
78n/a
79n/aextern int CFStringRef_New(CFStringRef *);
80n/a
81n/aextern int CFStringRef_Convert(PyObject *, CFStringRef *);
82n/aextern int CFBundleRef_Convert(PyObject *, CFBundleRef *);
83n/a
84n/aint EventTargetRef_Convert(PyObject *, EventTargetRef *);
85n/aPyObject *EventHandlerCallRef_New(EventHandlerCallRef itself);
86n/aPyObject *EventRef_New(EventRef itself);
87n/a
88n/a/********** EventTypeSpec *******/
89n/astatic PyObject*
90n/aEventTypeSpec_New(EventTypeSpec *in)
91n/a{
92n/a return Py_BuildValue("ll", in->eventClass, in->eventKind);
93n/a}
94n/a
95n/astatic int
96n/aEventTypeSpec_Convert(PyObject *v, EventTypeSpec *out)
97n/a{
98n/a if (PyArg_Parse(v, "(O&l)",
99n/a PyMac_GetOSType, &(out->eventClass),
100n/a &(out->eventKind)))
101n/a return 1;
102n/a return NULL;
103n/a}
104n/a
105n/a/********** end EventTypeSpec *******/
106n/a
107n/a/********** HIPoint *******/
108n/a
109n/a#if 0 /* XXX doesn't compile */
110n/astatic PyObject*
111n/aHIPoint_New(HIPoint *in)
112n/a{
113n/a return Py_BuildValue("ff", in->x, in->y);
114n/a}
115n/a
116n/astatic int
117n/aHIPoint_Convert(PyObject *v, HIPoint *out)
118n/a{
119n/a if (PyArg_ParseTuple(v, "ff", &(out->x), &(out->y)))
120n/a return 1;
121n/a return NULL;
122n/a}
123n/a#endif
124n/a
125n/a/********** end HIPoint *******/
126n/a
127n/a/********** EventHotKeyID *******/
128n/a
129n/astatic PyObject*
130n/aEventHotKeyID_New(EventHotKeyID *in)
131n/a{
132n/a return Py_BuildValue("ll", in->signature, in->id);
133n/a}
134n/a
135n/astatic int
136n/aEventHotKeyID_Convert(PyObject *v, EventHotKeyID *out)
137n/a{
138n/a if (PyArg_ParseTuple(v, "ll", &out->signature, &out->id))
139n/a return 1;
140n/a return NULL;
141n/a}
142n/a
143n/a/********** end EventHotKeyID *******/
144n/a
145n/a/******** myEventHandler ***********/
146n/a
147n/astatic EventHandlerUPP myEventHandlerUPP;
148n/a
149n/astatic pascal OSStatus
150n/amyEventHandler(EventHandlerCallRef handlerRef, EventRef event, void *outPyObject) {
151n/a PyObject *retValue;
152n/a int status;
153n/a
154n/a retValue = PyObject_CallFunction((PyObject *)outPyObject, "O&O&",
155n/a EventHandlerCallRef_New, handlerRef,
156n/a EventRef_New, event);
157n/a if (retValue == NULL) {
158n/a PySys_WriteStderr("Error in event handler callback:\n");
159n/a PyErr_Print(); /* this also clears the error */
160n/a status = noErr; /* complain? how? */
161n/a } else {
162n/a if (retValue == Py_None)
163n/a status = noErr;
164n/a else if (PyInt_Check(retValue)) {
165n/a status = PyInt_AsLong(retValue);
166n/a } else
167n/a status = noErr; /* wrong object type, complain? */
168n/a Py_DECREF(retValue);
169n/a }
170n/a
171n/a return status;
172n/a}
173n/a
174n/a/******** end myEventHandler ***********/
175n/a
176n/a"""
177n/a
178n/ainitstuff = initstuff + """
179n/amyEventHandlerUPP = NewEventHandlerUPP(myEventHandler);
180n/a"""
181n/amodule = MacModule('_CarbonEvt', 'CarbonEvents', includestuff, finalstuff, initstuff)
182n/a
183n/a
184n/a
185n/a
186n/aclass EventHandlerRefObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
187n/a def outputStructMembers(self):
188n/a Output("%s ob_itself;", self.itselftype)
189n/a Output("PyObject *ob_callback;")
190n/a def outputInitStructMembers(self):
191n/a Output("it->ob_itself = %sitself;", self.argref)
192n/a Output("it->ob_callback = NULL;")
193n/a def outputFreeIt(self, name):
194n/a OutLbrace("if (self->ob_itself != NULL)")
195n/a Output("RemoveEventHandler(self->ob_itself);")
196n/a Output("Py_DECREF(self->ob_callback);")
197n/a OutRbrace()
198n/a
199n/aclass MyGlobalObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
200n/a pass
201n/a
202n/afor typ in RefObjectTypes:
203n/a if typ == 'EventHandlerRef':
204n/a EventHandlerRefobject = EventHandlerRefObjectDefinition('EventHandlerRef')
205n/a else:
206n/a execstr = typ + 'object = MyGlobalObjectDefinition(typ)'
207n/a exec execstr
208n/a module.addobject(eval(typ + 'object'))
209n/a
210n/a
211n/afunctions = []
212n/afor typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEventsscan.py
213n/a # initialize the lists for carbongen to fill
214n/a execstr = typ + 'methods = []'
215n/a exec execstr
216n/a
217n/aexecfile('CarbonEventsgen.py')
218n/a
219n/a
220n/a
221n/afor f in functions: module.add(f) # add all the functions carboneventsgen put in the list
222n/a
223n/afor typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEventsscan.py
224n/a methods = eval(typ + 'methods') ## get a reference to the method list from the main namespace
225n/a obj = eval(typ + 'object') ## get a reference to the object
226n/a for m in methods: obj.add(m) ## add each method in the list to the object
227n/a
228n/a
229n/aremoveeventhandler = """
230n/aOSStatus _err;
231n/aif (_self->ob_itself == NULL) {
232n/a PyErr_SetString(CarbonEvents_Error, "Handler has been removed");
233n/a return NULL;
234n/a}
235n/aif (!PyArg_ParseTuple(_args, ""))
236n/a return NULL;
237n/a_err = RemoveEventHandler(_self->ob_itself);
238n/aif (_err != noErr) return PyMac_Error(_err);
239n/a_self->ob_itself = NULL;
240n/aPy_DECREF(_self->ob_callback);
241n/a_self->ob_callback = NULL;
242n/aPy_INCREF(Py_None);
243n/a_res = Py_None;
244n/areturn _res;"""
245n/a
246n/af = ManualGenerator("RemoveEventHandler", removeeventhandler);
247n/af.docstring = lambda: "() -> None"
248n/aEventHandlerRefobject.add(f)
249n/a
250n/a
251n/ainstalleventhandler = """
252n/aEventTypeSpec inSpec;
253n/aPyObject *callback;
254n/aEventHandlerRef outRef;
255n/aOSStatus _err;
256n/a
257n/aif (!PyArg_ParseTuple(_args, "O&O", EventTypeSpec_Convert, &inSpec, &callback))
258n/a return NULL;
259n/a
260n/a_err = InstallEventHandler(_self->ob_itself, myEventHandlerUPP, 1, &inSpec, (void *)callback, &outRef);
261n/aif (_err != noErr) return PyMac_Error(_err);
262n/a
263n/a_res = EventHandlerRef_New(outRef);
264n/aif (_res != NULL) {
265n/a ((EventHandlerRefObject*)_res)->ob_callback = callback;
266n/a Py_INCREF(callback);
267n/a}
268n/areturn _res;"""
269n/a
270n/af = ManualGenerator("InstallEventHandler", installeventhandler);
271n/af.docstring = lambda: "(EventTypeSpec inSpec, Method callback) -> (EventHandlerRef outRef)"
272n/aEventTargetRefobject.add(f)
273n/a
274n/a# 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.
275n/a
276n/ageteventparameter = """
277n/aUInt32 bufferSize;
278n/aEventParamName inName;
279n/aEventParamType inType;
280n/aOSErr _err;
281n/avoid * buffer;
282n/a
283n/aif (!PyArg_ParseTuple(_args, "O&O&", PyMac_GetOSType, &inName, PyMac_GetOSType, &inType))
284n/a return NULL;
285n/a
286n/a/* Figure out the size by passing a null buffer to GetEventParameter */
287n/a_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, 0, &bufferSize, NULL);
288n/a
289n/aif (_err != noErr)
290n/a return PyMac_Error(_err);
291n/abuffer = PyMem_NEW(char, bufferSize);
292n/aif (buffer == NULL)
293n/a return PyErr_NoMemory();
294n/a
295n/a_err = GetEventParameter(_self->ob_itself, inName, inType, NULL, bufferSize, NULL, buffer);
296n/a
297n/aif (_err != noErr) {
298n/a PyMem_DEL(buffer);
299n/a return PyMac_Error(_err);
300n/a}
301n/a_res = Py_BuildValue("s#", buffer, bufferSize);
302n/aPyMem_DEL(buffer);
303n/areturn _res;
304n/a"""
305n/a
306n/af = ManualGenerator("GetEventParameter", geteventparameter);
307n/af.docstring = lambda: "(EventParamName eventName, EventParamType eventType) -> (String eventParamData)"
308n/aEventRefobject.add(f)
309n/a
310n/aSetOutputFileName('_CarbonEvtmodule.c')
311n/amodule.generate()
312n/a
313n/a##import os
314n/a##os.system("python setup.py build")