summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Mac/Modules/win/Winmodule.c36
-rw-r--r--Mac/Modules/win/winscan.py4
-rw-r--r--Mac/Modules/win/winsupport.py44
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