]> granicus.if.org Git - python/commitdiff
Window objects now also have an AutoDispose funcpointer (set for our windows, cleared...
authorJack Jansen <jack.jansen@cwi.nl>
Fri, 25 Aug 2000 22:17:51 +0000 (22:17 +0000)
committerJack Jansen <jack.jansen@cwi.nl>
Fri, 25 Aug 2000 22:17:51 +0000 (22:17 +0000)
Fixed a few calls that return an ExistingWindow.

Mac/Modules/win/Winmodule.c
Mac/Modules/win/winscan.py
Mac/Modules/win/winsupport.py

index f7890f17bd4401607afaf2a8cbe804b7b3fc14ed..c95e06b48f52a58cf6c9381251e4d0abb61b0ec0 100644 (file)
@@ -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;
 }
 
index 88a89192654566de491ac9b564042c39b5b3e41d..3c37d33aaa95f5c382e0242cd1e32e9f59cde029 100644 (file)
@@ -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__":
index bfc5f275a67bd280eec6a5aa7b8256a0dbbc6aec..65d70d07a95f079fa4b32f8232e0a60930d75633 100644 (file)
@@ -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