From 69e7f11aa871c9aac2011adf1cb1148a78f273bc Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Tue, 6 Feb 2001 16:14:54 +0000 Subject: [PATCH] Added DlgObj_WhichDialog, analoguous to WhichWindow, and use this to get at dialogs. --- Mac/Modules/dlg/Dlgmodule.c | 54 +++++++++++++++++++++++++---- Mac/Modules/dlg/dlgsupport.py | 64 ++++++++++++++++++++++++++++++++--- 2 files changed, 107 insertions(+), 11 deletions(-) diff --git a/Mac/Modules/dlg/Dlgmodule.c b/Mac/Modules/dlg/Dlgmodule.c index 3ab14a0c965..070283e5ffa 100644 --- a/Mac/Modules/dlg/Dlgmodule.c +++ b/Mac/Modules/dlg/Dlgmodule.c @@ -30,7 +30,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog, if (callback == NULL) return 0; /* Default behavior */ Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ - args = Py_BuildValue("O&O&", WinObj_WhichWindow, dialog, PyMac_BuildEventRecord, event); + args = Py_BuildValue("O&O&", DlgObj_WhichDialog, dialog, PyMac_BuildEventRecord, event); if (args == NULL) res = NULL; else { @@ -81,7 +81,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, if (Dlg_UserItemProc_callback == NULL) return; /* Default behavior */ Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ - args = Py_BuildValue("O&h", WinObj_WhichWindow, dialog, item); + args = Py_BuildValue("O&h", DlgObj_WhichDialog, dialog, item); if (args == NULL) res = NULL; else { @@ -96,7 +96,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, return; } -#if 1 +#if 0 /* ** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon. ** However, as they are still identical under MacOS9 Carbon this is a problem, even @@ -922,7 +922,7 @@ static PyMethodDef DlgObj_methods[] = { {NULL, NULL, 0} }; -PyMethodChain DlgObj_chain = { DlgObj_methods, &WinObj_chain }; +PyMethodChain DlgObj_chain = { DlgObj_methods, NULL }; static PyObject *DlgObj_getattr(self, name) DialogObject *self; @@ -933,11 +933,21 @@ static PyObject *DlgObj_getattr(self, name) #define DlgObj_setattr NULL -#define DlgObj_compare NULL +static int DlgObj_compare(self, other) + DialogObject *self, *other; +{ + if ( self->ob_itself > other->ob_itself ) return 1; + if ( self->ob_itself < other->ob_itself ) return -1; + return 0; +} #define DlgObj_repr NULL -#define DlgObj_hash NULL +static int DlgObj_hash(self) + DialogObject *self; +{ + return (int)self->ob_itself; +} PyTypeObject Dialog_Type = { PyObject_HEAD_INIT(&PyType_Type) @@ -1107,7 +1117,7 @@ static PyObject *Dlg_DialogSelect(_self, _args) &itemHit); _res = Py_BuildValue("bO&h", _rv, - WinObj_WhichWindow, theDialog, + DlgObj_WhichDialog, theDialog, itemHit); return _res; } @@ -1463,6 +1473,36 @@ DlgObj_ConvertToWindow(self) return GetDialogWindow(((DialogObject *)self)->ob_itself); return NULL; } +/* Return the object corresponding to the dialog, or None */ + +PyObject * +DlgObj_WhichDialog(d) + DialogPtr d; +{ + PyObject *it; + + if (d == NULL) { + it = Py_None; + Py_INCREF(it); + } else { + WindowPtr w = GetDialogWindow(d); + + it = (PyObject *) GetWRefCon(w); + if (it == NULL || ((DialogObject *)it)->ob_itself != d || !DlgObj_Check(it)) { +#if 0 + /* Should do this, but we don't have an ob_freeit for dialogs yet. */ + it = WinObj_New(w); + ((WindowObject *)it)->ob_freeit = NULL; +#else + it = Py_None; + Py_INCREF(it); +#endif + } else { + Py_INCREF(it); + } + } + return it; +} void initDlg() diff --git a/Mac/Modules/dlg/dlgsupport.py b/Mac/Modules/dlg/dlgsupport.py index e537c66c9ec..ab22e180ff6 100644 --- a/Mac/Modules/dlg/dlgsupport.py +++ b/Mac/Modules/dlg/dlgsupport.py @@ -53,7 +53,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog, if (callback == NULL) return 0; /* Default behavior */ Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ - args = Py_BuildValue("O&O&", WinObj_WhichWindow, dialog, PyMac_BuildEventRecord, event); + args = Py_BuildValue("O&O&", DlgObj_WhichDialog, dialog, PyMac_BuildEventRecord, event); if (args == NULL) res = NULL; else { @@ -104,7 +104,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, if (Dlg_UserItemProc_callback == NULL) return; /* Default behavior */ Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ - args = Py_BuildValue("O&h", WinObj_WhichWindow, dialog, item); + args = Py_BuildValue("O&h", DlgObj_WhichDialog, dialog, item); if (args == NULL) res = NULL; else { @@ -119,7 +119,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, return; } -#if 1 +#if 0 /* ** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon. ** However, as they are still identical under MacOS9 Carbon this is a problem, even @@ -144,6 +144,36 @@ DlgObj_ConvertToWindow(self) return GetDialogWindow(((DialogObject *)self)->ob_itself); return NULL; } +/* Return the object corresponding to the dialog, or None */ + +PyObject * +DlgObj_WhichDialog(d) + DialogPtr d; +{ + PyObject *it; + + if (d == NULL) { + it = Py_None; + Py_INCREF(it); + } else { + WindowPtr w = GetDialogWindow(d); + + it = (PyObject *) GetWRefCon(w); + if (it == NULL || ((DialogObject *)it)->ob_itself != d || !DlgObj_Check(it)) { +#if 0 + /* Should do this, but we don't have an ob_freeit for dialogs yet. */ + it = WinObj_New(w); + ((WindowObject *)it)->ob_freeit = NULL; +#else + it = Py_None; + Py_INCREF(it); +#endif + } else { + Py_INCREF(it); + } + } + return it; +} """ @@ -153,16 +183,42 @@ class MyObjectDefinition(GlobalObjectDefinition): GlobalObjectDefinition.__init__(self, name, prefix, itselftype) ## This won't work in Carbon, so we disable it for all MacPythons:-( ## But see the comment above:-(( - self.basechain = "&WinObj_chain" +## self.basechain = "&WinObj_chain" + def outputInitStructMembers(self): GlobalObjectDefinition.outputInitStructMembers(self) Output("SetWRefCon(GetDialogWindow(itself), (long)it);") + def outputCheckNewArg(self): Output("if (itself == NULL) return Py_None;") + def outputCheckConvertArg(self): Output("if (v == Py_None) { *p_itself = NULL; return 1; }") Output("if (PyInt_Check(v)) { *p_itself = (DialogPtr)PyInt_AsLong(v);") Output(" return 1; }") + + def outputCompare(self): + Output() + Output("static int %s_compare(self, other)", self.prefix) + IndentLevel() + Output("%s *self, *other;", self.objecttype) + DedentLevel() + OutLbrace() + Output("if ( self->ob_itself > other->ob_itself ) return 1;") + Output("if ( self->ob_itself < other->ob_itself ) return -1;") + Output("return 0;") + OutRbrace() + + def outputHash(self): + Output() + Output("static int %s_hash(self)", self.prefix) + IndentLevel() + Output("%s *self;", self.objecttype) + DedentLevel() + OutLbrace() + Output("return (int)self->ob_itself;") + OutRbrace() + def outputFreeIt(self, itselfname): Output("DisposeDialog(%s);", itselfname)