ยปCore Development>Code coverage>Mac/Modules/dlg/dlgsupport.py

Python code coverage for Mac/Modules/dlg/dlgsupport.py

#countcontent
1n/a# This script generates the Dialogs interface for Python.
2n/a# It uses the "bgen" package to generate C code.
3n/a# It execs the file dlggen.py which contain the function definitions
4n/a# (dlggen.py was generated by dlgscan.py, scanning the <Dialogs.h> header file).
5n/a
6n/afrom macsupport import *
7n/a
8n/a# Create the type objects
9n/a
10n/aDialogPtr = OpaqueByValueType("DialogPtr", "DlgObj")
11n/aDialogRef = DialogPtr
12n/a
13n/a# An OptHandle is either a handle or None (in case NULL is passed in).
14n/a# This is needed for GetDialogItem().
15n/aOptHandle = OpaqueByValueType("Handle", "OptResObj")
16n/a
17n/aModalFilterProcPtr = InputOnlyType("PyObject*", "O")
18n/aModalFilterProcPtr.passInput = lambda name: "Dlg_PassFilterProc(%s)" % name
19n/aModalFilterUPP = ModalFilterProcPtr
20n/a
21n/aRgnHandle = OpaqueByValueType("RgnHandle", "ResObj")
22n/aTEHandle = OpaqueByValueType("TEHandle", "ResObj")
23n/aCGrafPtr = OpaqueByValueType("CGrafPtr", "GrafObj")
24n/a
25n/aDITLMethod = Type("DITLMethod", "h")
26n/aDialogItemIndex = Type("DialogItemIndex", "h")
27n/aDialogItemType = Type("DialogItemType", "h")
28n/aDialogItemIndexZeroBased = Type("DialogItemIndexZeroBased", "h")
29n/aAlertType = Type("AlertType", "h")
30n/aStringPtr = Str255
31n/aEventMask = Type("EventMask", "H")
32n/a
33n/aincludestuff = includestuff + """
34n/a#include <Carbon/Carbon.h>
35n/a
36n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
37n/aextern PyObject *_DlgObj_New(DialogRef);
38n/aextern PyObject *_DlgObj_WhichDialog(DialogRef);
39n/aextern int _DlgObj_Convert(PyObject *, DialogRef *);
40n/a
41n/a#define DlgObj_New _DlgObj_New
42n/a#define DlgObj_WhichDialog _DlgObj_WhichDialog
43n/a#define DlgObj_Convert _DlgObj_Convert
44n/a#endif
45n/a
46n/a/* XXX Shouldn't this be a stack? */
47n/astatic PyObject *Dlg_FilterProc_callback = NULL;
48n/a
49n/astatic pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog,
50n/a EventRecord *event,
51n/a short *itemHit)
52n/a{
53n/a Boolean rv;
54n/a PyObject *args, *res;
55n/a PyObject *callback = Dlg_FilterProc_callback;
56n/a if (callback == NULL)
57n/a return 0; /* Default behavior */
58n/a Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */
59n/a args = Py_BuildValue("O&O&", DlgObj_WhichDialog, dialog, PyMac_BuildEventRecord, event);
60n/a if (args == NULL)
61n/a res = NULL;
62n/a else {
63n/a res = PyEval_CallObject(callback, args);
64n/a Py_DECREF(args);
65n/a }
66n/a if (res == NULL) {
67n/a PySys_WriteStderr("Exception in Dialog Filter\\n");
68n/a PyErr_Print();
69n/a *itemHit = -1; /* Fake return item */
70n/a return 1; /* We handled it */
71n/a }
72n/a else {
73n/a Dlg_FilterProc_callback = callback;
74n/a if (PyInt_Check(res)) {
75n/a *itemHit = PyInt_AsLong(res);
76n/a rv = 1;
77n/a }
78n/a else
79n/a rv = PyObject_IsTrue(res);
80n/a }
81n/a Py_DECREF(res);
82n/a return rv;
83n/a}
84n/a
85n/astatic ModalFilterUPP
86n/aDlg_PassFilterProc(PyObject *callback)
87n/a{
88n/a PyObject *tmp = Dlg_FilterProc_callback;
89n/a static ModalFilterUPP UnivFilterUpp = NULL;
90n/a
91n/a Dlg_FilterProc_callback = NULL;
92n/a if (callback == Py_None) {
93n/a Py_XDECREF(tmp);
94n/a return NULL;
95n/a }
96n/a Py_INCREF(callback);
97n/a Dlg_FilterProc_callback = callback;
98n/a Py_XDECREF(tmp);
99n/a if ( UnivFilterUpp == NULL )
100n/a UnivFilterUpp = NewModalFilterUPP(&Dlg_UnivFilterProc);
101n/a return UnivFilterUpp;
102n/a}
103n/a
104n/astatic PyObject *Dlg_UserItemProc_callback = NULL;
105n/a
106n/astatic pascal void Dlg_UnivUserItemProc(DialogPtr dialog,
107n/a short item)
108n/a{
109n/a PyObject *args, *res;
110n/a
111n/a if (Dlg_UserItemProc_callback == NULL)
112n/a return; /* Default behavior */
113n/a Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */
114n/a args = Py_BuildValue("O&h", DlgObj_WhichDialog, dialog, item);
115n/a if (args == NULL)
116n/a res = NULL;
117n/a else {
118n/a res = PyEval_CallObject(Dlg_UserItemProc_callback, args);
119n/a Py_DECREF(args);
120n/a }
121n/a if (res == NULL) {
122n/a PySys_WriteStderr("Exception in Dialog UserItem proc\\n");
123n/a PyErr_Print();
124n/a }
125n/a Py_XDECREF(res);
126n/a return;
127n/a}
128n/a
129n/a#if 0
130n/a/*
131n/a** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon.
132n/a** However, as they are still identical under MacOS9 Carbon this is a problem, even
133n/a** if we neatly call GetDialogWindow() at the right places: there's one refcon field
134n/a** and it points to the DialogObject, so WinObj_WhichWindow will smartly return the
135n/a** dialog object, and therefore we still don't have a WindowObject.
136n/a** I'll leave the chaining code in place for now, with this comment to warn the
137n/a** unsuspecting victims (i.e. me, probably, in a few weeks:-)
138n/a*/
139n/aextern PyMethodChain WinObj_chain;
140n/a#endif
141n/a"""
142n/a
143n/afinalstuff = finalstuff + """
144n/a/* Return the WindowPtr corresponding to a DialogObject */
145n/a#if 0
146n/aWindowPtr
147n/aDlgObj_ConvertToWindow(PyObject *self)
148n/a{
149n/a if ( DlgObj_Check(self) )
150n/a return GetDialogWindow(((DialogObject *)self)->ob_itself);
151n/a return NULL;
152n/a}
153n/a#endif
154n/a/* Return the object corresponding to the dialog, or None */
155n/a
156n/aPyObject *
157n/aDlgObj_WhichDialog(DialogPtr d)
158n/a{
159n/a PyObject *it;
160n/a
161n/a if (d == NULL) {
162n/a it = Py_None;
163n/a Py_INCREF(it);
164n/a } else {
165n/a WindowPtr w = GetDialogWindow(d);
166n/a
167n/a it = (PyObject *) GetWRefCon(w);
168n/a if (it == NULL || ((DialogObject *)it)->ob_itself != d || !DlgObj_Check(it)) {
169n/a#if 0
170n/a /* Should do this, but we don't have an ob_freeit for dialogs yet. */
171n/a it = WinObj_New(w);
172n/a ((WindowObject *)it)->ob_freeit = NULL;
173n/a#else
174n/a it = Py_None;
175n/a Py_INCREF(it);
176n/a#endif
177n/a } else {
178n/a Py_INCREF(it);
179n/a }
180n/a }
181n/a return it;
182n/a}
183n/a"""
184n/a
185n/ainitstuff = initstuff + """
186n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(DialogPtr, DlgObj_New);
187n/a PyMac_INIT_TOOLBOX_OBJECT_NEW(DialogPtr, DlgObj_WhichDialog);
188n/a PyMac_INIT_TOOLBOX_OBJECT_CONVERT(DialogPtr, DlgObj_Convert);
189n/a"""
190n/a
191n/a
192n/a# Define a class which specializes our object definition
193n/aclass MyObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
194n/a def __init__(self, name, prefix = None, itselftype = None):
195n/a GlobalObjectDefinition.__init__(self, name, prefix, itselftype)
196n/a## This won't work in Carbon, so we disable it for all MacPythons:-(
197n/a## But see the comment above:-((
198n/a## self.basechain = "&WinObj_chain"
199n/a
200n/a def outputInitStructMembers(self):
201n/a GlobalObjectDefinition.outputInitStructMembers(self)
202n/a Output("SetWRefCon(GetDialogWindow(itself), (long)it);")
203n/a
204n/a def outputCheckNewArg(self):
205n/a Output("if (itself == NULL) { Py_INCREF(Py_None); return Py_None; }")
206n/a
207n/a def outputCheckConvertArg(self):
208n/a Output("if (v == Py_None) { *p_itself = NULL; return 1; }")
209n/a Output("if (PyInt_Check(v)) { *p_itself = (DialogPtr)PyInt_AsLong(v);")
210n/a Output(" return 1; }")
211n/a
212n/a def outputCompare(self):
213n/a Output()
214n/a Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype, self.objecttype)
215n/a OutLbrace()
216n/a Output("if ( self->ob_itself > other->ob_itself ) return 1;")
217n/a Output("if ( self->ob_itself < other->ob_itself ) return -1;")
218n/a Output("return 0;")
219n/a OutRbrace()
220n/a
221n/a def outputHash(self):
222n/a Output()
223n/a Output("static int %s_hash(%s *self)", self.prefix, self.objecttype)
224n/a OutLbrace()
225n/a Output("return (int)self->ob_itself;")
226n/a OutRbrace()
227n/a
228n/a def outputFreeIt(self, itselfname):
229n/a Output("DisposeDialog(%s);", itselfname)
230n/a
231n/a# Create the generator groups and link them
232n/amodule = MacModule('_Dlg', 'Dlg', includestuff, finalstuff, initstuff)
233n/aobject = MyObjectDefinition('Dialog', 'DlgObj', 'DialogPtr')
234n/amodule.addobject(object)
235n/a
236n/a# Create the generator classes used to populate the lists
237n/aFunction = OSErrWeakLinkFunctionGenerator
238n/aMethod = OSErrWeakLinkMethodGenerator
239n/a
240n/a# Create and populate the lists
241n/afunctions = []
242n/amethods = []
243n/aexecfile("dlggen.py")
244n/a
245n/a# add the populated lists to the generator groups
246n/afor f in functions: module.add(f)
247n/afor f in methods: object.add(f)
248n/a
249n/asetuseritembody = """
250n/a PyObject *new = NULL;
251n/a
252n/a
253n/a if (!PyArg_ParseTuple(_args, "|O", &new))
254n/a return NULL;
255n/a
256n/a if (Dlg_UserItemProc_callback && new && new != Py_None) {
257n/a PyErr_SetString(Dlg_Error, "Another UserItemProc is already installed");
258n/a return NULL;
259n/a }
260n/a
261n/a if (new == NULL || new == Py_None) {
262n/a new = NULL;
263n/a _res = Py_None;
264n/a Py_INCREF(Py_None);
265n/a } else {
266n/a Py_INCREF(new);
267n/a _res = Py_BuildValue("O&", ResObj_New, (Handle)NewUserItemUPP(Dlg_UnivUserItemProc));
268n/a }
269n/a
270n/a Dlg_UserItemProc_callback = new;
271n/a return _res;
272n/a"""
273n/af = ManualGenerator("SetUserItemHandler", setuseritembody)
274n/amodule.add(f)
275n/a
276n/a# generate output
277n/aSetOutputFileName('_Dlgmodule.c')
278n/amodule.generate()