From 80f980a2e162a66abbcd5ccb9b7e2f2c3a86c2593d72f707290e86fd64438545 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin Date: Wed, 16 Apr 2025 04:16:04 -0400 Subject: [PATCH 1/9] Revert "This adds some resource-ownership tracking." This reverts commit fad3dbc39a652629d9805abc04386892c77fae6ed0c74c2e37f1fbc1c55018dc. --- dw/fltkplatform.cc | 6 +++--- dw/fltkplatform.hh | 2 +- dw/fltkui.cc | 6 +++--- dw/fltkui.hh | 4 +--- dw/layout.cc | 34 +++++++++++++++++++--------------- dw/layout.hh | 7 +++---- dw/ui.cc | 6 +++--- dw/ui.hh | 6 ++---- dw/widget.cc | 2 +- src/form.cc | 15 ++++++--------- src/web.cc | 2 +- 11 files changed, 43 insertions(+), 47 deletions(-) diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index 699c9e5..dd872a5 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -390,11 +390,11 @@ FltkPlatform::FltkResourceFactory::createLabelButtonResource (const char } core::ui::ComplexButtonResource * -FltkPlatform::FltkResourceFactory::createComplexButtonResource (std::unique_ptr< core::Widget - > widget, +FltkPlatform::FltkResourceFactory::createComplexButtonResource (core::Widget + *widget, bool relief) { - return new ui::FltkComplexButtonResource (platform, std::move( widget ), relief); + return new ui::FltkComplexButtonResource (platform, widget, relief); } core::ui::ListResource * diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh index 0e79031..6395594 100644 --- a/dw/fltkplatform.hh +++ b/dw/fltkplatform.hh @@ -104,7 +104,7 @@ private: core::ui::LabelButtonResource *createLabelButtonResource (const char *label); core::ui::ComplexButtonResource * - createComplexButtonResource (std::unique_ptr< core::Widget > widget, bool relief); + createComplexButtonResource (core::Widget *widget, bool relief); core::ui::ListResource * createListResource (core::ui::ListResource::SelectionMode selectionMode, int rows); diff --git a/dw/fltkui.cc b/dw/fltkui.cc index fb4f839..42926a2 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -726,14 +726,14 @@ void FltkLabelButtonResource::setLabel (const char *label) // ---------------------------------------------------------------------- FltkComplexButtonResource::FltkComplexButtonResource (FltkPlatform *platform, - std::unique_ptr< dw::core::Widget - > widget, bool relief): + dw::core::Widget + *widget, bool relief): FltkSpecificResource (platform) { flatView = topView = NULL; this->relief = relief; FltkResource::init (platform); - ComplexButtonResource::init (std::move( widget )); + ComplexButtonResource::init (widget); } FltkComplexButtonResource::~FltkComplexButtonResource () diff --git a/dw/fltkui.hh b/dw/fltkui.hh index 1337dcf..e416683 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -5,8 +5,6 @@ # error Do not include this file directly, use "fltkcore.hh" instead. #endif -#include - #include #include #include @@ -286,7 +284,7 @@ protected: Fl_Widget *createNewWidget (core::Allocation *allocation); public: - FltkComplexButtonResource (FltkPlatform *platform, std::unique_ptr< dw::core::Widget > widget, + FltkComplexButtonResource (FltkPlatform *platform, dw::core::Widget *widget, bool relief); ~FltkComplexButtonResource (); }; diff --git a/dw/layout.cc b/dw/layout.cc index 6ba4e7c..82b0feb 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -327,8 +327,10 @@ Layout::~Layout () if (bgImage) bgImage->unref (); if (topLevel) { - detachWidget (topLevel.get()); - topLevel.reset(); + detachWidget (topLevel); + Widget *w = topLevel; + topLevel = NULL; + delete w; } delete queueResizeList; @@ -362,7 +364,7 @@ void Layout::detachWidget (Widget *widget) it->unref (); } -void Layout::addWidget (std::unique_ptr< Widget > widget) +void Layout::addWidget (Widget *widget) { if (topLevel) { MSG_WARN("widget already set\n"); @@ -372,20 +374,20 @@ void Layout::addWidget (std::unique_ptr< 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.get()); - DBG_OBJ_ASSOC (widget.get(), widget->stackingContextMgr); - widget->stackingContextWidget = widget.get(); + widget->stackingContextMgr = new StackingContextMgr (widget); + DBG_OBJ_ASSOC (widget, widget->stackingContextMgr); + widget->stackingContextWidget = widget; } - topLevel = std::move( widget ); - topLevel->layout = this; - topLevel->container = NULL; - DBG_OBJ_SET_PTR_O (topLevel.get(), "container", topLevel->container); + topLevel = widget; + widget->layout = this; + widget->container = NULL; + DBG_OBJ_SET_PTR_O (widget, "container", widget->container); queueResizeList->clear (); - topLevel->notifySetAsTopLevel (); + widget->notifySetAsTopLevel (); - findtextState.setWidget (topLevel.get()); + findtextState.setWidget (widget); canvasHeightGreater = false; DBG_OBJ_SET_SYM ("canvasHeightGreater", @@ -424,16 +426,18 @@ void Layout::removeWidget () updateCursor (); } -void Layout::setWidget (std::unique_ptr< Widget >widget) +void Layout::setWidget (Widget *widget) { DBG_OBJ_ASSOC_CHILD (widget); widgetAtPoint = NULL; if (topLevel) { - topLevel.reset(); + Widget *w = topLevel; + topLevel = NULL; + delete w; } textZone->zoneFree (); - addWidget (std::move(widget)); + addWidget (widget); updateCursor (); diff --git a/dw/layout.hh b/dw/layout.hh index 4f24c49..8389b3a 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -158,8 +158,7 @@ private: Platform *platform; View *view; - std::unique_ptr< Widget > topLevel; - Widget *widgetAtPoint; + Widget *topLevel, *widgetAtPoint; lout::container::typed::Vector *queueResizeList; /* The state, which must be projected into the view. */ @@ -282,8 +281,8 @@ public: lout::misc::ZoneAllocator *textZone; - void addWidget (std::unique_ptr< Widget > widget); - void setWidget (std::unique_ptr< Widget > widget); + void addWidget (Widget *widget); + void setWidget (Widget *widget); void attachView (View *view); void detachView (View *view); diff --git a/dw/ui.cc b/dw/ui.cc index 3364cc4..6bd2ad2 100644 --- a/dw/ui.cc +++ b/dw/ui.cc @@ -340,15 +340,15 @@ ComplexButtonResource::ComplexButtonResource () click_x = click_y = -1; } -void ComplexButtonResource::init (std::unique_ptr< Widget > widget) +void ComplexButtonResource::init (Widget *widget) { - childWidget = widget.get(); + childWidget = widget; /* FIXME: Buttons should not need a full Layout */ layout = new Layout (createPlatform (), false); setLayout (layout); DBG_OBJ_ASSOC_CHILD (layout); - layout->setWidget (std::move( widget )); + layout->setWidget (widget); layout->connect (&layoutReceiver); if (getEmbed ()) diff --git a/dw/ui.hh b/dw/ui.hh index ef73241..f7d0e5b 100644 --- a/dw/ui.hh +++ b/dw/ui.hh @@ -5,8 +5,6 @@ # error Do not include this file directly, use "core.hh" instead. #endif -#include - namespace dw { namespace core { @@ -435,7 +433,7 @@ protected: virtual int reliefXThickness () = 0; virtual int reliefYThickness () = 0; - void init (std::unique_ptr< Widget > widget); + void init (Widget *widget); public: ComplexButtonResource (); @@ -584,7 +582,7 @@ class ResourceFactory: public lout::object::Object public: virtual LabelButtonResource *createLabelButtonResource (const char *label) = 0; - virtual ComplexButtonResource *createComplexButtonResource (std::unique_ptr< Widget > widget, + virtual ComplexButtonResource *createComplexButtonResource (Widget *widget, bool relief) = 0; virtual ListResource *createListResource (ListResource::SelectionMode diff --git a/dw/widget.cc b/dw/widget.cc index 8874f70..79ea4be 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -214,7 +214,7 @@ void Widget::drawInterruption (View *view, Rectangle *area, DrawingContext *context) { Rectangle thisArea; - if (intersects (layout->topLevel.get(), context->getToplevelArea (), &thisArea)) + if (intersects (layout->topLevel, context->getToplevelArea (), &thisArea)) draw (view, &thisArea, context); context->addWidgetProcessedAsInterruption (this); diff --git a/src/form.cc b/src/form.cc index 5e7e7bd..f26bb5f 100644 --- a/src/form.cc +++ b/src/form.cc @@ -945,8 +945,7 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) if (inp_type != DILLO_HTML_INPUT_UNKNOWN) { /* Render the button */ - std::unique_ptr< Widget > page; - Widget *page_p; + Widget *page; Embed *embed; const char *attrbuf; char *name, *value; @@ -960,18 +959,17 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) /* We used to have Textblock (prefs.limit_text_width, ...) here, * but it caused 100% CPU usage. */ - page = std::make_unique< Textblock > (false, true); + page = new Textblock (false, true); page->setStyle (html->backgroundStyle ()); - page_p= page.get(); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); - Resource *resource = factory->createComplexButtonResource(std::move( page ), true); + Resource *resource = factory->createComplexButtonResource(page, true); embed = new Embed(resource); // a_Dw_button_set_sensitive (DW_BUTTON (button), FALSE); HT2TB(html)->addWidget (embed, html->backgroundStyle ()); - S_TOP(html)->textblock = html->dw = page_p; + S_TOP(html)->textblock = html->dw = page; value = a_Html_get_attr_wdef(html, tag, tagsize, "value", NULL); name = a_Html_get_attr_wdef(html, tag, tagsize, "name", NULL); @@ -2044,12 +2042,11 @@ static Embed *Html_input_image(DilloHtml *html, const char *tag, int tagsize) // At this point, we know that Image->ir represents an image // widget. Notice that the order of the casts matters, because // of multiple inheritance. - std::unique_ptr< dw::Image > dwi; - dwi.reset( reinterpret_cast< dw::Image *>( (dw::core::ImgRenderer*)Image->img_rndr ) ); + dw::Image *dwi = (dw::Image*)(dw::core::ImgRenderer*)Image->img_rndr; dwi->setStyle (html->backgroundStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); ComplexButtonResource *complex_b_r = - factory->createComplexButtonResource(std::move( dwi ), false); + factory->createComplexButtonResource(dwi, false); button = new Embed(complex_b_r); HT2TB(html)->addWidget (button, html->style ()); } diff --git a/src/web.cc b/src/web.cc index 794c2f9..6fdb413 100644 --- a/src/web.cc +++ b/src/web.cc @@ -85,7 +85,7 @@ int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, dw->setStyle (styleEngine.style (Web->bw)); /* This method frees the old dw if any */ - layout->setWidget(std::unique_ptr< Widget >{ dw }); + layout->setWidget(dw); /* Set the page title with the bare filename (e.g. for images), * HTML pages with a tag will overwrite it later */ From fc9a19158246bbb53645e2f724ebe5db1bf635ae1b558a60ffb080c3ee989932 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 02:46:18 -0400 Subject: [PATCH 2/9] Started plumbing out the ownership from layout. It seems to not crash, yet. --- dw/layout.cc | 14 ++++++-------- dw/layout.hh | 3 ++- dw/widget.cc | 2 +- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dw/layout.cc b/dw/layout.cc index 82b0feb..aef5ec0 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -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; @@ -379,7 +377,9 @@ void Layout::addWidget (Widget *widget) widget->stackingContextWidget = widget; } - topLevel = widget; + std::unique_ptr< Widget > widget_unique; + widget_unique.reset( widget ); + topLevel = std::move( widget_unique ); widget->layout = this; widget->container = NULL; DBG_OBJ_SET_PTR_O (widget, "container", widget->container); @@ -432,9 +432,7 @@ void Layout::setWidget (Widget *widget) widgetAtPoint = NULL; if (topLevel) { - Widget *w = topLevel; - topLevel = NULL; - delete w; + topLevel.reset(); } textZone->zoneFree (); addWidget (widget); diff --git a/dw/layout.hh b/dw/layout.hh index 8389b3a..757ce3a 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -158,7 +158,8 @@ private: Platform *platform; View *view; - Widget *topLevel, *widgetAtPoint; + std::unique_ptr< Widget > topLevel; + Widget *widgetAtPoint; lout::container::typed::Vector<Widget> *queueResizeList; /* The state, which must be projected into the view. */ diff --git a/dw/widget.cc b/dw/widget.cc index 79ea4be..8874f70 100644 --- a/dw/widget.cc +++ b/dw/widget.cc @@ -214,7 +214,7 @@ void Widget::drawInterruption (View *view, Rectangle *area, DrawingContext *context) { Rectangle thisArea; - if (intersects (layout->topLevel, context->getToplevelArea (), &thisArea)) + if (intersects (layout->topLevel.get(), context->getToplevelArea (), &thisArea)) draw (view, &thisArea, context); context->addWidgetProcessedAsInterruption (this); From f4e70bfa75a595f288756bf49f6e741d2d3a6b8b32cf20d678882803bcaf0b18 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 03:41:06 -0400 Subject: [PATCH 3/9] I plumbed out ownership a bit and it hasn't crashed yet. --- dw/layout.cc | 27 ++++++++++++++------------- dw/layout.hh | 2 +- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/dw/layout.cc b/dw/layout.cc index aef5ec0..7186212 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -362,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"); @@ -372,22 +372,21 @@ 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(); } - std::unique_ptr< Widget > widget_unique; - widget_unique.reset( widget ); - topLevel = std::move( widget_unique ); - widget->layout = this; - widget->container = NULL; - DBG_OBJ_SET_PTR_O (widget, "container", widget->container); + Widget *widget_p= widget.get(); + topLevel = std::move( widget ); + widget_p->layout = this; + widget_p->container = NULL; + DBG_OBJ_SET_PTR_O (widget_p, "container", widget_p->container); queueResizeList->clear (); - widget->notifySetAsTopLevel (); + widget_p->notifySetAsTopLevel (); - findtextState.setWidget (widget); + findtextState.setWidget (widget_p); canvasHeightGreater = false; DBG_OBJ_SET_SYM ("canvasHeightGreater", @@ -435,7 +434,9 @@ void Layout::setWidget (Widget *widget) topLevel.reset(); } textZone->zoneFree (); - addWidget (widget); + std::unique_ptr< Widget > widget_unique; + widget_unique.reset( widget ); + addWidget (std::move( widget_unique )); updateCursor (); diff --git a/dw/layout.hh b/dw/layout.hh index 757ce3a..a47ee2b 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -282,7 +282,7 @@ public: lout::misc::ZoneAllocator *textZone; - void addWidget (Widget *widget); + void addWidget (std::unique_ptr< Widget > widget); void setWidget (Widget *widget); void attachView (View *view); From f63c1209a9d74372c487aea413040019c0558a9d3f6c0cd3cc82aeb55f8e430b Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 05:20:26 -0400 Subject: [PATCH 4/9] Widen the unique pointer a bit more. --- dw/layout.cc | 8 +++----- dw/layout.hh | 2 +- dw/ui.cc | 4 +++- src/web.cc | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/dw/layout.cc b/dw/layout.cc index 7186212..3337bab 100644 --- a/dw/layout.cc +++ b/dw/layout.cc @@ -425,18 +425,16 @@ void Layout::removeWidget () updateCursor (); } -void Layout::setWidget (Widget *widget) +void Layout::setWidget (std::unique_ptr< Widget > widget) { - DBG_OBJ_ASSOC_CHILD (widget); + DBG_OBJ_ASSOC_CHILD (widget.get()); widgetAtPoint = NULL; if (topLevel) { topLevel.reset(); } textZone->zoneFree (); - std::unique_ptr< Widget > widget_unique; - widget_unique.reset( widget ); - addWidget (std::move( widget_unique )); + addWidget (std::move( widget )); updateCursor (); diff --git a/dw/layout.hh b/dw/layout.hh index a47ee2b..4f24c49 100644 --- a/dw/layout.hh +++ b/dw/layout.hh @@ -283,7 +283,7 @@ public: lout::misc::ZoneAllocator *textZone; void addWidget (std::unique_ptr< Widget > widget); - void setWidget (Widget *widget); + void setWidget (std::unique_ptr< Widget > widget); void attachView (View *view); void detachView (View *view); diff --git a/dw/ui.cc b/dw/ui.cc index 6bd2ad2..cba694d 100644 --- a/dw/ui.cc +++ b/dw/ui.cc @@ -348,7 +348,9 @@ void ComplexButtonResource::init (Widget *widget) layout = new Layout (createPlatform (), false); setLayout (layout); DBG_OBJ_ASSOC_CHILD (layout); - layout->setWidget (widget); + std::unique_ptr< Widget > widget_unique; + widget_unique.reset( widget ); + layout->setWidget (std::move( widget_unique )); layout->connect (&layoutReceiver); if (getEmbed ()) diff --git a/src/web.cc b/src/web.cc index 6fdb413..e3b5aea 100644 --- a/src/web.cc +++ b/src/web.cc @@ -85,7 +85,9 @@ int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, dw->setStyle (styleEngine.style (Web->bw)); /* This method frees the old dw if any */ - layout->setWidget(dw); + std::unique_ptr< Widget > dw_unique; + dw_unique.reset( dw ); + layout->setWidget(std::move( dw_unique )); /* Set the page title with the bare filename (e.g. for images), * HTML pages with a <TITLE> tag will overwrite it later */ From 317d1bfa566e8217d53dffbb8aeb455ad139b8dbc9bbe8641e0aafb79cc5d849 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 13:29:29 -0400 Subject: [PATCH 5/9] Some further expansion of ownership for `Widget`. --- src/web.cc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/web.cc b/src/web.cc index e3b5aea..2e90161 100644 --- a/src/web.cc +++ b/src/web.cc @@ -50,8 +50,6 @@ void a_Web_init(void) int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, CA_Callback_t *Call, void **Data) { - Widget *dw = NULL; - _MSG("a_Web_dispatch_by_type\n"); BrowserWindow *bw = Web->bw; @@ -78,16 +76,14 @@ int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, StyleEngine styleEngine (layout, Web->url, Web->url, bw->zoom); styleEngine.startElement ("body", Web->bw); - dw = (Widget*) viewer(Type, Web, Call, Data); - if (dw == NULL) + std::unique_ptr< Widget > dw( reinterpret_cast< Widget* >( viewer(Type, Web, Call, Data) ) ); + if (not dw) return -1; dw->setStyle (styleEngine.style (Web->bw)); /* This method frees the old dw if any */ - std::unique_ptr< Widget > dw_unique; - dw_unique.reset( dw ); - layout->setWidget(std::move( dw_unique )); + layout->setWidget(std::move( dw )); /* Set the page title with the bare filename (e.g. for images), * HTML pages with a <TITLE> tag will overwrite it later */ @@ -104,16 +100,19 @@ int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, /* Let the Nav module know... */ a_Nav_expect_done(Web->bw); - } else { + return 1; + + } /* A non-RootUrl. At this moment we only handle image-children */ if (!dStrnAsciiCasecmp(Type, "image/", 6)) { - dw = (Widget*) viewer(Type, Web, Call, Data); - } else { + auto dw = (Widget*) viewer(Type, Web, Call, Data); + return (dw ? 1 : -1); + + } + MSG_HTTP("'%s' cannot be displayed as image; has media type '%s'\n", URL_STR(Web->url), Type); - } - } - return (dw ? 1 : -1); + return -1; } From dceaffe4f73cfe77b2a974149030d6cae75ee7d20465877ba86f33baf1404e3c Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 13:37:55 -0400 Subject: [PATCH 6/9] Do the whitespace format. (This may make some diff tracking easier?) --- src/web.cc | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/web.cc b/src/web.cc index 2e90161..8dd1e46 100644 --- a/src/web.cc +++ b/src/web.cc @@ -103,16 +103,16 @@ int a_Web_dispatch_by_type (const char *Type, DilloWeb *Web, return 1; } - /* A non-RootUrl. At this moment we only handle image-children */ - if (!dStrnAsciiCasecmp(Type, "image/", 6)) { - auto dw = (Widget*) viewer(Type, Web, Call, Data); - return (dw ? 1 : -1); - - } - MSG_HTTP("'%s' cannot be displayed as image; has media type '%s'\n", - URL_STR(Web->url), Type); - return -1; + /* A non-RootUrl. At this moment we only handle image-children */ + if (!dStrnAsciiCasecmp(Type, "image/", 6)) { + auto dw = (Widget*) viewer(Type, Web, Call, Data); + return (dw ? 1 : -1); + } + + MSG_HTTP("'%s' cannot be displayed as image; has media type '%s'\n", + URL_STR(Web->url), Type); + return -1; } From b6c7511997287c4bf3fde2223a253eb3f816379e68c4902019813968a8a9ba76 Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 14:08:07 -0400 Subject: [PATCH 7/9] Push Widget ownership up one more level. --- dw/fltkui.cc | 4 +++- dw/ui.cc | 8 +++----- dw/ui.hh | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/dw/fltkui.cc b/dw/fltkui.cc index 42926a2..c8baa44 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -733,7 +733,9 @@ FltkComplexButtonResource::FltkComplexButtonResource (FltkPlatform *platform, flatView = topView = NULL; this->relief = relief; FltkResource::init (platform); - ComplexButtonResource::init (widget); + std::unique_ptr< dw::core::Widget > widget_unique; + widget_unique.reset( widget ); + ComplexButtonResource::init (std::move( widget_unique )); } FltkComplexButtonResource::~FltkComplexButtonResource () diff --git a/dw/ui.cc b/dw/ui.cc index cba694d..3364cc4 100644 --- a/dw/ui.cc +++ b/dw/ui.cc @@ -340,17 +340,15 @@ ComplexButtonResource::ComplexButtonResource () click_x = click_y = -1; } -void ComplexButtonResource::init (Widget *widget) +void ComplexButtonResource::init (std::unique_ptr< Widget > widget) { - childWidget = widget; + childWidget = widget.get(); /* FIXME: Buttons should not need a full Layout */ layout = new Layout (createPlatform (), false); setLayout (layout); DBG_OBJ_ASSOC_CHILD (layout); - std::unique_ptr< Widget > widget_unique; - widget_unique.reset( widget ); - layout->setWidget (std::move( widget_unique )); + layout->setWidget (std::move( widget )); layout->connect (&layoutReceiver); if (getEmbed ()) diff --git a/dw/ui.hh b/dw/ui.hh index f7d0e5b..bae84ca 100644 --- a/dw/ui.hh +++ b/dw/ui.hh @@ -433,7 +433,7 @@ protected: virtual int reliefXThickness () = 0; virtual int reliefYThickness () = 0; - void init (Widget *widget); + void init (std::unique_ptr< Widget > widget); public: ComplexButtonResource (); From 99515ff35330c9f0fdb10d499ed88bc6cf88e8bbeff4c3f5597d4191e43151aa Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 14:15:09 -0400 Subject: [PATCH 8/9] Plumb Widget ownership up higher. --- dw/fltkplatform.cc | 5 ++--- dw/fltkplatform.hh | 2 +- dw/fltkui.cc | 8 +++----- dw/fltkui.hh | 2 +- dw/ui.hh | 2 +- src/form.cc | 8 ++++++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index dd872a5..d532c7d 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -390,11 +390,10 @@ FltkPlatform::FltkResourceFactory::createLabelButtonResource (const char } core::ui::ComplexButtonResource * -FltkPlatform::FltkResourceFactory::createComplexButtonResource (core::Widget - *widget, +FltkPlatform::FltkResourceFactory::createComplexButtonResource (std::unique_ptr< core::Widget > widget, bool relief) { - return new ui::FltkComplexButtonResource (platform, widget, relief); + return new ui::FltkComplexButtonResource (platform, std::move( widget ), relief); } core::ui::ListResource * diff --git a/dw/fltkplatform.hh b/dw/fltkplatform.hh index 6395594..0e79031 100644 --- a/dw/fltkplatform.hh +++ b/dw/fltkplatform.hh @@ -104,7 +104,7 @@ private: core::ui::LabelButtonResource *createLabelButtonResource (const char *label); core::ui::ComplexButtonResource * - createComplexButtonResource (core::Widget *widget, bool relief); + createComplexButtonResource (std::unique_ptr< core::Widget > widget, bool relief); core::ui::ListResource * createListResource (core::ui::ListResource::SelectionMode selectionMode, int rows); diff --git a/dw/fltkui.cc b/dw/fltkui.cc index c8baa44..2b987e5 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -726,16 +726,14 @@ void FltkLabelButtonResource::setLabel (const char *label) // ---------------------------------------------------------------------- FltkComplexButtonResource::FltkComplexButtonResource (FltkPlatform *platform, - dw::core::Widget - *widget, bool relief): + std::unique_ptr< dw::core::Widget > widget, + bool relief): FltkSpecificResource <dw::core::ui::ComplexButtonResource> (platform) { flatView = topView = NULL; this->relief = relief; FltkResource::init (platform); - std::unique_ptr< dw::core::Widget > widget_unique; - widget_unique.reset( widget ); - ComplexButtonResource::init (std::move( widget_unique )); + ComplexButtonResource::init (std::move( widget )); } FltkComplexButtonResource::~FltkComplexButtonResource () diff --git a/dw/fltkui.hh b/dw/fltkui.hh index e416683..df8613d 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -284,7 +284,7 @@ protected: Fl_Widget *createNewWidget (core::Allocation *allocation); public: - FltkComplexButtonResource (FltkPlatform *platform, dw::core::Widget *widget, + FltkComplexButtonResource (FltkPlatform *platform, std::unique_ptr< dw::core::Widget > widget, bool relief); ~FltkComplexButtonResource (); }; diff --git a/dw/ui.hh b/dw/ui.hh index bae84ca..09856d8 100644 --- a/dw/ui.hh +++ b/dw/ui.hh @@ -582,7 +582,7 @@ class ResourceFactory: public lout::object::Object public: virtual LabelButtonResource *createLabelButtonResource (const char *label) = 0; - virtual ComplexButtonResource *createComplexButtonResource (Widget *widget, + virtual ComplexButtonResource *createComplexButtonResource (std::unique_ptr< Widget > widget, bool relief) = 0; virtual ListResource *createListResource (ListResource::SelectionMode diff --git a/src/form.cc b/src/form.cc index f26bb5f..bdb8452 100644 --- a/src/form.cc +++ b/src/form.cc @@ -960,10 +960,12 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) * but it caused 100% CPU usage. */ page = new Textblock (false, true); + std::unique_ptr< Widget > page_unique; + page_unique.reset( page ); page->setStyle (html->backgroundStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); - Resource *resource = factory->createComplexButtonResource(page, true); + Resource *resource = factory->createComplexButtonResource(std::move( page_unique ), true); embed = new Embed(resource); // a_Dw_button_set_sensitive (DW_BUTTON (button), FALSE); @@ -2043,10 +2045,12 @@ static Embed *Html_input_image(DilloHtml *html, const char *tag, int tagsize) // widget. Notice that the order of the casts matters, because // of multiple inheritance. dw::Image *dwi = (dw::Image*)(dw::core::ImgRenderer*)Image->img_rndr; + std::unique_ptr< dw::core::Widget > dwi_unique; + dwi_unique.reset( dwi ); dwi->setStyle (html->backgroundStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); ComplexButtonResource *complex_b_r = - factory->createComplexButtonResource(dwi, false); + factory->createComplexButtonResource(std::move( dwi_unique ), false); button = new Embed(complex_b_r); HT2TB(html)->addWidget (button, html->style ()); } From 176628fa02e537169b94ee12c0e40cb9d7331d71e790db356ccab187b81e211b Mon Sep 17 00:00:00 2001 From: ADAM David Alan Martin <adam@recursive.engineer> Date: Fri, 18 Apr 2025 14:18:37 -0400 Subject: [PATCH 9/9] Ownership of page Widget plumbed to top. Now it's created by `make_unique`. --- src/form.cc | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/form.cc b/src/form.cc index bdb8452..13e2b0b 100644 --- a/src/form.cc +++ b/src/form.cc @@ -945,7 +945,6 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) if (inp_type != DILLO_HTML_INPUT_UNKNOWN) { /* Render the button */ - Widget *page; Embed *embed; const char *attrbuf; char *name, *value; @@ -959,19 +958,18 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) /* We used to have Textblock (prefs.limit_text_width, ...) here, * but it caused 100% CPU usage. */ - page = new Textblock (false, true); - std::unique_ptr< Widget > page_unique; - page_unique.reset( page ); + std::unique_ptr< Widget > page = std::make_unique< Textblock >( false, true ); + Widget *page_p= page.get(); page->setStyle (html->backgroundStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); - Resource *resource = factory->createComplexButtonResource(std::move( page_unique ), true); + Resource *resource = factory->createComplexButtonResource(std::move( page ), true); embed = new Embed(resource); // a_Dw_button_set_sensitive (DW_BUTTON (button), FALSE); HT2TB(html)->addWidget (embed, html->backgroundStyle ()); - S_TOP(html)->textblock = html->dw = page; + S_TOP(html)->textblock = html->dw = page_p; value = a_Html_get_attr_wdef(html, tag, tagsize, "value", NULL); name = a_Html_get_attr_wdef(html, tag, tagsize, "name", NULL);