Kaydet (Commit) 69e7f11a authored tarafından Jack Jansen's avatar Jack Jansen

Added DlgObj_WhichDialog, analoguous to WhichWindow, and use this to get at dialogs.

üst d6b2aeb1
...@@ -30,7 +30,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog, ...@@ -30,7 +30,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog,
if (callback == NULL) if (callback == NULL)
return 0; /* Default behavior */ return 0; /* Default behavior */
Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ 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) if (args == NULL)
res = NULL; res = NULL;
else { else {
...@@ -81,7 +81,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, ...@@ -81,7 +81,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog,
if (Dlg_UserItemProc_callback == NULL) if (Dlg_UserItemProc_callback == NULL)
return; /* Default behavior */ return; /* Default behavior */
Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ 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) if (args == NULL)
res = NULL; res = NULL;
else { else {
...@@ -96,7 +96,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, ...@@ -96,7 +96,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog,
return; return;
} }
#if 1 #if 0
/* /*
** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon. ** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon.
** However, as they are still identical under MacOS9 Carbon this is a problem, even ** However, as they are still identical under MacOS9 Carbon this is a problem, even
...@@ -922,7 +922,7 @@ static PyMethodDef DlgObj_methods[] = { ...@@ -922,7 +922,7 @@ static PyMethodDef DlgObj_methods[] = {
{NULL, NULL, 0} {NULL, NULL, 0}
}; };
PyMethodChain DlgObj_chain = { DlgObj_methods, &WinObj_chain }; PyMethodChain DlgObj_chain = { DlgObj_methods, NULL };
static PyObject *DlgObj_getattr(self, name) static PyObject *DlgObj_getattr(self, name)
DialogObject *self; DialogObject *self;
...@@ -933,11 +933,21 @@ static PyObject *DlgObj_getattr(self, name) ...@@ -933,11 +933,21 @@ static PyObject *DlgObj_getattr(self, name)
#define DlgObj_setattr NULL #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_repr NULL
#define DlgObj_hash NULL static int DlgObj_hash(self)
DialogObject *self;
{
return (int)self->ob_itself;
}
PyTypeObject Dialog_Type = { PyTypeObject Dialog_Type = {
PyObject_HEAD_INIT(&PyType_Type) PyObject_HEAD_INIT(&PyType_Type)
...@@ -1107,7 +1117,7 @@ static PyObject *Dlg_DialogSelect(_self, _args) ...@@ -1107,7 +1117,7 @@ static PyObject *Dlg_DialogSelect(_self, _args)
&itemHit); &itemHit);
_res = Py_BuildValue("bO&h", _res = Py_BuildValue("bO&h",
_rv, _rv,
WinObj_WhichWindow, theDialog, DlgObj_WhichDialog, theDialog,
itemHit); itemHit);
return _res; return _res;
} }
...@@ -1463,6 +1473,36 @@ DlgObj_ConvertToWindow(self) ...@@ -1463,6 +1473,36 @@ DlgObj_ConvertToWindow(self)
return GetDialogWindow(((DialogObject *)self)->ob_itself); return GetDialogWindow(((DialogObject *)self)->ob_itself);
return NULL; 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() void initDlg()
......
...@@ -53,7 +53,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog, ...@@ -53,7 +53,7 @@ static pascal Boolean Dlg_UnivFilterProc(DialogPtr dialog,
if (callback == NULL) if (callback == NULL)
return 0; /* Default behavior */ return 0; /* Default behavior */
Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ 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) if (args == NULL)
res = NULL; res = NULL;
else { else {
...@@ -104,7 +104,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, ...@@ -104,7 +104,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog,
if (Dlg_UserItemProc_callback == NULL) if (Dlg_UserItemProc_callback == NULL)
return; /* Default behavior */ return; /* Default behavior */
Dlg_FilterProc_callback = NULL; /* We'll restore it when call successful */ 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) if (args == NULL)
res = NULL; res = NULL;
else { else {
...@@ -119,7 +119,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog, ...@@ -119,7 +119,7 @@ static pascal void Dlg_UnivUserItemProc(DialogPtr dialog,
return; return;
} }
#if 1 #if 0
/* /*
** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon. ** Treating DialogObjects as WindowObjects is (I think) illegal under Carbon.
** However, as they are still identical under MacOS9 Carbon this is a problem, even ** However, as they are still identical under MacOS9 Carbon this is a problem, even
...@@ -144,6 +144,36 @@ DlgObj_ConvertToWindow(self) ...@@ -144,6 +144,36 @@ DlgObj_ConvertToWindow(self)
return GetDialogWindow(((DialogObject *)self)->ob_itself); return GetDialogWindow(((DialogObject *)self)->ob_itself);
return NULL; 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): ...@@ -153,16 +183,42 @@ class MyObjectDefinition(GlobalObjectDefinition):
GlobalObjectDefinition.__init__(self, name, prefix, itselftype) GlobalObjectDefinition.__init__(self, name, prefix, itselftype)
## This won't work in Carbon, so we disable it for all MacPythons:-( ## This won't work in Carbon, so we disable it for all MacPythons:-(
## But see the comment above:-(( ## But see the comment above:-((
self.basechain = "&WinObj_chain" ## self.basechain = "&WinObj_chain"
def outputInitStructMembers(self): def outputInitStructMembers(self):
GlobalObjectDefinition.outputInitStructMembers(self) GlobalObjectDefinition.outputInitStructMembers(self)
Output("SetWRefCon(GetDialogWindow(itself), (long)it);") Output("SetWRefCon(GetDialogWindow(itself), (long)it);")
def outputCheckNewArg(self): def outputCheckNewArg(self):
Output("if (itself == NULL) return Py_None;") Output("if (itself == NULL) return Py_None;")
def outputCheckConvertArg(self): def outputCheckConvertArg(self):
Output("if (v == Py_None) { *p_itself = NULL; return 1; }") Output("if (v == Py_None) { *p_itself = NULL; return 1; }")
Output("if (PyInt_Check(v)) { *p_itself = (DialogPtr)PyInt_AsLong(v);") Output("if (PyInt_Check(v)) { *p_itself = (DialogPtr)PyInt_AsLong(v);")
Output(" return 1; }") 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): def outputFreeIt(self, itselfname):
Output("DisposeDialog(%s);", itselfname) Output("DisposeDialog(%s);", itselfname)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment