diff --git a/dw/fltkplatform.cc b/dw/fltkplatform.cc index dd872a5..699c9e5 100644 --- a/dw/fltkplatform.cc +++ b/dw/fltkplatform.cc @@ -390,11 +390,11 @@ 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 ababfb0..0989467 100644 --- a/dw/fltkui.cc +++ b/dw/fltkui.cc @@ -727,14 +727,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 (platform) { flatView = topView = NULL; this->relief = relief; FltkResource::init (platform); - ComplexButtonResource::init (widget); + ComplexButtonResource::init (std::move( widget )); } FltkComplexButtonResource::~FltkComplexButtonResource () diff --git a/dw/fltkui.hh b/dw/fltkui.hh index e416683..1337dcf 100644 --- a/dw/fltkui.hh +++ b/dw/fltkui.hh @@ -5,6 +5,8 @@ # error Do not include this file directly, use "fltkcore.hh" instead. #endif +#include + #include #include #include @@ -284,7 +286,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/layout.cc b/dw/layout.cc index 82b0feb..6ba4e7c 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; @@ -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 (); diff --git a/dw/layout.hh b/dw/layout.hh index 8389b3a..4f24c49 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 *queueResizeList; /* The state, which must be projected into the view. */ @@ -281,8 +282,8 @@ public: lout::misc::ZoneAllocator *textZone; - void addWidget (Widget *widget); - void setWidget (Widget *widget); + void addWidget (std::unique_ptr< 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..3364cc4 100644 --- a/dw/ui.cc +++ b/dw/ui.cc @@ -340,15 +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); - layout->setWidget (widget); + layout->setWidget (std::move( widget )); layout->connect (&layoutReceiver); if (getEmbed ()) diff --git a/dw/ui.hh b/dw/ui.hh index f7d0e5b..ef73241 100644 --- a/dw/ui.hh +++ b/dw/ui.hh @@ -5,6 +5,8 @@ # error Do not include this file directly, use "core.hh" instead. #endif +#include + namespace dw { namespace core { @@ -433,7 +435,7 @@ protected: virtual int reliefXThickness () = 0; virtual int reliefYThickness () = 0; - void init (Widget *widget); + void init (std::unique_ptr< Widget > widget); public: ComplexButtonResource (); @@ -582,7 +584,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/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); diff --git a/src/form.cc b/src/form.cc index ce79bbc..d849e18 100644 --- a/src/form.cc +++ b/src/form.cc @@ -932,7 +932,8 @@ void Html_tag_open_button(DilloHtml *html, const char *tag, int tagsize) if (inp_type != DILLO_HTML_INPUT_UNKNOWN) { /* Render the button */ - Widget *page; + std::unique_ptr< Widget > page; + Widget *page_p; Embed *embed; const char *attrbuf; char *name, *value; @@ -946,17 +947,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); + page = std::make_unique< Textblock > (false, true); page->setStyle (html->backgroundStyle ()); + page_p= page.get(); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); - Resource *resource = factory->createComplexButtonResource(page, 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); @@ -2036,11 +2038,12 @@ 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. - dw::Image *dwi = (dw::Image*)(dw::core::ImgRenderer*)Image->img_rndr; + std::unique_ptr< dw::Image > dwi; + dwi.reset( reinterpret_cast< dw::Image *>( (dw::core::ImgRenderer*)Image->img_rndr ) ); dwi->setStyle (html->backgroundStyle ()); ResourceFactory *factory = HT2LT(html)->getResourceFactory(); ComplexButtonResource *complex_b_r = - factory->createComplexButtonResource(dwi, false); + factory->createComplexButtonResource(std::move( 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 242dfdd..d0da091 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(dw); + layout->setWidget(std::unique_ptr< Widget >{ dw }); /* Set the page title with the bare filename (e.g. for images), * HTML pages with a tag will overwrite it later */