PageRenderTime 346ms CodeModel.GetById 182ms app.highlight 10ms RepoModel.GetById 150ms app.codeStats 1ms

/Mac/Modules/dlg/dlgsupport.py

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