]> granicus.if.org Git - python/commitdiff
Fixed access to Quickdraw globals. Unfortunately, they now have to be
authorJack Jansen <jack.jansen@cwi.nl>
Mon, 29 Jan 1996 15:44:03 +0000 (15:44 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Mon, 29 Jan 1996 15:44:03 +0000 (15:44 +0000)
accessed as Qd.qd.xxxx

Mac/Modules/qd/Qdmodule.c
Mac/Modules/qd/qdsupport.py

index 54176f30878be15adeaa06cdb5e2585e7301d8ad..88cddaf7d30116996e6df13e25a8968f3f4186ac 100644 (file)
@@ -329,6 +329,81 @@ PyTypeObject BitMap_Type = {
 /* --------------------- End object type BitMap --------------------- */
 
 
+/* ------------------ Object type QDGlobalsAccess ------------------- */
+
+staticforward PyTypeObject QDGlobalsAccess_Type;
+
+#define QDGA_Check(x) ((x)->ob_type == &QDGlobalsAccess_Type)
+
+typedef struct QDGlobalsAccessObject {
+       PyObject_HEAD
+} QDGlobalsAccessObject;
+
+static PyObject *QDGA_New()
+{
+       QDGlobalsAccessObject *it;
+       it = PyObject_NEW(QDGlobalsAccessObject, &QDGlobalsAccess_Type);
+       if (it == NULL) return NULL;
+       return (PyObject *)it;
+}
+
+static void QDGA_dealloc(self)
+       QDGlobalsAccessObject *self;
+{
+       PyMem_DEL(self);
+}
+
+static PyMethodDef QDGA_methods[] = {
+       {NULL, NULL, 0}
+};
+
+static PyMethodChain QDGA_chain = { QDGA_methods, NULL };
+
+static PyObject *QDGA_getattr(self, name)
+       QDGlobalsAccessObject *self;
+       char *name;
+{
+
+               if ( strcmp(name, "arrow") == 0 )
+                       return PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
+               if ( strcmp(name, "black") == 0 ) 
+                       return PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
+               if ( strcmp(name, "white") == 0 ) 
+                       return PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
+               if ( strcmp(name, "gray") == 0 ) 
+                       return PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
+               if ( strcmp(name, "ltGray") == 0 ) 
+                       return PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
+               if ( strcmp(name, "dkGray") == 0 ) 
+                       return PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
+               if ( strcmp(name, "screenBits") == 0 ) 
+                       return BMObj_New(&qd.screenBits);
+               if ( strcmp(name, "thePort") == 0 ) 
+                       return GrafObj_New(qd.thePort);
+               if ( strcmp(name, "randSeed") == 0 ) 
+                       return Py_BuildValue("l", &qd.randSeed);
+                       
+       return Py_FindMethodInChain(&QDGA_chain, (PyObject *)self, name);
+}
+
+#define QDGA_setattr NULL
+
+staticforward PyTypeObject QDGlobalsAccess_Type = {
+       PyObject_HEAD_INIT(&PyType_Type)
+       0, /*ob_size*/
+       "QDGlobalsAccess", /*tp_name*/
+       sizeof(QDGlobalsAccessObject), /*tp_basicsize*/
+       0, /*tp_itemsize*/
+       /* methods */
+       (destructor) QDGA_dealloc, /*tp_dealloc*/
+       0, /*tp_print*/
+       (getattrfunc) QDGA_getattr, /*tp_getattr*/
+       (setattrfunc) QDGA_setattr, /*tp_setattr*/
+};
+
+/* ---------------- End object type QDGlobalsAccess ----------------- */
+
+
 static PyObject *Qd_SetPort(_self, _args)
        PyObject *_self;
        PyObject *_args;
@@ -3855,26 +3930,10 @@ void initQd()
 
        {
                PyObject *o;
-               
-               o = PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
-               if (o == NULL || PyDict_SetItemString(d, "arrow", o) != 0)
-                       Py_FatalError("can't initialize Qd.arrow");
-               o = PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
-               if (o == NULL || PyDict_SetItemString(d, "black", o) != 0)
-                       Py_FatalError("can't initialize Qd.black");
-               o = PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
-               if (o == NULL || PyDict_SetItemString(d, "white", o) != 0)
-                       Py_FatalError("can't initialize Qd.white");
-               o = PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
-               if (o == NULL || PyDict_SetItemString(d, "gray", o) != 0)
-                       Py_FatalError("can't initialize Qd.gray");
-               o = PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
-               if (o == NULL || PyDict_SetItemString(d, "ltGray", o) != 0)
-                       Py_FatalError("can't initialize Qd.ltGray");
-               o = PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
-               if (o == NULL || PyDict_SetItemString(d, "dkGray", o) != 0)
-                       Py_FatalError("can't initialize Qd.dkGray");
-               /* thePort, screenBits and randSeed still missing... */
+               
+               o = QDGA_New();
+               if (o == NULL || PyDict_SetItemString(d, "qd", o) != 0)
+                       Py_FatalError("can't initialize Qd.qd");
        }
 
 
index 39d98959aae888c08dd70bb407cb5c2cb5efc0a3..203f8c05b94b326cf4fbdadfd0935aaf7a5dd054 100644 (file)
@@ -101,26 +101,10 @@ PyObject *QdFI_New(itself)
 variablestuff = """
 {
        PyObject *o;
-       
-       o = PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
-       if (o == NULL || PyDict_SetItemString(d, "arrow", o) != 0)
-               Py_FatalError("can't initialize Qd.arrow");
-       o = PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
-       if (o == NULL || PyDict_SetItemString(d, "black", o) != 0)
-               Py_FatalError("can't initialize Qd.black");
-       o = PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
-       if (o == NULL || PyDict_SetItemString(d, "white", o) != 0)
-               Py_FatalError("can't initialize Qd.white");
-       o = PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
-       if (o == NULL || PyDict_SetItemString(d, "gray", o) != 0)
-               Py_FatalError("can't initialize Qd.gray");
-       o = PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
-       if (o == NULL || PyDict_SetItemString(d, "ltGray", o) != 0)
-               Py_FatalError("can't initialize Qd.ltGray");
-       o = PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
-       if (o == NULL || PyDict_SetItemString(d, "dkGray", o) != 0)
-               Py_FatalError("can't initialize Qd.dkGray");
-       /* thePort, screenBits and randSeed still missing... */
+       
+       o = QDGA_New();
+       if (o == NULL || PyDict_SetItemString(d, "qd", o) != 0)
+               Py_FatalError("can't initialize Qd.qd");
 }
 """
 
@@ -251,6 +235,46 @@ class MyBMObjectDefinition(GlobalObjectDefinition):
                if ( strcmp(name, "pixmap_data") == 0 )
                        return PyString_FromStringAndSize((char *)self->ob_itself, sizeof(PixMap));
                """)
+               
+# This object is instanciated once, and will access qd globals.
+class QDGlobalsAccessObjectDefinition(ObjectDefinition):
+       def outputStructMembers(self):
+               pass
+       def outputNew(self):
+               Output()
+               Output("%sPyObject *%s_New()", self.static, self.prefix)
+               OutLbrace()
+               Output("%s *it;", self.objecttype)
+               Output("it = PyObject_NEW(%s, &%s);", self.objecttype, self.typename)
+               Output("if (it == NULL) return NULL;")
+               Output("return (PyObject *)it;")
+               OutRbrace()
+       def outputConvert(self):
+               pass
+       def outputCleanupStructMembers(self):
+               pass
+
+       def outputGetattrHook(self):
+               Output("""
+       if ( strcmp(name, "arrow") == 0 )
+               return PyString_FromStringAndSize((char *)&qd.arrow, sizeof(qd.arrow));
+       if ( strcmp(name, "black") == 0 ) 
+               return PyString_FromStringAndSize((char *)&qd.black, sizeof(qd.black));
+       if ( strcmp(name, "white") == 0 ) 
+               return PyString_FromStringAndSize((char *)&qd.white, sizeof(qd.white));
+       if ( strcmp(name, "gray") == 0 ) 
+               return PyString_FromStringAndSize((char *)&qd.gray, sizeof(qd.gray));
+       if ( strcmp(name, "ltGray") == 0 ) 
+               return PyString_FromStringAndSize((char *)&qd.ltGray, sizeof(qd.ltGray));
+       if ( strcmp(name, "dkGray") == 0 ) 
+               return PyString_FromStringAndSize((char *)&qd.dkGray, sizeof(qd.dkGray));
+       if ( strcmp(name, "screenBits") == 0 ) 
+               return BMObj_New(&qd.screenBits);
+       if ( strcmp(name, "thePort") == 0 ) 
+               return GrafObj_New(qd.thePort);
+       if ( strcmp(name, "randSeed") == 0 ) 
+               return Py_BuildValue("l", &qd.randSeed);
+               """)
 
 # Create the generator groups and link them
 module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
@@ -262,6 +286,8 @@ gr_object = MyGRObjectDefinition("GrafPort", "GrafObj", "GrafPtr")
 module.addobject(gr_object)
 bm_object = MyBMObjectDefinition("BitMap", "BMObj", "BitMapPtr")
 module.addobject(bm_object)
+qd_object = QDGlobalsAccessObjectDefinition("QDGlobalsAccess", "QDGA", "XXXX")
+module.addobject(qd_object)
 
 
 # Create the generator classes used to populate the lists