Set autodispose only if RefCon isn't set yet on the window. This way we don't accidentally dispose of windows that are actually dialogs-in-disguise.

This commit is contained in:
Jack Jansen 2000-12-14 22:29:00 +00:00
parent 4550b00c80
commit 80716f0e61
2 changed files with 117 additions and 6 deletions

View File

@ -45,8 +45,12 @@ PyObject *WinObj_New(itself)
it = PyObject_NEW(WindowObject, &Window_Type);
if (it == NULL) return NULL;
it->ob_itself = itself;
SetWRefCon(itself, (long)it);
it->ob_freeit = PyMac_AutoDisposeWindow;
it->ob_freeit = NULL;
if (GetWRefCon(itself) == 0)
{
SetWRefCon(itself, (long)it);
it->ob_freeit = PyMac_AutoDisposeWindow;
}
return (PyObject *)it;
}
WinObj_Convert(v, p_itself)
@ -73,12 +77,13 @@ WinObj_Convert(v, p_itself)
static void WinObj_dealloc(self)
WindowObject *self;
{
if (self->ob_itself) SetWRefCon(self->ob_itself, 0);
if (self->ob_freeit && self->ob_itself)
{
SetWRefCon(self->ob_itself, 0);
self->ob_freeit(self->ob_itself);
}
self->ob_itself = NULL;
self->ob_freeit = NULL;
PyMem_DEL(self);
}
@ -394,6 +399,38 @@ static PyObject *WinObj_DrawNew(_self, _args)
}
#endif
static PyObject *WinObj_PaintOne(_self, _args)
WindowObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
RgnHandle clobberedRgn;
if (!PyArg_ParseTuple(_args, "O&",
ResObj_Convert, &clobberedRgn))
return NULL;
PaintOne(_self->ob_itself,
clobberedRgn);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *WinObj_PaintBehind(_self, _args)
WindowObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
RgnHandle clobberedRgn;
if (!PyArg_ParseTuple(_args, "O&",
ResObj_Convert, &clobberedRgn))
return NULL;
PaintBehind(_self->ob_itself,
clobberedRgn);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *WinObj_CalcVis(_self, _args)
WindowObject *_self;
PyObject *_args;
@ -407,6 +444,22 @@ static PyObject *WinObj_CalcVis(_self, _args)
return _res;
}
static PyObject *WinObj_CalcVisBehind(_self, _args)
WindowObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
RgnHandle clobberedRgn;
if (!PyArg_ParseTuple(_args, "O&",
ResObj_Convert, &clobberedRgn))
return NULL;
CalcVisBehind(_self->ob_itself,
clobberedRgn);
Py_INCREF(Py_None);
_res = Py_None;
return _res;
}
static PyObject *WinObj_BringToFront(_self, _args)
WindowObject *_self;
PyObject *_args;
@ -1032,6 +1085,26 @@ static PyObject *WinObj_IsWindowPathSelectClick(_self, _args)
return _res;
}
static PyObject *WinObj_WindowPathSelect(_self, _args)
WindowObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
OSStatus _err;
MenuHandle menu;
SInt32 outMenuResult;
if (!PyArg_ParseTuple(_args, "O&",
MenuObj_Convert, &menu))
return NULL;
_err = WindowPathSelect(_self->ob_itself,
menu,
&outMenuResult);
if (_err != noErr) return PyMac_Error(_err);
_res = Py_BuildValue("l",
outMenuResult);
return _res;
}
static PyObject *WinObj_HiliteWindowFrameForDrag(_self, _args)
WindowObject *_self;
PyObject *_args;
@ -1242,6 +1315,29 @@ static PyObject *WinObj_GetWindowBounds(_self, _args)
return _res;
}
static PyObject *WinObj_ResizeWindow(_self, _args)
WindowObject *_self;
PyObject *_args;
{
PyObject *_res = NULL;
Boolean _rv;
Point startPoint;
Rect sizeConstraints;
Rect newContentRect;
if (!PyArg_ParseTuple(_args, "O&O&",
PyMac_GetPoint, &startPoint,
PyMac_GetRect, &sizeConstraints))
return NULL;
_rv = ResizeWindow(_self->ob_itself,
startPoint,
&sizeConstraints,
&newContentRect);
_res = Py_BuildValue("bO&",
_rv,
PyMac_BuildRect, &newContentRect);
return _res;
}
static PyObject *WinObj_SetWindowBounds(_self, _args)
WindowObject *_self;
PyObject *_args;
@ -1860,8 +1956,14 @@ static PyMethodDef WinObj_methods[] = {
{"DrawNew", (PyCFunction)WinObj_DrawNew, 1,
"(Boolean update) -> None"},
#endif
{"PaintOne", (PyCFunction)WinObj_PaintOne, 1,
"(RgnHandle clobberedRgn) -> None"},
{"PaintBehind", (PyCFunction)WinObj_PaintBehind, 1,
"(RgnHandle clobberedRgn) -> None"},
{"CalcVis", (PyCFunction)WinObj_CalcVis, 1,
"() -> None"},
{"CalcVisBehind", (PyCFunction)WinObj_CalcVisBehind, 1,
"(RgnHandle clobberedRgn) -> None"},
{"BringToFront", (PyCFunction)WinObj_BringToFront, 1,
"() -> None"},
{"SendBehind", (PyCFunction)WinObj_SendBehind, 1,
@ -1942,6 +2044,8 @@ static PyMethodDef WinObj_methods[] = {
"(Boolean modified) -> None"},
{"IsWindowPathSelectClick", (PyCFunction)WinObj_IsWindowPathSelectClick, 1,
"(EventRecord event) -> (Boolean _rv)"},
{"WindowPathSelect", (PyCFunction)WinObj_WindowPathSelect, 1,
"(MenuHandle menu) -> (SInt32 outMenuResult)"},
{"HiliteWindowFrameForDrag", (PyCFunction)WinObj_HiliteWindowFrameForDrag, 1,
"(Boolean hilited) -> None"},
{"TransitionWindow", (PyCFunction)WinObj_TransitionWindow, 1,
@ -1964,6 +2068,8 @@ static PyMethodDef WinObj_methods[] = {
"(Boolean collapse) -> None"},
{"GetWindowBounds", (PyCFunction)WinObj_GetWindowBounds, 1,
"(WindowRegionCode regionCode) -> (Rect globalBounds)"},
{"ResizeWindow", (PyCFunction)WinObj_ResizeWindow, 1,
"(Point startPoint, Rect sizeConstraints) -> (Boolean _rv, Rect newContentRect)"},
{"SetWindowBounds", (PyCFunction)WinObj_SetWindowBounds, 1,
"(WindowRegionCode regionCode, Rect globalBounds) -> None"},
{"RepositionWindow", (PyCFunction)WinObj_RepositionWindow, 1,
@ -2767,7 +2873,7 @@ WinObj_WhichWindow(w)
Py_INCREF(it);
} else {
it = (PyObject *) GetWRefCon(w);
if (it == NULL || ((WindowObject *)it)->ob_itself != w) {
if (it == NULL || ((WindowObject *)it)->ob_itself != w || !WinObj_Check(it)) {
it = WinObj_New(w);
((WindowObject *)it)->ob_freeit = NULL;
} else {

View File

@ -84,7 +84,7 @@ WinObj_WhichWindow(w)
Py_INCREF(it);
} else {
it = (PyObject *) GetWRefCon(w);
if (it == NULL || ((WindowObject *)it)->ob_itself != w) {
if (it == NULL || ((WindowObject *)it)->ob_itself != w || !WinObj_Check(it)) {
it = WinObj_New(w);
((WindowObject *)it)->ob_freeit = NULL;
} else {
@ -103,8 +103,12 @@ class MyObjectDefinition(GlobalObjectDefinition):
Output("void (*ob_freeit)(%s ptr);", self.itselftype)
def outputInitStructMembers(self):
GlobalObjectDefinition.outputInitStructMembers(self)
Output("it->ob_freeit = NULL;")
Output("if (GetWRefCon(itself) == 0)")
OutLbrace()
Output("SetWRefCon(itself, (long)it);")
Output("it->ob_freeit = PyMac_AutoDisposeWindow;")
OutRbrace()
def outputCheckConvertArg(self):
OutLbrace("if (DlgObj_Check(v))")
Output("*p_itself = DlgObj_ConvertToWindow(v);")
@ -115,12 +119,13 @@ class MyObjectDefinition(GlobalObjectDefinition):
if (PyInt_Check(v)) { *p_itself = (WindowPtr)PyInt_AsLong(v); return 1; }
""")
def outputCleanupStructMembers(self):
Output("if (self->ob_itself) SetWRefCon(self->ob_itself, 0);")
Output("if (self->ob_freeit && self->ob_itself)")
OutLbrace()
Output("SetWRefCon(self->ob_itself, 0);")
Output("self->ob_freeit(self->ob_itself);")
OutRbrace()
Output("self->ob_itself = NULL;")
Output("self->ob_freeit = NULL;")
## def outputFreeIt(self, itselfname):
## Output("DisposeWindow(%s);", itselfname)
# From here on it's basically all boiler plate...