This adds some resource-ownership tracking.

Time to start spreading this out, more.
This commit is contained in:
2025-03-03 13:26:36 -05:00
parent a36901db50
commit fad3dbc39a
11 changed files with 47 additions and 43 deletions

View File

@ -327,10 +327,8 @@ Layout::~Layout ()
if (bgImage)
bgImage->unref ();
if (topLevel) {
detachWidget (topLevel);
Widget *w = topLevel;
topLevel = NULL;
delete w;
detachWidget (topLevel.get());
topLevel.reset();
}
delete queueResizeList;
@ -364,7 +362,7 @@ void Layout::detachWidget (Widget *widget)
it->unref ();
}
void Layout::addWidget (Widget *widget)
void Layout::addWidget (std::unique_ptr< Widget > widget)
{
if (topLevel) {
MSG_WARN("widget already set\n");
@ -374,20 +372,20 @@ void Layout::addWidget (Widget *widget)
// The toplevel widget always establishes a stacking context. It could
// already be set in Widget::setStyle().
if (widget->stackingContextMgr == NULL && IMPL_POS) {
widget->stackingContextMgr = new StackingContextMgr (widget);
DBG_OBJ_ASSOC (widget, widget->stackingContextMgr);
widget->stackingContextWidget = widget;
widget->stackingContextMgr = new StackingContextMgr (widget.get());
DBG_OBJ_ASSOC (widget.get(), widget->stackingContextMgr);
widget->stackingContextWidget = widget.get();
}
topLevel = widget;
widget->layout = this;
widget->container = NULL;
DBG_OBJ_SET_PTR_O (widget, "container", widget->container);
topLevel = std::move( widget );
topLevel->layout = this;
topLevel->container = NULL;
DBG_OBJ_SET_PTR_O (topLevel.get(), "container", topLevel->container);
queueResizeList->clear ();
widget->notifySetAsTopLevel ();
topLevel->notifySetAsTopLevel ();
findtextState.setWidget (widget);
findtextState.setWidget (topLevel.get());
canvasHeightGreater = false;
DBG_OBJ_SET_SYM ("canvasHeightGreater",
@ -426,18 +424,16 @@ void Layout::removeWidget ()
updateCursor ();
}
void Layout::setWidget (Widget *widget)
void Layout::setWidget (std::unique_ptr< Widget >widget)
{
DBG_OBJ_ASSOC_CHILD (widget);
widgetAtPoint = NULL;
if (topLevel) {
Widget *w = topLevel;
topLevel = NULL;
delete w;
topLevel.reset();
}
textZone->zoneFree ();
addWidget (widget);
addWidget (std::move(widget));
updateCursor ();