diff options
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/win/Winmodule.c | 36 | ||||
-rw-r--r-- | Mac/Modules/win/winscan.py | 4 | ||||
-rw-r--r-- | 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 f7890f1..c95e06b 100644 --- a/Mac/Modules/win/Winmodule.c +++ b/Mac/Modules/win/Winmodule.c @@ -9,6 +9,12 @@ #include "pymactoolbox.h" #include <Windows.h> +/* 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 88a8919..3c37d33 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 bfc5f27..65d70d0 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 |