Object Ownership

From Inkscape Wiki
Revision as of 15:37, 8 September 2021 by Tavmjong (talk | contribs) (→‎Document)
Jump to navigation Jump to search

Inkscape currently uses garbage collecting to manage the lifetime of many objects. This is problematic...

Objects managed by GC: (grep -Ir GC:: src | grep public):

  • SPDocument: src/document.h
  • SPDesktop (via View): ui/view/view.h
  • Undo stack: undo-stack-observer.h
  • XML nodes: xml/event.h, xml/attribute-record.h, xml/composite-node-observer.h, xml/node.h, xml/simple-node-observer.h, xml/simple-node.h
  • Profile manager: profile-manager.h
  • Layer manager: layer-manager.h
  • Selections: selection.h
  • Document subset: document-subset.h


Documents opened for editing should be owned by InkscapeApplication.

  • Help (tutorials)

Temporary documents should be opened with unique_ptr<>.

  • SVG Cursors (ui/cursor-utils.cpp, uses ink_file_open(), unique_ptr)
  • SVG to Pixbuf (ui/svg-renderer.cpp, uses ink_file_open(), unique_ptr)
  • SPDocument::copy (document.cpp, uses createDoc() ***)
  • Paint selector (ui/widget/paint-selector.cpp, uses SPDocument::createNewDoc, static, never deleted)
  • Markers (ui/widget/marker-combo-box.cpp, uses SPDocument::createNewDoc, static, never deleted)
  • Symbols (ui/dialog/symbols.cpp, uses SPDocument::createNewDoc() x3, not clear if any deleted)
  • Win32 File (ui/dialog/filedialogimpl-win32.cpp, uses SPDocument::createNewDoc(), unique_ptr)
  • About (ui/dialog/about.cpp, uses SPDocument::createNewDoc(), document not deleted!)
  • Paint servers (ui/dialog/paint-servers.cpp, uses SPDocument::createNewDoc(), not deleted!)
  • SVG Preview (ui/dialog/svg-preview.cpp, uses SPDocument::createNewDoc(), deleted in destructor)
  • Clipboard (ui/clipboard.cpp, uses SPDocument::createNewDoc(), uses std::unique_ptr)
  • InkView (inkview-window.h, uses SPDocument::createNewDoc(), not deleted!)
  • ink_file_new(), ink_file_open() (io/file.cpp, uses SPDocument::createNewDoc(), not deleted, utility for other functions)
  • CDR (extension/internal/cdr-input.cpp, uses SPDocument::createNewDocFromMem() x3, not deleted!)
  • SVG (extension/internal/svg.cpp, uses SPDocument::createNew() x3, SPDocument::createNewDocFromMem(), not deleted!)
  • PDF Input ...
  • PixBuf
  • WMF
  • WPG
  • Gimp Grad
  • EMF
  • VSD
  • DBUS
  • Cairo utils (display/cairo-utils.cpp, uses SPDocument::createNewDocFromMem(), uses std::unique_ptr)
  • Stock items (helper/stock-items.cpp, uses SPDocument::createNewDoc(), markers, static, not deleted).
  • URIReference (object/uri-reference.cpp, uses SPDocument::createChildDoc(),

One problem, when saving, a document is copied so it can be modified in place. This document stores a reference to the original document.

Inkscape::Application (different from InkscapeApplication) has a list of documents too. This list should be removed (as should Inkscape::Application).


Desktop should be owned by InkscapeWindow. There should be no need to ref count.

The desktop is used in the following sources for two purpose, one to find the SPDocument and the second to ensure the pop-up window is over the correct window.

  • live_effects/parameter/powerstrokepointarray.cpp
  • ui/dialog/knot-properties.cpp
  • ui/dialog/layer-properties.cpp
  • ui/dialog/lpe-fillet-chamfer-properties.cpp
  • ui/dialog/lpe-powerstroke-properties.cpp
  • ui/tools/measure-tool.cpp
  • /ui/widget/style-subject.cpp
  • src/widgets/desktop-widget.cpp
  • src/ui/view/view.cpp