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

Skip to content

Commit bdd0747

Browse files
committed
Fixed access to Quickdraw globals. Unfortunately, they now have to be
accessed as Qd.qd.xxxx
1 parent 05a6d8f commit bdd0747

2 files changed

Lines changed: 125 additions & 40 deletions

File tree

Mac/Modules/qd/Qdmodule.c

Lines changed: 79 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,81 @@ PyTypeObject BitMap_Type = {
329329
/* --------------------- End object type BitMap --------------------- */
330330

331331

332+
/* ------------------ Object type QDGlobalsAccess ------------------- */
333+
334+
staticforward PyTypeObject QDGlobalsAccess_Type;
335+
336+
#define QDGA_Check(x) ((x)->ob_type == &QDGlobalsAccess_Type)
337+
338+
typedef struct QDGlobalsAccessObject {
339+
PyObject_HEAD
340+
} QDGlobalsAccessObject;
341+
342+
static PyObject *QDGA_New()
343+
{
344+
QDGlobalsAccessObject *it;
345+
it = PyObject_NEW(QDGlobalsAccessObject, &QDGlobalsAccess_Type);
346+
if (it == NULL) return NULL;
347+
return (PyObject *)it;
348+
}
349+
350+
static void QDGA_dealloc(self)
351+
QDGlobalsAccessObject *self;
352+
{
353+
PyMem_DEL(self);
354+
}
355+
356+
static PyMethodDef QDGA_methods[] = {
357+
{NULL, NULL, 0}
358+
};
359+
360+
static PyMethodChain QDGA_chain = { QDGA_methods, NULL };
361+
362+
static PyObject *QDGA_getattr(self, name)
363+
QDGlobalsAccessObject *self;
364+
char *name;
365+
{
366+
367+
if ( strcmp(name, "arrow") == 0 )
368+
return PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
369+
if ( strcmp(name, "black") == 0 )
370+
return PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
371+
if ( strcmp(name, "white") == 0 )
372+
return PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
373+
if ( strcmp(name, "gray") == 0 )
374+
return PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
375+
if ( strcmp(name, "ltGray") == 0 )
376+
return PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
377+
if ( strcmp(name, "dkGray") == 0 )
378+
return PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
379+
if ( strcmp(name, "screenBits") == 0 )
380+
return BMObj_New(&qd.screenBits);
381+
if ( strcmp(name, "thePort") == 0 )
382+
return GrafObj_New(qd.thePort);
383+
if ( strcmp(name, "randSeed") == 0 )
384+
return Py_BuildValue("l", &qd.randSeed);
385+
386+
return Py_FindMethodInChain(&QDGA_chain, (PyObject *)self, name);
387+
}
388+
389+
#define QDGA_setattr NULL
390+
391+
staticforward PyTypeObject QDGlobalsAccess_Type = {
392+
PyObject_HEAD_INIT(&PyType_Type)
393+
0, /*ob_size*/
394+
"QDGlobalsAccess", /*tp_name*/
395+
sizeof(QDGlobalsAccessObject), /*tp_basicsize*/
396+
0, /*tp_itemsize*/
397+
/* methods */
398+
(destructor) QDGA_dealloc, /*tp_dealloc*/
399+
0, /*tp_print*/
400+
(getattrfunc) QDGA_getattr, /*tp_getattr*/
401+
(setattrfunc) QDGA_setattr, /*tp_setattr*/
402+
};
403+
404+
/* ---------------- End object type QDGlobalsAccess ----------------- */
405+
406+
332407
static PyObject *Qd_SetPort(_self, _args)
333408
PyObject *_self;
334409
PyObject *_args;
@@ -3855,26 +3930,10 @@ void initQd()
38553930

38563931
{
38573932
PyObject *o;
3858-
3859-
o = PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
3860-
if (o == NULL || PyDict_SetItemString(d, "arrow", o) != 0)
3861-
Py_FatalError("can't initialize Qd.arrow");
3862-
o = PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
3863-
if (o == NULL || PyDict_SetItemString(d, "black", o) != 0)
3864-
Py_FatalError("can't initialize Qd.black");
3865-
o = PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
3866-
if (o == NULL || PyDict_SetItemString(d, "white", o) != 0)
3867-
Py_FatalError("can't initialize Qd.white");
3868-
o = PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
3869-
if (o == NULL || PyDict_SetItemString(d, "gray", o) != 0)
3870-
Py_FatalError("can't initialize Qd.gray");
3871-
o = PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
3872-
if (o == NULL || PyDict_SetItemString(d, "ltGray", o) != 0)
3873-
Py_FatalError("can't initialize Qd.ltGray");
3874-
o = PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
3875-
if (o == NULL || PyDict_SetItemString(d, "dkGray", o) != 0)
3876-
Py_FatalError("can't initialize Qd.dkGray");
3877-
/* thePort, screenBits and randSeed still missing... */
3933+
3934+
o = QDGA_New();
3935+
if (o == NULL || PyDict_SetItemString(d, "qd", o) != 0)
3936+
Py_FatalError("can't initialize Qd.qd");
38783937
}
38793938

38803939

Mac/Modules/qd/qdsupport.py

Lines changed: 46 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -101,26 +101,10 @@ def getargsCheck(self, name):
101101
variablestuff = """
102102
{
103103
PyObject *o;
104-
105-
o = PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
106-
if (o == NULL || PyDict_SetItemString(d, "arrow", o) != 0)
107-
Py_FatalError("can't initialize Qd.arrow");
108-
o = PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
109-
if (o == NULL || PyDict_SetItemString(d, "black", o) != 0)
110-
Py_FatalError("can't initialize Qd.black");
111-
o = PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
112-
if (o == NULL || PyDict_SetItemString(d, "white", o) != 0)
113-
Py_FatalError("can't initialize Qd.white");
114-
o = PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
115-
if (o == NULL || PyDict_SetItemString(d, "gray", o) != 0)
116-
Py_FatalError("can't initialize Qd.gray");
117-
o = PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
118-
if (o == NULL || PyDict_SetItemString(d, "ltGray", o) != 0)
119-
Py_FatalError("can't initialize Qd.ltGray");
120-
o = PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
121-
if (o == NULL || PyDict_SetItemString(d, "dkGray", o) != 0)
122-
Py_FatalError("can't initialize Qd.dkGray");
123-
/* thePort, screenBits and randSeed still missing... */
104+
105+
o = QDGA_New();
106+
if (o == NULL || PyDict_SetItemString(d, "qd", o) != 0)
107+
Py_FatalError("can't initialize Qd.qd");
124108
}
125109
"""
126110

@@ -251,6 +235,46 @@ def outputGetattrHook(self):
251235
if ( strcmp(name, "pixmap_data") == 0 )
252236
return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(PixMap));
253237
""")
238+
239+
# This object is instanciated once, and will access qd globals.
240+
class QDGlobalsAccessObjectDefinition(ObjectDefinition):
241+
def outputStructMembers(self):
242+
pass
243+
def outputNew(self):
244+
Output()
245+
Output("%sPyObject *%s_New()", self.static, self.prefix)
246+
OutLbrace()
247+
Output("%s *it;", self.objecttype)
248+
Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
249+
Output("if (it == NULL) return NULL;")
250+
Output("return (PyObject *)it;")
251+
OutRbrace()
252+
def outputConvert(self):
253+
pass
254+
def outputCleanupStructMembers(self):
255+
pass
256+
257+
def outputGetattrHook(self):
258+
Output("""
259+
if ( strcmp(name, "arrow") == 0 )
260+
return PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
261+
if ( strcmp(name, "black") == 0 )
262+
return PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
263+
if ( strcmp(name, "white") == 0 )
264+
return PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
265+
if ( strcmp(name, "gray") == 0 )
266+
return PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
267+
if ( strcmp(name, "ltGray") == 0 )
268+
return PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
269+
if ( strcmp(name, "dkGray") == 0 )
270+
return PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
271+
if ( strcmp(name, "screenBits") == 0 )
272+
return BMObj_New(&qd.screenBits);
273+
if ( strcmp(name, "thePort") == 0 )
274+
return GrafObj_New(qd.thePort);
275+
if ( strcmp(name, "randSeed") == 0 )
276+
return Py_BuildValue("l", &qd.randSeed);
277+
""")
254278

255279
# Create the generator groups and link them
256280
module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
@@ -262,6 +286,8 @@ def outputGetattrHook(self):
262286
module.addobject(gr_object)
263287
bm_object = MyBMObjectDefinition("BitMap", "BMObj", "BitMapPtr")
264288
module.addobject(bm_object)
289+
qd_object = QDGlobalsAccessObjectDefinition("QDGlobalsAccess", "QDGA", "XXXX")
290+
module.addobject(qd_object)
265291

266292

267293
# Create the generator classes used to populate the lists

0 commit comments

Comments
 (0)