Object Ownership

From Inkscape Wiki
Revision as of 15:01, 9 September 2021 by Tavmjong (talk | contribs)
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 these purpose:

  1. To find the SPDocument
  2. To ensure the pop-up window is over the correct window. As pop-up windows seize control, the desktop cannot disappear from beneath them.
  3. New layer pop-up where desktop is needed to add layer (why?).

It's used in these files:

  • live_effects/parameter/powerstrokepointarray.cpp
  • ui/dialog/knot-properties.cpp (only in with Measure Tool). Removed
  • ui/dialog/layer-properties.cpp. Removed
  • ui/dialog/lpe-fillet-chamfer-properties.cpp. Removed.
  • ui/dialog/lpe-powerstroke-properties.cpp. Removed.
  • /ui/widget/style-subject.cpp (used by Fill and Stroke, and Layers dialogs for opacity, blending, and blurring).
  • src/widgets/desktop-widget.cpp
  • src/ui/view/view.cpp

Undo stack

The undo stack should be owned by the document.


Selections should be owned by InkscapeWindow with an additional selection owned by InkscapeApplication for use with the GUI.