summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/Modules/ctl/Ctlmodule.c59
-rw-r--r--Mac/Modules/ctl/ctlsupport.py27
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):