From 0aee0e61f8e7b1b112500aa3ae1edb7bcb5e28b1 Mon Sep 17 00:00:00 2001 From: Jack Jansen Date: Fri, 25 Aug 2000 22:17:51 +0000 Subject: [PATCH] Window objects now also have an AutoDispose funcpointer (set for our windows, cleared for foreign windows). Needed mainly for Carbon (where we don't know about the windows belonging to our dialogs). Fixed a few calls that return an ExistingWindow. --- Mac/Modules/win/Winmodule.c | 36 ++++++++++++++++++++-------- Mac/Modules/win/winscan.py | 4 ++++ Mac/Modules/win/winsupport.py | 44 ++++++++++++++++++++++++----------- 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/Mac/Modules/win/Winmodule.c b/Mac/Modules/win/Winmodule.c index f7890f17bd..c95e06b48f 100644 --- a/Mac/Modules/win/Winmodule.c +++ b/Mac/Modules/win/Winmodule.c @@ -9,6 +9,12 @@ #include "pymactoolbox.h" #include +/* Function to dispose a window, with a "normal" calling sequence */ +static void +PyMac_AutoDisposeWindow(WindowPtr w) +{ + DisposeWindow(w); +} static PyObject *Win_Error; @@ -21,6 +27,7 @@ PyTypeObject Window_Type; typedef struct WindowObject { PyObject_HEAD WindowPtr ob_itself; + void (*ob_freeit)(WindowPtr ptr); } WindowObject; PyObject *WinObj_New(itself) @@ -32,6 +39,7 @@ PyObject *WinObj_New(itself) if (it == NULL) return NULL; it->ob_itself = itself; SetWRefCon(itself, (long)it); + it->ob_freeit = PyMac_AutoDisposeWindow; return (PyObject *)it; } WinObj_Convert(v, p_itself) @@ -60,7 +68,12 @@ WinObj_Convert(v, p_itself) static void WinObj_dealloc(self) WindowObject *self; { - DisposeWindow(self->ob_itself); + if (self->ob_itself) SetWRefCon(self->ob_itself, 0); + if (self->ob_freeit && self->ob_itself) + { + self->ob_freeit(self->ob_itself); + } + self->ob_itself = NULL; PyMem_DEL(self); } @@ -2079,7 +2092,7 @@ static PyObject *Win_FrontNonFloatingWindow(_self, _args) return NULL; _rv = FrontNonFloatingWindow(); _res = Py_BuildValue("O&", - WinObj_New, _rv); + WinObj_WhichWindow, _rv); return _res; } @@ -2492,15 +2505,18 @@ WinObj_WhichWindow(w) { PyObject *it; - /* XXX What if we find a stdwin window or a window belonging - to some other package? */ - if (w == NULL) - it = NULL; - else - it = (PyObject *) GetWRefCon(w); - if (it == NULL || ((WindowObject *)it)->ob_itself != w) + if (w == NULL) { it = Py_None; - Py_INCREF(it); + Py_INCREF(it); + } else { + it = (PyObject *) GetWRefCon(w); + if (it == NULL || ((WindowObject *)it)->ob_itself != w) { + it = WinObj_New(w); + ((WindowObject *)it)->ob_freeit = NULL; + } else { + Py_INCREF(it); + } + } return it; } diff --git a/Mac/Modules/win/winscan.py b/Mac/Modules/win/winscan.py index 88a8919265..3c37d33aaa 100644 --- a/Mac/Modules/win/winscan.py +++ b/Mac/Modules/win/winscan.py @@ -100,6 +100,10 @@ class MyScanner(Scanner): [("ExistingWindowPtr", "*", "*")]), ([("WindowRef", "FrontWindow", "ReturnMode")], # Ditto [("ExistingWindowPtr", "*", "*")]), + ([("WindowPtr", "FrontNonFloatingWindow", "ReturnMode")], + [("ExistingWindowPtr", "*", "*")]), + ([("WindowRef", "FrontNonFloatingWindow", "ReturnMode")], # Ditto + [("ExistingWindowPtr", "*", "*")]), ] if __name__ == "__main__": diff --git a/Mac/Modules/win/winsupport.py b/Mac/Modules/win/winsupport.py index bfc5f275a6..65d70d07a9 100644 --- a/Mac/Modules/win/winsupport.py +++ b/Mac/Modules/win/winsupport.py @@ -49,6 +49,12 @@ PropertyTag = OSTypeType("PropertyTag") includestuff = includestuff + """ #include <%s>""" % MACHEADERFILE + """ +/* Function to dispose a window, with a "normal" calling sequence */ +static void +PyMac_AutoDisposeWindow(WindowPtr w) +{ + DisposeWindow(w); +} """ finalstuff = finalstuff + """ @@ -60,15 +66,18 @@ WinObj_WhichWindow(w) { PyObject *it; - /* XXX What if we find a stdwin window or a window belonging - to some other package? */ - if (w == NULL) - it = NULL; - else - it = (PyObject *) GetWRefCon(w); - if (it == NULL || ((WindowObject *)it)->ob_itself != w) + if (w == NULL) { it = Py_None; - Py_INCREF(it); + Py_INCREF(it); + } else { + it = (PyObject *) GetWRefCon(w); + if (it == NULL || ((WindowObject *)it)->ob_itself != w) { + it = WinObj_New(w); + ((WindowObject *)it)->ob_freeit = NULL; + } else { + Py_INCREF(it); + } + } return it; } """ @@ -76,22 +85,31 @@ WinObj_WhichWindow(w) class MyObjectDefinition(GlobalObjectDefinition): def outputCheckNewArg(self): Output("if (itself == NULL) return PyMac_Error(resNotFound);") + def outputStructMembers(self): + GlobalObjectDefinition.outputStructMembers(self) + Output("void (*ob_freeit)(%s ptr);", self.itselftype) def outputInitStructMembers(self): GlobalObjectDefinition.outputInitStructMembers(self) Output("SetWRefCon(itself, (long)it);") + Output("it->ob_freeit = PyMac_AutoDisposeWindow;") def outputCheckConvertArg(self): - Output("#if !TARGET_API_MAC_CARBON") OutLbrace("if (DlgObj_Check(v))") - Output("*p_itself = ((WindowObject *)v)->ob_itself;") + Output("*p_itself = DlgObj_ConvertToWindow(v);") Output("return 1;") OutRbrace() - Output("#endif") Out(""" if (v == Py_None) { *p_itself = NULL; return 1; } if (PyInt_Check(v)) { *p_itself = (WindowPtr)PyInt_AsLong(v); return 1; } """) - def outputFreeIt(self, itselfname): - Output("DisposeWindow(%s);", itselfname) + def outputCleanupStructMembers(self): + Output("if (self->ob_itself) SetWRefCon(self->ob_itself, 0);") + Output("if (self->ob_freeit && self->ob_itself)") + OutLbrace() + Output("self->ob_freeit(self->ob_itself);") + OutRbrace() + Output("self->ob_itself = NULL;") +## def outputFreeIt(self, itselfname): +## Output("DisposeWindow(%s);", itselfname) # From here on it's basically all boiler plate... # Create the generator groups and link them -- 2.49.0