X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Flayer_pastecanvas.h;h=1dc9506764edad2e7b1fbd2a1d678b4284615e7c;hb=4a982de650f64a6d2a94b137d65fc1233d5c9098;hp=5873ff44a37af945075e34739bd30c517ec88afe;hpb=37600b4b217caa5e316984ec0b035c5e8f9698af;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/layer_pastecanvas.h b/synfig-core/trunk/src/synfig/layer_pastecanvas.h index 5873ff4..1dc9506 100644 --- a/synfig-core/trunk/src/synfig/layer_pastecanvas.h +++ b/synfig-core/trunk/src/synfig/layer_pastecanvas.h @@ -1,6 +1,6 @@ /* === S Y N F I G ========================================================= */ /*! \file layer_pastecanvas.h -** \brief Template Header +** \brief Header file for implementation of the "Paste Canvas" layer ** ** $Id$ ** @@ -70,6 +70,33 @@ private: mutable Rect bounds; sigc::connection child_changed_connection; + + // Nasty hack: Remember whether we called an extra ref() when + // setting the canvas, so we know whether to call an extra unref() + // when finished with the canvas. + // + // Here's the story: + // + // The root canvas is destructed first. That sets the + // Layer::canvas_ (the parent canvas) of any PasteCanvas layer it + // contains to nil, due to a call to Layer::set_canvas(0), + // triggered by the connection made when Layer::set_canvas + // originally set its canvas_ member to point to the root canvas. + // ~Canvas does begin_delete() which triggers that connection. + // + // After ~Canvas has run, the members of the root canvas are + // freed, including its children_ list. If this was the last + // reference to the child canvas that the pastecanvas uses, that + // child canvas will Layer_PasteCanvas::set_sub_canvas(0) on the + // PasteCanvas layer to set its canvas (the child, pasted canvas) + // not to refer to the soon-to-be destroys child canvas. But + // set_sub_canvas() originally looked at the value of + // Layer::canvas_ (the parent canvas, obtained via + // Layer::get_canvas()) to decide whether to do an extra ref() on + // canvas (the child canvas). We need to unref() it now if we + // did, but we've forgotten whether we did. So we use this + // 'extra_reference' member to store that decision. + bool extra_reference; public: virtual void on_canvas_set();