diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 1999-03-13 23:07:32 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 1999-03-13 23:07:32 (GMT) |
commit | 8387af65a9152ae2b286b6955ea51157e54aafda (patch) | |
tree | 0b4037f25179bc3e2ef4363955d8470b2e3c440f /Mac | |
parent | d5138caba5fac644571cd7fa013d1ab0d4f867b6 (diff) | |
download | cpython-8387af65a9152ae2b286b6955ea51157e54aafda.zip cpython-8387af65a9152ae2b286b6955ea51157e54aafda.tar.gz cpython-8387af65a9152ae2b286b6955ea51157e54aafda.tar.bz2 |
If a control has no refcon pointing back to the Python object we create a new
Python object. This needs a new bgenObjectDefinition.py, which implements
compare and hash functions.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/ctl/Ctlmodule.c | 59 | ||||
-rw-r--r-- | Mac/Modules/ctl/ctlsupport.py | 27 |
2 files changed, 75 insertions, 11 deletions
diff --git a/Mac/Modules/ctl/Ctlmodule.c b/Mac/Modules/ctl/Ctlmodule.c index 42a82d9..895187e 100644 --- a/Mac/Modules/ctl/Ctlmodule.c +++ b/Mac/Modules/ctl/Ctlmodule.c @@ -1016,6 +1016,34 @@ static PyObject *CtlObj_getattr(self, name) #define CtlObj_setattr NULL +static int CtlObj_compare(self, other) + ControlObject *self, *other; +{ + unsigned long v, w; + + if (!CtlObj_Check((PyObject *)other)) + { + v=(unsigned long)self; + w=(unsigned long)other; + } + else + { + v=(unsigned long)self->ob_itself; + w=(unsigned long)other->ob_itself; + } + if( v < w ) return -1; + if( v > w ) return 1; + return 0; +} + +#define CtlObj_repr NULL + +static long CtlObj_hash(self) + ControlObject *self; +{ + return (long)self->ob_itself; +} + PyTypeObject Control_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, /*ob_size*/ @@ -1027,6 +1055,12 @@ PyTypeObject Control_Type = { 0, /*tp_print*/ (getattrfunc) CtlObj_getattr, /*tp_getattr*/ (setattrfunc) CtlObj_setattr, /*tp_setattr*/ + (cmpfunc) CtlObj_compare, /*tp_compare*/ + (reprfunc) CtlObj_repr, /*tp_repr*/ + (PyNumberMethods *)0, /* tp_as_number */ + (PySequenceMethods *)0, /* tp_as_sequence */ + (PyMappingMethods *)0, /* tp_as_mapping */ + (hashfunc) CtlObj_hash, /*tp_hash*/ }; /* -------------------- End object type Control --------------------- */ @@ -1388,18 +1422,33 @@ static PyMethodDef Ctl_methods[] = { +PyObject *CtlObj_NewUnmanaged(itself) + ControlHandle itself; +{ + ControlObject *it; + if (itself == NULL) return PyMac_Error(resNotFound); + it = PyObject_NEW(ControlObject, &Control_Type); + if (it == NULL) return NULL; + it->ob_itself = itself; + return (PyObject *)it; +} + PyObject * CtlObj_WhichControl(ControlHandle c) { PyObject *it; - /* XXX What if we find a control belonging to some other package? */ if (c == NULL) - it = NULL; - else - it = (PyObject *) GetControlReference(c); - if (it == NULL || ((ControlObject *)it)->ob_itself != c) it = Py_None; + else { + it = (PyObject *) GetControlReference(c); + /* + ** If the refcon is zero or doesn't point back to the Python object + ** the control is not ours. Return a temporary object. + */ + if (it == NULL || ((ControlObject *)it)->ob_itself != c) + return CtlObj_NewUnmanaged(c); + } Py_INCREF(it); return it; } diff --git a/Mac/Modules/ctl/ctlsupport.py b/Mac/Modules/ctl/ctlsupport.py index 3ba6778..8d966f9 100644 --- a/Mac/Modules/ctl/ctlsupport.py +++ b/Mac/Modules/ctl/ctlsupport.py @@ -89,18 +89,33 @@ extern void clrtrackfunc(void); /* forward */ """ finalstuff = finalstuff + """ +PyObject *CtlObj_NewUnmanaged(itself) + ControlHandle itself; +{ + ControlObject *it; + if (itself == NULL) return PyMac_Error(resNotFound); + it = PyObject_NEW(ControlObject, &Control_Type); + if (it == NULL) return NULL; + it->ob_itself = itself; + return (PyObject *)it; +} + PyObject * CtlObj_WhichControl(ControlHandle c) { PyObject *it; - /* XXX What if we find a control belonging to some other package? */ if (c == NULL) - it = NULL; - else - it = (PyObject *) GetControlReference(c); - if (it == NULL || ((ControlObject *)it)->ob_itself != c) it = Py_None; + else { + it = (PyObject *) GetControlReference(c); + /* + ** If the refcon is zero or doesn't point back to the Python object + ** the control is not ours. Return a temporary object. + */ + if (it == NULL || ((ControlObject *)it)->ob_itself != c) + return CtlObj_NewUnmanaged(c); + } Py_INCREF(it); return it; } @@ -147,7 +162,7 @@ initstuff = initstuff + """ mytracker_upp = NewControlActionProc(mytracker); """ -class MyObjectDefinition(GlobalObjectDefinition): +class MyObjectDefinition(ObjectIdentityMixin, GlobalObjectDefinition): def outputCheckNewArg(self): Output("if (itself == NULL) return PyMac_Error(resNotFound);") def outputInitStructMembers(self): |