<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PBS</id>
	<title>Inkscape Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.inkscape.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PBS"/>
	<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/Special:Contributions/PBS"/>
	<updated>2026-04-07T01:07:38Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=123287</id>
		<title>Installing Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=123287"/>
		<updated>2025-10-26T17:44:00Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update dev version download instructions after GitLab changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains how to install Inkscape, either the stable or the development version. For instructions on how to compile Inkscape from the source code, see [[Compiling Inkscape]].&lt;br /&gt;
&lt;br /&gt;
The latest stable version can always be found on the [https://inkscape.org/release/ Download page]. The latest development versions are available from [https://gitlab.com/inkscape/inkscape/-/commits/master GitLab].&lt;br /&gt;
== Installing the stable version ==&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
DMG files can be downloaded from the [https://inkscape.org/release/ Download page]. Click the box labelled macOS and choose Intel or arm64 architecture. Once the download is complete, installation is the same as for any other DMG.&lt;br /&gt;
&lt;br /&gt;
See also the [https://inkscape.org/learn/faq/#mac-os-x-specific-issues section dedicated to macOS in our FAQ], and the [https://inkscape-manuals.readthedocs.io/en/latest/installing-on-mac.html readthedocs] page for installation on macOS.&lt;br /&gt;
=== '''Linux''' ===&lt;br /&gt;
&lt;br /&gt;
On most Linux systems, you can use the software installer provided with your system (look for &amp;quot;software&amp;quot; in your start menu) to install Inkscape.&lt;br /&gt;
&lt;br /&gt;
Visit the [https://inkscape.org/release/ Download page] to see a list of other available options and installation methods for each available version.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu or Debian ====&lt;br /&gt;
Probably the easiest way to install on Debian/Ubuntu is to use the &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; command. &lt;br /&gt;
&lt;br /&gt;
Open a terminal and type:&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install inkscape&lt;br /&gt;
&lt;br /&gt;
If your Ubuntu version does not have the most recent Inkscape version in its repositories (yet), the next section describes how to use the [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable stable PPA] to get it.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu (new stable versions) ====&lt;br /&gt;
&lt;br /&gt;
The most recent version (slightly newer than what is available directly from Ubuntu) is available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable/ stable PPA] for Ubuntu and derivative Linux distributions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo add-apt-repository universe&lt;br /&gt;
sudo add-apt-repository ppa:inkscape.dev/stable&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt install inkscape&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== openSUSE ====&lt;br /&gt;
&lt;br /&gt;
openSUSE includes Inkscape in the Gnome repositories. The newest version of Inkscape is in Gnome:Apps.&lt;br /&gt;
=== '''Windows''' ===&lt;br /&gt;
You can find the installer on the [http://www.inkscape.org/release/ Download page]. Normally you want to choose &amp;quot;64-bit architecture&amp;quot; and &amp;quot;Windows Installer Package (msi)&amp;quot;. Installing should be an easy step-by-step (next-next-finish) process.&lt;br /&gt;
&lt;br /&gt;
== Installing the development version ==&lt;br /&gt;
First be warned. Unstable and development mean you likely will encounter crashes, usability problems and sometimes lose data. Ctrl+S will become your friend. If you cannot take this risk, please use the stable version instead.&lt;br /&gt;
&lt;br /&gt;
If you are still reading, you are probably one of the brave ones who wants to be on the bleeding edge. If so, follow the steps below.&lt;br /&gt;
&lt;br /&gt;
'''Don't forget:''' Please help Inkscape by reporting bugs, encouraging developers or fixing bugs yourself. If you find bugs, make sure to include the debug information which can be found in &amp;lt;code&amp;gt;Help &amp;gt; About&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Tip:''' If you're looking for a beta release, those can be downloaded from the [https://inkscape.org/release/ Download page]. Find the &amp;quot;Next version preview&amp;quot; option in the Download tab, and proceed like you would with a stable release.&lt;br /&gt;
&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions to download the development version, then install it in the same way as the stable version.&lt;br /&gt;
&lt;br /&gt;
=== '''Linux''' ===&lt;br /&gt;
You can run an [https://appimage.org/ AppImage] of the latest development version on any Linux distribution. See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions on how to download. To run, extract the zip and run the executable inside.&lt;br /&gt;
&lt;br /&gt;
'''Tip:''' If you don't want to trust our executable, you can run it with sandboxing using [https://wiki.archlinux.org/title/Firejail firejail]: &amp;lt;code&amp;gt;firejail --appimage ...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
Development versions (inkscape-trunk) are also available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/trunk trunk PPA] for Ubuntu and derivative Linux distributions. Follow the commands at https://inkscape.org/release/inkscape-dev/gnulinux/ubuntu/ppa/dl/ .&lt;br /&gt;
&lt;br /&gt;
=== '''Windows''' ===&lt;br /&gt;
&lt;br /&gt;
=== 1. Download the latest build ===&lt;br /&gt;
Follow the instructions on [https://inkscape.org/release/inkscape-dev/windows/ the inkscape-dev Download page] to download a 7zip file of the latest development build. Save the file (&amp;lt;code&amp;gt;inkscape-....7z&amp;lt;/code&amp;gt;) to your Downloads folder. &lt;br /&gt;
&lt;br /&gt;
==== 2. Extract the .7z archive ====&lt;br /&gt;
Extract the archive using the [http://www.7-zip.org/ 7zip unpacker]: Open the Downloads folder in Explorer, right-click on the 7zip file and choose 7-Zip → Extract to &amp;quot;inkscape-....&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You will get a directory which contains several files including &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== 3. Run inkscape ====&lt;br /&gt;
Run the &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; file by double clicking it. That's it. You can also drag files to &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; to have these opened.&lt;br /&gt;
&lt;br /&gt;
==== Multiple versions for testing ====&lt;br /&gt;
For testing purposes it is good to be able to test multiple versions of Inkscape to find when and where some problem first appeared. For this reason you are able to store and use as many parallel versions of Inkscape as your disk has room for.&lt;br /&gt;
== Finding development versions on GitLab ==&lt;br /&gt;
Recent development builds can be found using the GitLab CI infrastructure. They do however require clicking through several pages to find:&lt;br /&gt;
&lt;br /&gt;
# Visit https://gitlab.com/inkscape/inkscape/-/commits/master.&lt;br /&gt;
# There, look for the topmost (most recent) commit with a &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;✓ mark&amp;lt;/span&amp;gt;, and click on that &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;✓ mark&amp;lt;/span&amp;gt;.&lt;br /&gt;
#On the next page, find a &amp;lt;span style=&amp;quot;color:green&amp;quot;&amp;gt;✓ mark&amp;lt;/span&amp;gt; which when clicked on, shows a menu with &amp;quot;appimage:linux&amp;quot;, &amp;quot;inkscape:macos&amp;quot; and &amp;quot;inkscape:windows:7z&amp;quot; in it. Within this menu, click on the item you want to download.&lt;br /&gt;
#On the next page, click the Download button.&lt;br /&gt;
&lt;br /&gt;
In a similar way, you download a build of any earlier commit, allowing bugs to be pinpointed to the commit that introduced them.&lt;br /&gt;
&lt;br /&gt;
[[File:Gitlab-download-instructions-1.png|alt=Click the green tick with alt text &amp;quot;Pipeline: passed/failed&amp;quot;|none|thumb|Step 2]]&lt;br /&gt;
[[File:Gitlab-download-instructions-2.png|alt=Click the leftmost green tick under &amp;quot;stages&amp;quot; with alt text &amp;quot;build passed:failed&amp;quot;|none|thumb|Step 3]]&lt;br /&gt;
[[File:Gitlab-download-instructions-3.png|alt=Click the download button|none||thumb|Step 4]]&lt;br /&gt;
[[Category:User Documentation]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123285</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123285"/>
		<updated>2025-09-21T21:16:42Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mark as usable std::make_unique_for_overwrite, ranges and heterogenous lookup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute &amp;lt;code&amp;gt;floor(log2(x))&amp;lt;/code&amp;gt;. (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| Concepts                          || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| Coroutines                        || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Ranges                            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 ||        || ? || (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Mathematical Constants            || C++20 ||                                             || 10     || 12.0.5 || Constants like &amp;lt;code&amp;gt;std::numbers::pi&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Heterogenous lookup in &amp;lt;code&amp;gt;std::unordered_map&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 ||        ||        || Faster lookup, use of smart pointers as keys.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;consteval static&amp;lt;/code&amp;gt; member functions&lt;br /&gt;
|C++20&lt;br /&gt;
| style=&amp;quot;background: pink;&amp;quot; | not yet&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Guaranteed compile time evaluation of member functions (stronger than &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 21 September 2025, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux: GCC 13.3.0 (on Ubuntu 24.04)&lt;br /&gt;
* Windows: GCC 15.1.0&lt;br /&gt;
* macOS: Apple Clang 17.0.0&lt;br /&gt;
* Android: Clang 19.0.0 (on Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
We support the latest Debian stable and latest Ubuntu LTS.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || glib || glibmm || gtk4 || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 13 (Trixie)             || 14.2.0 || 19.0   || 2.84.4 || 2.84.0 || 4.18.6 || 4.18.0&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.3.0 || 18.1.3 || 2.80.0 || 2.78.1 || 4.14.2 || style=&amp;quot;background: wheat;&amp;quot; | 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The build requires glibmm &amp;gt;= 2.78.1 and gtkmm4 &amp;gt;= 4.14, however Inkscape will compile its own gtkmm4 if the system version is too old, so building on Ubuntu 24.04 still works out of the box.&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123284</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123284"/>
		<updated>2025-09-21T20:22:15Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mark as usable std::format, concepts, and coroutines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute &amp;lt;code&amp;gt;floor(log2(x))&amp;lt;/code&amp;gt;. (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| Concepts                          || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| Coroutines                        || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.5 || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Ranges                            || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Mathematical Constants            || C++20 ||                                             || 10     || 12.0.5 || Constants like &amp;lt;code&amp;gt;std::numbers::pi&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Heterogenous lookup in &amp;lt;code&amp;gt;std::unordered_map&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        ||        || Faster lookup, use of smart pointers as keys.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;consteval static&amp;lt;/code&amp;gt; member functions&lt;br /&gt;
|C++20&lt;br /&gt;
| style=&amp;quot;background: pink;&amp;quot; | not yet&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Guaranteed compile time evaluation of member functions (stronger than &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 21 September 2025, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux: GCC 13.3.0 (on Ubuntu 24.04)&lt;br /&gt;
* Windows: GCC 15.1.0&lt;br /&gt;
* macOS: Apple Clang 17.0.0&lt;br /&gt;
* Android: Clang 19.0.0 (on Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
We support the latest Debian stable and latest Ubuntu LTS.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || glib || glibmm || gtk4 || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 13 (Trixie)             || 14.2.0 || 19.0   || 2.84.4 || 2.84.0 || 4.18.6 || 4.18.0&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.3.0 || 18.1.3 || 2.80.0 || 2.78.1 || 4.14.2 || style=&amp;quot;background: wheat;&amp;quot; | 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The build requires glibmm &amp;gt;= 2.78.1 and gtkmm4 &amp;gt;= 4.14, however Inkscape will compile its own gtkmm4 if the system version is too old, so building on Ubuntu 24.04 still works out of the box.&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123283</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=123283"/>
		<updated>2025-09-21T18:54:47Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update compiler versions used by CI&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute &amp;lt;code&amp;gt;floor(log2(x))&amp;lt;/code&amp;gt;. (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| Concepts                          || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| Coroutines                        || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Ranges                            || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Mathematical Constants            || C++20 ||                                             || 10     || 12.0.5 || Constants like &amp;lt;code&amp;gt;std::numbers::pi&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Heterogenous lookup in &amp;lt;code&amp;gt;std::unordered_map&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        ||        || Faster lookup, use of smart pointers as keys.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;consteval static&amp;lt;/code&amp;gt; member functions&lt;br /&gt;
|C++20&lt;br /&gt;
| style=&amp;quot;background: pink;&amp;quot; | not yet&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Guaranteed compile time evaluation of member functions (stronger than &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 21 September 2025, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux: GCC 13.3.0 (on Ubuntu 24.04)&lt;br /&gt;
* Windows: GCC 15.1.0&lt;br /&gt;
* macOS: Apple Clang 17.0.0&lt;br /&gt;
* Android: Clang 19.0.0 (on Ubuntu 24.04)&lt;br /&gt;
&lt;br /&gt;
We support the latest Debian stable and latest Ubuntu LTS.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || glib || glibmm || gtk4 || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 13 (Trixie)             || 14.2.0 || 19.0   || 2.84.4 || 2.84.0 || 4.18.6 || 4.18.0&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.3.0 || 18.1.3 || 2.80.0 || 2.78.1 || 4.14.2 || style=&amp;quot;background: wheat;&amp;quot; | 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The build requires glibmm &amp;gt;= 2.78.1 and gtkmm4 &amp;gt;= 4.14, however Inkscape will compile its own gtkmm4 if the system version is too old, so building on Ubuntu 24.04 still works out of the box.&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=123282</id>
		<title>Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=123282"/>
		<updated>2025-08-10T20:26:55Z</updated>

		<summary type="html">&lt;p&gt;PBS: Move 2025 hackfest from upcoming to past&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a freeform area for Inkscape development and discussion. Curious about [[wiki syntax]]?&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
== Project Info ==&lt;br /&gt;
* [http://www.inkscape.org/ Inkscape Homepage]&lt;br /&gt;
* [[About Inkscape]]&lt;br /&gt;
* [[FAQ]] — Frequently Asked Questions&lt;br /&gt;
* [[Tools]] — Supporting Tools and Applications&lt;br /&gt;
* [[Galleries]]&lt;br /&gt;
* [[Inkscape coverage|Coverage]] — Awards, articles, presentations, books about Inkscape&lt;br /&gt;
* [[Inkscape popularity|Popularity]]&lt;br /&gt;
* [[Inkscape invariants|Inkscape's Mission]]&lt;br /&gt;
* [https://inkscape.org/en/community/ Communication] — How to reach us&lt;br /&gt;
* [[Announcement to Sodipodi]] — This started it all&lt;br /&gt;
* [[Branding]]&lt;br /&gt;
* [[Travel Reimbursement Policy]]&lt;br /&gt;
* [[Funded Project System Development]]&lt;br /&gt;
* [[:Category:Hackfest|Hackfests]]&lt;br /&gt;
** upcoming/proposed events:&lt;br /&gt;
** past events:&lt;br /&gt;
*** [[Inkscape Summit 2025 Nuremberg|2025 Nuremberg]]&lt;br /&gt;
*** [[Hackfest2023_Bensberg|2023 Bensberg]]&lt;br /&gt;
*** [[Hackfest2019 SCALE|2019 Pasadena (SCALE)]], [[Hackfest2019 Saarbrücken|2019 Saarbrücken (LGM)]]&lt;br /&gt;
*** [[Hackfest2018|2018 Boston]], [[Hackfest2018 LGM|2018 Seville (LGM)]], [[Hackfest2018 Kiel|2018 Kiel]]&lt;br /&gt;
*** [[Hackfest2017|2017 Paris]]&lt;br /&gt;
*** [[Hackfest2016|2016 Leeds (LGM)]]&lt;br /&gt;
*** [[Hackfest2015|2015 Toronto (LGM)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
* [[Installing Inkscape|Installation]]&lt;br /&gt;
* [[International and Local Communities]]&lt;br /&gt;
* [[Inkscape glossary]]&lt;br /&gt;
* [[User manual information]] — Inkscape manual and how to contribute &lt;br /&gt;
* [http://inkscape.org/en/learn/tutorials/ Tutorials]&lt;br /&gt;
* [[Inkscape SVG vs. plain SVG]]&lt;br /&gt;
* [[Output format requirements]] &lt;br /&gt;
* [[Extension requirements]] —  (slightly outdated)&lt;br /&gt;
* [[Extension reference]] — What each extension does (slightly outdated)&lt;br /&gt;
* [[Installing fonts]]&lt;br /&gt;
* [[Emergency save]] — Recovery in case Inkscape crashed&lt;br /&gt;
* [[Release notes]]&lt;br /&gt;
** ''[[Release notes/1.5|Inkscape 1.5]] &amp;amp;mdash; development branch''&lt;br /&gt;
** '''[[Release notes/1.4|Inkscape 1.4]]''' &amp;amp;mdash; ''current stable release branch''&lt;br /&gt;
***[[Release notes/1.4.1|Inkscape 1.4.1]] &amp;amp;mdash; ''bug fix release branch''&lt;br /&gt;
***'''[[Release notes/1.4.2|Inkscape 1.4.2]]''' &amp;amp;mdash; future ''bug fix release branch''&lt;br /&gt;
* [[Announcing Releases]] (slightly outdated)&lt;br /&gt;
* [[Release Process Debrief]] (slightly outdated)&lt;br /&gt;
* [[Tricks and tips]] — Miscellaneous advice (slightly outdated)&lt;br /&gt;
*[[Customizing Inkscape]] – Change icons, shortcuts, menus, toolbars and other parts of the user interface&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Help Inkscape Without Coding ==&lt;br /&gt;
* [[Help wanted]]&lt;br /&gt;
* [[Bug management]]&lt;br /&gt;
** [[Projects #Bug_Triage]]&lt;br /&gt;
* [[Testing]]&lt;br /&gt;
** [[macOS alpha|macOS]]&lt;br /&gt;
* [[Translation information]]&lt;br /&gt;
* [[WebSite]]&lt;br /&gt;
* [[Inkscape Classes]]&lt;br /&gt;
* [[Conferences]]&lt;br /&gt;
* [[Fundraising Ideas]]&lt;br /&gt;
* [[Creating Inkscape distributions]] — How to build packages&lt;br /&gt;
* [[Updating tracker items]]&lt;br /&gt;
* [[Tutorials and help]]&lt;br /&gt;
* [[How to start a page]] — How to use the wiki&lt;br /&gt;
* [[Creating screencasts]]&lt;br /&gt;
* [[About-Screen contest]]&lt;br /&gt;
* [[social media|Participate in social media]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top: 1em; padding: .5em 1em 1em; border: 1px solid #62C012;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 50%; padding-right: 1em;&amp;quot; |&lt;br /&gt;
=== First Steps ===&lt;br /&gt;
* [[Working with Git]] — How to obtain the source code. A quick start on how to use our version control system.&lt;br /&gt;
* [[Compiling Inkscape]]&lt;br /&gt;
* [[Developer manual]] — Various important information, be sure to read this before coding&lt;br /&gt;
* [[Debugging Inkscape|Debugging]] — Random tips to help debug problems&lt;br /&gt;
* [[Janitorial tasks]] — Small tasks that need doing&lt;br /&gt;
* [[Doxygen documentation]]&lt;br /&gt;
* [[Working with CMake]] — Getting started with CMake coding for configuring and building Inkscape&lt;br /&gt;
&lt;br /&gt;
=== Developer tutorials ===&lt;br /&gt;
* [[Architectural overview]] — A high-level look at Inkscape&lt;br /&gt;
* [[Preferences subsystem]] — Creating and using preference values&lt;br /&gt;
&amp;lt;!-- * XML subsystem — How to manipulate the XML representation of a document&lt;br /&gt;
* Display subsystem — How to make things appear on the canvas&lt;br /&gt;
* Tools subsystem — How to create a new tool --&amp;gt;&lt;br /&gt;
* Extensions&lt;br /&gt;
** [[Extension subsystem]] — An overview of the functionality provided by extensions and the possible implementations&lt;br /&gt;
** [[Script extensions]] — Extend Inkscape easily using scripting languages (Python, Perl, …)&lt;br /&gt;
** [[Python modules for extensions]] — Some helpful routines for use in Python script extensions&lt;br /&gt;
** [[INX extension descriptor format]]&lt;br /&gt;
* [[Creating Live Path Effects]]&lt;br /&gt;
* [[Using libsigc++ signals]]&lt;br /&gt;
&lt;br /&gt;
=== User Interface Discussion===&lt;br /&gt;
*[[Interface translation]]&lt;br /&gt;
* [[Adding interface verbs]]&lt;br /&gt;
*[[Accessible graphics]]&lt;br /&gt;
*[[Dialogs reorganization]]&lt;br /&gt;
*[[Modal interfaces]]&lt;br /&gt;
*[[Text usability]] — Text tool and dialog&lt;br /&gt;
*[[KeyboardShortcutsToDo]]&lt;br /&gt;
**[[Keyboard profiles]] — How you can help&lt;br /&gt;
*[[Statusbar API]]&lt;br /&gt;
* [[Animation-(Timeline)]]&lt;br /&gt;
*[[Free Desktop Graphic Suite]]&lt;br /&gt;
*[[Skeletal Strokes]] — Brushes, Strokes, Pressure Sensibility...&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Development Discussion === &lt;br /&gt;
*[[Roadmap]] — Outdated&lt;br /&gt;
*[[Tracking Dependencies|Dependencies]] — What libs are needed to build Inkscape&lt;br /&gt;
*[[C++20]] — Which C++20 features can be used&lt;br /&gt;
*[[New feature proposals]]&lt;br /&gt;
* [[Extension architecture proposals]]&lt;br /&gt;
*[[Coding Style|Coding Style Discussion]]&lt;br /&gt;
*[[File types]]&lt;br /&gt;
*[[Creating a multicolor icon|Icons]]&lt;br /&gt;
*[[Color management]]&lt;br /&gt;
*[[Printing subsystem]]&lt;br /&gt;
*[[SVG Tiny Compliance]]&lt;br /&gt;
* [[SVG Test Suite Compliance]] — [[W3C]] full test suite&lt;br /&gt;
*[[CSS Support]]&lt;br /&gt;
*[[Google Summer of Code]]&lt;br /&gt;
* [[Improved Media Management]]&lt;br /&gt;
*[[UI Mockup Screenshots]]&lt;br /&gt;
* [[Swatch Book]]&lt;br /&gt;
*[[Tablet Dialog]]&lt;br /&gt;
*[[ViewBoxToDo]] — View box support info&lt;br /&gt;
* [[Caching]]&lt;br /&gt;
*[[Canvas Rendering Profiling]]&lt;br /&gt;
*[[UI and Document coordinates‎]]&lt;br /&gt;
* [[GtkMMification]] — Replace C boilerplate with gtkmm objects&lt;br /&gt;
*[[CMake Tasks]] — Converting the Inkscape build system to CMake&lt;br /&gt;
*[[Bug Reporting Workflow]] — Options for improving Inkscape bug workflow from user to developer&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
*[[Inkscape-specific XML attributes]] — Documentation of attributes from Inkscape's XML namespace&lt;br /&gt;
*[[Environment variables]] — Overview of important environment variables that modify the behavior of Inkscape and its dependencies.&lt;br /&gt;
*[[Extension repository]] — An Internet central for Inkscape extensions&lt;br /&gt;
*[[Related programs]]&lt;br /&gt;
*[[Sponsors list]]&lt;br /&gt;
*[[Contracting Process]] &lt;br /&gt;
*[[Wiki Playground]]&lt;br /&gt;
&lt;br /&gt;
===[[Lib2geom]]===&lt;br /&gt;
*[[Lib2geom]]&lt;br /&gt;
*[[Working with 2Geom FAQ]] — Real-life questions answered about using 2Geom in real code&lt;br /&gt;
*[[Lib2geom py2geom]] — Python bindings to 2geom. With this you can use the power of 2geom in Python scripts.&lt;br /&gt;
&lt;br /&gt;
===Historical pages===&lt;br /&gt;
These pages are outdated, but linked here for posterity.&lt;br /&gt;
&lt;br /&gt;
*[[Working with Bazaar]] — Our former control version system, no longer used. See [[Working with Git]] for current instructions.&lt;br /&gt;
* [[Creating a new SPObject]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*&lt;br /&gt;
[[:Category:Wiki Attic|Wiki Attic]] — Pages that are no longer relevant but kept for historical value&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Top level categories]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Projects&amp;diff=123275</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Projects&amp;diff=123275"/>
		<updated>2025-06-13T11:45:27Z</updated>

		<summary type="html">&lt;p&gt;PBS: Expand GC section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{DevDiscussion}}&lt;br /&gt;
&lt;br /&gt;
This page lists proposed ideas for projects to improve Inkscape. The original list is from Krzysztof Kosiński. Consider it a permanent work-in-progress &amp;quot;brainstorm&amp;quot; list and feel free to add your own comments and project proposals.  None of these are &amp;quot;official&amp;quot; and have not been thoroughly reviewed/debated and so may or may not fit with actual development plans.&lt;br /&gt;
&lt;br /&gt;
== General Codebase ==&lt;br /&gt;
&lt;br /&gt;
=== Object Printing ===&lt;br /&gt;
&lt;br /&gt;
Replace the print functions in the SPxxx classes with a generic &amp;quot;Visitor&amp;quot; pattern and port the different export types (e.g. EMF, PDF, PS) to the new routines.&lt;br /&gt;
&lt;br /&gt;
=== Janitorial Work ===&lt;br /&gt;
&lt;br /&gt;
Clean up all unnecessary castings in C++ classes. Remove unnecessary use of &amp;quot;this&amp;quot;. Etc.&lt;br /&gt;
&lt;br /&gt;
=== Rename s/SP/Ink/ ===&lt;br /&gt;
&lt;br /&gt;
Various functions and variables have names from the early versions of Sodipodi, these names no longer makes sense (especially for new developers).  Renaming s/SP/Ink/ would be ok if there aren't better ideas.  This is most prevalent in the object tree, which may or may not be worth changing, but everything that is not part of the object tree should definitely be converted.&lt;br /&gt;
&lt;br /&gt;
=== Retire Garbage Collector ===&lt;br /&gt;
&lt;br /&gt;
We use the Boehm garbage collector in the XML and undo subsystems. This GC usage is likely entirely removable.&lt;br /&gt;
&lt;br /&gt;
Review all classes that derive from &amp;lt;code&amp;gt;GC::Managed&amp;lt;/code&amp;gt;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Class !! Comments&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XML::AttributeRecord&amp;lt;/code&amp;gt; || Always uniquely owned by &amp;lt;code&amp;gt;XML::SimpleNode&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XML::CompositeNodeObserver&amp;lt;/code&amp;gt; || Never heap-allocated - doesn't even need to be managed.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XML::Event&amp;lt;/code&amp;gt; || Integral part of document undo.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XML::Node&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;XML::SimpleNode&amp;lt;/code&amp;gt; || In practice, these are the same class. Integral part of XML system.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XML::Subtree&amp;lt;/code&amp;gt; || Used in one ''single'' place, easily removable.&lt;br /&gt;
|}&lt;br /&gt;
Understand their usage and lifetime patterns, and rewrite them to use standard, deterministic C++ memory management (e.g. smart pointers).&lt;br /&gt;
&lt;br /&gt;
Remaining GC usage is in shared immutable strings used to hold XML attributes (&amp;lt;code&amp;gt;Util::share_string&amp;lt;/code&amp;gt;). Replace with an equally-performant alternative.&lt;br /&gt;
&lt;br /&gt;
== Object Tree ==&lt;br /&gt;
&lt;br /&gt;
=== Robust ID handling refactoring ===&lt;br /&gt;
&lt;br /&gt;
Currently ID clash resolution is implemented as a giant switch over object types, listing every possible dependency. Replace this with virtual methods on objects, which provide information on what each object refers to. Improve behavior when a dependency of an object is deleted, and when IDs are changed / deleted from the XML editor.&lt;br /&gt;
&lt;br /&gt;
See id-class.cpp for specifics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;It should be possible to change ID and have&lt;br /&gt;
Inkscape update all references. It should also not be automatically&lt;br /&gt;
created for all objects. Tav&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Typed XML tree ===&lt;br /&gt;
&lt;br /&gt;
Improve XML tree so that it can store some attributes in parsed,&lt;br /&gt;
binary form. The main target of this are the data URIs used to embed&lt;br /&gt;
images, which could be stored as binary data only. This work should be&lt;br /&gt;
done after completing task 3 (SAX parser), as this will make it&lt;br /&gt;
easier.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== XML Refactoring ===&lt;br /&gt;
Remove direct manipulation of XML from as many places as possible and replace it with SP tree methods.&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
=== On-canvas tool controls ===&lt;br /&gt;
&lt;br /&gt;
More tool controls could be available on-canvas right by the object &lt;br /&gt;
being edited. An example of this would be having some of the text &lt;br /&gt;
tool controls available right by where text editing is happening &lt;br /&gt;
akin to what GIMP provides.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Numeric input on the canvas ===&lt;br /&gt;
&lt;br /&gt;
Right-clicking on nodes should bring up a numeric entry box which&lt;br /&gt;
would allow you to specify its position numericaly. This could allow&lt;br /&gt;
us to phase out some of the controls on the top bar. For dynamic&lt;br /&gt;
offsets, the numeric entry would simply be the width of the offset&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Unify document and desktop coordinates ===&lt;br /&gt;
&lt;br /&gt;
Change the desktop coordinates to match document coordinates. Make it&lt;br /&gt;
so that document coordinates are specified in the coordinate system of&lt;br /&gt;
the toplevel SVG element, so that it is possible to emulate other&lt;br /&gt;
coordinate systems using a suitable transform attribute or viewBox.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Shape manipulators ===&lt;br /&gt;
&lt;br /&gt;
The idea here is to rewrite shape tools in the same paradigm as the&lt;br /&gt;
node tool. Instead of storing all information about the shape in knots&lt;br /&gt;
which differ only by their callbacks, allow to store information in a&lt;br /&gt;
higher-level manipulator object. This would enable things like&lt;br /&gt;
dragging the side of a rectangle and consistent outlining / update&lt;br /&gt;
preferences for all shapes.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== SVG Support ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
=== [https://inkscape.org/en/projects/svg2-compliant-flowed-text/ SVG-compliant flowed text (FPRJ-003)] ===&lt;br /&gt;
&lt;br /&gt;
Move the existing flowed text XML representation into an svg:switch&lt;br /&gt;
and provide an alternative fallback representation with SVG 1.1 text&lt;br /&gt;
objects only.&lt;br /&gt;
&lt;br /&gt;
This should be done via SVG 2 CSS text wrapping&lt;br /&gt;
which provides a simple SVG 1.1 fallback mechanism.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
priority: Short term&lt;br /&gt;
owner: Tav&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vector effects ===&lt;br /&gt;
&lt;br /&gt;
Refactor live path effects so that their XML representation matches&lt;br /&gt;
that of SVG 2.0 vector effects. Put them in switches, so that the&lt;br /&gt;
output is not limited to a single path. Integrate them better with&lt;br /&gt;
core Inkscape. For instance, instead of four actions: inset, outset,&lt;br /&gt;
dynamic offset, linked offset, there should be only one: offset. Using&lt;br /&gt;
it on a normal path would create a dynamic offset, while using it on a&lt;br /&gt;
clone would create a linked offset. The same principle would apply to&lt;br /&gt;
vector effects: creating them on a normal path would move the path to&lt;br /&gt;
defs and replace it with the vector effect, while creating them on&lt;br /&gt;
clones would delete the clone and create a reference to the original&lt;br /&gt;
path.&lt;br /&gt;
&lt;br /&gt;
Update: Vector effects will be dropped from SVG 2 but we can still refactor&lt;br /&gt;
our own code to make it easier to use.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Better support for linked SVG images ===&lt;br /&gt;
&lt;br /&gt;
Create the document and rendering tree for linked SVG images. Use&lt;br /&gt;
Inkscape's renderer instead of relying on the librsvg loader to avoid&lt;br /&gt;
inconsistencies. Allow importing the linked image as a group via the&lt;br /&gt;
context menu.&lt;br /&gt;
&lt;br /&gt;
There are two main conceptual ways of dealing with linked svg files, one is to treat svg files as 'bitmaps' using our own renderer to generate a bitmap and placing it inside much like we do with including outside png, jpeg files. This has implications involving exporting png with mismatched resolutions and pdf where text and vector elements are no longer vector in the output pdf.&lt;br /&gt;
&lt;br /&gt;
The second method is to treat the svg as an advanced 'clone' which has it's own defs section. This would preserve the vector nature of the included svg file and allow rendering via pdf and png to happen without much exception. The implications of this have not been thought through completely.&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== SVG 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;Mesh gradients, hatches, etc. See [[SVG2|SVG2 page]]. Tav&amp;lt;/span&amp;gt;&lt;br /&gt;
* Improve support for SVG switches: the first recognized element in a switch should appear directly in the SP tree, not as a child of the switch element.&lt;br /&gt;
&lt;br /&gt;
== Paths ==&lt;br /&gt;
&lt;br /&gt;
=== Boolean operations and stroking ===&lt;br /&gt;
&lt;br /&gt;
Add methods to PathVector objects:&lt;br /&gt;
&lt;br /&gt;
a) Set operators (&amp;amp; | - ^), which perform the relevant boolean&lt;br /&gt;
operation on the paths. Use the algorithm from CGAL or devise a new&lt;br /&gt;
robust algorithm.&lt;br /&gt;
&lt;br /&gt;
b) stroke(double line_width, LineJoin join, LineCap cap, double&lt;br /&gt;
miter_limit), which performs the stroke-to-path operation.&lt;br /&gt;
&lt;br /&gt;
c) stroke(double line_width, LineJoin join, LineCap cap, double&lt;br /&gt;
miter_limit, std::vector&amp;lt;double&amp;gt; const &amp;amp;dasharray), which performs&lt;br /&gt;
stroke-to-path with dashing.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== Fonts ==&lt;br /&gt;
&lt;br /&gt;
=== variable fonts usability/UX ===&lt;br /&gt;
&lt;br /&gt;
=== filters UI usability/UX ===&lt;br /&gt;
&lt;br /&gt;
== Print ==&lt;br /&gt;
&lt;br /&gt;
=== Color Management ===&lt;br /&gt;
&lt;br /&gt;
Analyze what users require for CMYK and other aspects of color management,&lt;br /&gt;
including a review of what other software does, and what can currently be&lt;br /&gt;
done with Inkscape.  Examine off the shelf code that could be used (e.g. libcms).&lt;br /&gt;
Define what needs implemented in Inkscape's dependencies (e.g. libcairo) vs.&lt;br /&gt;
what can or must be done in Inkscape itself.  Outline project(s) to implement&lt;br /&gt;
the needed changes.&lt;br /&gt;
See [[Color_management]] and [[Color Management Planning]] (which represents a head start into this task)&lt;br /&gt;
&lt;br /&gt;
* Improve support for CMYK/spot colors&lt;br /&gt;
** Minor UI streamlining&lt;br /&gt;
** Eliminate the CMS tab&lt;br /&gt;
** Change the CMYK tab to allow selecting the CMYK colors directly&lt;br /&gt;
** Allow setting the document to CMYK, which sets a global CMYK profile&lt;br /&gt;
** Stores RGB colors as RGB, CMYK colors as CMYK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
priority: short term&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
&lt;br /&gt;
There are several distinct types of animation workflows and objectives, such as:&lt;br /&gt;
&lt;br /&gt;
* CSS/SMIL animation - tweening/easing formulas for individual elements, aiming at e.g web display.&lt;br /&gt;
* Sequential animation - each layer is a static frame that can be played back with a time delay, and recorded to a video stream&lt;br /&gt;
* Keyframe animation - layers represent points on a timeline with objects whose states change through some interpolation mechanism&lt;br /&gt;
* Javascript?&lt;br /&gt;
&lt;br /&gt;
While the intent, output, and UI for these may vary, the underlying machinery supporting them may have commonality, so the following projects may apply to one or more of the above types of animation.&lt;br /&gt;
&lt;br /&gt;
=== Object interpolation display ===&lt;br /&gt;
&lt;br /&gt;
Create routines to morph the properties and/or style of an object according to some proportion (such as elapsed time over a time period).&lt;br /&gt;
&lt;br /&gt;
This will need modification of object structures to support the animation attributes, following the SMIL and CSS animation specifications.&lt;br /&gt;
&lt;br /&gt;
contact: Tav&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== Object animation property editor UI/UX design ===&lt;br /&gt;
&lt;br /&gt;
Conceptualize how users would add and edit animation properties in Inkscape.  What should be done in dialogs vs. in the main interface?&lt;br /&gt;
Mockup ideas for how the UI could look.  Describe the workflow the user would follow.&lt;br /&gt;
&lt;br /&gt;
=== Time keyed layer display ===&lt;br /&gt;
&lt;br /&gt;
Functionality to display/hide a list of layers in a fixed or variable sequence, or recorded to a sequential output format (e.g. a video output format or numbered raster images).&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== Frame transitions ===&lt;br /&gt;
&lt;br /&gt;
Expand on the above projects by organizing objects in sequential layers, where the layers can mark either transition points for a given object, or an object that replaces one or more objects in an earlier frame.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== CSS/SVG Web Animations ===&lt;br /&gt;
&lt;br /&gt;
Export animation properties as corresponding CSS/SVG parameters to output files, following the model from the Web Animations specification so that both SMIL and CSS animations are supported. Inkscape Community/Tav&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== Technical Writing ==&lt;br /&gt;
&lt;br /&gt;
=== Improve this Project List ===&lt;br /&gt;
&lt;br /&gt;
Review all the projects in this list.  Cleanup grammar or phrasing to make the descriptions clearer.  Expand on points that are vague.  Add links to relevant bug reports, feature requests, blueprints, etc.  Add &amp;quot;[Please fill in]&amp;quot; to items that need more information; identify particular questions needing addressed where possible.&lt;br /&gt;
&lt;br /&gt;
=== Inkscape Widgets Doxygen ===&lt;br /&gt;
&lt;br /&gt;
Over the years Inkscape has collected a number of custom UI objects, which have been consolidated to src/widgets/.  Many of these are un- or under-documented.  For each widget, write doxygen comments in the header file explaining what the widget is and does, and document the widget's public API.  In some cases there may be doxygen in the .cpp file for public API functions - this should move to the header.&lt;br /&gt;
&lt;br /&gt;
=== Bring inkscape/doc up to date ===&lt;br /&gt;
&lt;br /&gt;
The doc directory in the Inkscape codebase is used for high level technical documentation including architecture, codebase introduction, and new developer orientation, however it has not been very well maintained and much is obsolete or incorrect.  It also needs to be reformatted into Markdown, and appropriate scripts created to generate it into HTML/PDF/SVG.  There may be additional developer documentation in Wiki that would be worth inclusion here.&lt;br /&gt;
&lt;br /&gt;
=== Code Doxygen Documentation ===&lt;br /&gt;
&lt;br /&gt;
Ensure all functions declared in header files have doxygen-compatible documentation.  See items in [[Janitorial tasks]] for the style we're going for.  All doxygen of the core Inkscape code (i.e. excluding 3rd party libraries included in src/*/) should have consistently written and formatted doxygen, which should include descriptions of input, output, and return parameters, identification of potential errors, a one-line brief statement and a more detailed explanation of the routine's purpose.&lt;br /&gt;
&lt;br /&gt;
== User-facing documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Release Notes Improvement ===&lt;br /&gt;
&lt;br /&gt;
Review the release notes for the next major Inkscape release.  Update wording and phrasing to be more comprehensible for end users.  Fill in missing items where possible.  Create and add explanatory graphics (c.f as done in past release notes).  Add Known Issues from the previous release that are still relevant.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
* Review existing tutorials and update as appropriate&lt;br /&gt;
* Finish or remove unfinished tutorials&lt;br /&gt;
* Solicit community-contributed tutorial contributions&lt;br /&gt;
* Introduce new tutorials&lt;br /&gt;
&lt;br /&gt;
=== Man page ===&lt;br /&gt;
&lt;br /&gt;
* Update man page&lt;br /&gt;
** transcribe the examples to the new command line structure&lt;br /&gt;
* Add more helpful examples&lt;br /&gt;
&lt;br /&gt;
=== Manual ===&lt;br /&gt;
&lt;br /&gt;
Create a comprehensive, community-owned Inkscape manual: As a first step, devise a plan for how / where it will be created / hosted, and how versioning is going to work. Define its structure, and a set of editing guidelines. Recruit writers and proofreaders. Write the documentation. Keep the documentation up-to-date with the released Inkscape versions (ongoing task).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Packaging and Release Management ==&lt;br /&gt;
&lt;br /&gt;
=== Library Package De-integration ===&lt;br /&gt;
&lt;br /&gt;
Several 3rd party codebases are included in Inkscape's codebase (i.e., src/lib*/, src/2geom, possibly livarot?).  This has convenience for local patching of our own improvements and simplifies the number of components platform packagers need to deal with, however this increases the weight of our codebase and makes our package larger on platforms such as Linux that have good dependency sharing.  Arguably, it may also hinder collaboration with the upstreams or other users of the libraries.  Certainly it makes it difficult to roll out fixes to one of those libraries to our users.  So, we want these libraries to be packaged and released separately from Inkscape.&lt;br /&gt;
&lt;br /&gt;
For each of these libraries, create a separate git repository in Inkscape's gitlab project for hosting our branch of that project's code.  Make sure any of Inkscape's changes to it are clearly registered as distinct git commits.  If there is an active upstream project maintaining that library, make sure each of our changes are registered in their patch or bug tracking systems.&lt;br /&gt;
&lt;br /&gt;
In theory, Inkscape should only be using the libraries' public APIs; doublecheck that this is indeed the case, and identify any instances where Inkscape code is bypassing it and accessing library internals directly.  These should be filed as high priority bugs in Inkscape's bug tracker.&lt;br /&gt;
&lt;br /&gt;
Lastly, make sure that `make dist` passes successfully for each of our branched libraries, and generates a source tarball.  Inform the Release Team of the need to start separately packaging and releasing these libraries in conjunction with Inkscape's release processes.&lt;br /&gt;
&lt;br /&gt;
== Bug Triage ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With as many bugs as we've accumulated, working on them can seem daunting.  Where to start!?  Below are some encapsulated projects to try to achieve.  Together, the more of these projects that are completed the less daunting the remaining work will be, and the better Inkscape will become!&lt;br /&gt;
&lt;br /&gt;
The [[Bug management]] page in this wiki includes advice on how to judge bug status and importance levels.&lt;br /&gt;
&lt;br /&gt;
''Tip:  Some of these tasks could be scripted and automated via the Launchpad email interface.  See https://help.launchpad.net/BugTrackerEmailInterface''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;&lt;br /&gt;
=== (100% Complete) Update Status for Critical Bugs from New ===&lt;br /&gt;
&lt;br /&gt;
(DONE) Review each Critical bug with Status New, and change status to Incomplete if the last comment on the bug is a question, or Confirmed otherwise. -- Bryce&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (100% Complete) Update Status for Critical Bugs from Fix Committed ===&lt;br /&gt;
&lt;br /&gt;
Review each Critical bug with Status Fix Committed; most likely these are incorrect.  If comments towards the end of the thread indicate a fix was committed to SVN, then it is okay to be in state Fix Committed.  Otherwise, move it to a more accurate Status.&lt;br /&gt;
&lt;br /&gt;
=== (100% Complete) Update Status for High Priority Bugs from Fix Committed ===&lt;br /&gt;
&lt;br /&gt;
Review each High priority bug with Status Fix Committed; most likely these are incorrect.  If comments towards the end of the thread indicate a fix was committed to SVN, then it is okay to be in state Fix Committed.  Otherwise, move it to a more accurate Status.&lt;br /&gt;
&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update Status for High Priority Bugs from New ===&lt;br /&gt;
&lt;br /&gt;
Review each High priority bug with Status New, and change status to Incomplete if the last comment on the bug is a question, or Confirmed otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Tag OSX bugs ===&lt;br /&gt;
&lt;br /&gt;
Using the Advanced search, identify bugs that are reported against OSX and update them to include the tag 'osx'.&lt;br /&gt;
&lt;br /&gt;
=== Tag Windows bugs ===&lt;br /&gt;
&lt;br /&gt;
Using the Advanced search, identify bugs that are reported against Windows and update them to include the tag 'windows'. Some bugs are already tagged with 'win32'&lt;br /&gt;
: Searched all entries with 'win' in it. Tagged all appropriate bug reports with 'win32'. Now only 'win32' tags exist, but no 'windows' tags. Renaming the tags via the database should be easier than doing it manually (if at all possible). Is this what you guys had in mind? --[[User:Cerno|Cerno]] 15:40, 30 June 2008 (UTC)&lt;br /&gt;
&lt;br /&gt;
=== Link Cairo bugs ===&lt;br /&gt;
&lt;br /&gt;
Do a search for 'cairo'.  Review the bugs (there's only about a dozen), and for each, identify if the issue is a Cairo bug.  If so, look in the cairo bug tracker at freedesktop.org for a matching bug (or enter a new one if there isn't one already) and link it in via the 'Also affects: +Project'.&lt;br /&gt;
&lt;br /&gt;
=== Set Importance on Confirmed / Fixed Bugs ===&lt;br /&gt;
&lt;br /&gt;
Do a search on Importance=Undecided and Status=Fix Committed,Confirmed,In Progress.  (There's 18 of these presently).  Review each and assign it an Importance (probably Medium or High in most cases, but use best judgement).&lt;br /&gt;
&lt;br /&gt;
=== Ping Old Low Priority Bugs ===&lt;br /&gt;
&lt;br /&gt;
Search on bugs with Importance=Low, sorted by Oldest First.  Go through the bugs that are more than a year old and review them.  If they don't seem to have gotten much activity (e.g. few comments), and don't seem to be worth keeping, mark them Incomplete, with the following text:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Thank you for taking the time to report this bug and helping to make Inkscape better. You reported this bug a long while ago and there hasn't been any activity in it recently. We were wondering is this still an issue for you? Can you try with latest Inkscape release? Thanks in advance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or if it is a feature request:&lt;br /&gt;
&amp;quot;Thank you for taking the time to report this feature request and helping to make Inkscape better. You requested this feature a long while ago and there hasn't been any activity in it recently. We were wondering; is this still on your wishlist? Can you try with latest Inkscape release and see if recent improvements have obsoleted your request? Thanks in advance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wait about a month, then follow up with a search against these bugs that have not received a response; they can then be closed as Invalid.&lt;br /&gt;
&lt;br /&gt;
https://wiki.ubuntu.com/Bugs/Status&lt;br /&gt;
&lt;br /&gt;
=== Confirm all appropriate bugs marked Incomplete with responses ===&lt;br /&gt;
&lt;br /&gt;
Search on 'Incomplete with response', and review the feedback that's been given.  If it appears the initial triager's information requests were met, and the bug seems legitimate, move it to Confirmed.  If there seems to be further questions needing answered, ask them and leave it as incomplete.&lt;br /&gt;
&lt;br /&gt;
As well, specify a priority for these bugs.  Generally, issues that cause crashes or data loss are high priority unless they only occur in very narrow situations.  Issues which are purely cosmetic or involve very obscure or limited conditions are low priority, and everything else is Medium.  Only use Critical priority for extremely serious bugs that will be affecting most everyone using Inkscape.&lt;br /&gt;
&lt;br /&gt;
=== Convert high priority wishlist bugs into blueprints ===&lt;br /&gt;
&lt;br /&gt;
Browse the collection of bugs marked ''wishlist''.  Look for sets of related bugs that are all requesting essentially the same feature.  Create a corresponding blueprint at [https://blueprints.launchpad.net/inkscape https://blueprints.launchpad.net/inkscape], and use ''Specify a URL'' to attach it to a wiki page.  Then consolidate the wishlist bug reports together onto the blueprint page.  Specify if you're willing to act as the Drafter for the spec, and carry it through to acceptance, or if you prefer someone else take that role.&lt;br /&gt;
&lt;br /&gt;
Once you've created the specification, use ''Link to bug'' to link each of the related bugs.&lt;br /&gt;
&lt;br /&gt;
=== Close old incomplete bugs with no response ===&lt;br /&gt;
&lt;br /&gt;
Do a query on bugs marked Incomplete with no response, and sort by age.  All bugs older than 1 month with no reply can be closed as out of date.&lt;br /&gt;
=== [https://inkscape.org/en/projects/box-blur/ Box blur (FPRJ-001)] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
Currently we always use a very accurate method to compute the Gaussian&lt;br /&gt;
blur filter. Add an alternate method which approximates Gaussian blur&lt;br /&gt;
using three stacked box blurs (simple averages). This is detailed in&lt;br /&gt;
the SVG 1.1 SE specification.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Marker Knockout ===&lt;br /&gt;
&lt;br /&gt;
Idea is to clean up markers where part of the line shows through.  For example if a triangular arrowhead's tip is on the end point of a line with a relatively thick stroke, the rectangular end corners of the line shows up.  Or if you're doing a mid-line marker that needs to have a transparent hole (e.g. a &amp;quot;subway station marker&amp;quot;, it needs to show through.&lt;br /&gt;
&lt;br /&gt;
To implement this, draw the line on another surface and mask it with the knockout shape.  The filters code uses this approach, as an example.  See also the [https://www.w3.org/TR/svg-markers/ SVG Markers] specification.&lt;br /&gt;
&lt;br /&gt;
contact: Tav&lt;br /&gt;
priority: Nearer term&lt;br /&gt;
=== Restore Ancient Change History ===&lt;br /&gt;
&lt;br /&gt;
Inkscape's earliest development history is missing, with the first commit being &amp;quot;bzr r1&amp;quot; when we migrated to bzr.  Prior history was in CVS and is missing.  While not a huge priority, it would be nice to have this pre-bzr history resurrected and prepended to our git history.&lt;br /&gt;
&lt;br /&gt;
=== Rewrite / reintroduce 3D box ===&lt;br /&gt;
** 3-dimensional grid, perspective deformed, with snapping&lt;br /&gt;
&lt;br /&gt;
=== Git Integration ===&lt;br /&gt;
Due to the nature of SVG (text files), versioning might offer a really good way to effectively manage local historical changes even when inkscape is closed. [[https://git-scm.com/ Git]] is a popular versioning software, and is well known among open source contributors. I imagine a versioning system could be &amp;quot;enabled&amp;quot; through the user interface, and allow a user to tag &amp;quot;releases&amp;quot;, branch copies if need be, and maintain a historical log of changes.  Git could also have been a great way to maintain a branch of different versions of the svg file when the Inkscape project made the change of default dpi for old files recently.&lt;br /&gt;
&lt;br /&gt;
=== Other Misc. Ideas ===&lt;br /&gt;
* Improve support for changing the name of the XML element node in response to SP tree changes&lt;br /&gt;
* Inkscape for Android&lt;br /&gt;
* CAD drawing functionality&lt;br /&gt;
* OCR of bitmap traces&lt;br /&gt;
* Excentric radial gradients, see e.g. samples/orav.svg in the distribution. --bb&lt;br /&gt;
&lt;br /&gt;
= Finished Projects =&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;[https://inkscape.org/en/projects/remove-all-use-of-glist-and-gslist/ Remove all use of GList and GSList]&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
These GLib data structures are poorly designed (they are simple lists&lt;br /&gt;
without sentinels, leading to blunders such as O(N) performance when&lt;br /&gt;
appending to a doubly-linked list) and not type-safe. Replace all uses&lt;br /&gt;
with standard C++ containers or suitable Boost containers.&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Common build system for all platforms&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Migrate and port all necessary features to the CMake build system and remove Autotools.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Use a different data structure for Inkscape::Selection&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Inkscape::Selection currently uses GSList as its data structure. This&lt;br /&gt;
is suboptimal, since a very common operation is checking whether some&lt;br /&gt;
object is selected. Change Inkscape::Selection so that its underlying&lt;br /&gt;
structure is a boost::multi_index container which implements the same&lt;br /&gt;
semantics as Java's LinkedHashSet.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Remove dom/ directory&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This directory contains strange code which is barely used. The only&lt;br /&gt;
class which is actually used is the URI class.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Remove SPCurve (refactoring)&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
SPCurve is a thin wrapper around Geom::PathVector which exists for&lt;br /&gt;
historical reasons. Its functionality should be added to PathVector,&lt;br /&gt;
and SPCurve should be purged.&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/7259&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Projects&amp;diff=123274</id>
		<title>Projects</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Projects&amp;diff=123274"/>
		<updated>2025-06-13T10:20:19Z</updated>

		<summary type="html">&lt;p&gt;PBS: Move SPCurve project to done&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{DevDiscussion}}&lt;br /&gt;
&lt;br /&gt;
This page lists proposed ideas for projects to improve Inkscape. The original list is from Krzysztof Kosiński. Consider it a permanent work-in-progress &amp;quot;brainstorm&amp;quot; list and feel free to add your own comments and project proposals.  None of these are &amp;quot;official&amp;quot; and have not been thoroughly reviewed/debated and so may or may not fit with actual development plans.&lt;br /&gt;
&lt;br /&gt;
== General Codebase ==&lt;br /&gt;
&lt;br /&gt;
=== Object Printing ===&lt;br /&gt;
&lt;br /&gt;
Replace the print functions in the SPxxx classes with a generic &amp;quot;Visitor&amp;quot; pattern and port the different export types (e.g. EMF, PDF, PS) to the new routines.&lt;br /&gt;
&lt;br /&gt;
=== Janitorial Work ===&lt;br /&gt;
&lt;br /&gt;
Clean up all unnecessary castings in C++ classes. Remove unnecessary use of &amp;quot;this&amp;quot;. Etc.&lt;br /&gt;
&lt;br /&gt;
=== Rename s/SP/Ink/ ===&lt;br /&gt;
&lt;br /&gt;
Various functions and variables have names from the early versions of Sodipodi, these names no longer makes sense (especially for new developers).  Renaming s/SP/Ink/ would be ok if there aren't better ideas.  This is most prevalent in the object tree, which may or may not be worth changing, but everything that is not part of the object tree should definitely be converted.&lt;br /&gt;
&lt;br /&gt;
=== Retire Garbage Collector ===&lt;br /&gt;
&lt;br /&gt;
We use the Boehm garbage collector, but for smart pointers we can use&lt;br /&gt;
support in C++-11 now, so most likely any Inkscape-specific gc code can&lt;br /&gt;
probably go.  Analyze where this code is, what uses it, and how to port&lt;br /&gt;
it to use standard code, then delete our gc bits&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Object Tree ==&lt;br /&gt;
&lt;br /&gt;
=== Robust ID handling refactoring ===&lt;br /&gt;
&lt;br /&gt;
Currently ID clash resolution is implemented as a giant switch over object types, listing every possible dependency. Replace this with virtual methods on objects, which provide information on what each object refers to. Improve behavior when a dependency of an object is deleted, and when IDs are changed / deleted from the XML editor.&lt;br /&gt;
&lt;br /&gt;
See id-class.cpp for specifics.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;It should be possible to change ID and have&lt;br /&gt;
Inkscape update all references. It should also not be automatically&lt;br /&gt;
created for all objects. Tav&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Typed XML tree ===&lt;br /&gt;
&lt;br /&gt;
Improve XML tree so that it can store some attributes in parsed,&lt;br /&gt;
binary form. The main target of this are the data URIs used to embed&lt;br /&gt;
images, which could be stored as binary data only. This work should be&lt;br /&gt;
done after completing task 3 (SAX parser), as this will make it&lt;br /&gt;
easier.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== XML Refactoring ===&lt;br /&gt;
Remove direct manipulation of XML from as many places as possible and replace it with SP tree methods.&lt;br /&gt;
&lt;br /&gt;
== Interface ==&lt;br /&gt;
=== On-canvas tool controls ===&lt;br /&gt;
&lt;br /&gt;
More tool controls could be available on-canvas right by the object &lt;br /&gt;
being edited. An example of this would be having some of the text &lt;br /&gt;
tool controls available right by where text editing is happening &lt;br /&gt;
akin to what GIMP provides.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Numeric input on the canvas ===&lt;br /&gt;
&lt;br /&gt;
Right-clicking on nodes should bring up a numeric entry box which&lt;br /&gt;
would allow you to specify its position numericaly. This could allow&lt;br /&gt;
us to phase out some of the controls on the top bar. For dynamic&lt;br /&gt;
offsets, the numeric entry would simply be the width of the offset&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Unify document and desktop coordinates ===&lt;br /&gt;
&lt;br /&gt;
Change the desktop coordinates to match document coordinates. Make it&lt;br /&gt;
so that document coordinates are specified in the coordinate system of&lt;br /&gt;
the toplevel SVG element, so that it is possible to emulate other&lt;br /&gt;
coordinate systems using a suitable transform attribute or viewBox.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Shape manipulators ===&lt;br /&gt;
&lt;br /&gt;
The idea here is to rewrite shape tools in the same paradigm as the&lt;br /&gt;
node tool. Instead of storing all information about the shape in knots&lt;br /&gt;
which differ only by their callbacks, allow to store information in a&lt;br /&gt;
higher-level manipulator object. This would enable things like&lt;br /&gt;
dragging the side of a rectangle and consistent outlining / update&lt;br /&gt;
preferences for all shapes.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== SVG Support ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
=== [https://inkscape.org/en/projects/svg2-compliant-flowed-text/ SVG-compliant flowed text (FPRJ-003)] ===&lt;br /&gt;
&lt;br /&gt;
Move the existing flowed text XML representation into an svg:switch&lt;br /&gt;
and provide an alternative fallback representation with SVG 1.1 text&lt;br /&gt;
objects only.&lt;br /&gt;
&lt;br /&gt;
This should be done via SVG 2 CSS text wrapping&lt;br /&gt;
which provides a simple SVG 1.1 fallback mechanism.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
priority: Short term&lt;br /&gt;
owner: Tav&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Vector effects ===&lt;br /&gt;
&lt;br /&gt;
Refactor live path effects so that their XML representation matches&lt;br /&gt;
that of SVG 2.0 vector effects. Put them in switches, so that the&lt;br /&gt;
output is not limited to a single path. Integrate them better with&lt;br /&gt;
core Inkscape. For instance, instead of four actions: inset, outset,&lt;br /&gt;
dynamic offset, linked offset, there should be only one: offset. Using&lt;br /&gt;
it on a normal path would create a dynamic offset, while using it on a&lt;br /&gt;
clone would create a linked offset. The same principle would apply to&lt;br /&gt;
vector effects: creating them on a normal path would move the path to&lt;br /&gt;
defs and replace it with the vector effect, while creating them on&lt;br /&gt;
clones would delete the clone and create a reference to the original&lt;br /&gt;
path.&lt;br /&gt;
&lt;br /&gt;
Update: Vector effects will be dropped from SVG 2 but we can still refactor&lt;br /&gt;
our own code to make it easier to use.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== Better support for linked SVG images ===&lt;br /&gt;
&lt;br /&gt;
Create the document and rendering tree for linked SVG images. Use&lt;br /&gt;
Inkscape's renderer instead of relying on the librsvg loader to avoid&lt;br /&gt;
inconsistencies. Allow importing the linked image as a group via the&lt;br /&gt;
context menu.&lt;br /&gt;
&lt;br /&gt;
There are two main conceptual ways of dealing with linked svg files, one is to treat svg files as 'bitmaps' using our own renderer to generate a bitmap and placing it inside much like we do with including outside png, jpeg files. This has implications involving exporting png with mismatched resolutions and pdf where text and vector elements are no longer vector in the output pdf.&lt;br /&gt;
&lt;br /&gt;
The second method is to treat the svg as an advanced 'clone' which has it's own defs section. This would preserve the vector nature of the included svg file and allow rendering via pdf and png to happen without much exception. The implications of this have not been thought through completely.&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== SVG 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:blue&amp;quot;&amp;gt;Mesh gradients, hatches, etc. See [[SVG2|SVG2 page]]. Tav&amp;lt;/span&amp;gt;&lt;br /&gt;
* Improve support for SVG switches: the first recognized element in a switch should appear directly in the SP tree, not as a child of the switch element.&lt;br /&gt;
&lt;br /&gt;
== Paths ==&lt;br /&gt;
&lt;br /&gt;
=== Boolean operations and stroking ===&lt;br /&gt;
&lt;br /&gt;
Add methods to PathVector objects:&lt;br /&gt;
&lt;br /&gt;
a) Set operators (&amp;amp; | - ^), which perform the relevant boolean&lt;br /&gt;
operation on the paths. Use the algorithm from CGAL or devise a new&lt;br /&gt;
robust algorithm.&lt;br /&gt;
&lt;br /&gt;
b) stroke(double line_width, LineJoin join, LineCap cap, double&lt;br /&gt;
miter_limit), which performs the stroke-to-path operation.&lt;br /&gt;
&lt;br /&gt;
c) stroke(double line_width, LineJoin join, LineCap cap, double&lt;br /&gt;
miter_limit, std::vector&amp;lt;double&amp;gt; const &amp;amp;dasharray), which performs&lt;br /&gt;
stroke-to-path with dashing.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== Fonts ==&lt;br /&gt;
&lt;br /&gt;
=== variable fonts usability/UX ===&lt;br /&gt;
&lt;br /&gt;
=== filters UI usability/UX ===&lt;br /&gt;
&lt;br /&gt;
== Print ==&lt;br /&gt;
&lt;br /&gt;
=== Color Management ===&lt;br /&gt;
&lt;br /&gt;
Analyze what users require for CMYK and other aspects of color management,&lt;br /&gt;
including a review of what other software does, and what can currently be&lt;br /&gt;
done with Inkscape.  Examine off the shelf code that could be used (e.g. libcms).&lt;br /&gt;
Define what needs implemented in Inkscape's dependencies (e.g. libcairo) vs.&lt;br /&gt;
what can or must be done in Inkscape itself.  Outline project(s) to implement&lt;br /&gt;
the needed changes.&lt;br /&gt;
See [[Color_management]] and [[Color Management Planning]] (which represents a head start into this task)&lt;br /&gt;
&lt;br /&gt;
* Improve support for CMYK/spot colors&lt;br /&gt;
** Minor UI streamlining&lt;br /&gt;
** Eliminate the CMS tab&lt;br /&gt;
** Change the CMYK tab to allow selecting the CMYK colors directly&lt;br /&gt;
** Allow setting the document to CMYK, which sets a global CMYK profile&lt;br /&gt;
** Stores RGB colors as RGB, CMYK colors as CMYK&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
priority: short term&lt;br /&gt;
&lt;br /&gt;
== Animation ==&lt;br /&gt;
&lt;br /&gt;
There are several distinct types of animation workflows and objectives, such as:&lt;br /&gt;
&lt;br /&gt;
* CSS/SMIL animation - tweening/easing formulas for individual elements, aiming at e.g web display.&lt;br /&gt;
* Sequential animation - each layer is a static frame that can be played back with a time delay, and recorded to a video stream&lt;br /&gt;
* Keyframe animation - layers represent points on a timeline with objects whose states change through some interpolation mechanism&lt;br /&gt;
* Javascript?&lt;br /&gt;
&lt;br /&gt;
While the intent, output, and UI for these may vary, the underlying machinery supporting them may have commonality, so the following projects may apply to one or more of the above types of animation.&lt;br /&gt;
&lt;br /&gt;
=== Object interpolation display ===&lt;br /&gt;
&lt;br /&gt;
Create routines to morph the properties and/or style of an object according to some proportion (such as elapsed time over a time period).&lt;br /&gt;
&lt;br /&gt;
This will need modification of object structures to support the animation attributes, following the SMIL and CSS animation specifications.&lt;br /&gt;
&lt;br /&gt;
contact: Tav&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== Object animation property editor UI/UX design ===&lt;br /&gt;
&lt;br /&gt;
Conceptualize how users would add and edit animation properties in Inkscape.  What should be done in dialogs vs. in the main interface?&lt;br /&gt;
Mockup ideas for how the UI could look.  Describe the workflow the user would follow.&lt;br /&gt;
&lt;br /&gt;
=== Time keyed layer display ===&lt;br /&gt;
&lt;br /&gt;
Functionality to display/hide a list of layers in a fixed or variable sequence, or recorded to a sequential output format (e.g. a video output format or numbered raster images).&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
=== Frame transitions ===&lt;br /&gt;
&lt;br /&gt;
Expand on the above projects by organizing objects in sequential layers, where the layers can mark either transition points for a given object, or an object that replaces one or more objects in an earlier frame.&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
=== CSS/SVG Web Animations ===&lt;br /&gt;
&lt;br /&gt;
Export animation properties as corresponding CSS/SVG parameters to output files, following the model from the Web Animations specification so that both SMIL and CSS animations are supported. Inkscape Community/Tav&lt;br /&gt;
&lt;br /&gt;
priority: Longer term&lt;br /&gt;
&lt;br /&gt;
== Technical Writing ==&lt;br /&gt;
&lt;br /&gt;
=== Improve this Project List ===&lt;br /&gt;
&lt;br /&gt;
Review all the projects in this list.  Cleanup grammar or phrasing to make the descriptions clearer.  Expand on points that are vague.  Add links to relevant bug reports, feature requests, blueprints, etc.  Add &amp;quot;[Please fill in]&amp;quot; to items that need more information; identify particular questions needing addressed where possible.&lt;br /&gt;
&lt;br /&gt;
=== Inkscape Widgets Doxygen ===&lt;br /&gt;
&lt;br /&gt;
Over the years Inkscape has collected a number of custom UI objects, which have been consolidated to src/widgets/.  Many of these are un- or under-documented.  For each widget, write doxygen comments in the header file explaining what the widget is and does, and document the widget's public API.  In some cases there may be doxygen in the .cpp file for public API functions - this should move to the header.&lt;br /&gt;
&lt;br /&gt;
=== Bring inkscape/doc up to date ===&lt;br /&gt;
&lt;br /&gt;
The doc directory in the Inkscape codebase is used for high level technical documentation including architecture, codebase introduction, and new developer orientation, however it has not been very well maintained and much is obsolete or incorrect.  It also needs to be reformatted into Markdown, and appropriate scripts created to generate it into HTML/PDF/SVG.  There may be additional developer documentation in Wiki that would be worth inclusion here.&lt;br /&gt;
&lt;br /&gt;
=== Code Doxygen Documentation ===&lt;br /&gt;
&lt;br /&gt;
Ensure all functions declared in header files have doxygen-compatible documentation.  See items in [[Janitorial tasks]] for the style we're going for.  All doxygen of the core Inkscape code (i.e. excluding 3rd party libraries included in src/*/) should have consistently written and formatted doxygen, which should include descriptions of input, output, and return parameters, identification of potential errors, a one-line brief statement and a more detailed explanation of the routine's purpose.&lt;br /&gt;
&lt;br /&gt;
== User-facing documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Release Notes Improvement ===&lt;br /&gt;
&lt;br /&gt;
Review the release notes for the next major Inkscape release.  Update wording and phrasing to be more comprehensible for end users.  Fill in missing items where possible.  Create and add explanatory graphics (c.f as done in past release notes).  Add Known Issues from the previous release that are still relevant.&lt;br /&gt;
&lt;br /&gt;
=== Tutorials ===&lt;br /&gt;
&lt;br /&gt;
* Review existing tutorials and update as appropriate&lt;br /&gt;
* Finish or remove unfinished tutorials&lt;br /&gt;
* Solicit community-contributed tutorial contributions&lt;br /&gt;
* Introduce new tutorials&lt;br /&gt;
&lt;br /&gt;
=== Man page ===&lt;br /&gt;
&lt;br /&gt;
* Update man page&lt;br /&gt;
** transcribe the examples to the new command line structure&lt;br /&gt;
* Add more helpful examples&lt;br /&gt;
&lt;br /&gt;
=== Manual ===&lt;br /&gt;
&lt;br /&gt;
Create a comprehensive, community-owned Inkscape manual: As a first step, devise a plan for how / where it will be created / hosted, and how versioning is going to work. Define its structure, and a set of editing guidelines. Recruit writers and proofreaders. Write the documentation. Keep the documentation up-to-date with the released Inkscape versions (ongoing task).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Packaging and Release Management ==&lt;br /&gt;
&lt;br /&gt;
=== Library Package De-integration ===&lt;br /&gt;
&lt;br /&gt;
Several 3rd party codebases are included in Inkscape's codebase (i.e., src/lib*/, src/2geom, possibly livarot?).  This has convenience for local patching of our own improvements and simplifies the number of components platform packagers need to deal with, however this increases the weight of our codebase and makes our package larger on platforms such as Linux that have good dependency sharing.  Arguably, it may also hinder collaboration with the upstreams or other users of the libraries.  Certainly it makes it difficult to roll out fixes to one of those libraries to our users.  So, we want these libraries to be packaged and released separately from Inkscape.&lt;br /&gt;
&lt;br /&gt;
For each of these libraries, create a separate git repository in Inkscape's gitlab project for hosting our branch of that project's code.  Make sure any of Inkscape's changes to it are clearly registered as distinct git commits.  If there is an active upstream project maintaining that library, make sure each of our changes are registered in their patch or bug tracking systems.&lt;br /&gt;
&lt;br /&gt;
In theory, Inkscape should only be using the libraries' public APIs; doublecheck that this is indeed the case, and identify any instances where Inkscape code is bypassing it and accessing library internals directly.  These should be filed as high priority bugs in Inkscape's bug tracker.&lt;br /&gt;
&lt;br /&gt;
Lastly, make sure that `make dist` passes successfully for each of our branched libraries, and generates a source tarball.  Inform the Release Team of the need to start separately packaging and releasing these libraries in conjunction with Inkscape's release processes.&lt;br /&gt;
&lt;br /&gt;
== Bug Triage ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With as many bugs as we've accumulated, working on them can seem daunting.  Where to start!?  Below are some encapsulated projects to try to achieve.  Together, the more of these projects that are completed the less daunting the remaining work will be, and the better Inkscape will become!&lt;br /&gt;
&lt;br /&gt;
The [[Bug management]] page in this wiki includes advice on how to judge bug status and importance levels.&lt;br /&gt;
&lt;br /&gt;
''Tip:  Some of these tasks could be scripted and automated via the Launchpad email interface.  See https://help.launchpad.net/BugTrackerEmailInterface''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strike&amp;gt;&lt;br /&gt;
=== (100% Complete) Update Status for Critical Bugs from New ===&lt;br /&gt;
&lt;br /&gt;
(DONE) Review each Critical bug with Status New, and change status to Incomplete if the last comment on the bug is a question, or Confirmed otherwise. -- Bryce&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== (100% Complete) Update Status for Critical Bugs from Fix Committed ===&lt;br /&gt;
&lt;br /&gt;
Review each Critical bug with Status Fix Committed; most likely these are incorrect.  If comments towards the end of the thread indicate a fix was committed to SVN, then it is okay to be in state Fix Committed.  Otherwise, move it to a more accurate Status.&lt;br /&gt;
&lt;br /&gt;
=== (100% Complete) Update Status for High Priority Bugs from Fix Committed ===&lt;br /&gt;
&lt;br /&gt;
Review each High priority bug with Status Fix Committed; most likely these are incorrect.  If comments towards the end of the thread indicate a fix was committed to SVN, then it is okay to be in state Fix Committed.  Otherwise, move it to a more accurate Status.&lt;br /&gt;
&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Update Status for High Priority Bugs from New ===&lt;br /&gt;
&lt;br /&gt;
Review each High priority bug with Status New, and change status to Incomplete if the last comment on the bug is a question, or Confirmed otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Tag OSX bugs ===&lt;br /&gt;
&lt;br /&gt;
Using the Advanced search, identify bugs that are reported against OSX and update them to include the tag 'osx'.&lt;br /&gt;
&lt;br /&gt;
=== Tag Windows bugs ===&lt;br /&gt;
&lt;br /&gt;
Using the Advanced search, identify bugs that are reported against Windows and update them to include the tag 'windows'. Some bugs are already tagged with 'win32'&lt;br /&gt;
: Searched all entries with 'win' in it. Tagged all appropriate bug reports with 'win32'. Now only 'win32' tags exist, but no 'windows' tags. Renaming the tags via the database should be easier than doing it manually (if at all possible). Is this what you guys had in mind? --[[User:Cerno|Cerno]] 15:40, 30 June 2008 (UTC)&lt;br /&gt;
&lt;br /&gt;
=== Link Cairo bugs ===&lt;br /&gt;
&lt;br /&gt;
Do a search for 'cairo'.  Review the bugs (there's only about a dozen), and for each, identify if the issue is a Cairo bug.  If so, look in the cairo bug tracker at freedesktop.org for a matching bug (or enter a new one if there isn't one already) and link it in via the 'Also affects: +Project'.&lt;br /&gt;
&lt;br /&gt;
=== Set Importance on Confirmed / Fixed Bugs ===&lt;br /&gt;
&lt;br /&gt;
Do a search on Importance=Undecided and Status=Fix Committed,Confirmed,In Progress.  (There's 18 of these presently).  Review each and assign it an Importance (probably Medium or High in most cases, but use best judgement).&lt;br /&gt;
&lt;br /&gt;
=== Ping Old Low Priority Bugs ===&lt;br /&gt;
&lt;br /&gt;
Search on bugs with Importance=Low, sorted by Oldest First.  Go through the bugs that are more than a year old and review them.  If they don't seem to have gotten much activity (e.g. few comments), and don't seem to be worth keeping, mark them Incomplete, with the following text:&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Thank you for taking the time to report this bug and helping to make Inkscape better. You reported this bug a long while ago and there hasn't been any activity in it recently. We were wondering is this still an issue for you? Can you try with latest Inkscape release? Thanks in advance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
or if it is a feature request:&lt;br /&gt;
&amp;quot;Thank you for taking the time to report this feature request and helping to make Inkscape better. You requested this feature a long while ago and there hasn't been any activity in it recently. We were wondering; is this still on your wishlist? Can you try with latest Inkscape release and see if recent improvements have obsoleted your request? Thanks in advance.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Wait about a month, then follow up with a search against these bugs that have not received a response; they can then be closed as Invalid.&lt;br /&gt;
&lt;br /&gt;
https://wiki.ubuntu.com/Bugs/Status&lt;br /&gt;
&lt;br /&gt;
=== Confirm all appropriate bugs marked Incomplete with responses ===&lt;br /&gt;
&lt;br /&gt;
Search on 'Incomplete with response', and review the feedback that's been given.  If it appears the initial triager's information requests were met, and the bug seems legitimate, move it to Confirmed.  If there seems to be further questions needing answered, ask them and leave it as incomplete.&lt;br /&gt;
&lt;br /&gt;
As well, specify a priority for these bugs.  Generally, issues that cause crashes or data loss are high priority unless they only occur in very narrow situations.  Issues which are purely cosmetic or involve very obscure or limited conditions are low priority, and everything else is Medium.  Only use Critical priority for extremely serious bugs that will be affecting most everyone using Inkscape.&lt;br /&gt;
&lt;br /&gt;
=== Convert high priority wishlist bugs into blueprints ===&lt;br /&gt;
&lt;br /&gt;
Browse the collection of bugs marked ''wishlist''.  Look for sets of related bugs that are all requesting essentially the same feature.  Create a corresponding blueprint at [https://blueprints.launchpad.net/inkscape https://blueprints.launchpad.net/inkscape], and use ''Specify a URL'' to attach it to a wiki page.  Then consolidate the wishlist bug reports together onto the blueprint page.  Specify if you're willing to act as the Drafter for the spec, and carry it through to acceptance, or if you prefer someone else take that role.&lt;br /&gt;
&lt;br /&gt;
Once you've created the specification, use ''Link to bug'' to link each of the related bugs.&lt;br /&gt;
&lt;br /&gt;
=== Close old incomplete bugs with no response ===&lt;br /&gt;
&lt;br /&gt;
Do a query on bugs marked Incomplete with no response, and sort by age.  All bugs older than 1 month with no reply can be closed as out of date.&lt;br /&gt;
=== [https://inkscape.org/en/projects/box-blur/ Box blur (FPRJ-001)] ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
Currently we always use a very accurate method to compute the Gaussian&lt;br /&gt;
blur filter. Add an alternate method which approximates Gaussian blur&lt;br /&gt;
using three stacked box blurs (simple averages). This is detailed in&lt;br /&gt;
the SVG 1.1 SE specification.&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Marker Knockout ===&lt;br /&gt;
&lt;br /&gt;
Idea is to clean up markers where part of the line shows through.  For example if a triangular arrowhead's tip is on the end point of a line with a relatively thick stroke, the rectangular end corners of the line shows up.  Or if you're doing a mid-line marker that needs to have a transparent hole (e.g. a &amp;quot;subway station marker&amp;quot;, it needs to show through.&lt;br /&gt;
&lt;br /&gt;
To implement this, draw the line on another surface and mask it with the knockout shape.  The filters code uses this approach, as an example.  See also the [https://www.w3.org/TR/svg-markers/ SVG Markers] specification.&lt;br /&gt;
&lt;br /&gt;
contact: Tav&lt;br /&gt;
priority: Nearer term&lt;br /&gt;
=== Restore Ancient Change History ===&lt;br /&gt;
&lt;br /&gt;
Inkscape's earliest development history is missing, with the first commit being &amp;quot;bzr r1&amp;quot; when we migrated to bzr.  Prior history was in CVS and is missing.  While not a huge priority, it would be nice to have this pre-bzr history resurrected and prepended to our git history.&lt;br /&gt;
&lt;br /&gt;
=== Rewrite / reintroduce 3D box ===&lt;br /&gt;
** 3-dimensional grid, perspective deformed, with snapping&lt;br /&gt;
&lt;br /&gt;
=== Git Integration ===&lt;br /&gt;
Due to the nature of SVG (text files), versioning might offer a really good way to effectively manage local historical changes even when inkscape is closed. [[https://git-scm.com/ Git]] is a popular versioning software, and is well known among open source contributors. I imagine a versioning system could be &amp;quot;enabled&amp;quot; through the user interface, and allow a user to tag &amp;quot;releases&amp;quot;, branch copies if need be, and maintain a historical log of changes.  Git could also have been a great way to maintain a branch of different versions of the svg file when the Inkscape project made the change of default dpi for old files recently.&lt;br /&gt;
&lt;br /&gt;
=== Other Misc. Ideas ===&lt;br /&gt;
* Improve support for changing the name of the XML element node in response to SP tree changes&lt;br /&gt;
* Inkscape for Android&lt;br /&gt;
* CAD drawing functionality&lt;br /&gt;
* OCR of bitmap traces&lt;br /&gt;
* Excentric radial gradients, see e.g. samples/orav.svg in the distribution. --bb&lt;br /&gt;
&lt;br /&gt;
= Finished Projects =&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;[https://inkscape.org/en/projects/remove-all-use-of-glist-and-gslist/ Remove all use of GList and GSList]&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: green&amp;quot;&amp;gt;&lt;br /&gt;
These GLib data structures are poorly designed (they are simple lists&lt;br /&gt;
without sentinels, leading to blunders such as O(N) performance when&lt;br /&gt;
appending to a doubly-linked list) and not type-safe. Replace all uses&lt;br /&gt;
with standard C++ containers or suitable Boost containers.&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Common build system for all platforms&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Migrate and port all necessary features to the CMake build system and remove Autotools.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Use a different data structure for Inkscape::Selection&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Inkscape::Selection currently uses GSList as its data structure. This&lt;br /&gt;
is suboptimal, since a very common operation is checking whether some&lt;br /&gt;
object is selected. Change Inkscape::Selection so that its underlying&lt;br /&gt;
structure is a boost::multi_index container which implements the same&lt;br /&gt;
semantics as Java's LinkedHashSet.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Remove dom/ directory&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
This directory contains strange code which is barely used. The only&lt;br /&gt;
class which is actually used is the URI class.&lt;br /&gt;
&lt;br /&gt;
=== [DONE] &amp;lt;s&amp;gt;Remove SPCurve (refactoring)&amp;lt;/s&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
SPCurve is a thin wrapper around Geom::PathVector which exists for&lt;br /&gt;
historical reasons. Its functionality should be added to PathVector,&lt;br /&gt;
and SPCurve should be purged.&lt;br /&gt;
&lt;br /&gt;
priority: Medium term&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/7259&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123088</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123088"/>
		<updated>2025-01-02T19:08:24Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mark affinity designer importer as completed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;max-width:70em; margin-left: auto; margin-right: auto&amp;quot;&amp;gt;&lt;br /&gt;
= Welcome to Inkscape! =&lt;br /&gt;
&lt;br /&gt;
For quite a few years Inkscape has been successfully participating in [http://code.google.com/soc/ Google Summer of Code].&lt;br /&gt;
&lt;br /&gt;
Google has opened up the program to students AND beginners to Open Source who are 18 years are older. Projects can be medium size (~175 hours) or large size (~350 hours). Finish times are flexible, 12 to 22 weeks (with agreement of mentor).&lt;br /&gt;
&lt;br /&gt;
GSoC is a program where Google funds the development of specific features in open source software by university students and other new to open source. You don't need to be a Computer Science student to apply. Features to be developed are picked by Inkscape administrators from the pool of proposals submitted by applicants.&lt;br /&gt;
&lt;br /&gt;
We've mentored about half a dozen students a year since GSoC started.  Many students enjoyed their work and continue to be involved; perhaps your mentor will be a past GSoC student!  We have a high rate of acceptance of student code into the core codebase. Indeed, GSoC projects have been a key source of some of Inkscape's best features in the past several releases.&lt;br /&gt;
&lt;br /&gt;
If you are interested in joining us this summer, it is time to get your proposal ready. You can choose a proposal from our list of suggestions or come up with one of your own. In either either case, you '''must''' give us a detailed outline of what you plan to do. It is '''highly''' recommended that you discuss your idea as early as possible with Inkscape developers. They not only can give you guidance as you flesh out your proposal but ultimately you must convince them that you can do the work planned in the time allotted. '''If you have not discussed your proposal with Inkscape developers before you apply, your application will be rejected!'''&lt;br /&gt;
&lt;br /&gt;
= Candidate Applications =&lt;br /&gt;
&lt;br /&gt;
* Google program information:&lt;br /&gt;
** [https://summerofcode.withgoogle.com/ Home page].&lt;br /&gt;
** Summer of Code Application form. Applications open at 18:00 UTC on March 18th, 2024. -&amp;gt; https://developers.google.com/open-source/gsoc/timeline&lt;br /&gt;
&lt;br /&gt;
* Inkscape-specific information:&lt;br /&gt;
** [[SOC Application Template]].&lt;br /&gt;
** [[Roadmap | Inkscape Roadmap]] - to see our overall objectives.&lt;br /&gt;
** [[Projects | Inkscape Development Project Ideas]] - broader list of development ideas.&lt;br /&gt;
** [[SOC Writing Project Proposals]] - some guidelines for proposals.&lt;br /&gt;
** [[SOC Selection Criteria]] - how we rate applications.&lt;br /&gt;
&lt;br /&gt;
'''Candidate Applications for GSoC 2024 must be submitted to the GSoC site by 18:00 UTC on April 2nd 2024.'''&lt;br /&gt;
&lt;br /&gt;
= The &amp;quot;two patches&amp;quot; rule =&lt;br /&gt;
&lt;br /&gt;
We require two patches from each potential GSoC student, before accepting the student for GSoC participation (it is the same requirement as for obtaining rights to commit changes to the code repository).&lt;br /&gt;
&lt;br /&gt;
The reason for this requirement is that you can show us that you have succeeded in building Inkscape on your PC, and that you have understood a little piece of Inkscape's code and are able to improve it. &lt;br /&gt;
Inkscape is a large project, and you really should not try to understand all the code. Many (all?) developers know only parts of the program code!&lt;br /&gt;
You can join our [https://inkscape.org/community/discussion/ IRC] channel or [https://chat.inkscape.org/channel/team_devel Rocket Chat] and ask developers for help.&lt;br /&gt;
&lt;br /&gt;
== Suggested &amp;quot;easy&amp;quot; bug fixes or improvements ==&lt;br /&gt;
&lt;br /&gt;
To get you started on Inkscape development, you can find (probably) easy-to-fix bugs or small improvements that require very little knowledge of the whole program by searching our [https://gitlab.com/inkscape/inkscape/issues/ bug-tracker] for bugs tagged with 'easy-fix'.&lt;br /&gt;
&lt;br /&gt;
= Performance Evaluation =&lt;br /&gt;
&lt;br /&gt;
GSoC has two formal evaluation points, at the ''mid-term'' and at the end. These evaluations determine if you receive the stipend from Google. In order to receive a pass for the evaluations you will need to show adequate progress toward your project's goals.&lt;br /&gt;
&lt;br /&gt;
To help you meet your goals and so that your mentor can better evaluate your progress you need to:&lt;br /&gt;
&lt;br /&gt;
* Have frequent, public discussions of your progress. (Don't rely on just your mentor for advice.)&lt;br /&gt;
* Have a public Inkscape branch for your code to which you commit regularly.&lt;br /&gt;
* Give weekly status reports.&lt;br /&gt;
&lt;br /&gt;
For the final pass, you will normally be required to merge your code into Inkscape trunk.&lt;br /&gt;
&lt;br /&gt;
Remember: ''we want you to succeed!''&lt;br /&gt;
&lt;br /&gt;
= Suggested Project Ideas =&lt;br /&gt;
&lt;br /&gt;
The following is a list of formal project suggestions, but do not feel limited to only these - some of our best contributions have been unique ideas that students had in mind from other sources!&lt;br /&gt;
&lt;br /&gt;
See also [[Development Project Ideas]], [[Refactoring projects]], [[Projects]], and https://blueprints.launchpad.net/inkscape/&lt;br /&gt;
&lt;br /&gt;
==P5. UI-Free Inkscape ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Difficult - Long (350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin, pbs&lt;br /&gt;
* Programming skills: C++, CMake&lt;br /&gt;
* Prerequisites: Minimal knowledge of build systems. Experience with GTKmm helpful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape currently builds with X11 and gtk and a lot of graphical dependencies. But since it is allowed to run in commandline, and there are controlled environments (servers) that use it to convert svg to png and to perform actions, there should be no need to force it to build with those. The main goal of this project is to add a WITH_GUI compilation flag that when OFF, does *not* link Inkscape with any graphical dependency. While much work has been done towards this goal, much remains to be done. DONE &amp;lt;s&amp;gt;As a next step, Inkscape's &amp;quot;verbs&amp;quot; which are mostly GUI dependent (even if there is no reason to be) need to be converted to Gio::Actions.&amp;lt;/s&amp;gt; More work needs to be done to separate out hidden GUI dependencies that remain after the Verb to Action transition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Server installs, scripts&lt;br /&gt;
&lt;br /&gt;
==P8. Add Text and Image Support to Live Path Effect System ==&lt;br /&gt;
* Estimation of difficulty: Hard - Short (175h)&lt;br /&gt;
* Potential mentors: Jabier Arraiza (Spanish, English(not native))&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Experience managing bitmaps&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Live Path Effects are non destructive effects applied to paths and shapes standalone or inside a group.&amp;lt;br /&amp;gt; &lt;br /&gt;
This is done keepeng a reference to the original data to reaply when needed.&amp;lt;br /&amp;gt;&lt;br /&gt;
But ignore text and image elements.&amp;lt;br /&amp;gt;&lt;br /&gt;
Things to do:&lt;br /&gt;
* Study add image, text, both and maybe others SVG elements to the LPE system.&lt;br /&gt;
* Create/adapt minimun one LPE for each new type of element acepted as reference. Suggestion Perspective-Envelope.&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Apply live effects to images and text based in C++ code in a non destructive way even in groups with mixed elements types.&lt;br /&gt;
&lt;br /&gt;
==P9. Path Library Improvements ==&lt;br /&gt;
* Estimation of difficulty: Hard - Long (350h)&lt;br /&gt;
* Potential mentors: Tavmjong Bah, KK&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Strong math skills, specifically in geometry.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape relies on two geometry libraries for path manipulations: lib2geom and livarot. lib2geom is a generic modern library written specifically with Inkscape in mind. lib2geom is missing some functionality that Inkscape requires and that is found in livarot. This project is to move that functionality into lib2geom (or into separate files) using lib2geom path descriptions. A 2020 GSoC student did a significant amount of work understanding and documenting the issues involved [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416]. This project would be to build on his work.&lt;br /&gt;
&lt;br /&gt;
Specifically, the functionality needed is&lt;br /&gt;
* Path offset/inset functions.&lt;br /&gt;
* Path simplify.&lt;br /&gt;
* Stroke to path function.&lt;br /&gt;
* Line scanning (used for flowing text into a shape).&lt;br /&gt;
&lt;br /&gt;
==P11. Improvements to Paint Server Dialog ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Easy to Medium - Short (175h)&lt;br /&gt;
* Potential mentors: Tavmjong&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Some knowledge of GTK and CSS.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The ''Paint Server Dialog'' allows a user to visually select a pattern or hatch to use in painting the ''fill'' or ''stroke'' of an object. This project would be to expand the dialog to cover gradients, meshes, and solid colors as well as make other improvements to the dialog. Interaction with the Inkscape's ''UX'' team will be required.&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/40 '''Full poposal''']&lt;br /&gt;
== P15. Import and Export extensions ==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Flexible, usually easy to medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python, Ability to read technical documents, depending on the format: some reverse engineering&lt;br /&gt;
* Prerequisites: minimal knowledge of test-driven development&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; Inkscape is alway looking to improve compatibility! Some ideas of relevant file formats - each of them more than enough for one GSoC:*Refactor our '''DXF input and output''' extensions, and expand support towards binary DXF&lt;br /&gt;
*Write an as-complete-as-possible '''EPS export''', circumventing the internal information loss in ghostscript (EPS is still relevant for scientific papers, but more and more tools are dropping support, so this is a chance to grab market share - the results of Adobe Distiller are much better than ghostscript's...)&lt;br /&gt;
*Rewrite the '''XAML importer''' in Python (currenly XSLT) to match the capabilities of the new XAML exporter (i.e. support for different target frameworks, better text support...) - would have to select carefully what to support (drawing primitives) and what not (control elements) - the boundary is not as clear-cut as it seems.&lt;br /&gt;
* Update the '''Synfig export''' to support the latest Synfig developments&lt;br /&gt;
* '''Import or export of TikZ'''. There are a few abandoned extensions out there (from which we can borrow), but it's very widely used in science - both import and export could serve an important function in the scientific workflow.&lt;br /&gt;
*'''Import of the proprietary fileformats''' of Vectornator or Vectorstyler (which seem in their infancy and users at some point will sit on a bunch of files that they can't open anymore because their SAAS model wasn't profitable) .&lt;br /&gt;
*'''Import of CGM''' - old, but ISO standardized. Was supported once and dropped when the uniconvertor extension was removed for 1.0.&lt;br /&gt;
* '''Python based EMF / WMF importer -''' the current (core Inkscape) C extension is unmaintained and Python would probably be the right way to get more collaboration on it. A lot of public archives sit on mountains of EMF files. Note that the Document Foundation recently did a lot of work properly importing those files, so we can learn from them / maybe even join forces...&lt;br /&gt;
*your favorite file format? - also have a look here: https://office.inkscape.org/nextcloud/index.php/s/Tq6cdDDGay6taCw&lt;br /&gt;
==P16. Gcodetools refactoring and documentation==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Easy- Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Maker background / familiarity with the Maker community&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; [https://gitlab.com/inkscape/extras/extensions-gcodetools/ Gcodetools] is a set of Inkscape extensions that deal with reading and creating Gcode files, mostly for use in laser cutters or plotters. For this project, ideally someone with a Makerspace background will&lt;br /&gt;
#query maker spaces on their needs regarding gcodetools,&lt;br /&gt;
#implement those needs together with unit tests,&lt;br /&gt;
# improve the test coverage of Gcodetools,&lt;br /&gt;
#write proper documentation for it. (doesn't really exist at the moment).&lt;br /&gt;
==P17. Packing / Nesting as an Inkscape extension==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Computational geometry&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; In this project, a set of packing / nesting algorithms will be implemented:&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Cutting_stock_problem Linear nesting] is not too useful in SVG, but might be a good place to get acquainted with the problem. 2D cutting stock problem would be very interesting to have and would work great with the new multipage functionality.&lt;br /&gt;
*For efficient packing of free form objects, we might just re-implement [https://github.com/Jack000/SVGnest SVGNest] in Python. There are probably some more recent research papers which would be interesting to implement as a comparison.&lt;br /&gt;
&lt;br /&gt;
== P19. Improving UI of Live path effects ==&lt;br /&gt;
*Estimation of difficulty: Medium- Hard, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Mike, jabier ,??&lt;br /&gt;
* Programming skills: GTK 4, C++&lt;br /&gt;
*Prerequisites: Front end UI , familiarity with Live path effects&lt;br /&gt;
[[File:Imageasdasda qrq.png|thumb|146x146px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; This project Should implement Proposed UI clean up of Controls . LPE controls shoulbe be more user freindly and predictive,&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/?sort=popularity&amp;amp;state=opened&amp;amp;label_name%5B%5D=Dialog%3A%3ALPE&amp;amp;first_page_size=100 '''Full Proposed designs''']&lt;br /&gt;
&lt;br /&gt;
[[File:Imageasd.png|right|frameless|466x466px]]&lt;br /&gt;
== P20. Recolor Artwork ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short (90h or 175h)&lt;br /&gt;
* Potential mentors: Adam Belis ?&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
An easy and convenient way how to change any color from the selection. Useful for experimenting and tweaking colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/inbox/-/issues/6095 '''Full proposal Here''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* fast Editing color in whole project without of need for swatches&lt;br /&gt;
*easier work for color harmonies in a project&lt;br /&gt;
*Easier iteration and visioning of designs&lt;br /&gt;
&lt;br /&gt;
==Pxx. Your project ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short or Long (175h or 350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: good ideas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The most successful GSoC we had in the past were students coming with their own past, use cases and ideas for Inkscape. Many basic tools like 3d cubes or connectors you can see in Inkscape now have been brought by brilliant people (like you) with ideas. If we think that your project fits with Inkscape (ie: has its place with a vector graphic editor), we can help you refining your ideas and help bring shiny new stuff to life!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Amaze us!&lt;br /&gt;
&lt;br /&gt;
= Successful SOC Projects from Previous Years =&lt;br /&gt;
* 2005&lt;br /&gt;
** Connectors&lt;br /&gt;
** Inkboard&lt;br /&gt;
** [http://www.openclipart.org/ Open Clip Art Library (OCAL)] Interface&lt;br /&gt;
** DXF Import / Export&lt;br /&gt;
* [[Google Summer of Code 2006|2006]]&lt;br /&gt;
** Support for SVG Filters&lt;br /&gt;
** Filter Effects&lt;br /&gt;
** PDF export&lt;br /&gt;
** Inkboard Protocol Spec / Lib Conversion&lt;br /&gt;
* [[Google Summer of Code 2007|2007]]&lt;br /&gt;
** Text Style Improvements&lt;br /&gt;
** PDF import&lt;br /&gt;
** Live Path Effects&lt;br /&gt;
** 3D Box Tool&lt;br /&gt;
** UI for SVG Filter Effects&lt;br /&gt;
** Raster Functionality&lt;br /&gt;
** Importing from, and Exporting to, a remote ccHost instance&lt;br /&gt;
* [[Google Summer of Code 2008|2008]]&lt;br /&gt;
** SVG Fonts support&lt;br /&gt;
** 2Geom refactoring project - port most geometry code to 2Geom&lt;br /&gt;
** lib2geom: interactive applications showing off the power of lib2geom&lt;br /&gt;
** Tech drawing abilities&lt;br /&gt;
** A test suite&lt;br /&gt;
* 2009&lt;br /&gt;
** [[GSoC2009 Node Tool Rewrite|Node tool rewrite]]&lt;br /&gt;
** D-Bus scripting API&lt;br /&gt;
** Connector tool improvements&lt;br /&gt;
** ICC/CMYK workflow&lt;br /&gt;
* 2010&lt;br /&gt;
** Cairo-based rendering&lt;br /&gt;
** C++ification of SP Layer&lt;br /&gt;
* 2011&lt;br /&gt;
** Rendering caching&lt;br /&gt;
** Javascript support improvements&lt;br /&gt;
** CSS support improvements&lt;br /&gt;
* 2012&lt;br /&gt;
** Usibility Improvements for Guides&lt;br /&gt;
** [[Tiling tool|On-canvas support for Tessellations]]&lt;br /&gt;
** Creating python bindings for lib2geom&lt;br /&gt;
* [[Google Summer of Code 2013|2013]]&lt;br /&gt;
** Recolor Tool&lt;br /&gt;
** Improved Units Support&lt;br /&gt;
** Electronics CAD Support&lt;br /&gt;
** New From Templates Dialog&lt;br /&gt;
** New Raster to Vector Algorithm&lt;br /&gt;
* 2014&lt;br /&gt;
** Better Support for SVG Paints&lt;br /&gt;
** Robust Boolean and Stroking Operations for 2Geom&lt;br /&gt;
* 2016&lt;br /&gt;
** [[GSoC 2016 Better data structure for selections|Better data structure for selections]]&lt;br /&gt;
** [[Style Editor|CSS Style Sheet Editor]]&lt;br /&gt;
* 2017&lt;br /&gt;
** SVG 2 Text Support&lt;br /&gt;
** Better CSS Style Sheet Support&lt;br /&gt;
* 2019&lt;br /&gt;
** Mesh gradient and hatches polyfills. Paint server dialog.&lt;br /&gt;
* 2020&lt;br /&gt;
** [https://gitlab.com/vanntile/inkscape-gsoc-2020 New dialog system.]&lt;br /&gt;
** [https://gitlab.com/rathod-sahaab/gsoc-2020-inkscape Command palette dialog.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416 Documenting livarot]&lt;br /&gt;
* 2021&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3420 On canvas marker editing.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3328 Verbs to Gio::Actions.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3294 On canvas alignment snapping.]&lt;br /&gt;
* 2022&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4692 Tab Structure.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4694 Font Collections.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4756 Modernizing Memory Management.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4504 OCR Support.]&lt;br /&gt;
* 2023&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5335 GTK4 toolbar port preparation]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5624 Customizable Appearance of Canvas Controls]&lt;br /&gt;
* 2024&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6578 Node-based filter editor]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6492 Improving UX of Node tool and Bezier tool]&lt;br /&gt;
** [https://gitlab.com/inkscape/extras/extension-afdesign Affinity Designer importer]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123087</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123087"/>
		<updated>2024-12-22T15:30:13Z</updated>

		<summary type="html">&lt;p&gt;PBS: Add self to mentors list for &amp;quot;UI-free Inkscape&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;max-width:70em; margin-left: auto; margin-right: auto&amp;quot;&amp;gt;&lt;br /&gt;
= Welcome to Inkscape! =&lt;br /&gt;
&lt;br /&gt;
For quite a few years Inkscape has been successfully participating in [http://code.google.com/soc/ Google Summer of Code].&lt;br /&gt;
&lt;br /&gt;
Google has opened up the program to students AND beginners to Open Source who are 18 years are older. Projects can be medium size (~175 hours) or large size (~350 hours). Finish times are flexible, 12 to 22 weeks (with agreement of mentor).&lt;br /&gt;
&lt;br /&gt;
GSoC is a program where Google funds the development of specific features in open source software by university students and other new to open source. You don't need to be a Computer Science student to apply. Features to be developed are picked by Inkscape administrators from the pool of proposals submitted by applicants.&lt;br /&gt;
&lt;br /&gt;
We've mentored about half a dozen students a year since GSoC started.  Many students enjoyed their work and continue to be involved; perhaps your mentor will be a past GSoC student!  We have a high rate of acceptance of student code into the core codebase. Indeed, GSoC projects have been a key source of some of Inkscape's best features in the past several releases.&lt;br /&gt;
&lt;br /&gt;
If you are interested in joining us this summer, it is time to get your proposal ready. You can choose a proposal from our list of suggestions or come up with one of your own. In either either case, you '''must''' give us a detailed outline of what you plan to do. It is '''highly''' recommended that you discuss your idea as early as possible with Inkscape developers. They not only can give you guidance as you flesh out your proposal but ultimately you must convince them that you can do the work planned in the time allotted. '''If you have not discussed your proposal with Inkscape developers before you apply, your application will be rejected!'''&lt;br /&gt;
&lt;br /&gt;
= Candidate Applications =&lt;br /&gt;
&lt;br /&gt;
* Google program information:&lt;br /&gt;
** [https://summerofcode.withgoogle.com/ Home page].&lt;br /&gt;
** Summer of Code Application form. Applications open at 18:00 UTC on March 18th, 2024. -&amp;gt; https://developers.google.com/open-source/gsoc/timeline&lt;br /&gt;
&lt;br /&gt;
* Inkscape-specific information:&lt;br /&gt;
** [[SOC Application Template]].&lt;br /&gt;
** [[Roadmap | Inkscape Roadmap]] - to see our overall objectives.&lt;br /&gt;
** [[Projects | Inkscape Development Project Ideas]] - broader list of development ideas.&lt;br /&gt;
** [[SOC Writing Project Proposals]] - some guidelines for proposals.&lt;br /&gt;
** [[SOC Selection Criteria]] - how we rate applications.&lt;br /&gt;
&lt;br /&gt;
'''Candidate Applications for GSoC 2024 must be submitted to the GSoC site by 18:00 UTC on April 2nd 2024.'''&lt;br /&gt;
&lt;br /&gt;
= The &amp;quot;two patches&amp;quot; rule =&lt;br /&gt;
&lt;br /&gt;
We require two patches from each potential GSoC student, before accepting the student for GSoC participation (it is the same requirement as for obtaining rights to commit changes to the code repository).&lt;br /&gt;
&lt;br /&gt;
The reason for this requirement is that you can show us that you have succeeded in building Inkscape on your PC, and that you have understood a little piece of Inkscape's code and are able to improve it. &lt;br /&gt;
Inkscape is a large project, and you really should not try to understand all the code. Many (all?) developers know only parts of the program code!&lt;br /&gt;
You can join our [https://inkscape.org/community/discussion/ IRC] channel or [https://chat.inkscape.org/channel/team_devel Rocket Chat] and ask developers for help.&lt;br /&gt;
&lt;br /&gt;
== Suggested &amp;quot;easy&amp;quot; bug fixes or improvements ==&lt;br /&gt;
&lt;br /&gt;
To get you started on Inkscape development, you can find (probably) easy-to-fix bugs or small improvements that require very little knowledge of the whole program by searching our [https://gitlab.com/inkscape/inkscape/issues/ bug-tracker] for bugs tagged with 'easy-fix'.&lt;br /&gt;
&lt;br /&gt;
= Performance Evaluation =&lt;br /&gt;
&lt;br /&gt;
GSoC has two formal evaluation points, at the ''mid-term'' and at the end. These evaluations determine if you receive the stipend from Google. In order to receive a pass for the evaluations you will need to show adequate progress toward your project's goals.&lt;br /&gt;
&lt;br /&gt;
To help you meet your goals and so that your mentor can better evaluate your progress you need to:&lt;br /&gt;
&lt;br /&gt;
* Have frequent, public discussions of your progress. (Don't rely on just your mentor for advice.)&lt;br /&gt;
* Have a public Inkscape branch for your code to which you commit regularly.&lt;br /&gt;
* Give weekly status reports.&lt;br /&gt;
&lt;br /&gt;
For the final pass, you will normally be required to merge your code into Inkscape trunk.&lt;br /&gt;
&lt;br /&gt;
Remember: ''we want you to succeed!''&lt;br /&gt;
&lt;br /&gt;
= Suggested Project Ideas =&lt;br /&gt;
&lt;br /&gt;
The following is a list of formal project suggestions, but do not feel limited to only these - some of our best contributions have been unique ideas that students had in mind from other sources!&lt;br /&gt;
&lt;br /&gt;
See also [[Development Project Ideas]], [[Refactoring projects]], [[Projects]], and https://blueprints.launchpad.net/inkscape/&lt;br /&gt;
&lt;br /&gt;
==P5. UI-Free Inkscape ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Difficult - Long (350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin, pbs&lt;br /&gt;
* Programming skills: C++, CMake&lt;br /&gt;
* Prerequisites: Minimal knowledge of build systems. Experience with GTKmm helpful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape currently builds with X11 and gtk and a lot of graphical dependencies. But since it is allowed to run in commandline, and there are controlled environments (servers) that use it to convert svg to png and to perform actions, there should be no need to force it to build with those. The main goal of this project is to add a WITH_GUI compilation flag that when OFF, does *not* link Inkscape with any graphical dependency. While much work has been done towards this goal, much remains to be done. DONE &amp;lt;s&amp;gt;As a next step, Inkscape's &amp;quot;verbs&amp;quot; which are mostly GUI dependent (even if there is no reason to be) need to be converted to Gio::Actions.&amp;lt;/s&amp;gt; More work needs to be done to separate out hidden GUI dependencies that remain after the Verb to Action transition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Server installs, scripts&lt;br /&gt;
&lt;br /&gt;
==P8. Add Text and Image Support to Live Path Effect System ==&lt;br /&gt;
* Estimation of difficulty: Hard - Short (175h)&lt;br /&gt;
* Potential mentors: Jabier Arraiza (Spanish, English(not native))&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Experience managing bitmaps&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Live Path Effects are non destructive effects applied to paths and shapes standalone or inside a group.&amp;lt;br /&amp;gt; &lt;br /&gt;
This is done keepeng a reference to the original data to reaply when needed.&amp;lt;br /&amp;gt;&lt;br /&gt;
But ignore text and image elements.&amp;lt;br /&amp;gt;&lt;br /&gt;
Things to do:&lt;br /&gt;
* Study add image, text, both and maybe others SVG elements to the LPE system.&lt;br /&gt;
* Create/adapt minimun one LPE for each new type of element acepted as reference. Suggestion Perspective-Envelope.&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Apply live effects to images and text based in C++ code in a non destructive way even in groups with mixed elements types.&lt;br /&gt;
&lt;br /&gt;
==P9. Path Library Improvements ==&lt;br /&gt;
* Estimation of difficulty: Hard - Long (350h)&lt;br /&gt;
* Potential mentors: Tavmjong Bah, KK&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Strong math skills, specifically in geometry.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape relies on two geometry libraries for path manipulations: lib2geom and livarot. lib2geom is a generic modern library written specifically with Inkscape in mind. lib2geom is missing some functionality that Inkscape requires and that is found in livarot. This project is to move that functionality into lib2geom (or into separate files) using lib2geom path descriptions. A 2020 GSoC student did a significant amount of work understanding and documenting the issues involved [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416]. This project would be to build on his work.&lt;br /&gt;
&lt;br /&gt;
Specifically, the functionality needed is&lt;br /&gt;
* Path offset/inset functions.&lt;br /&gt;
* Path simplify.&lt;br /&gt;
* Stroke to path function.&lt;br /&gt;
* Line scanning (used for flowing text into a shape).&lt;br /&gt;
&lt;br /&gt;
==P11. Improvements to Paint Server Dialog ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Easy to Medium - Short (175h)&lt;br /&gt;
* Potential mentors: Tavmjong&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Some knowledge of GTK and CSS.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The ''Paint Server Dialog'' allows a user to visually select a pattern or hatch to use in painting the ''fill'' or ''stroke'' of an object. This project would be to expand the dialog to cover gradients, meshes, and solid colors as well as make other improvements to the dialog. Interaction with the Inkscape's ''UX'' team will be required.&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/40 '''Full poposal''']&lt;br /&gt;
== P15. Import and Export extensions ==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Flexible, usually easy to medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python, Ability to read technical documents, depending on the format: some reverse engineering&lt;br /&gt;
* Prerequisites: minimal knowledge of test-driven development&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; Inkscape is alway looking to improve compatibility! Some ideas of relevant file formats - each of them more than enough for one GSoC:*Refactor our '''DXF input and output''' extensions, and expand support towards binary DXF&lt;br /&gt;
*Write an as-complete-as-possible '''EPS export''', circumventing the internal information loss in ghostscript (EPS is still relevant for scientific papers, but more and more tools are dropping support, so this is a chance to grab market share - the results of Adobe Distiller are much better than ghostscript's...)&lt;br /&gt;
*Rewrite the '''XAML importer''' in Python (currenly XSLT) to match the capabilities of the new XAML exporter (i.e. support for different target frameworks, better text support...) - would have to select carefully what to support (drawing primitives) and what not (control elements) - the boundary is not as clear-cut as it seems.&lt;br /&gt;
* Update the '''Synfig export''' to support the latest Synfig developments&lt;br /&gt;
* '''Import or export of TikZ'''. There are a few abandoned extensions out there (from which we can borrow), but it's very widely used in science - both import and export could serve an important function in the scientific workflow.&lt;br /&gt;
*'''Import of the proprietary fileformats''' of Affinity Design, Vectornator, Vectorstyler (especially the last two seem in their infancy and users at some point will sit on a bunch of files that they can't open anymore because their SAAS model wasn't profitable) .&lt;br /&gt;
*'''Import of CGM''' - old, but ISO standardized. Was supported once and dropped when the uniconvertor extension was removed for 1.0.&lt;br /&gt;
* '''Python based EMF / WMF importer -''' the current (core Inkscape) C extension is unmaintained and Python would probably be the right way to get more collaboration on it. A lot of public archives sit on mountains of EMF files. Note that the Document Foundation recently did a lot of work properly importing those files, so we can learn from them / maybe even join forces...&lt;br /&gt;
*your favorite file format? - also have a look here: https://office.inkscape.org/nextcloud/index.php/s/Tq6cdDDGay6taCw&lt;br /&gt;
==P16. Gcodetools refactoring and documentation==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Easy- Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Maker background / familiarity with the Maker community&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; [https://gitlab.com/inkscape/extras/extensions-gcodetools/ Gcodetools] is a set of Inkscape extensions that deal with reading and creating Gcode files, mostly for use in laser cutters or plotters. For this project, ideally someone with a Makerspace background will&lt;br /&gt;
#query maker spaces on their needs regarding gcodetools,&lt;br /&gt;
#implement those needs together with unit tests,&lt;br /&gt;
# improve the test coverage of Gcodetools,&lt;br /&gt;
#write proper documentation for it. (doesn't really exist at the moment).&lt;br /&gt;
==P17. Packing / Nesting as an Inkscape extension==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Computational geometry&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; In this project, a set of packing / nesting algorithms will be implemented:&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Cutting_stock_problem Linear nesting] is not too useful in SVG, but might be a good place to get acquainted with the problem. 2D cutting stock problem would be very interesting to have and would work great with the new multipage functionality.&lt;br /&gt;
*For efficient packing of free form objects, we might just re-implement [https://github.com/Jack000/SVGnest SVGNest] in Python. There are probably some more recent research papers which would be interesting to implement as a comparison.&lt;br /&gt;
&lt;br /&gt;
== P19. Improving UI of Live path effects ==&lt;br /&gt;
*Estimation of difficulty: Medium- Hard, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Mike, jabier ,??&lt;br /&gt;
* Programming skills: GTK 4, C++&lt;br /&gt;
*Prerequisites: Front end UI , familiarity with Live path effects&lt;br /&gt;
[[File:Imageasdasda qrq.png|thumb|146x146px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; This project Should implement Proposed UI clean up of Controls . LPE controls shoulbe be more user freindly and predictive,&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/?sort=popularity&amp;amp;state=opened&amp;amp;label_name%5B%5D=Dialog%3A%3ALPE&amp;amp;first_page_size=100 '''Full Proposed designs''']&lt;br /&gt;
&lt;br /&gt;
[[File:Imageasd.png|right|frameless|466x466px]]&lt;br /&gt;
== P20. Recolor Artwork ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short (90h or 175h)&lt;br /&gt;
* Potential mentors: Adam Belis ?&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
An easy and convenient way how to change any color from the selection. Useful for experimenting and tweaking colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/inbox/-/issues/6095 '''Full proposal Here''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* fast Editing color in whole project without of need for swatches&lt;br /&gt;
*easier work for color harmonies in a project&lt;br /&gt;
*Easier iteration and visioning of designs&lt;br /&gt;
&lt;br /&gt;
==Pxx. Your project ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short or Long (175h or 350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: good ideas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The most successful GSoC we had in the past were students coming with their own past, use cases and ideas for Inkscape. Many basic tools like 3d cubes or connectors you can see in Inkscape now have been brought by brilliant people (like you) with ideas. If we think that your project fits with Inkscape (ie: has its place with a vector graphic editor), we can help you refining your ideas and help bring shiny new stuff to life!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Amaze us!&lt;br /&gt;
&lt;br /&gt;
= Successful SOC Projects from Previous Years =&lt;br /&gt;
* 2005&lt;br /&gt;
** Connectors&lt;br /&gt;
** Inkboard&lt;br /&gt;
** [http://www.openclipart.org/ Open Clip Art Library (OCAL)] Interface&lt;br /&gt;
** DXF Import / Export&lt;br /&gt;
* [[Google Summer of Code 2006|2006]]&lt;br /&gt;
** Support for SVG Filters&lt;br /&gt;
** Filter Effects&lt;br /&gt;
** PDF export&lt;br /&gt;
** Inkboard Protocol Spec / Lib Conversion&lt;br /&gt;
* [[Google Summer of Code 2007|2007]]&lt;br /&gt;
** Text Style Improvements&lt;br /&gt;
** PDF import&lt;br /&gt;
** Live Path Effects&lt;br /&gt;
** 3D Box Tool&lt;br /&gt;
** UI for SVG Filter Effects&lt;br /&gt;
** Raster Functionality&lt;br /&gt;
** Importing from, and Exporting to, a remote ccHost instance&lt;br /&gt;
* [[Google Summer of Code 2008|2008]]&lt;br /&gt;
** SVG Fonts support&lt;br /&gt;
** 2Geom refactoring project - port most geometry code to 2Geom&lt;br /&gt;
** lib2geom: interactive applications showing off the power of lib2geom&lt;br /&gt;
** Tech drawing abilities&lt;br /&gt;
** A test suite&lt;br /&gt;
* 2009&lt;br /&gt;
** [[GSoC2009 Node Tool Rewrite|Node tool rewrite]]&lt;br /&gt;
** D-Bus scripting API&lt;br /&gt;
** Connector tool improvements&lt;br /&gt;
** ICC/CMYK workflow&lt;br /&gt;
* 2010&lt;br /&gt;
** Cairo-based rendering&lt;br /&gt;
** C++ification of SP Layer&lt;br /&gt;
* 2011&lt;br /&gt;
** Rendering caching&lt;br /&gt;
** Javascript support improvements&lt;br /&gt;
** CSS support improvements&lt;br /&gt;
* 2012&lt;br /&gt;
** Usibility Improvements for Guides&lt;br /&gt;
** [[Tiling tool|On-canvas support for Tessellations]]&lt;br /&gt;
** Creating python bindings for lib2geom&lt;br /&gt;
* [[Google Summer of Code 2013|2013]]&lt;br /&gt;
** Recolor Tool&lt;br /&gt;
** Improved Units Support&lt;br /&gt;
** Electronics CAD Support&lt;br /&gt;
** New From Templates Dialog&lt;br /&gt;
** New Raster to Vector Algorithm&lt;br /&gt;
* 2014&lt;br /&gt;
** Better Support for SVG Paints&lt;br /&gt;
** Robust Boolean and Stroking Operations for 2Geom&lt;br /&gt;
* 2016&lt;br /&gt;
** [[GSoC 2016 Better data structure for selections|Better data structure for selections]]&lt;br /&gt;
** [[Style Editor|CSS Style Sheet Editor]]&lt;br /&gt;
* 2017&lt;br /&gt;
** SVG 2 Text Support&lt;br /&gt;
** Better CSS Style Sheet Support&lt;br /&gt;
* 2019&lt;br /&gt;
** Mesh gradient and hatches polyfills. Paint server dialog.&lt;br /&gt;
* 2020&lt;br /&gt;
** [https://gitlab.com/vanntile/inkscape-gsoc-2020 New dialog system.]&lt;br /&gt;
** [https://gitlab.com/rathod-sahaab/gsoc-2020-inkscape Command palette dialog.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416 Documenting livarot]&lt;br /&gt;
* 2021&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3420 On canvas marker editing.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3328 Verbs to Gio::Actions.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3294 On canvas alignment snapping.]&lt;br /&gt;
* 2022&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4692 Tab Structure.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4694 Font Collections.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4756 Modernizing Memory Management.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4504 OCR Support.]&lt;br /&gt;
* 2023&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5335 GTK4 toolbar port preparation]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5624 Customizable Appearance of Canvas Controls]&lt;br /&gt;
* 2024&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6578 Node-based filter editor]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6492 Improving UX of Node tool and Bezier tool]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123086</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123086"/>
		<updated>2024-12-22T15:23:06Z</updated>

		<summary type="html">&lt;p&gt;PBS: Add links to Documenting Livarot GSoC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;max-width:70em; margin-left: auto; margin-right: auto&amp;quot;&amp;gt;&lt;br /&gt;
= Welcome to Inkscape! =&lt;br /&gt;
&lt;br /&gt;
For quite a few years Inkscape has been successfully participating in [http://code.google.com/soc/ Google Summer of Code].&lt;br /&gt;
&lt;br /&gt;
Google has opened up the program to students AND beginners to Open Source who are 18 years are older. Projects can be medium size (~175 hours) or large size (~350 hours). Finish times are flexible, 12 to 22 weeks (with agreement of mentor).&lt;br /&gt;
&lt;br /&gt;
GSoC is a program where Google funds the development of specific features in open source software by university students and other new to open source. You don't need to be a Computer Science student to apply. Features to be developed are picked by Inkscape administrators from the pool of proposals submitted by applicants.&lt;br /&gt;
&lt;br /&gt;
We've mentored about half a dozen students a year since GSoC started.  Many students enjoyed their work and continue to be involved; perhaps your mentor will be a past GSoC student!  We have a high rate of acceptance of student code into the core codebase. Indeed, GSoC projects have been a key source of some of Inkscape's best features in the past several releases.&lt;br /&gt;
&lt;br /&gt;
If you are interested in joining us this summer, it is time to get your proposal ready. You can choose a proposal from our list of suggestions or come up with one of your own. In either either case, you '''must''' give us a detailed outline of what you plan to do. It is '''highly''' recommended that you discuss your idea as early as possible with Inkscape developers. They not only can give you guidance as you flesh out your proposal but ultimately you must convince them that you can do the work planned in the time allotted. '''If you have not discussed your proposal with Inkscape developers before you apply, your application will be rejected!'''&lt;br /&gt;
&lt;br /&gt;
= Candidate Applications =&lt;br /&gt;
&lt;br /&gt;
* Google program information:&lt;br /&gt;
** [https://summerofcode.withgoogle.com/ Home page].&lt;br /&gt;
** Summer of Code Application form. Applications open at 18:00 UTC on March 18th, 2024. -&amp;gt; https://developers.google.com/open-source/gsoc/timeline&lt;br /&gt;
&lt;br /&gt;
* Inkscape-specific information:&lt;br /&gt;
** [[SOC Application Template]].&lt;br /&gt;
** [[Roadmap | Inkscape Roadmap]] - to see our overall objectives.&lt;br /&gt;
** [[Projects | Inkscape Development Project Ideas]] - broader list of development ideas.&lt;br /&gt;
** [[SOC Writing Project Proposals]] - some guidelines for proposals.&lt;br /&gt;
** [[SOC Selection Criteria]] - how we rate applications.&lt;br /&gt;
&lt;br /&gt;
'''Candidate Applications for GSoC 2024 must be submitted to the GSoC site by 18:00 UTC on April 2nd 2024.'''&lt;br /&gt;
&lt;br /&gt;
= The &amp;quot;two patches&amp;quot; rule =&lt;br /&gt;
&lt;br /&gt;
We require two patches from each potential GSoC student, before accepting the student for GSoC participation (it is the same requirement as for obtaining rights to commit changes to the code repository).&lt;br /&gt;
&lt;br /&gt;
The reason for this requirement is that you can show us that you have succeeded in building Inkscape on your PC, and that you have understood a little piece of Inkscape's code and are able to improve it. &lt;br /&gt;
Inkscape is a large project, and you really should not try to understand all the code. Many (all?) developers know only parts of the program code!&lt;br /&gt;
You can join our [https://inkscape.org/community/discussion/ IRC] channel or [https://chat.inkscape.org/channel/team_devel Rocket Chat] and ask developers for help.&lt;br /&gt;
&lt;br /&gt;
== Suggested &amp;quot;easy&amp;quot; bug fixes or improvements ==&lt;br /&gt;
&lt;br /&gt;
To get you started on Inkscape development, you can find (probably) easy-to-fix bugs or small improvements that require very little knowledge of the whole program by searching our [https://gitlab.com/inkscape/inkscape/issues/ bug-tracker] for bugs tagged with 'easy-fix'.&lt;br /&gt;
&lt;br /&gt;
= Performance Evaluation =&lt;br /&gt;
&lt;br /&gt;
GSoC has two formal evaluation points, at the ''mid-term'' and at the end. These evaluations determine if you receive the stipend from Google. In order to receive a pass for the evaluations you will need to show adequate progress toward your project's goals.&lt;br /&gt;
&lt;br /&gt;
To help you meet your goals and so that your mentor can better evaluate your progress you need to:&lt;br /&gt;
&lt;br /&gt;
* Have frequent, public discussions of your progress. (Don't rely on just your mentor for advice.)&lt;br /&gt;
* Have a public Inkscape branch for your code to which you commit regularly.&lt;br /&gt;
* Give weekly status reports.&lt;br /&gt;
&lt;br /&gt;
For the final pass, you will normally be required to merge your code into Inkscape trunk.&lt;br /&gt;
&lt;br /&gt;
Remember: ''we want you to succeed!''&lt;br /&gt;
&lt;br /&gt;
= Suggested Project Ideas =&lt;br /&gt;
&lt;br /&gt;
The following is a list of formal project suggestions, but do not feel limited to only these - some of our best contributions have been unique ideas that students had in mind from other sources!&lt;br /&gt;
&lt;br /&gt;
See also [[Development Project Ideas]], [[Refactoring projects]], [[Projects]], and https://blueprints.launchpad.net/inkscape/&lt;br /&gt;
&lt;br /&gt;
==P5. UI-Free Inkscape ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Difficult - Long (350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: C++, CMake&lt;br /&gt;
* Prerequisites: Minimal knowledge of build systems. Experience with GtkMM helpful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape currently builds with X11 and gtk and a lot of graphical dependencies. But since it is allowed to run in commandline, and there are controlled environments (servers) that use it to convert svg to png and to perform actions, there should be no need to force it to build with those. The main goal of this project is to add a WITH_GUI compilation flag that when OFF, does *not* link Inkscape with any graphical dependency. While much work has been done towards this goal, much remains to be done. DONE &amp;lt;s&amp;gt;As a next step, Inkscape's &amp;quot;verbs&amp;quot; which are mostly GUI dependent (even if there is no reason to be) need to be converted to Gio::Actions.&amp;lt;/s&amp;gt; More work needs to be done to separate out hidden GUI dependencies that remain after the Verb to Action transition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Server installs, scripts&lt;br /&gt;
&lt;br /&gt;
==P8. Add Text and Image Support to Live Path Effect System ==&lt;br /&gt;
* Estimation of difficulty: Hard - Short (175h)&lt;br /&gt;
* Potential mentors: Jabier Arraiza (Spanish, English(not native))&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Experience managing bitmaps&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Live Path Effects are non destructive effects applied to paths and shapes standalone or inside a group.&amp;lt;br /&amp;gt; &lt;br /&gt;
This is done keepeng a reference to the original data to reaply when needed.&amp;lt;br /&amp;gt;&lt;br /&gt;
But ignore text and image elements.&amp;lt;br /&amp;gt;&lt;br /&gt;
Things to do:&lt;br /&gt;
* Study add image, text, both and maybe others SVG elements to the LPE system.&lt;br /&gt;
* Create/adapt minimun one LPE for each new type of element acepted as reference. Suggestion Perspective-Envelope.&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Apply live effects to images and text based in C++ code in a non destructive way even in groups with mixed elements types.&lt;br /&gt;
&lt;br /&gt;
==P9. Path Library Improvements ==&lt;br /&gt;
* Estimation of difficulty: Hard - Long (350h)&lt;br /&gt;
* Potential mentors: Tavmjong Bah, KK&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Strong math skills, specifically in geometry.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape relies on two geometry libraries for path manipulations: lib2geom and livarot. lib2geom is a generic modern library written specifically with Inkscape in mind. lib2geom is missing some functionality that Inkscape requires and that is found in livarot. This project is to move that functionality into lib2geom (or into separate files) using lib2geom path descriptions. A 2020 GSoC student did a significant amount of work understanding and documenting the issues involved [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416]. This project would be to build on his work.&lt;br /&gt;
&lt;br /&gt;
Specifically, the functionality needed is&lt;br /&gt;
* Path offset/inset functions.&lt;br /&gt;
* Path simplify.&lt;br /&gt;
* Stroke to path function.&lt;br /&gt;
* Line scanning (used for flowing text into a shape).&lt;br /&gt;
&lt;br /&gt;
==P11. Improvements to Paint Server Dialog ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Easy to Medium - Short (175h)&lt;br /&gt;
* Potential mentors: Tavmjong&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Some knowledge of GTK and CSS.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The ''Paint Server Dialog'' allows a user to visually select a pattern or hatch to use in painting the ''fill'' or ''stroke'' of an object. This project would be to expand the dialog to cover gradients, meshes, and solid colors as well as make other improvements to the dialog. Interaction with the Inkscape's ''UX'' team will be required.&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/40 '''Full poposal''']&lt;br /&gt;
== P15. Import and Export extensions ==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Flexible, usually easy to medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python, Ability to read technical documents, depending on the format: some reverse engineering&lt;br /&gt;
* Prerequisites: minimal knowledge of test-driven development&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; Inkscape is alway looking to improve compatibility! Some ideas of relevant file formats - each of them more than enough for one GSoC:*Refactor our '''DXF input and output''' extensions, and expand support towards binary DXF&lt;br /&gt;
*Write an as-complete-as-possible '''EPS export''', circumventing the internal information loss in ghostscript (EPS is still relevant for scientific papers, but more and more tools are dropping support, so this is a chance to grab market share - the results of Adobe Distiller are much better than ghostscript's...)&lt;br /&gt;
*Rewrite the '''XAML importer''' in Python (currenly XSLT) to match the capabilities of the new XAML exporter (i.e. support for different target frameworks, better text support...) - would have to select carefully what to support (drawing primitives) and what not (control elements) - the boundary is not as clear-cut as it seems.&lt;br /&gt;
* Update the '''Synfig export''' to support the latest Synfig developments&lt;br /&gt;
* '''Import or export of TikZ'''. There are a few abandoned extensions out there (from which we can borrow), but it's very widely used in science - both import and export could serve an important function in the scientific workflow.&lt;br /&gt;
*'''Import of the proprietary fileformats''' of Affinity Design, Vectornator, Vectorstyler (especially the last two seem in their infancy and users at some point will sit on a bunch of files that they can't open anymore because their SAAS model wasn't profitable) .&lt;br /&gt;
*'''Import of CGM''' - old, but ISO standardized. Was supported once and dropped when the uniconvertor extension was removed for 1.0.&lt;br /&gt;
* '''Python based EMF / WMF importer -''' the current (core Inkscape) C extension is unmaintained and Python would probably be the right way to get more collaboration on it. A lot of public archives sit on mountains of EMF files. Note that the Document Foundation recently did a lot of work properly importing those files, so we can learn from them / maybe even join forces...&lt;br /&gt;
*your favorite file format? - also have a look here: https://office.inkscape.org/nextcloud/index.php/s/Tq6cdDDGay6taCw&lt;br /&gt;
==P16. Gcodetools refactoring and documentation==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Easy- Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Maker background / familiarity with the Maker community&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; [https://gitlab.com/inkscape/extras/extensions-gcodetools/ Gcodetools] is a set of Inkscape extensions that deal with reading and creating Gcode files, mostly for use in laser cutters or plotters. For this project, ideally someone with a Makerspace background will&lt;br /&gt;
#query maker spaces on their needs regarding gcodetools,&lt;br /&gt;
#implement those needs together with unit tests,&lt;br /&gt;
# improve the test coverage of Gcodetools,&lt;br /&gt;
#write proper documentation for it. (doesn't really exist at the moment).&lt;br /&gt;
==P17. Packing / Nesting as an Inkscape extension==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Computational geometry&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; In this project, a set of packing / nesting algorithms will be implemented:&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Cutting_stock_problem Linear nesting] is not too useful in SVG, but might be a good place to get acquainted with the problem. 2D cutting stock problem would be very interesting to have and would work great with the new multipage functionality.&lt;br /&gt;
*For efficient packing of free form objects, we might just re-implement [https://github.com/Jack000/SVGnest SVGNest] in Python. There are probably some more recent research papers which would be interesting to implement as a comparison.&lt;br /&gt;
&lt;br /&gt;
== P19. Improving UI of Live path effects ==&lt;br /&gt;
*Estimation of difficulty: Medium- Hard, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Mike, jabier ,??&lt;br /&gt;
* Programming skills: GTK 4, C++&lt;br /&gt;
*Prerequisites: Front end UI , familiarity with Live path effects&lt;br /&gt;
[[File:Imageasdasda qrq.png|thumb|146x146px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; This project Should implement Proposed UI clean up of Controls . LPE controls shoulbe be more user freindly and predictive,&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/?sort=popularity&amp;amp;state=opened&amp;amp;label_name%5B%5D=Dialog%3A%3ALPE&amp;amp;first_page_size=100 '''Full Proposed designs''']&lt;br /&gt;
&lt;br /&gt;
[[File:Imageasd.png|right|frameless|466x466px]]&lt;br /&gt;
== P20. Recolor Artwork ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short (90h or 175h)&lt;br /&gt;
* Potential mentors: Adam Belis ?&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
An easy and convenient way how to change any color from the selection. Useful for experimenting and tweaking colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/inbox/-/issues/6095 '''Full proposal Here''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* fast Editing color in whole project without of need for swatches&lt;br /&gt;
*easier work for color harmonies in a project&lt;br /&gt;
*Easier iteration and visioning of designs&lt;br /&gt;
&lt;br /&gt;
==Pxx. Your project ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short or Long (175h or 350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: good ideas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The most successful GSoC we had in the past were students coming with their own past, use cases and ideas for Inkscape. Many basic tools like 3d cubes or connectors you can see in Inkscape now have been brought by brilliant people (like you) with ideas. If we think that your project fits with Inkscape (ie: has its place with a vector graphic editor), we can help you refining your ideas and help bring shiny new stuff to life!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Amaze us!&lt;br /&gt;
&lt;br /&gt;
= Successful SOC Projects from Previous Years =&lt;br /&gt;
* 2005&lt;br /&gt;
** Connectors&lt;br /&gt;
** Inkboard&lt;br /&gt;
** [http://www.openclipart.org/ Open Clip Art Library (OCAL)] Interface&lt;br /&gt;
** DXF Import / Export&lt;br /&gt;
* [[Google Summer of Code 2006|2006]]&lt;br /&gt;
** Support for SVG Filters&lt;br /&gt;
** Filter Effects&lt;br /&gt;
** PDF export&lt;br /&gt;
** Inkboard Protocol Spec / Lib Conversion&lt;br /&gt;
* [[Google Summer of Code 2007|2007]]&lt;br /&gt;
** Text Style Improvements&lt;br /&gt;
** PDF import&lt;br /&gt;
** Live Path Effects&lt;br /&gt;
** 3D Box Tool&lt;br /&gt;
** UI for SVG Filter Effects&lt;br /&gt;
** Raster Functionality&lt;br /&gt;
** Importing from, and Exporting to, a remote ccHost instance&lt;br /&gt;
* [[Google Summer of Code 2008|2008]]&lt;br /&gt;
** SVG Fonts support&lt;br /&gt;
** 2Geom refactoring project - port most geometry code to 2Geom&lt;br /&gt;
** lib2geom: interactive applications showing off the power of lib2geom&lt;br /&gt;
** Tech drawing abilities&lt;br /&gt;
** A test suite&lt;br /&gt;
* 2009&lt;br /&gt;
** [[GSoC2009 Node Tool Rewrite|Node tool rewrite]]&lt;br /&gt;
** D-Bus scripting API&lt;br /&gt;
** Connector tool improvements&lt;br /&gt;
** ICC/CMYK workflow&lt;br /&gt;
* 2010&lt;br /&gt;
** Cairo-based rendering&lt;br /&gt;
** C++ification of SP Layer&lt;br /&gt;
* 2011&lt;br /&gt;
** Rendering caching&lt;br /&gt;
** Javascript support improvements&lt;br /&gt;
** CSS support improvements&lt;br /&gt;
* 2012&lt;br /&gt;
** Usibility Improvements for Guides&lt;br /&gt;
** [[Tiling tool|On-canvas support for Tessellations]]&lt;br /&gt;
** Creating python bindings for lib2geom&lt;br /&gt;
* [[Google Summer of Code 2013|2013]]&lt;br /&gt;
** Recolor Tool&lt;br /&gt;
** Improved Units Support&lt;br /&gt;
** Electronics CAD Support&lt;br /&gt;
** New From Templates Dialog&lt;br /&gt;
** New Raster to Vector Algorithm&lt;br /&gt;
* 2014&lt;br /&gt;
** Better Support for SVG Paints&lt;br /&gt;
** Robust Boolean and Stroking Operations for 2Geom&lt;br /&gt;
* 2016&lt;br /&gt;
** [[GSoC 2016 Better data structure for selections|Better data structure for selections]]&lt;br /&gt;
** [[Style Editor|CSS Style Sheet Editor]]&lt;br /&gt;
* 2017&lt;br /&gt;
** SVG 2 Text Support&lt;br /&gt;
** Better CSS Style Sheet Support&lt;br /&gt;
* 2019&lt;br /&gt;
** Mesh gradient and hatches polyfills. Paint server dialog.&lt;br /&gt;
* 2020&lt;br /&gt;
** [https://gitlab.com/vanntile/inkscape-gsoc-2020 New dialog system.]&lt;br /&gt;
** [https://gitlab.com/rathod-sahaab/gsoc-2020-inkscape Command palette dialog.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4416 Documenting livarot]&lt;br /&gt;
* 2021&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3420 On canvas marker editing.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3328 Verbs to Gio::Actions.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3294 On canvas alignment snapping.]&lt;br /&gt;
* 2022&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4692 Tab Structure.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4694 Font Collections.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4756 Modernizing Memory Management.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4504 OCR Support.]&lt;br /&gt;
* 2023&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5335 GTK4 toolbar port preparation]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5624 Customizable Appearance of Canvas Controls]&lt;br /&gt;
* 2024&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6578 Node-based filter editor]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6492 Improving UX of Node tool and Bezier tool]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123085</id>
		<title>Google Summer of Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Google_Summer_of_Code&amp;diff=123085"/>
		<updated>2024-12-22T15:11:55Z</updated>

		<summary type="html">&lt;p&gt;PBS: Add completed 2024 projects&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;max-width:70em; margin-left: auto; margin-right: auto&amp;quot;&amp;gt;&lt;br /&gt;
= Welcome to Inkscape! =&lt;br /&gt;
&lt;br /&gt;
For quite a few years Inkscape has been successfully participating in [http://code.google.com/soc/ Google Summer of Code].&lt;br /&gt;
&lt;br /&gt;
Google has opened up the program to students AND beginners to Open Source who are 18 years are older. Projects can be medium size (~175 hours) or large size (~350 hours). Finish times are flexible, 12 to 22 weeks (with agreement of mentor).&lt;br /&gt;
&lt;br /&gt;
GSoC is a program where Google funds the development of specific features in open source software by university students and other new to open source. You don't need to be a Computer Science student to apply. Features to be developed are picked by Inkscape administrators from the pool of proposals submitted by applicants.&lt;br /&gt;
&lt;br /&gt;
We've mentored about half a dozen students a year since GSoC started.  Many students enjoyed their work and continue to be involved; perhaps your mentor will be a past GSoC student!  We have a high rate of acceptance of student code into the core codebase. Indeed, GSoC projects have been a key source of some of Inkscape's best features in the past several releases.&lt;br /&gt;
&lt;br /&gt;
If you are interested in joining us this summer, it is time to get your proposal ready. You can choose a proposal from our list of suggestions or come up with one of your own. In either either case, you '''must''' give us a detailed outline of what you plan to do. It is '''highly''' recommended that you discuss your idea as early as possible with Inkscape developers. They not only can give you guidance as you flesh out your proposal but ultimately you must convince them that you can do the work planned in the time allotted. '''If you have not discussed your proposal with Inkscape developers before you apply, your application will be rejected!'''&lt;br /&gt;
&lt;br /&gt;
= Candidate Applications =&lt;br /&gt;
&lt;br /&gt;
* Google program information:&lt;br /&gt;
** [https://summerofcode.withgoogle.com/ Home page].&lt;br /&gt;
** Summer of Code Application form. Applications open at 18:00 UTC on March 18th, 2024. -&amp;gt; https://developers.google.com/open-source/gsoc/timeline&lt;br /&gt;
&lt;br /&gt;
* Inkscape-specific information:&lt;br /&gt;
** [[SOC Application Template]].&lt;br /&gt;
** [[Roadmap | Inkscape Roadmap]] - to see our overall objectives.&lt;br /&gt;
** [[Projects | Inkscape Development Project Ideas]] - broader list of development ideas.&lt;br /&gt;
** [[SOC Writing Project Proposals]] - some guidelines for proposals.&lt;br /&gt;
** [[SOC Selection Criteria]] - how we rate applications.&lt;br /&gt;
&lt;br /&gt;
'''Candidate Applications for GSoC 2024 must be submitted to the GSoC site by 18:00 UTC on April 2nd 2024.'''&lt;br /&gt;
&lt;br /&gt;
= The &amp;quot;two patches&amp;quot; rule =&lt;br /&gt;
&lt;br /&gt;
We require two patches from each potential GSoC student, before accepting the student for GSoC participation (it is the same requirement as for obtaining rights to commit changes to the code repository).&lt;br /&gt;
&lt;br /&gt;
The reason for this requirement is that you can show us that you have succeeded in building Inkscape on your PC, and that you have understood a little piece of Inkscape's code and are able to improve it. &lt;br /&gt;
Inkscape is a large project, and you really should not try to understand all the code. Many (all?) developers know only parts of the program code!&lt;br /&gt;
You can join our [https://inkscape.org/community/discussion/ IRC] channel or [https://chat.inkscape.org/channel/team_devel Rocket Chat] and ask developers for help.&lt;br /&gt;
&lt;br /&gt;
== Suggested &amp;quot;easy&amp;quot; bug fixes or improvements ==&lt;br /&gt;
&lt;br /&gt;
To get you started on Inkscape development, you can find (probably) easy-to-fix bugs or small improvements that require very little knowledge of the whole program by searching our [https://gitlab.com/inkscape/inkscape/issues/ bug-tracker] for bugs tagged with 'easy-fix'.&lt;br /&gt;
&lt;br /&gt;
= Performance Evaluation =&lt;br /&gt;
&lt;br /&gt;
GSoC has two formal evaluation points, at the ''mid-term'' and at the end. These evaluations determine if you receive the stipend from Google. In order to receive a pass for the evaluations you will need to show adequate progress toward your project's goals.&lt;br /&gt;
&lt;br /&gt;
To help you meet your goals and so that your mentor can better evaluate your progress you need to:&lt;br /&gt;
&lt;br /&gt;
* Have frequent, public discussions of your progress. (Don't rely on just your mentor for advice.)&lt;br /&gt;
* Have a public Inkscape branch for your code to which you commit regularly.&lt;br /&gt;
* Give weekly status reports.&lt;br /&gt;
&lt;br /&gt;
For the final pass, you will normally be required to merge your code into Inkscape trunk.&lt;br /&gt;
&lt;br /&gt;
Remember: ''we want you to succeed!''&lt;br /&gt;
&lt;br /&gt;
= Suggested Project Ideas =&lt;br /&gt;
&lt;br /&gt;
The following is a list of formal project suggestions, but do not feel limited to only these - some of our best contributions have been unique ideas that students had in mind from other sources!&lt;br /&gt;
&lt;br /&gt;
See also [[Development Project Ideas]], [[Refactoring projects]], [[Projects]], and https://blueprints.launchpad.net/inkscape/&lt;br /&gt;
&lt;br /&gt;
==P5. UI-Free Inkscape ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Difficult - Long (350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: C++, CMake&lt;br /&gt;
* Prerequisites: Minimal knowledge of build systems. Experience with GtkMM helpful.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape currently builds with X11 and gtk and a lot of graphical dependencies. But since it is allowed to run in commandline, and there are controlled environments (servers) that use it to convert svg to png and to perform actions, there should be no need to force it to build with those. The main goal of this project is to add a WITH_GUI compilation flag that when OFF, does *not* link Inkscape with any graphical dependency. While much work has been done towards this goal, much remains to be done. DONE &amp;lt;s&amp;gt;As a next step, Inkscape's &amp;quot;verbs&amp;quot; which are mostly GUI dependent (even if there is no reason to be) need to be converted to Gio::Actions.&amp;lt;/s&amp;gt; More work needs to be done to separate out hidden GUI dependencies that remain after the Verb to Action transition.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Server installs, scripts&lt;br /&gt;
&lt;br /&gt;
==P8. Add Text and Image Support to Live Path Effect System ==&lt;br /&gt;
* Estimation of difficulty: Hard - Short (175h)&lt;br /&gt;
* Potential mentors: Jabier Arraiza (Spanish, English(not native))&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Experience managing bitmaps&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Live Path Effects are non destructive effects applied to paths and shapes standalone or inside a group.&amp;lt;br /&amp;gt; &lt;br /&gt;
This is done keepeng a reference to the original data to reaply when needed.&amp;lt;br /&amp;gt;&lt;br /&gt;
But ignore text and image elements.&amp;lt;br /&amp;gt;&lt;br /&gt;
Things to do:&lt;br /&gt;
* Study add image, text, both and maybe others SVG elements to the LPE system.&lt;br /&gt;
* Create/adapt minimun one LPE for each new type of element acepted as reference. Suggestion Perspective-Envelope.&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Apply live effects to images and text based in C++ code in a non destructive way even in groups with mixed elements types.&lt;br /&gt;
&lt;br /&gt;
==P9. Path Library Improvements ==&lt;br /&gt;
* Estimation of difficulty: Hard - Long (350h)&lt;br /&gt;
* Potential mentors: Tavmjong Bah, KK&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Strong math skills, specifically in geometry.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
Inkscape relies on two geometry libraries for path manipulations: lib2geom and livarot. lib2geom is a generic modern library written specifically with Inkscape in mind. lib2geom is missing some functionality that Inkscape requires and that is found in livarot. This project is to move that functionality into lib2geom (or into separate files) using lib2geom path descriptions. A 2020 GSoC student did a significant amount of work understanding and documenting the issues involved. This project would be to build on his work.&lt;br /&gt;
&lt;br /&gt;
Specifically, the functionality needed is&lt;br /&gt;
* Path offset/inset functions.&lt;br /&gt;
* Path simplify.&lt;br /&gt;
* Stroke to path function.&lt;br /&gt;
* Line scanning (used for flowing text into a shape).&lt;br /&gt;
&lt;br /&gt;
==P11. Improvements to Paint Server Dialog ==&lt;br /&gt;
&lt;br /&gt;
* Estimation of difficulty: Easy to Medium - Short (175h)&lt;br /&gt;
* Potential mentors: Tavmjong&lt;br /&gt;
* Programming skills: C++&lt;br /&gt;
* Prerequisites: Some knowledge of GTK and CSS.&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The ''Paint Server Dialog'' allows a user to visually select a pattern or hatch to use in painting the ''fill'' or ''stroke'' of an object. This project would be to expand the dialog to cover gradients, meshes, and solid colors as well as make other improvements to the dialog. Interaction with the Inkscape's ''UX'' team will be required.&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/40 '''Full poposal''']&lt;br /&gt;
== P15. Import and Export extensions ==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Flexible, usually easy to medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python, Ability to read technical documents, depending on the format: some reverse engineering&lt;br /&gt;
* Prerequisites: minimal knowledge of test-driven development&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; Inkscape is alway looking to improve compatibility! Some ideas of relevant file formats - each of them more than enough for one GSoC:*Refactor our '''DXF input and output''' extensions, and expand support towards binary DXF&lt;br /&gt;
*Write an as-complete-as-possible '''EPS export''', circumventing the internal information loss in ghostscript (EPS is still relevant for scientific papers, but more and more tools are dropping support, so this is a chance to grab market share - the results of Adobe Distiller are much better than ghostscript's...)&lt;br /&gt;
*Rewrite the '''XAML importer''' in Python (currenly XSLT) to match the capabilities of the new XAML exporter (i.e. support for different target frameworks, better text support...) - would have to select carefully what to support (drawing primitives) and what not (control elements) - the boundary is not as clear-cut as it seems.&lt;br /&gt;
* Update the '''Synfig export''' to support the latest Synfig developments&lt;br /&gt;
* '''Import or export of TikZ'''. There are a few abandoned extensions out there (from which we can borrow), but it's very widely used in science - both import and export could serve an important function in the scientific workflow.&lt;br /&gt;
*'''Import of the proprietary fileformats''' of Affinity Design, Vectornator, Vectorstyler (especially the last two seem in their infancy and users at some point will sit on a bunch of files that they can't open anymore because their SAAS model wasn't profitable) .&lt;br /&gt;
*'''Import of CGM''' - old, but ISO standardized. Was supported once and dropped when the uniconvertor extension was removed for 1.0.&lt;br /&gt;
* '''Python based EMF / WMF importer -''' the current (core Inkscape) C extension is unmaintained and Python would probably be the right way to get more collaboration on it. A lot of public archives sit on mountains of EMF files. Note that the Document Foundation recently did a lot of work properly importing those files, so we can learn from them / maybe even join forces...&lt;br /&gt;
*your favorite file format? - also have a look here: https://office.inkscape.org/nextcloud/index.php/s/Tq6cdDDGay6taCw&lt;br /&gt;
==P16. Gcodetools refactoring and documentation==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Easy- Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Maker background / familiarity with the Maker community&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; [https://gitlab.com/inkscape/extras/extensions-gcodetools/ Gcodetools] is a set of Inkscape extensions that deal with reading and creating Gcode files, mostly for use in laser cutters or plotters. For this project, ideally someone with a Makerspace background will&lt;br /&gt;
#query maker spaces on their needs regarding gcodetools,&lt;br /&gt;
#implement those needs together with unit tests,&lt;br /&gt;
# improve the test coverage of Gcodetools,&lt;br /&gt;
#write proper documentation for it. (doesn't really exist at the moment).&lt;br /&gt;
==P17. Packing / Nesting as an Inkscape extension==&lt;br /&gt;
&lt;br /&gt;
*Estimation of difficulty: Medium, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Jonathan&lt;br /&gt;
* Programming skills: Python&lt;br /&gt;
* Prerequisites: Computational geometry&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; In this project, a set of packing / nesting algorithms will be implemented:&lt;br /&gt;
*[https://en.wikipedia.org/wiki/Cutting_stock_problem Linear nesting] is not too useful in SVG, but might be a good place to get acquainted with the problem. 2D cutting stock problem would be very interesting to have and would work great with the new multipage functionality.&lt;br /&gt;
*For efficient packing of free form objects, we might just re-implement [https://github.com/Jack000/SVGnest SVGNest] in Python. There are probably some more recent research papers which would be interesting to implement as a comparison.&lt;br /&gt;
&lt;br /&gt;
== P19. Improving UI of Live path effects ==&lt;br /&gt;
*Estimation of difficulty: Medium- Hard, Short or Long depending on scope (175h or 350h)&lt;br /&gt;
*Potential mentors: Mike, jabier ,??&lt;br /&gt;
* Programming skills: GTK 4, C++&lt;br /&gt;
*Prerequisites: Front end UI , familiarity with Live path effects&lt;br /&gt;
[[File:Imageasdasda qrq.png|thumb|146x146px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description:&amp;lt;/u&amp;gt; This project Should implement Proposed UI clean up of Controls . LPE controls shoulbe be more user freindly and predictive,&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/ux/-/issues/?sort=popularity&amp;amp;state=opened&amp;amp;label_name%5B%5D=Dialog%3A%3ALPE&amp;amp;first_page_size=100 '''Full Proposed designs''']&lt;br /&gt;
&lt;br /&gt;
[[File:Imageasd.png|right|frameless|466x466px]]&lt;br /&gt;
== P20. Recolor Artwork ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short (90h or 175h)&lt;br /&gt;
* Potential mentors: Adam Belis ?&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
An easy and convenient way how to change any color from the selection. Useful for experimenting and tweaking colors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://gitlab.com/inkscape/inbox/-/issues/6095 '''Full proposal Here''']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* fast Editing color in whole project without of need for swatches&lt;br /&gt;
*easier work for color harmonies in a project&lt;br /&gt;
*Easier iteration and visioning of designs&lt;br /&gt;
&lt;br /&gt;
==Pxx. Your project ==&lt;br /&gt;
* Estimation of difficulty: Variable - Short or Long (175h or 350h)&lt;br /&gt;
* Potential mentors: Marc Jeanmougin&lt;br /&gt;
* Programming skills: usually C++&lt;br /&gt;
* Prerequisites: good ideas&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Detailed Description&amp;lt;/u&amp;gt;&lt;br /&gt;
The most successful GSoC we had in the past were students coming with their own past, use cases and ideas for Inkscape. Many basic tools like 3d cubes or connectors you can see in Inkscape now have been brought by brilliant people (like you) with ideas. If we think that your project fits with Inkscape (ie: has its place with a vector graphic editor), we can help you refining your ideas and help bring shiny new stuff to life!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt;Use cases&amp;lt;/u&amp;gt;&lt;br /&gt;
* Amaze us!&lt;br /&gt;
&lt;br /&gt;
= Successful SOC Projects from Previous Years =&lt;br /&gt;
* 2005&lt;br /&gt;
** Connectors&lt;br /&gt;
** Inkboard&lt;br /&gt;
** [http://www.openclipart.org/ Open Clip Art Library (OCAL)] Interface&lt;br /&gt;
** DXF Import / Export&lt;br /&gt;
* [[Google Summer of Code 2006|2006]]&lt;br /&gt;
** Support for SVG Filters&lt;br /&gt;
** Filter Effects&lt;br /&gt;
** PDF export&lt;br /&gt;
** Inkboard Protocol Spec / Lib Conversion&lt;br /&gt;
* [[Google Summer of Code 2007|2007]]&lt;br /&gt;
** Text Style Improvements&lt;br /&gt;
** PDF import&lt;br /&gt;
** Live Path Effects&lt;br /&gt;
** 3D Box Tool&lt;br /&gt;
** UI for SVG Filter Effects&lt;br /&gt;
** Raster Functionality&lt;br /&gt;
** Importing from, and Exporting to, a remote ccHost instance&lt;br /&gt;
* [[Google Summer of Code 2008|2008]]&lt;br /&gt;
** SVG Fonts support&lt;br /&gt;
** 2Geom refactoring project - port most geometry code to 2Geom&lt;br /&gt;
** lib2geom: interactive applications showing off the power of lib2geom&lt;br /&gt;
** Tech drawing abilities&lt;br /&gt;
** A test suite&lt;br /&gt;
* 2009&lt;br /&gt;
** [[GSoC2009 Node Tool Rewrite|Node tool rewrite]]&lt;br /&gt;
** D-Bus scripting API&lt;br /&gt;
** Connector tool improvements&lt;br /&gt;
** ICC/CMYK workflow&lt;br /&gt;
* 2010&lt;br /&gt;
** Cairo-based rendering&lt;br /&gt;
** C++ification of SP Layer&lt;br /&gt;
* 2011&lt;br /&gt;
** Rendering caching&lt;br /&gt;
** Javascript support improvements&lt;br /&gt;
** CSS support improvements&lt;br /&gt;
* 2012&lt;br /&gt;
** Usibility Improvements for Guides&lt;br /&gt;
** [[Tiling tool|On-canvas support for Tessellations]]&lt;br /&gt;
** Creating python bindings for lib2geom&lt;br /&gt;
* [[Google Summer of Code 2013|2013]]&lt;br /&gt;
** Recolor Tool&lt;br /&gt;
** Improved Units Support&lt;br /&gt;
** Electronics CAD Support&lt;br /&gt;
** New From Templates Dialog&lt;br /&gt;
** New Raster to Vector Algorithm&lt;br /&gt;
* 2014&lt;br /&gt;
** Better Support for SVG Paints&lt;br /&gt;
** Robust Boolean and Stroking Operations for 2Geom&lt;br /&gt;
* 2016&lt;br /&gt;
** [[GSoC 2016 Better data structure for selections|Better data structure for selections]]&lt;br /&gt;
** [[Style Editor|CSS Style Sheet Editor]]&lt;br /&gt;
* 2017&lt;br /&gt;
** SVG 2 Text Support&lt;br /&gt;
** Better CSS Style Sheet Support&lt;br /&gt;
* 2019&lt;br /&gt;
** Mesh gradient and hatches polyfills. Paint server dialog.&lt;br /&gt;
* 2020&lt;br /&gt;
** [https://gitlab.com/vanntile/inkscape-gsoc-2020 New dialog system.]&lt;br /&gt;
** [https://gitlab.com/rathod-sahaab/gsoc-2020-inkscape Command palette dialog.]&lt;br /&gt;
** Path operations.&lt;br /&gt;
* 2021&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3420 On canvas marker editing.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3328 Verbs to Gio::Actions.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/3294 On canvas alignment snapping.]&lt;br /&gt;
* 2022&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4692 Tab Structure.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4694 Font Collections.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4756 Modernizing Memory Management.]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/4504 OCR Support.]&lt;br /&gt;
* 2023&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5335 GTK4 toolbar port preparation]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/5624 Customizable Appearance of Canvas Controls]&lt;br /&gt;
* 2024&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6578 Node-based filter editor]&lt;br /&gt;
** [https://gitlab.com/inkscape/inkscape/-/merge_requests/6492 Improving UX of Node tool and Bezier tool]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122978</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122978"/>
		<updated>2024-07-10T00:50:31Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update for Ubuntu 24.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute &amp;lt;code&amp;gt;floor(log2(x))&amp;lt;/code&amp;gt;. (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| Concepts                          || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| Coroutines                        || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Ranges                            || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Mathematical Constants            || C++20 ||                                             || 10     || 12.0.5 || Constants like &amp;lt;code&amp;gt;std::numbers::pi&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Heterogenous lookup in &amp;lt;code&amp;gt;std::unordered_map&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        ||        || Faster lookup, use of smart pointers as keys.&lt;br /&gt;
|-&lt;br /&gt;
|&amp;lt;code&amp;gt;consteval static&amp;lt;/code&amp;gt; member functions&lt;br /&gt;
|C++20&lt;br /&gt;
| style=&amp;quot;background: pink;&amp;quot; | not yet&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Guaranteed compile time evaluation of member functions (stronger than &amp;lt;code&amp;gt;constexpr&amp;lt;/code&amp;gt;)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 10 July 2024, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux: GNU 13.2.0 (building on Ubuntu 24.04)&lt;br /&gt;
** inkscape:linux: Same as above&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build: GNU 13.2.0&lt;br /&gt;
** inkscape:windows:dist: Same as above&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm: Apple Clang 15.0.0&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)&lt;br /&gt;
&lt;br /&gt;
We strive to support latest Debian stable and latest Ubuntu LTS.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || glib || glibmm || gtk4 || gtkmm4 || Can build?&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || style=&amp;quot;background: pink;&amp;quot; | 2.74.6 || style=&amp;quot;background: pink;&amp;quot; | 2.74.0 || style=&amp;quot;background: wheat;&amp;quot; | 4.8.3 || style=&amp;quot;background: wheat;&amp;quot; | 4.8.3 || ❌&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.2.0 || 18.1.3 || 2.80.0 || 2.78.1 || 4.14.2 || style=&amp;quot;background: wheat;&amp;quot; | 4.10.1 || ✅&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The build requires glibmm &amp;gt;= 2.78.1 and gtkmm4 &amp;gt;= 4.14. The build system will supply its own gtkmm4 if out-of-date. Therefore the build only currently works out of the box on Ubuntu 24.04.&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122757</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122757"/>
		<updated>2024-04-19T21:53:43Z</updated>

		<summary type="html">&lt;p&gt;PBS: Add heterogenous lookup; can't use yet (macOS)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute &amp;lt;code&amp;gt;floor(log2(x))&amp;lt;/code&amp;gt;. (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| Concepts                          || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| Coroutines                        || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Ranges                            || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| [https://stackoverflow.com/a/60244416/5075760 Structural templates]&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| Mathematical Constants            || C++20 ||                                             || 10     || 12.0.5 || Constants like &amp;lt;code&amp;gt;std::numbers::pi&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Heterogenous lookup in &amp;lt;code&amp;gt;std::unordered_map&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        ||        || Faster lookup, use of smart pointers as keys.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 27 March 2024, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux: GNU 13.2.0 (building on Ubuntu 23.10)&lt;br /&gt;
** inkscape:linux: Same as above&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build: GNU 13.2.0&lt;br /&gt;
** inkscape:windows:dist: Same as above&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm: Apple Clang 15.0.0&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)&lt;br /&gt;
&lt;br /&gt;
We strive to support latest Debian stable and latest Ubuntu LTS. However, we had to break that promise since the GTK4 port, which requires gtkmm4 &amp;gt;= 4.14:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || 4.8.3&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 (Jammy Jellyfish) || 12.3.0 || 15.0.7 || Not packaged!&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 23.04 (Lunar)           || 13.1.0 || 16.0.0 || 4.10.1&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.2.0 || 18.1.0 || 4.10.1 (???)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ubuntu users therefore have the following options:&lt;br /&gt;
&lt;br /&gt;
* Wait for Ubuntu 24.04, expected around 25 April 2024.&lt;br /&gt;
* Upgrade to Ubuntu 24.04 now.&lt;br /&gt;
* Upgrade to Ubuntu 23.10 and build gtkmm4 from source, as is currently done by CI.&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122756</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122756"/>
		<updated>2024-04-17T22:41:24Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mention Windows CI is back&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]], [[C++23]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || 15.3   || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial,&amp;lt;br/&amp;gt; 15.3 Full || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || 15.0.0 || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Mathematical Constants&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                             || 10     || 12.0.5 || Constants like std::numbers::pi.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 27 March 2024, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux: GNU 13.2.0 (building on Ubuntu 23.10)&lt;br /&gt;
** inkscape:linux: Same as above&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build: GNU 13.2.0&lt;br /&gt;
** inkscape:windows:dist: Same as above&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm: Apple Clang 15.0.0&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)&lt;br /&gt;
&lt;br /&gt;
We strive to support latest Debian stable and latest Ubuntu LTS. However, we had to break that promise since the GTK4 port, which requires gtkmm4 &amp;gt;= 4.14:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || 4.8.3&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 (Jammy Jellyfish) || 12.3.0 || 15.0.7 || Not packaged!&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 23.04 (Lunar)           || 13.1.0 || 16.0.0 || 4.10.1&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 (Noble)           || 13.2.0 || 18.1.0 || 4.10.1 (???)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ubuntu users therefore have the following options:&lt;br /&gt;
&lt;br /&gt;
* Wait for Ubuntu 24.04, expected around 25 April 2024.&lt;br /&gt;
* Upgrade to Ubuntu 24.04 now.&lt;br /&gt;
* Upgrade to Ubuntu 23.10 and build gtkmm4 from source, as is currently done by CI.&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122718</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122718"/>
		<updated>2024-03-27T05:43:24Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update to reflect latest CI changes, add new information&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || N/A    || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || N/A || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Mathematical Constants&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                             || 10     || 12.0.5 || Constants like std::numbers::pi.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
&lt;br /&gt;
* General: https://en.cppreference.com/w/Template:cpp/compiler_support/20&lt;br /&gt;
* Apple Clang: https://developer.apple.com/documentation/xcode-release-notes&lt;br /&gt;
&lt;br /&gt;
As of 27 March 2024, the CI runners for the various supported platforms are&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux: GNU 13.2.0 (building on Ubuntu 23.10)&lt;br /&gt;
** inkscape:linux: Same as above&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build: GNU 13.2.0 (temporarily disabled since GTK4 port)&lt;br /&gt;
** inkscape:windows:dist: Same as above&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm: Apple Clang 15.0.0&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 13.0.0 (temporarily disabled since GTK4 port)&lt;br /&gt;
&lt;br /&gt;
We strive to support latest Debian stable and latest Ubuntu LTS. However, we had to break that promise since the GTK4 port, which requires gtkmm4 &amp;gt;= 4.14:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || 4.8.3&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 (Jammy Jellyfish) || 12.3.0 || 15.0.7 || Not packaged!&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 23.04 (Lunar)           || 13.1.0 || 16.0.0 || 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ubuntu users therefore have the following options:&lt;br /&gt;
&lt;br /&gt;
* Wait for Ubuntu 24.04, expected around 25 April 2024.&lt;br /&gt;
* Upgrade to Ubuntu 24.04 now.&lt;br /&gt;
* Upgrade to Ubuntu 23.10 and build gtkmm4 from source, as is currently done by CI.&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
Deprecated items that we still use:&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122630</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122630"/>
		<updated>2023-12-08T12:25:42Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mark coroutines as unsupported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |   not yet || 13     || N/A    || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 10     || 10.0.1 Partial || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet || 11     || N/A || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 || style=&amp;quot;background: pink;&amp;quot; |         not yet ||        || ? || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                   from 1.4? ||        || Partial || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Mathematical Constants&amp;lt;/code&amp;gt;&lt;br /&gt;
                                    || C++20 ||                                             || 10     || 12.0.5 || Constants like std::numbers::pi.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As of 6 September 2023, the CI runners for:&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux GNU 10.5 (Building on &amp;quot;oldest supported Ubuntu LTS release&amp;quot;, we must wait until April 2025 to use a newer GNU version!) Note: Gtkmm4 is not available in Ubuntu 20.04 or 22.04!&lt;br /&gt;
** inkscape:linux GNU 11.4.0&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build Gnu 13.1.0&lt;br /&gt;
** inkscape:windows:dist Same as above.&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm Apple Clang 13.1.6&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 14.0.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We strive to support lastest Debian stable and latest Ubuntu LTS. But this may not be possible for a gtk4 based release. Ideally, we would target gtkmm4 4.10 as it has a critical scrolling bug fix.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || 4.8.3&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 (Jammy Jellyfish) || 12.3.0 || 15.0.7 || Not packaged!&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 23.04 (Lunar)           || 13.1.0 || 16.0.0 || 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Errors and Deprecated items that we use:&lt;br /&gt;
* error: call of overloaded ‘lerp(double, double&amp;amp;, double&amp;amp;)’ is ambiguous  (ui/knot/knot-holder-entity.cpp)&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122572</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122572"/>
		<updated>2023-10-23T14:50:58Z</updated>

		<summary type="html">&lt;p&gt;PBS: Mark std::views as unavailable on Apple clang&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! GCC    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 10     || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |           || 13     || N/A    || Better and more efficient formatting of strings. [https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html Text Formatting]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  ||  9     || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4  || 9/10   || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 6/10   || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 ||                                             || 10     || 10.0.1 Partial || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt; || C++20 || style=&amp;quot;background: pink;&amp;quot; |       || 11     || N/A    || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 || style=&amp;quot;background: pink;&amp;quot; |       from 1.4? ||        || ?      || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt; || C++20 || from 1.4? ||   || Partial      || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Mathematical Constants&amp;lt;/code&amp;gt;|| C++20 ||                                            || 10      || 12.0.5 || Constants like std::numbers::pi.     &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As of 6 September 2023, the CI runners for:&lt;br /&gt;
* Linux:&lt;br /&gt;
** appimage:linux GNU 10.5 (Building on &amp;quot;oldest supported Ubuntu LTS release&amp;quot;, we must wait until April 2025 to use a newer GNU version!) Note: Gtkmm4 is not available in Ubuntu 20.04 or 22.04!&lt;br /&gt;
** inkscape:linux GNU 11.4.0&lt;br /&gt;
* Windows&lt;br /&gt;
** inkscape:windows:build Gnu 13.1.0&lt;br /&gt;
** inkscape:windows:dist Same as above.&lt;br /&gt;
* macOS:&lt;br /&gt;
** inkscape::macos:arm Apple Clang 13.1.6&lt;br /&gt;
** inkscape:macos:x64: Apple Clang 14.0.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
We strive to support lastest Debian stable and latest Ubuntu LTS. But this may not be possible for a gtk4 based release. Ideally, we would target gtkmm4 4.10 as it has a critical scrolling bug fix.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distro                         || gcc    || clang  || gtkmm4&lt;br /&gt;
|-&lt;br /&gt;
| Debian 12 (Bookworm, stable)   || 12.2.0 || 15.0.6 || 4.8.3&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 (Jammy Jellyfish) || 12.3.0 || 15.0.7 || Not packaged!&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 23.04 (Lunar)           || 13.1.0 || 16.0.0 || 4.10.1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Errors and Deprecated items that we use:&lt;br /&gt;
* error: call of overloaded ‘lerp(double, double&amp;amp;, double&amp;amp;)’ is ambiguous  (ui/knot/knot-holder-entity.cpp)&lt;br /&gt;
* warning: implicit capture of ‘this’ via ‘[=]’ is deprecated in C++20 [-Wdeprecated] https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0806r2.html&lt;br /&gt;
* warning: bitwise operation between different enumeration types ‘Box3D::Axis’ and ‘Box3D::FrontOrRear’ is deprecated [-Wdeprecated-enum-enum-conversion]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122541</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122541"/>
		<updated>2023-09-02T03:34:53Z</updated>

		<summary type="html">&lt;p&gt;PBS: Class types as non-type template parameters -&amp;gt; partial&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.3? || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |           || N/A    || Better and more efficient formatting of strings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4? || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4? || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 ||                                             || 10.0.1 Partial || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt; || C++20 || style=&amp;quot;background: pink;&amp;quot; |       || N/A    || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 ||                                   from 1.4? || ?      || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt; || C++20 ||                                   from 1.4? || Partial      || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As of 1 September 2023, the CI runners for macOS are using Apple Clang 13.1.6 (ARM) and Apple Clang 14.0.0 (Intel64).&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122540</id>
		<title>C++20</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=C%2B%2B20&amp;diff=122540"/>
		<updated>2023-09-02T03:25:59Z</updated>

		<summary type="html">&lt;p&gt;PBS: Expand some descriptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
See also [[C++11]], [[C++17]].&lt;br /&gt;
&lt;br /&gt;
Some things that will be interesting to use once C++20 is common:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Feature                           !! Since !! Can use?                                    !! Apple Clang !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::span&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.3? || 11.0.3 || Handle buffers like standard library containers without risk of overflow.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::format&amp;lt;/code&amp;gt;          || C++20 || style=&amp;quot;background: pink;&amp;quot;       |           || N/A    || Better and more efficient formatting of strings.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::lerp&amp;lt;/code&amp;gt;            || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4? || 11.0.3 || Linear interpolation. (ui/tools/pencil-tool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::bit_floor&amp;lt;/code&amp;gt;       || C++20 || style=&amp;quot;background: lightgreen;&amp;quot; | from 1.4? || 11.0.3/13.0.0 || Compute floor(log2(x)). (helper/mathfns.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Concepts&amp;lt;/code&amp;gt;             || C++20 ||                                   from 1.4? || 12.0.0 Partial || Safer templating. (ui/controller.h)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Coroutines&amp;lt;/code&amp;gt;           || C++20 ||                                             || 10.0.1 Partial || Simpler asynchronous code. (trace/trace.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;std::make_unique_for_overwrite&amp;lt;/code&amp;gt; || C++20 || style=&amp;quot;background: pink;&amp;quot; |       || N/A    || Don't zero arrays allocated using std::make_unique. (util/pool.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ranges&amp;lt;/code&amp;gt;               || C++20 ||                                   from 1.4? || ?      || for (init; decl : expr). (ui/dialog/swatches.cpp)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[https://stackoverflow.com/a/60244416/5075760 Structural templates]&amp;lt;/code&amp;gt; || C++20 ||                                   from 1.4? || ?      || Allow instances of arbitrary literal classes as template parameters. (display/drawing.cpp)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
As of 1 September 2023, the CI runners for macOS are using Apple Clang 13.1.6 (ARM) and Apple Clang 14.0.0 (Intel64).&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122420</id>
		<title>Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122420"/>
		<updated>2023-06-09T06:56:56Z</updated>

		<summary type="html">&lt;p&gt;PBS: Move 2023 hackfest from planned/upcoming to past&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a freeform area for Inkscape development and discussion. Curious about [[wiki syntax]]?&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
== Project Info ==&lt;br /&gt;
* [http://www.inkscape.org/ Inkscape Homepage]&lt;br /&gt;
* [[About Inkscape]]&lt;br /&gt;
* [[Features of Inkscape|Features]]&lt;br /&gt;
* [[FAQ]] — Frequently Asked Questions&lt;br /&gt;
* [[Supported operating systems]]&lt;br /&gt;
* [[Tools]] — Supporting Tools and Applications&lt;br /&gt;
* [[Galleries]]&lt;br /&gt;
* [[Inkscape coverage|Coverage]] — Awards, articles, presentations, books about Inkscape&lt;br /&gt;
* [[Inkscape popularity|Popularity]]&lt;br /&gt;
* [[Inkscape invariants|Inkscape's Mission]]&lt;br /&gt;
* [https://inkscape.org/en/community/ Communication] — How to reach us&lt;br /&gt;
* [[Announcement to Sodipodi]] — This started it all&lt;br /&gt;
* [[Branding]]&lt;br /&gt;
* [[Travel Reimbursement Policy]]&lt;br /&gt;
* [[Funded Project System Development]]&lt;br /&gt;
* [[:Category:Hackfest|Hackfests]]&lt;br /&gt;
** upcoming/proposed events:&lt;br /&gt;
** past events:&lt;br /&gt;
::: [[Hackfest2023_Bensberg|2023 Bensberg]]&lt;br /&gt;
::: [[Hackfest2019 SCALE|2019 Pasadena (SCALE)]], [[Hackfest2019 Saarbrücken|2019 Saarbrücken (LGM)]]&lt;br /&gt;
::: [[Hackfest2018|2018 Boston]], [[Hackfest2018 LGM|2018 Seville (LGM)]], [[Hackfest2018 Kiel|2018 Kiel]]&lt;br /&gt;
::: [[Hackfest2017|2017 Paris]]&lt;br /&gt;
::: [[Hackfest2016|2016 Leeds (LGM)]]&lt;br /&gt;
::: [[Hackfest2015|2015 Toronto (LGM)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
* [[Installing Inkscape|Installation]]&lt;br /&gt;
* [[International and Local Communities]]&lt;br /&gt;
* [[Inkscape glossary]]&lt;br /&gt;
* [[User manual information]] — Where to find the free Inkscape manual and how to contribute to it&lt;br /&gt;
* [http://inkscape.org/en/learn/tutorials/ Tutorials]&lt;br /&gt;
* [[Inkscape SVG vs. plain SVG]]&lt;br /&gt;
* [[Output format requirements]] — What's needed to save in some formats&lt;br /&gt;
* [[Extension requirements]] — What's needed to use some extensions (slightly outdated)&lt;br /&gt;
* [[Extension reference]] — What each extension does (slightly outdated)&lt;br /&gt;
* [[Connector tool tutorial]]&lt;br /&gt;
* [[Installing fonts]]&lt;br /&gt;
* [[Emergency save]] — Recovery in case Inkscape crashed&lt;br /&gt;
* [[Release notes]]&lt;br /&gt;
** ''[[Release notes/1.3|Inkscape 1.3]]'' &amp;amp;mdash; ''development branch''&lt;br /&gt;
** '''[[Release notes/1.2|Inkscape 1.2]]''' ([[Release notes/1.2.1|1.2.1]], [[Release_notes/1.2.2|1.2.2]]) &amp;amp;mdash; ''current stable release branch''&lt;br /&gt;
** [[Release notes/1.1|Inkscape 1.1]] ([[Release notes/1.1.1|1.1.1]], [[Release notes/1.1.2|1.1.2]])&lt;br /&gt;
* [[Announcing Releases]] (slightly outdated)&lt;br /&gt;
* [[Release Process Debrief]] (slightly outdated)&lt;br /&gt;
* [[Tricks and tips]] — Miscellaneous advice, may be slightly outdated&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Help Inkscape Without Coding ==&lt;br /&gt;
* [[Help wanted]]&lt;br /&gt;
* [[Bug management]]&lt;br /&gt;
** [[Projects#Bug_Triage]]&lt;br /&gt;
* [[Testing]]&lt;br /&gt;
** [[macOS alpha]]&lt;br /&gt;
* [[Translation information]]&lt;br /&gt;
* [[WebSite]]&lt;br /&gt;
* [[Inkscape Classes]]&lt;br /&gt;
* [[Conferences]]&lt;br /&gt;
* [[Fundraising Ideas]]&lt;br /&gt;
* [[Creating Inkscape distributions]] — How to build packages&lt;br /&gt;
* [[Stable branch updates]]&lt;br /&gt;
* [[Updating tracker items]]&lt;br /&gt;
* [[Tutorials and help]]&lt;br /&gt;
* [[How to start a page]] — How to use the wiki&lt;br /&gt;
* [[Creating screencasts]]&lt;br /&gt;
* [[About-Screen contest]]&lt;br /&gt;
* [[social media|Participate in social media]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top: 1em; padding: .5em 1em 1em; border: 1px solid #62C012;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 50%; padding-right: 1em;&amp;quot; |&lt;br /&gt;
=== First Steps ===&lt;br /&gt;
* [[Working with Git]] — How to obtain the source code. A quick start on how to use our version control system.&lt;br /&gt;
* [[Compiling Inkscape]]&lt;br /&gt;
* [[Developer manual]] — Various important information, be sure to read this before coding&lt;br /&gt;
* [[Debugging Inkscape|Debugging]] — Random tips to help debug problems&lt;br /&gt;
* [[Janitorial tasks]] — Small tasks that need doing&lt;br /&gt;
* [[Doxygen documentation]]&lt;br /&gt;
* [[Working with CMake]] — Getting started with CMake coding for configuring and building Inkscape&lt;br /&gt;
&lt;br /&gt;
=== Developer tutorials ===&lt;br /&gt;
* [[Architectural overview]] — A high-level look at Inkscape&lt;br /&gt;
* [[Preferences subsystem]] — Creating and using preference values&lt;br /&gt;
&amp;lt;!-- * XML subsystem — How to manipulate the XML representation of a document&lt;br /&gt;
* Display subsystem — How to make things appear on the canvas&lt;br /&gt;
* Tools subsystem — How to create a new tool --&amp;gt;&lt;br /&gt;
* Extensions&lt;br /&gt;
** [[Extension subsystem]] — An overview of the functionality provided by extensions and the possible implementations&lt;br /&gt;
** [[Script extensions]] — Extend Inkscape easily using scripting languages (Python, Perl, …)&lt;br /&gt;
** [[Python modules for extensions]] — Some helpful routines for use in Python script extensions&lt;br /&gt;
** [[INX extension descriptor format]]&lt;br /&gt;
* [[Creating Live Path Effects]]&lt;br /&gt;
* [[Using libsigc++ signals]]&lt;br /&gt;
*[[Windows development on Linux]]&lt;br /&gt;
&lt;br /&gt;
=== User Interface Discussion===&lt;br /&gt;
*[[Interface translation]]&lt;br /&gt;
* [[Adding interface verbs]]&lt;br /&gt;
*[[Accessible graphics]]&lt;br /&gt;
* [[Object Manager]]&lt;br /&gt;
*[[Dialogs reorganization]]&lt;br /&gt;
*[[Modal interfaces]]&lt;br /&gt;
*[[Text usability]] — Text tool and dialog&lt;br /&gt;
*[[KeyboardShortcutsToDo]]&lt;br /&gt;
**[[Keyboard profiles]] — How you can help&lt;br /&gt;
*[[Statusbar API]]&lt;br /&gt;
* [[Animation-(Timeline)]]&lt;br /&gt;
*[[Free Desktop Graphic Suite]]&lt;br /&gt;
*[[Skeletal Strokes]] — Brushes, Strokes, Pressure Sensibility...&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Development Discussion === &lt;br /&gt;
*[[Roadmap]] — The main todo list&lt;br /&gt;
*[[Tracking Dependencies|Dependencies]] — What libs are needed to build Inkscape&lt;br /&gt;
*[[C++11]] — Which C++11 features can be used&lt;br /&gt;
*[[New feature proposals]]&lt;br /&gt;
* [[Extension architecture proposals]]&lt;br /&gt;
*[[Coding Style|Coding Style Discussion]]&lt;br /&gt;
*[[File types]]&lt;br /&gt;
*[[Application icons]] — Application + Interface&lt;br /&gt;
*[[Icons]]&lt;br /&gt;
*[[Color management]]&lt;br /&gt;
*[[Printing subsystem]]&lt;br /&gt;
*[[SVG Tiny Compliance]]&lt;br /&gt;
* [[SVG Test Suite Compliance]] — [[W3C]] full test suite&lt;br /&gt;
*[[CSS Support]]&lt;br /&gt;
*[[Google Summer of Code]]&lt;br /&gt;
* [[Improved Media Management]]&lt;br /&gt;
*[[UI Mockup Screenshots]]&lt;br /&gt;
* [[Swatch Book]]&lt;br /&gt;
*[[Tablet Dialog]]&lt;br /&gt;
*[[ViewBoxToDo]] — View box support info&lt;br /&gt;
* [[Caching]]&lt;br /&gt;
*[[Canvas Rendering Profiling]]&lt;br /&gt;
*[[UI and Document coordinates‎]]&lt;br /&gt;
* [[GtkMMification]] — Replace C boilerplate with gtkmm objects&lt;br /&gt;
*[[CMake Tasks]] — Converting the Inkscape build system to CMake&lt;br /&gt;
*[[Bug Reporting Workflow]] — Options for improving Inkscape bug workflow from user to developer&lt;br /&gt;
*[[1.0 Release Bug Fix List]] — List of bugs that need to be fixed for 1.0&lt;br /&gt;
*[[1.0 Release Planning]] — Roadmap and planning for 1.0 Release&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
*[[Inkscape-specific XML attributes]] — Documentation of attributes from Inkscape's XML namespace&lt;br /&gt;
*[[Environment variables]] — Overview of important environment variables that modify the behavior of Inkscape and its dependencies.&lt;br /&gt;
*[[Extension repository]] — An Internet central for Inkscape extensions&lt;br /&gt;
*[[Related programs]]&lt;br /&gt;
*[[Sponsors list]]&lt;br /&gt;
*[[Contracting Process]] &lt;br /&gt;
*[[Wiki Playground]]&lt;br /&gt;
&lt;br /&gt;
===[[Lib2geom]]===&lt;br /&gt;
*[[Lib2geom]]&lt;br /&gt;
*[[Working with 2Geom FAQ]] — Real-life questions answered about using 2Geom in real code&lt;br /&gt;
*[[Lib2geom py2geom]] — Python bindings to 2geom. With this you can use the power of 2geom in Python scripts.&lt;br /&gt;
&lt;br /&gt;
===Historical pages===&lt;br /&gt;
These pages are outdated, but linked here for posterity.&lt;br /&gt;
&lt;br /&gt;
*[[Working with Bazaar]] — Our former control version system, no longer used. See [[Working with Git]] for current instructions.&lt;br /&gt;
* [[Creating a new SPObject]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*&lt;br /&gt;
[[:Category:Wiki Attic|Wiki Attic]] — Pages that are no longer relevant but kept for historical value&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Top level categories]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=122201</id>
		<title>Installing Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=122201"/>
		<updated>2023-03-03T20:30:33Z</updated>

		<summary type="html">&lt;p&gt;PBS: Adjust layout of images&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Other languages|en=Installing Inkscape}}&lt;br /&gt;
&lt;br /&gt;
This page explains how to install Inkscape, either the stable or the development version. For instructions on how to compile Inkscape from the source code, see [[Compiling Inkscape]].&lt;br /&gt;
&lt;br /&gt;
The latest stable version can always be found on the [https://inkscape.org/release/ Download page]. The latest development versions are available from [https://gitlab.com/inkscape/inkscape/-/commits/master GitLab].&lt;br /&gt;
== Installing the stable version ==&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
DMG files can be downloaded from the [https://inkscape.org/release/ Download page]. Click the box labelled macOS and choose Intel or arm64 architecture. Once the download is complete, installation is the same as for any other DMG.&lt;br /&gt;
&lt;br /&gt;
See also the [https://inkscape.org/learn/faq/#mac-os-x-specific-issues section dedicated to macOS in our FAQ], and the [https://inkscape-manuals.readthedocs.io/en/latest/installing-on-mac.html readthedocs] page for installation on macOS.&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
On most Linux systems, you can use the software installer provided with your system (look for &amp;quot;software&amp;quot; in your start menu) to install Inkscape.&lt;br /&gt;
&lt;br /&gt;
Visit the [https://inkscape.org/release/ Download page] to see a list of other available options and installation methods for each available version.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu or Debian ====&lt;br /&gt;
Probably the easiest way to install on Debian/Ubuntu is to use the &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; command. &lt;br /&gt;
&lt;br /&gt;
Open a terminal and type:&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install inkscape&lt;br /&gt;
&lt;br /&gt;
If your Ubuntu version does not have the most recent Inkscape version in its repositories (yet), the next section describes how to use the [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable stable PPA] to get it.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu (new stable versions) ====&lt;br /&gt;
&lt;br /&gt;
The most recent version (slightly newer than what is available directly from Ubuntu) is available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable/ stable PPA] for Ubuntu and derivative Linux distributions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo add-apt-repository universe&lt;br /&gt;
sudo add-apt-repository ppa:inkscape.dev/stable&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt install inkscape&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== openSUSE ====&lt;br /&gt;
&lt;br /&gt;
openSUSE includes Inkscape in the Gnome repositories. The newest version of Inkscape is in Gnome:Apps.&lt;br /&gt;
=== Windows ===&lt;br /&gt;
You can find the installer on the [http://www.inkscape.org/release/ Download page]. Normally you want to choose &amp;quot;64-bit architecture&amp;quot; and &amp;quot;Windows Installer Package (msi)&amp;quot;. Installing should be an easy step-by-step (next-next-finish) process.&lt;br /&gt;
&lt;br /&gt;
== Installing the development version ==&lt;br /&gt;
First be warned. Unstable and development mean you likely will encounter crashes, usability problems and sometimes lose data. Ctrl+S will become your friend. If you cannot take this risk, please use the stable version instead.&lt;br /&gt;
&lt;br /&gt;
If you are still reading, you are probably one of the brave ones who wants to be on the bleeding edge. If so, follow the steps below.&lt;br /&gt;
&lt;br /&gt;
'''Don't forget:''' Please help Inkscape by reporting bugs, encouraging developers or fixing bugs yourself. If you find bugs, make sure to include the debug information which can be found in &amp;lt;code&amp;gt;Help &amp;gt; About&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions to download the development version, then install it in the same way as the stable version.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
You can run an [https://appimage.org/ AppImage] of the latest development version on any Linux distribution. See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions on how to download. To run, extract the zip and run the executable inside.&lt;br /&gt;
&lt;br /&gt;
'''Tip:''' If you don't want to trust our executable, you can run it with sandboxing using [https://wiki.archlinux.org/title/Firejail firejail]: &amp;lt;code&amp;gt;firejail --appimage ...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
Development versions (inkscape-trunk) are also available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/trunk trunk PPA] for Ubuntu and derivative Linux distributions. Follow the commands at https://inkscape.org/release/inkscape-dev/gnulinux/ubuntu/ppa/dl/ .&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
=== 1. Download the latest build ===&lt;br /&gt;
Follow the instructions on [https://inkscape.org/release/inkscape-dev/windows/ the inkscape-dev Download page] to download a 7zip file of the latest development build. Save the file (&amp;lt;code&amp;gt;inkscape-....7z&amp;lt;/code&amp;gt;) to your Downloads folder. &lt;br /&gt;
&lt;br /&gt;
==== 2. Extract the .7z archive ====&lt;br /&gt;
Extract the archive using the [http://www.7-zip.org/ 7zip unpacker]: Open the Downloads folder in Explorer, right-click on the 7zip file and choose 7-Zip → Extract to &amp;quot;inkscape-....&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You will get a directory which contains several files including &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== 3. Run inkscape ====&lt;br /&gt;
Run the &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; file by double clicking it. That's it. You can also drag files to &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; to have these opened.&lt;br /&gt;
&lt;br /&gt;
==== Multiple versions for testing ====&lt;br /&gt;
For testing purposes it is good to be able to test multiple versions of Inkscape to find when and where some problem first appeared. For this reason you are able to store and use as many parallel versions of Inkscape as your disk has room for.&lt;br /&gt;
== Finding development versions on GitLab ==&lt;br /&gt;
Recent development builds can be found using the GitLab CI infrastructure. They do however require clicking through several pages to find:&lt;br /&gt;
&lt;br /&gt;
# Visit https://gitlab.com/inkscape/inkscape/-/commits/master.&lt;br /&gt;
# On the the top row of the table, click the green tick on the right. (Lower rows correspond to older versions.)&lt;br /&gt;
# On the next page, click the left green tick under stages, and choose the version appropriate for your platform.&lt;br /&gt;
# On the next page, click the Download button.&lt;br /&gt;
&lt;br /&gt;
This allows testing not just the latest development version but any earlier version, allowing bugs to be pinpointed to the version that introduced them.&lt;br /&gt;
&lt;br /&gt;
[[File:Gitlab-download-instructions-1.png|alt=Click the green tick with alt text &amp;quot;Pipeline: passed/failed&amp;quot;|none|thumb|Step 2]]&lt;br /&gt;
[[File:Gitlab-download-instructions-2.png|alt=Click the leftmost green tick under &amp;quot;stages&amp;quot; with alt text &amp;quot;build passed:failed&amp;quot;|none|thumb|Step 3]]&lt;br /&gt;
[[File:Gitlab-download-instructions-3.png|alt=Click the download button|none||thumb|Step 4]]&lt;br /&gt;
[[Category:User Documentation]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=122178</id>
		<title>Installing Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Installing_Inkscape&amp;diff=122178"/>
		<updated>2023-02-20T16:22:32Z</updated>

		<summary type="html">&lt;p&gt;PBS: Fix dead links, add instructions for using GitLab&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Other languages|en=Installing Inkscape}}&lt;br /&gt;
&lt;br /&gt;
This page explains how to install Inkscape, either the stable or the development version. For instructions on how to compile Inkscape from the source code, see [[Compiling Inkscape]].&lt;br /&gt;
&lt;br /&gt;
The latest stable version can always be found on the [https://inkscape.org/release/ Download page]. The latest development versions are available from [https://gitlab.com/inkscape/inkscape/-/commits/master GitLab].&lt;br /&gt;
== Installing the stable version ==&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
DMG files can be downloaded from the [https://inkscape.org/release/ Download page]. Click the box labelled macOS and choose Intel or arm64 architecture. Once the download is complete, installation is the same as for any other DMG.&lt;br /&gt;
&lt;br /&gt;
See also the [https://inkscape.org/learn/faq/#mac-os-x-specific-issues section dedicated to macOS in our FAQ], and the [https://inkscape-manuals.readthedocs.io/en/latest/installing-on-mac.html readthedocs] page for installation on macOS.&lt;br /&gt;
=== Linux ===&lt;br /&gt;
&lt;br /&gt;
On most Linux systems, you can use the software installer provided with your system (look for &amp;quot;software&amp;quot; in your start menu) to install Inkscape.&lt;br /&gt;
&lt;br /&gt;
Visit the [https://inkscape.org/release/ Download page] to see a list of other available options and installation methods for each available version.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu or Debian ====&lt;br /&gt;
Probably the easiest way to install on Debian/Ubuntu is to use the &amp;lt;code&amp;gt;apt&amp;lt;/code&amp;gt; command. &lt;br /&gt;
&lt;br /&gt;
Open a terminal and type:&lt;br /&gt;
  sudo apt-get update&lt;br /&gt;
  sudo apt-get install inkscape&lt;br /&gt;
&lt;br /&gt;
If your Ubuntu version does not have the most recent Inkscape version in its repositories (yet), the next section describes how to use the [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable stable PPA] to get it.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu (new stable versions) ====&lt;br /&gt;
&lt;br /&gt;
The most recent version (slightly newer than what is available directly from Ubuntu) is available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/stable/ stable PPA] for Ubuntu and derivative Linux distributions:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo add-apt-repository universe&lt;br /&gt;
sudo add-apt-repository ppa:inkscape.dev/stable&lt;br /&gt;
sudo apt-get update&lt;br /&gt;
sudo apt install inkscape&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== openSUSE ====&lt;br /&gt;
&lt;br /&gt;
openSUSE includes Inkscape in the Gnome repositories. The newest version of Inkscape is in Gnome:Apps.&lt;br /&gt;
=== Windows ===&lt;br /&gt;
You can find the installer on the [http://www.inkscape.org/release/ Download page]. Normally you want to choose &amp;quot;64-bit architecture&amp;quot; and &amp;quot;Windows Installer Package (msi)&amp;quot;. Installing should be an easy step-by-step (next-next-finish) process.&lt;br /&gt;
&lt;br /&gt;
== Installing the development version ==&lt;br /&gt;
First be warned. Unstable and development mean you likely will encounter crashes, usability problems and sometimes lose data. Ctrl+S will become your friend. If you cannot take this risk, please use the stable version instead.&lt;br /&gt;
&lt;br /&gt;
If you are still reading, you are probably one of the brave ones who wants to be on the bleeding edge. If so, follow the steps below.&lt;br /&gt;
&lt;br /&gt;
'''Don't forget:''' Please help Inkscape by reporting bugs, encouraging developers or fixing bugs yourself. If you find bugs, make sure to include the debug information which can be found in &amp;lt;code&amp;gt;Help &amp;gt; About&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== '''macOS''' ===&lt;br /&gt;
See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions to download the development version, then install it in the same way as the stable version.&lt;br /&gt;
&lt;br /&gt;
=== Linux ===&lt;br /&gt;
You can run an [https://appimage.org/ AppImage] of the latest development version on any Linux distribution. See [[Installing Inkscape#Finding development versions on GitLab|Finding development versions on GitLab]] below for instructions on how to download. To run, extract the zip and run the executable inside.&lt;br /&gt;
&lt;br /&gt;
'''Tip:''' If you don't want to trust our executable, you can run it with sandboxing using [https://wiki.archlinux.org/title/Firejail firejail]: &amp;lt;code&amp;gt;firejail --appimage ...&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Ubuntu ====&lt;br /&gt;
Development versions (inkscape-trunk) are also available from our [https://launchpad.net/~inkscape.dev/+archive/ubuntu/trunk trunk PPA] for Ubuntu and derivative Linux distributions. Follow the commands at https://inkscape.org/release/inkscape-dev/gnulinux/ubuntu/ppa/dl/ .&lt;br /&gt;
&lt;br /&gt;
=== Windows ===&lt;br /&gt;
&lt;br /&gt;
=== 1. Download the latest build ===&lt;br /&gt;
Follow the instructions on [https://inkscape.org/release/inkscape-dev/windows/ the inkscape-dev Download page] to download a 7zip file of the latest development build. Save the file (&amp;lt;code&amp;gt;inkscape-....7z&amp;lt;/code&amp;gt;) to your Downloads folder. &lt;br /&gt;
&lt;br /&gt;
==== 2. Extract the .7z archive ====&lt;br /&gt;
Extract the archive using the [http://www.7-zip.org/ 7zip unpacker]: Open the Downloads folder in Explorer, right-click on the 7zip file and choose 7-Zip → Extract to &amp;quot;inkscape-....&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
You will get a directory which contains several files including &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== 3. Run inkscape ====&lt;br /&gt;
Run the &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; file by double clicking it. That's it. You can also drag files to &amp;lt;code&amp;gt;inkscape.exe&amp;lt;/code&amp;gt; to have these opened.&lt;br /&gt;
&lt;br /&gt;
==== Multiple versions for testing ====&lt;br /&gt;
For testing purposes it is good to be able to test multiple versions of Inkscape to find when and where some problem first appeared. For this reason you are able to store and use as many parallel versions of Inkscape as your disk has room for.&lt;br /&gt;
== Finding development versions on GitLab ==&lt;br /&gt;
Recent development builds can be found using the GitLab CI infrastructure. They do however require clicking through several pages to find:&lt;br /&gt;
&lt;br /&gt;
# Visit https://gitlab.com/inkscape/inkscape/-/commits/master.&lt;br /&gt;
# On the the top row of the table, click the green tick on the right. (Lower rows correspond to older versions.)&lt;br /&gt;
# On the next page, click the left green tick under stages, and choose the version appropriate for your platform.&lt;br /&gt;
# On the next page, click the Download button.&lt;br /&gt;
&lt;br /&gt;
This allows testing not just the latest development version but any earlier version, allowing bugs to be pinpointed to the version that introduced them.&lt;br /&gt;
&lt;br /&gt;
[[File:Gitlab-download-instructions-1.png|alt=Click the green tick with alt text &amp;quot;Pipeline: passed/failed&amp;quot;|thumb|Step 1]]&lt;br /&gt;
[[File:Gitlab-download-instructions-2.png|alt=Click the leftmost green tick under &amp;quot;stages&amp;quot; with alt text &amp;quot;build passed:failed&amp;quot;|thumb|Step 2]]&lt;br /&gt;
[[File:Gitlab-download-instructions-3.png|alt=Click the download button|thumb|Step 3]]&lt;br /&gt;
[[Category:User Documentation]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-3.png&amp;diff=122176</id>
		<title>File:Gitlab-download-instructions-3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-3.png&amp;diff=122176"/>
		<updated>2023-02-20T16:07:28Z</updated>

		<summary type="html">&lt;p&gt;PBS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Navigating GitLab CI - Step 3&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-2.png&amp;diff=122175</id>
		<title>File:Gitlab-download-instructions-2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-2.png&amp;diff=122175"/>
		<updated>2023-02-20T16:04:42Z</updated>

		<summary type="html">&lt;p&gt;PBS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Navigating GitLab CI - Step 2&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-1.png&amp;diff=122174</id>
		<title>File:Gitlab-download-instructions-1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=File:Gitlab-download-instructions-1.png&amp;diff=122174"/>
		<updated>2023-02-20T16:01:05Z</updated>

		<summary type="html">&lt;p&gt;PBS: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Navigating GitLab CI - Step 1&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Compiling_Inkscape&amp;diff=122127</id>
		<title>Compiling Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Compiling_Inkscape&amp;diff=122127"/>
		<updated>2023-02-07T18:46:32Z</updated>

		<summary type="html">&lt;p&gt;PBS: add internal lib2geom instructions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;mark&amp;gt;Hopefully, Inkscape will compile right out of the box, according to the 'Getting Started' instructions on https://inkscape.org/develop/getting-started/ . If it doesn't, well that's what this page is for. &amp;lt;/mark&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mark&amp;gt; '''If you've come here without reading the Getting Started page, [https://inkscape.org/develop/getting-started/ please do so first], as it mentions some important things that this page does not.'''&lt;br /&gt;
&amp;lt;/mark&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Jot down notes, questions, findings, tips, etc. here on things you run into. It's a good idea to make mention of what version of the code you're trying to compile, the distribution you're running, and other such information that might be pertinent.&lt;br /&gt;
&lt;br /&gt;
If legitimate bugs are found or patches developed, please move them to the [https://inkscape.org/contribute/report-bugs/ tracker] rather than inlining them here.  &lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
Please use CMake instead of Automake for Inkscape 0.92 onwards.&lt;br /&gt;
&lt;br /&gt;
CMake is a crossplatform makefile generator similar to autotools. It tests dependencies and creates makefiles to be used with make.&lt;br /&gt;
&lt;br /&gt;
Please see the [[CMake]] wiki page.&lt;br /&gt;
&lt;br /&gt;
== OS &amp;amp; Distribution Specific ==&lt;br /&gt;
&lt;br /&gt;
* '''Linux'''&lt;br /&gt;
** [[CompilingUbuntu|Ubuntu]]&lt;br /&gt;
** [[CompilingSlackware|Slackware]]&lt;br /&gt;
* [[CompilingMacOsX|Mac OS X]]&lt;br /&gt;
* [[Compiling Inkscape on Windows|Windows]]&lt;br /&gt;
* [[Compiling Inkscape on Chrome OS|Chrome OS]]&lt;br /&gt;
* '''Cross-compiling'''&lt;br /&gt;
** [[CrossCompilingOsX|For OS X (from Linux)]]&lt;br /&gt;
** [[CrossCompilingWindows|For Windows (from Linux)]]&lt;br /&gt;
&lt;br /&gt;
== Package Config (pkg-config) ==&lt;br /&gt;
&lt;br /&gt;
If you must compile and install any of these from source, you may find an error like this when trying to&lt;br /&gt;
compile them or Inkscape itself:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
checking for gtk+-2.0 &amp;gt;= 2.0.0  libxml-2.0 &amp;gt;= 2-2.4.24  sigc++-1.2  gtkmm-2.0... Package gtkmm-2.0 was not found in the pkg-config search path.&lt;br /&gt;
Perhaps you should add the directory containing `gtkmm-2.0.pc'&lt;br /&gt;
to the PKG_CONFIG_PATH environment variable&lt;br /&gt;
No package 'gtkmm-2.0' found&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A solution is to set the PKG_CONFIG_PATH variable as so:&lt;br /&gt;
* for Bash: &amp;lt;code&amp;gt;export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
* for csh: &amp;lt;code&amp;gt;setenv PKG_CONFIG_PATH /usr/local/lib/pkgconfig:/usr/lib/pkgconfig&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A good place to put this line is in your .bashrc or .cshrc file.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
If your distro does not have some packages available (like many don't, ie, Fedora Core 2), you must often download and build source packages and/or install them yourself. See [[Tracking Dependencies]].&lt;br /&gt;
&lt;br /&gt;
== Developer Compilation ==&lt;br /&gt;
&lt;br /&gt;
Plain vanilla compilation is done as documented in INSTALL.&lt;br /&gt;
&lt;br /&gt;
Now, you should use [[CMake]] to compile Inkscape:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
cd build&lt;br /&gt;
cmake ..&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For old versions of inkscape before 0.92, you can still use autoconf:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./autogen.sh # optionally&lt;br /&gt;
./configure&lt;br /&gt;
make&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, to run tests and install Inkscape, you may do:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
make check&lt;br /&gt;
sudo make install || su -c &amp;quot;make install&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See INSTALL.md for more on that.&lt;br /&gt;
&lt;br /&gt;
But if you're going to be doing a lot of development, there's some tricks and techniques you should know, to get best results.&lt;br /&gt;
&lt;br /&gt;
# Turn off optimization.&lt;br /&gt;
# Use ccache for faster compilation.&lt;br /&gt;
# Set up a separate build directory (nice for testing both gcc and g++, or cross-compiling).&lt;br /&gt;
# Use ninja or the make -j N flag to increment the number of threads available to make, with N = 1 + number of processors.&lt;br /&gt;
&lt;br /&gt;
Example:  Setting up the build environment (in separate tree), and using ccache for faster&lt;br /&gt;
compilations on a dual-processor machine, with no optimization and full debug symbols, assuming /bin/bash:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir build&lt;br /&gt;
git clone --recurse-submodules https://gitlab.com/inkscape/inkscape.git&lt;br /&gt;
cd build&lt;br /&gt;
cmake ../inkscape -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_BUILD_TYPE=Debug -G Ninja&lt;br /&gt;
ninja&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See [[Testing Inkscape]] for information on building and executing (unit) tests.&lt;br /&gt;
&lt;br /&gt;
=== Internal lib2geom ===&lt;br /&gt;
If the version of Inkscape you are trying to build depends on recent lib2geom features, you'll need to add &amp;lt;code&amp;gt;-DWITH_INTERNAL_2GEOM=ON&amp;lt;/code&amp;gt; to the cmake command to use the development version of lib2geom rather than the system version.&lt;br /&gt;
[[Category:Developer Documentation]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Release_notes/1.3&amp;diff=122123</id>
		<title>Release notes/1.3</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Release_notes/1.3&amp;diff=122123"/>
		<updated>2023-02-07T08:38:15Z</updated>

		<summary type="html">&lt;p&gt;PBS: Blanket typo-fixing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Box| '''These Release Notes are in Draft Status.'''&lt;br /&gt;
&lt;br /&gt;
Note: Not all animations work, due to Wiki bugs with resizing images. Release notes will be transferred to website, there animations will be working.&lt;br /&gt;
&lt;br /&gt;
Important Links:&lt;br /&gt;
* [https://gitlab.com/inkscape/inkscape/commits/master Commit History Main Program (starting from: xxx)]&lt;br /&gt;
* [https://gitlab.com/inkscape/extensions/-/commits/master Commit History Extensions (starting from: xxx)]&lt;br /&gt;
* [https://gitlab.com/inkscape/inkscape-docs/documentation/-/tree/master Commit History Documentation (starting from: xxx)]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Box| Pending questions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release highlights ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--'''Released on May xx, 2023 '''--&amp;gt;&lt;br /&gt;
&amp;lt;!--'''Definitely not released yet.'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pattern editor, pattern canvas controls, and pattern performance.&lt;br /&gt;
*Shape builder - New tool for building complex shapes from simple shapes. (Live Boolean tool)&lt;br /&gt;
*Live path effects dialog - Totally new and improved&lt;br /&gt;
*Filter editor - New redesign&lt;br /&gt;
*'''And so much more!'''&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
There has been lots of effort to improve performance of all aspects in Inkscape. Lots of refactoring of various inefficient code, rewritten handling of patterns, and moving bitmap tracing off-main-thread are some examples.&lt;br /&gt;
&lt;br /&gt;
Canvas rendering is now both multithreaded and done off-main-thread. This should significantly improve performance while zooming/panning/transforming objects if your CPU has more than one core.&lt;br /&gt;
&lt;br /&gt;
In some cases you can see '''2-4x speed''' improvements.&lt;br /&gt;
&lt;br /&gt;
You can set core count in &amp;lt;code&amp;gt;Preferences &amp;gt; Rendering &amp;gt; Number of Threads&amp;lt;/code&amp;gt;. The default is to use as many as possible.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests?scope=all&amp;amp;state=merged&amp;amp;label_name&amp;amp;#x5B;&amp;amp;#x5D;=Project%3A%3AMultithreading&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4760&lt;br /&gt;
&lt;br /&gt;
==General user interface ==&lt;br /&gt;
[[File:Indicators of used colors.png|thumb|indicators of used colors]]&lt;br /&gt;
Color palettes have an indicator showing the stroke and fill of the selected object. The first 4 colors are pinned and have the ability to become larger than the rest. Colors can be pinned/unpinned in the context menu.&lt;br /&gt;
&lt;br /&gt;
[[File:Inkscape BHd0t2kzml.gif]]&lt;br /&gt;
&lt;br /&gt;
===New feature paste on page===&lt;br /&gt;
You can copy and paste objects from one page to another: &amp;lt;code&amp;gt;Edit &amp;gt; Specials Paste &amp;gt; Paste on page&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4695&lt;br /&gt;
&lt;br /&gt;
===Old-style permanent snapping toolbar===&lt;br /&gt;
An option was added in &amp;lt;code&amp;gt;Settings &amp;gt; Interface &amp;gt; Toolbars&amp;lt;/code&amp;gt; to show the detailed snapping options permanently in a dedicated toolbar, similar to Inkscape version 1.1 and earlier.&lt;br /&gt;
&lt;br /&gt;
===Keyboard shortcuts===&lt;br /&gt;
&lt;br /&gt;
The keyboard shortcuts for aligning objects vertically and horizontally have been moved to the numeric keypad, where the other alignment shortcuts are, too: &lt;br /&gt;
&lt;br /&gt;
*Vertical alignment was moved from &amp;lt;kbd&amp;gt;Ctrl+Alt+T&amp;lt;/kbd&amp;gt; to &amp;lt;kbd&amp;gt;'''Ctrl+Alt+Numpad 1'''&amp;lt;/kbd&amp;gt;&lt;br /&gt;
*Horizontal alignment was moved from &amp;lt;kbd&amp;gt;Ctrl+Alt+H&amp;lt;/kbd&amp;gt; to &amp;lt;kbd&amp;gt;'''Ctrl+Alt+Numpad 7'''&amp;lt;/kbd&amp;gt;&lt;br /&gt;
[[File:OKLAB.png|thumb|474x474px]]&lt;br /&gt;
If you find yourself unable to reach the new shortcuts (for example, because your laptop does not have a keypad, or because the shortcuts do not work - may be the case on Linux with Xfce), you can set them to something else by changing '''both''' the alignment shortcut '''and''' the function that now uses that shortcut (if any). Use the search in &amp;lt;code&amp;gt;Edit &amp;gt; Preferences &amp;gt; Interface &amp;gt; Keyboard&amp;lt;/code&amp;gt;. It also allows searching for shortcuts, not only for their name (e.g. search for 'ctrl+alt+t' to find the new default action that is executed when that combo is pressed).&lt;br /&gt;
&lt;br /&gt;
===Color Picker===&lt;br /&gt;
Added support for the '''OKLab''' and '''OKLch''' color spaces which have just been adopted into the CSS Color Module Level 4 [https://www.w3.org/TR/css-color-4/#ok-lab draft recommendation]. OKLab is described in detail by its creator in an interesting blog post. The new picker is called &amp;quot;OKHSL&amp;quot; and is available from the dropdown.&lt;br /&gt;
&lt;br /&gt;
=== '''Rulers'''===&lt;br /&gt;
Improved look. Fixed a performance penalty by caching text labels. Added indicator of selection (it's possible to turn off in preferences).&lt;br /&gt;
&lt;br /&gt;
===Command bar===&lt;br /&gt;
Improved UI https://gitlab.com/inkscape/inkscape/-/merge_requests/4988&lt;br /&gt;
&lt;br /&gt;
[[File:Command bar .png|none|thumb|508x508px]]&lt;br /&gt;
&lt;br /&gt;
==Canvas==&lt;br /&gt;
&lt;br /&gt;
Pressing '''&amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;''' temporarily hides on-canvas overlays (transformation handles, grids, guides...). This allows quick preview of final artwork without any distractions.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4395&lt;br /&gt;
&lt;br /&gt;
Added display overlay controls in top right corners. You need to have scrollbars enabled to see it.&lt;br /&gt;
&lt;br /&gt;
[[File:Canvas overlays.png|399x399px]]&lt;br /&gt;
&lt;br /&gt;
===OpenGL (GPU) accelerated canvas===&lt;br /&gt;
An OpenGL-accelerated display mode was added to the canvas to speed up panning, zooming and rotating.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4133&lt;br /&gt;
&lt;br /&gt;
This is NOT a fully GPU-based renderer; content is still rendered on the CPU in exactly the same way as before, so large performance improvements are not to be expected. It does however result in a smoother display and lower CPU usage, especially on HiDPI screens.&lt;br /&gt;
&lt;br /&gt;
OpenGL mode is highly experimental and is turned off by default. It can be turned on at&lt;br /&gt;
&lt;br /&gt;
Preferences -&amp;gt; Rendering -&amp;gt; Enable OpenGL&lt;br /&gt;
&lt;br /&gt;
Note however the following caveats:&lt;br /&gt;
&lt;br /&gt;
*Due to packaging problems, when using the Linux AppImage, OpenGL support either does not work (on X11) or crashes (on Wayland).&lt;br /&gt;
* Due to GTK3 bugs, OpenGL mode crashes on Windows, blacks out the screen on MacOS, is slower than software rendering on Linux X11, and is only really usable on Wayland.&lt;br /&gt;
&lt;br /&gt;
For these reasons, it is not expected to be useful until we migrate to GTK4, where we hope that at least some of these bugs have been fixed.&lt;br /&gt;
&lt;br /&gt;
===Smooth auto-scrolling===&lt;br /&gt;
Auto-scrolling happens when you drag an object off the edge of the canvas. We improved smoothness of this action.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/5027&lt;br /&gt;
&lt;br /&gt;
==Tools==&lt;br /&gt;
You can right click on any tool in toolbox to see tool preferences.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4982&lt;br /&gt;
&lt;br /&gt;
===Selection tool===&lt;br /&gt;
New commands:&lt;br /&gt;
&lt;br /&gt;
*'''Reapply transform''': ''Ctrl+Alt+T''  - This allows a user to perform a transformation multiple times and works from the canvas edits or from transform dialog or the select toolbar. &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Shortcut needs to change, it opens a terminal on Linux.&amp;lt;/span&amp;gt;&lt;br /&gt;
*'''Duplicate and transform''': ''Ctrl+Alt+D'' -This performs a duplication and then reapplies the previous transform to the duplicate. &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Shortcut needs to change, it minimizes the window on Linux.&amp;lt;/span&amp;gt;&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4506&lt;br /&gt;
*'''Clone while dragging:''' drag object + C - Drag and object and press C to clone it in the current position. https://gitlab.com/inkscape/inkscape/-/merge_requests/4752&lt;br /&gt;
&lt;br /&gt;
[[File:Inkscape xfsvsc2oY9.gif|thumb|editing pattern on canvas]]&lt;br /&gt;
&lt;br /&gt;
===Node tool===&lt;br /&gt;
&lt;br /&gt;
====Pattern editing====&lt;br /&gt;
Pattern editing on canvas is now easier; you can click on any part of a pattern and it will show you controls at that position. We also added an outline that shows you the edges of the pattern. The first square controls position, the circle controls rotation, and the second square controls size. Hold shift to constrain proportions. &lt;br /&gt;
&lt;br /&gt;
We also fixed performance problems with patterns, so now you can have smaller patterns in project and zoom in on them without worrying about Inkscape eating up all your RAM.&lt;br /&gt;
&lt;br /&gt;
====Lasso selection mode====&lt;br /&gt;
We added new lasso selection mode. Hold alt and draw around nodes you want to select. Useful for selecting nodes inside of complicated geometry.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4747&lt;br /&gt;
===Shape Builder tool (New tool) ===&lt;br /&gt;
New tool for fast shape building and Boolean operations. Shortcut: &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Use: Select multiple overlapping shapes and select the Shape Builder tool. The selection will be fragmented on overlapping areas, while everything else will be hidden until you leave the shape builder. Now you '''Click and drag''' to combine segments together or hold '''Shift + Click and drag''' to subtract, and '''Single click''' on segments to split. Adding is represented by a blue color, removing by pink.&lt;br /&gt;
&lt;br /&gt;
[[File:Shape_builder.gif]]&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4709&lt;br /&gt;
[[File:Ezgif.com-gif-maker (12).gif|right|600x600px]]&lt;br /&gt;
&lt;br /&gt;
===Pages tool ===&lt;br /&gt;
The pages tool now has controls for margins (guides):&lt;br /&gt;
&lt;br /&gt;
* An attribute on the page element to record the margin&lt;br /&gt;
*A new html/css style box model with tests&lt;br /&gt;
*New UI to set margins in the toolbar&lt;br /&gt;
* New on-canvas controls for moving margins (with ctrl/shift)&lt;br /&gt;
*New display of margins in the same canvas group as the page border&lt;br /&gt;
&lt;br /&gt;
*Snapping for page margins&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4523&lt;br /&gt;
=== Gradient tool ===&lt;br /&gt;
&lt;br /&gt;
*Allow changing the ''repeat'' setting when multiple gradients are selected.&lt;br /&gt;
*Show 'Multiple gradients' in the stop list when multiple gradients are selected (instead of a random stop).&lt;br /&gt;
*Allow editing of the offset of the start/end stops.&lt;br /&gt;
*Keep the stop selected after the offset is changed in the toolbar (instead of selecting the first stop of the gradient).&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4339&lt;br /&gt;
==Path Operations==&lt;br /&gt;
&lt;br /&gt;
New commands:&lt;br /&gt;
&lt;br /&gt;
'''Fracture''' &amp;lt;code&amp;gt;Path → Fracture&amp;lt;/code&amp;gt; - every overlapping path will be split into separate object.&lt;br /&gt;
&lt;br /&gt;
'''Flatten''' &amp;lt;code&amp;gt;Path → Flatten&amp;lt;/code&amp;gt; - overlapping objects will be flattened visually (it will delete paths that are hidden behind a top path). Useful for separating colors for Screen printing and offset printing.&lt;br /&gt;
== Masking / Clipping==&lt;br /&gt;
&lt;br /&gt;
*A new option to '''preserve clips / masks when ungrouping''' objects has been added (&amp;lt;code&amp;gt;Edit → Preferences → Behavior → Clippaths and masks: When ungroup, clip/mask is preserved in children&amp;lt;/code&amp;gt;). The option is active by default. This means that when you now ungroup a group that has been clipped, the elements inside it will inherit the clip. Previously, the clip was removed and everything became un-clipped. To go back to previous default behavior, deactivate this new option. ([https://gitlab.com/inkscape/inkscape/-/merge_requests/3564 MR #3564])&lt;br /&gt;
[[File:Pattern editor1.gif|alt=Pattern editor|right|Pattern editor]]&lt;br /&gt;
&lt;br /&gt;
== Dialogs ==&lt;br /&gt;
&lt;br /&gt;
=== Fill and Stroke Dialog===&lt;br /&gt;
&lt;br /&gt;
====New pattern editor====&lt;br /&gt;
Added in to UI. You can preview patterns, change Name, Size, Rotation, Offset, Gaps and Colors for some specific patterns. We also added collections of patterns in  &amp;lt;code&amp;gt;~paint/&amp;lt;/code&amp;gt;  so it's easier to be organized. Since this allows having many more patterns preinstalled, we also added a search function and a few new default patterns.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4938&lt;br /&gt;
&lt;br /&gt;
===Filter editor===&lt;br /&gt;
[[File:Filter-resize.gif|alt=Filter-resize|Filter-resize|left]]&lt;br /&gt;
&lt;br /&gt;
Redesign of this dialog:&lt;br /&gt;
&lt;br /&gt;
*Filter selection moved to a popover&lt;br /&gt;
* Effects are listed in a popup menu and can be selected by searching (by name)&lt;br /&gt;
* Adjusted connector sizes to make them more compact&lt;br /&gt;
* Fixed an issue where all parameters would initially be visible in a docked filter dialog&lt;br /&gt;
*Fixed min size of parameters panel to make it fit in a narrow docked dialog&lt;br /&gt;
*Reactive layout to accommodate wide dialog&lt;br /&gt;
*Added primitive filter attributes to fe-image and fe-tile (#1417)&lt;br /&gt;
*Replaced GTK color picker with Inkscape color picker &lt;br /&gt;
&lt;br /&gt;
*Sources can now be hidden (for most use cases only the source graphic is useful; other inputs are broken or need ux work).&amp;lt;br /&amp;gt;https://gitlab.com/inkscape/inkscape/-/merge_requests/4720[[File:Inkscape Y7U4yzIFTq.gif|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Layers and Objects ===&lt;br /&gt;
UX improvements:&lt;br /&gt;
&lt;br /&gt;
*You can click and drag to change visibility of multiple objects&lt;br /&gt;
* Selecting on group does not auto expand&lt;br /&gt;
*Selecting multiple objects and and changing visibility/locking applies to all selected&lt;br /&gt;
* We added a search feature; it's a limited implementation - it does not auto-apply search and you need to search for more than 3 characters.&lt;br /&gt;
*We added a hover indicator for rows and layer colors&lt;br /&gt;
*Added controls for opacity and blending mode&lt;br /&gt;
&lt;br /&gt;
We added shortcuts for layers navigation and actions:&lt;br /&gt;
&lt;br /&gt;
*Arrows to navigate&lt;br /&gt;
*Space bar confirms (select, apply, open)&lt;br /&gt;
*Shift -&amp;gt; &amp;lt;- open close group&lt;br /&gt;
*Shift up down to move in Z order&lt;br /&gt;
[[File:VirtualBoxVM I675gipqe1.gif|thumb|1017x1017px|Place holder  demo of new LPE dialog]]&lt;br /&gt;
&lt;br /&gt;
===Live Path Effects ( LPE )===&lt;br /&gt;
&lt;br /&gt;
====New redesigned LPE dialog====&lt;br /&gt;
The compact new design merges organization and controls into one unit. You can reorder LPE by dragging and dropping the whole effect. It adds a fast search box, and a fast dropdown for adding effects.&lt;br /&gt;
&lt;br /&gt;
Each LPE has 5 controls:&lt;br /&gt;
&lt;br /&gt;
*Show/hide controls&lt;br /&gt;
*Visibility of effect&lt;br /&gt;
*Delete effect&lt;br /&gt;
*Context menu &lt;br /&gt;
** Re-order&lt;br /&gt;
**Duplicate&lt;br /&gt;
**Set as default&lt;br /&gt;
** Flatten&lt;br /&gt;
&lt;br /&gt;
[[File:LPE organization.png|right|266x266px]]&lt;br /&gt;
&lt;br /&gt;
==== Reorganization of LPEs====&lt;br /&gt;
Since we needed a more compact way to show all LPEs, we decided on a list that is organized into 6 categories:&lt;br /&gt;
&lt;br /&gt;
Tools, Distort, Generate, Convert, Experimental + Favorite&lt;br /&gt;
&lt;br /&gt;
==== Changes ====&lt;br /&gt;
*Setting presets for LPE was moved into contextual menu&lt;br /&gt;
*Setting Favorite LPE was moved into contextual menu&lt;br /&gt;
*Added new feature: flatten - This will apply effect to geometry. It will apply all effects in the stack.&lt;br /&gt;
*We removed LPE gallery (you can still enable it in preferences if you wish: &amp;lt;code&amp;gt;Preferences &amp;gt; Behavior &amp;gt; LPE&amp;lt;/code&amp;gt;)&lt;br /&gt;
*To see experimental LPEs you need to enable it in Preferences: &amp;lt;code&amp;gt;Preferences &amp;gt; Behavior &amp;gt; LPE&amp;lt;/code&amp;gt;&lt;br /&gt;
*Added an indicator showing which object is selected&lt;br /&gt;
* Added conversion commands when you select text objects - since text does not support LPEs yet we added a workaround that converts text to paths or clones the text.&lt;br /&gt;
* If you select an object that is associated with an LPE (Clone, Boolean operations, Bend, Fill between many, etc...) you will see a button in the dialog that will take you to the linked geometry/controls.&lt;br /&gt;
*Labels inside effects are aligned nicely&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4677&lt;br /&gt;
===XML Editor===&lt;br /&gt;
[[File:Syntax highlighting.png|thumb|392x392px]]&lt;br /&gt;
We did small cosmetic changes to this dialog: smaller icons (16x16px), removed text tool tips. Added responsive layout and moved layout controls to the top in a dropdown (auto layout is the default option). &lt;br /&gt;
&lt;br /&gt;
==== Syntax readability====&lt;br /&gt;
For improving readability we added syntax highlighting and auto line-breaking. This works for CSS style tag, inline styling, d &amp;lt;path data&amp;gt;. You can change change highlighting themes in &amp;lt;code&amp;gt;Preferences &amp;gt; Interface &amp;gt; Theming&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====d &amp;lt; path data &amp;gt;====&lt;br /&gt;
We added a feature to round path data. You can also set how many decimal points you want to round to. &lt;br /&gt;
&lt;br /&gt;
[[File:Inkscape GAlKvNTcCm.gif]]&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4885  &lt;br /&gt;
&lt;br /&gt;
=== Symbols===&lt;br /&gt;
This dialog got a new redesign:&lt;br /&gt;
&lt;br /&gt;
*Migrated dialog settings to a popover.&lt;br /&gt;
*Saving dialog UI state in preferences (current symbol set and settings are remembered).&lt;br /&gt;
*Larger range for scaling (tile size) and symbol zooming.&lt;br /&gt;
*Fixed symbol selection color for dark themes.&lt;br /&gt;
*Added option to show symbols names.&lt;br /&gt;
*Rendering symbols at screen resolution - sharp (high-dpi aware).&lt;br /&gt;
*List of symbol sets is searchable and can be filtered.&lt;br /&gt;
*Symbol search is live (no need to press enter).&lt;br /&gt;
* Symbol rendering is done on-demand, to limit memory use and time needed to switch sets.&lt;br /&gt;
*Stats: total number of symbols / how many are visible.&lt;br /&gt;
&lt;br /&gt;
======New features======&lt;br /&gt;
&lt;br /&gt;
*You can drag and drop symbols on canvas and they are going to be placed exactly where you dropped them.&lt;br /&gt;
*A new icon - the &amp;quot;peace&amp;quot; symbol.&lt;br /&gt;
*Improved performance.&lt;br /&gt;
*Add visio modern formats vssx and vsdx. Symbols are loaded once, not in each window.&lt;br /&gt;
*We added new stock symbols SJJB map icons.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4975 &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4994 &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4666&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4883&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4793&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4784&lt;br /&gt;
&lt;br /&gt;
===Bitmap Tracer===&lt;br /&gt;
Got significant performance boost and a progress bar. Now it runs in the background, allowing you to cancel it if it's taking too long. &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4702&lt;br /&gt;
&lt;br /&gt;
=== Export Dialog===&lt;br /&gt;
We added new options for how to export multipage in PDF and SVG formats. &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/5002&lt;br /&gt;
&lt;br /&gt;
===Document Resources Dialog (NEW)===&lt;br /&gt;
Added a new dialog that shows you an overview of what assets are currently inside your document. You can edit names and export some of the resources from this dialog.&lt;br /&gt;
&lt;br /&gt;
It presents the following document assets:&lt;br /&gt;
&lt;br /&gt;
*fonts&lt;br /&gt;
*styles&lt;br /&gt;
*colors&lt;br /&gt;
*swatches&lt;br /&gt;
*gradients&lt;br /&gt;
*filters&lt;br /&gt;
*patterns&lt;br /&gt;
*symbols&lt;br /&gt;
*markers&lt;br /&gt;
*images&lt;br /&gt;
*external references&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/5003&lt;br /&gt;
&lt;br /&gt;
==Filters==&lt;br /&gt;
&lt;br /&gt;
==Live path effects==&lt;br /&gt;
Performance of most of the effects was improved.&lt;br /&gt;
&lt;br /&gt;
===Roughen===&lt;br /&gt;
UI clean-up and reordering of the controls.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4872&lt;br /&gt;
&lt;br /&gt;
=== Taper Stroke===&lt;br /&gt;
Added support for sub-paths.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4906&lt;br /&gt;
&lt;br /&gt;
=== Power Stroke===&lt;br /&gt;
Added support for sub-paths.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4880&lt;br /&gt;
&lt;br /&gt;
==Import / Export ==&lt;br /&gt;
&lt;br /&gt;
==Templates==&lt;br /&gt;
&lt;br /&gt;
All template dialogs (Welcome screen, New from Template, Page tool default sizes) now use the same template sizes ([https://gitlab.com/inkscape/extensions/-/merge_requests/479] MR #479)&lt;br /&gt;
&lt;br /&gt;
==Customization / Theming==&lt;br /&gt;
Added user.css to UI folder to allow tweaking UI without interfering with or fully overriding other css files. https://gitlab.com/inkscape/inkscape/-/merge_requests/5004&lt;br /&gt;
&lt;br /&gt;
Fixed hidden icons on menus: https://gitlab.com/inkscape/inkscape/-/merge_requests/4686&lt;br /&gt;
&lt;br /&gt;
==Other==&lt;br /&gt;
Added support for &amp;lt;code&amp;gt;href&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;xlink:href&amp;lt;/code&amp;gt; in SVG header. This makes Inkscape more compatible with SVG 2.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4596&lt;br /&gt;
&lt;br /&gt;
==MacOS-specific Changes==&lt;br /&gt;
&lt;br /&gt;
== Windows-specific Changes==&lt;br /&gt;
&lt;br /&gt;
== Extensions==&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
Speed up processing especially on complex documents: https://gitlab.com/inkscape/inkscape/-/merge_requests/4996&lt;br /&gt;
&lt;br /&gt;
====General Extension Changes====&lt;br /&gt;
&lt;br /&gt;
====New Extensions====&lt;br /&gt;
&lt;br /&gt;
==== Particular extensions====&lt;br /&gt;
&lt;br /&gt;
===Bugs fixed===&lt;br /&gt;
&lt;br /&gt;
====All extensions====&lt;br /&gt;
&lt;br /&gt;
====Particular extensions====&lt;br /&gt;
&lt;br /&gt;
===Extension Development ===&lt;br /&gt;
&lt;br /&gt;
====API Changes for Third-Party Extension Developers ====&lt;br /&gt;
&lt;br /&gt;
====Extension Development Documentation====&lt;br /&gt;
&lt;br /&gt;
==== Under the hood ====&lt;br /&gt;
&lt;br /&gt;
==Command line==&lt;br /&gt;
Added a new parameter --actions-file. You specify a list like in --actions but in a file to allow bypassing Windows comandline length limit, and also to allow reuse of action lists.&lt;br /&gt;
&lt;br /&gt;
Added a new parameter --active-window / -q that runs all commands on the active window of an already-running instance of Inkscape.&lt;br /&gt;
&lt;br /&gt;
==Behind the curtains==&lt;br /&gt;
&lt;br /&gt;
==Notable bugfixes==&lt;br /&gt;
===Crash fixes===&lt;br /&gt;
&lt;br /&gt;
Fixed a crash that occurred…&lt;br /&gt;
&lt;br /&gt;
* When…&lt;br /&gt;
&lt;br /&gt;
===Other bug fixes===&lt;br /&gt;
&lt;br /&gt;
* LPE related undo bugs: https://gitlab.com/inkscape/inkscape/-/merge_requests/4520&lt;br /&gt;
*Fixed bspline LPE with cusp nodes when initially using with node tool. https://gitlab.com/inkscape/inkscape/-/merge_requests/5016&lt;br /&gt;
*&amp;lt;use&amp;gt;s retain their LPE correctly when unlinked or converted to paths. The old convert to paths behaviour is still available in the Preferences. https://gitlab.com/inkscape/inkscape/-/merge_requests/5016&lt;br /&gt;
&lt;br /&gt;
===Even more bug fixes===&lt;br /&gt;
&lt;br /&gt;
There were even more issues fixed than those listed above, but these probably only affect a small proportion of users, or are relevant for development and packaging only.&lt;br /&gt;
&lt;br /&gt;
For a complete list, visit [https://gitlab.com/inkscape/inkscape/-/issues?milestone_title=Inkscape+1.3 our GitLab issue tracker] and see the [https://gitlab.com/inkscape/inkscape/-/commits/1.3.x commit history].&lt;br /&gt;
&lt;br /&gt;
==Translations==&lt;br /&gt;
&lt;br /&gt;
The following UI translations received updates:&lt;br /&gt;
&lt;br /&gt;
*…&lt;br /&gt;
&lt;br /&gt;
The Windows installer translation was updated for:&lt;br /&gt;
&lt;br /&gt;
*…&lt;br /&gt;
&lt;br /&gt;
The following documentation translations received updates:&lt;br /&gt;
&lt;br /&gt;
*…&lt;br /&gt;
&lt;br /&gt;
===Contributing to interface translations===&lt;br /&gt;
&lt;br /&gt;
Want to help with translations? [https://inkscape.org/contribute/translations/ Learn how to help!]&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
&lt;br /&gt;
===Contributing to documentation and documentation translation===&lt;br /&gt;
Contributions to the documentation translations, as well as improvements to its contents, are welcome at [https://gitlab.com/inkscape/inkscape-docs/documentation the inkscape-docs repository].&lt;br /&gt;
&lt;br /&gt;
==Website==&lt;br /&gt;
&lt;br /&gt;
==Important changes for packagers==&lt;br /&gt;
&lt;br /&gt;
==Known issues==&lt;br /&gt;
&lt;br /&gt;
==Other releases==&lt;br /&gt;
&lt;br /&gt;
{{:Release notes}}&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=122110</id>
		<title>Developer manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;diff=122110"/>
		<updated>2023-02-05T07:31:33Z</updated>

		<summary type="html">&lt;p&gt;PBS: /* Introduction */ Update developer access, C++ references&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Inkscape Developer’s Manual =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
For those of you just joining us, or who have been with us but are just&lt;br /&gt;
now getting the itch to work on Inkscape, I thought I’d give some tips&lt;br /&gt;
for how to get started working in the codebase based on our own&lt;br /&gt;
experiences.&lt;br /&gt;
&lt;br /&gt;
One of the first things most people wonder is “What should I work on?”.&lt;br /&gt;
As you may have already noticed, we generally don’t “assign” projects.&lt;br /&gt;
We figure there’s plenty more work to do than people to do it, so you&lt;br /&gt;
may as well work on something that you’re either interested in or that&lt;br /&gt;
adds something of benefit to you; that’s extra motivation to get your&lt;br /&gt;
own itches scratched.&lt;br /&gt;
&lt;br /&gt;
If you’re really stumped though, we keep a detailed [[Roadmap]] in wiki that&lt;br /&gt;
you’re welcome to browse through to look for ideas of things to work&lt;br /&gt;
on.  Tasks that do not have names beside them are open for anyone to&lt;br /&gt;
take; if you want to take ownership of a task, just put your name beside&lt;br /&gt;
it.  Feel free to add or reword tasks as needed, although try not to&lt;br /&gt;
load up the current milestone with tasks that aren’t critical for the&lt;br /&gt;
release.  Feel free to work on stuff that is several milestones down the&lt;br /&gt;
road; there’s rarely any problem with getting stuff done sooner than&lt;br /&gt;
planned.  ;-)&lt;br /&gt;
&lt;br /&gt;
We have a process for gaining GitLab Developer access.  The reason is that&lt;br /&gt;
while it is important that we keep access to the codebase open, we don’t&lt;br /&gt;
want to be crazy and leave it wide open to any random passer-by.  The&lt;br /&gt;
process is that we require that the person make two contributions&lt;br /&gt;
(patches, documentation, web collateral, etc.) and then make a request&lt;br /&gt;
to get account access.&lt;br /&gt;
&lt;br /&gt;
In general you won’t need Developer role in order to start doing&lt;br /&gt;
development, because you can create merge requests with only a regular account. Due to GitLab constraints however, you won't be able to run Windows or MacOS CI - but we can always do that for you.&lt;br /&gt;
&lt;br /&gt;
When you first start hacking on Inkscape code, I wouldn’t recommend&lt;br /&gt;
taking an objective of implementing a specific feature, because you will&lt;br /&gt;
need some time to familiarize yourself with the codebase, and because&lt;br /&gt;
you won’t really know what features are going to be straightforward to&lt;br /&gt;
implement and which will be highly challenging.  Of course, if you have&lt;br /&gt;
the time and love adventures, this might be a fun way to go.&lt;br /&gt;
&lt;br /&gt;
There are four approaches that I’ve seen people effectively use in&lt;br /&gt;
getting into the codebase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Write code documentation.&amp;lt;/strong&amp;gt;  Some people who don’t mind adding&lt;br /&gt;
comments to code or writing docs find it useful to just go through&lt;br /&gt;
code they’re interested in working on and writing up what it does.&lt;br /&gt;
The codebase is in dire need of better docs, so this approach pays&lt;br /&gt;
dividends well into the future.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Fix bugs.&amp;lt;/strong&amp;gt;  Tracing down the cause of reported bugs is an effective&lt;br /&gt;
way to gain understanding of the codebase in small chunks.  Many&lt;br /&gt;
common bugs can be traced down and fixed in a matter of hours, and&lt;br /&gt;
often will identify some bit of code in need of refactoring or&lt;br /&gt;
extension.  Note that some of our older bugs are in the system&lt;br /&gt;
because they’re hard to fix, so you’ll want to work on the more&lt;br /&gt;
recent ones.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Chip in on a group effort.&amp;lt;/strong&amp;gt;  Occasionally we identify a major&lt;br /&gt;
refactoring effort (such as when we converted from C to C++), that&lt;br /&gt;
we encourage lots of people to help on, in the philosophy that many&lt;br /&gt;
hands make light work.  This work tends to be pretty rote so is&lt;br /&gt;
not hard for new folks to get involved with; it just takes time.  We&lt;br /&gt;
generally have one of these kinds of efforts per release.  It&lt;br /&gt;
usually isn’t glamorous work, but in aggregate moves the codebase&lt;br /&gt;
forward in a major way.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;li&amp;gt;&amp;lt;strong&amp;gt;Subsystem/module work.&amp;lt;/strong&amp;gt;  Some people want to get their hands in the&lt;br /&gt;
details quick, so take the approach of developing new code separate&lt;br /&gt;
from the codebase, to be integrated in later.  This generally tends&lt;br /&gt;
to take a larger time commitment than the other approaches, but can be&lt;br /&gt;
an effective approach in some circumstances.  We have a SVN module&lt;br /&gt;
called &amp;lt;code&amp;gt;experimental&amp;lt;/code&amp;gt; that you’re welcome to house your work until&lt;br /&gt;
it’s ready for prime time.&lt;br /&gt;
&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beyond that, you’re going to find the documentation for the Inkscape&lt;br /&gt;
code is pretty scarce.  We’ve worked on bits and pieces but&lt;br /&gt;
unfortunately the vast majority of the code is undocumented.  On the&lt;br /&gt;
plus side, often you can implement the stuff you care about after&lt;br /&gt;
learning only a limited portion of the codebase.&lt;br /&gt;
&lt;br /&gt;
I think you’d find Inkscape an enjoyable Open Source project to work on.&lt;br /&gt;
There’s a huge range of interesting and useful skills that can be&lt;br /&gt;
learned from it, plus the developers are great guys to participate with.&lt;br /&gt;
The project itself runs smoothly and puts a premium on keeping things&lt;br /&gt;
friendly and low-stress, so heated arguments are rare.  The users have&lt;br /&gt;
been great to work with and very appreciative of even small new features&lt;br /&gt;
and fixes.  Plus, since Inkscape is so visual in nature, it’s very cool&lt;br /&gt;
to see how your little changes make noticeable improvements to the app&lt;br /&gt;
overall.&lt;br /&gt;
&lt;br /&gt;
== C++ Reference ==&lt;br /&gt;
&lt;br /&gt;
*The C++ Core Guidelines. A set of rules for using modern C++ well, emphasizing safety and simplicity.&amp;lt;p&amp;gt;https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*The C++ FAQ (with answers). We strongly recommend that everyone read this site comprehensively. You should not need to bookmark it, it should already be at the top of your autocomplete list!&amp;lt;p&amp;gt;[https://isocpp.org/wiki/faq/ https://isocpp.org/wiki/faq]&amp;lt;br/&amp;gt;[http://www.parashift.com/c++-faq-lite/ http://www.parashift.com/c++-faq-lite] (previous version)&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;It is actually more in-depth than the name FAQ suggests.  Many experienced C++ programmers would benefit from it.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*C++ Reference. Documentation of all features of the language and standard library.&amp;lt;p&amp;gt;https://cppreference.com&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Please use const ==&lt;br /&gt;
&lt;br /&gt;
Please be very aggressive in adding ''const'' to any code you write. It will help us understand code better and will prevent bugs from creeping in. It is very easy to remove ''const'' later on, but very hard to add it.&lt;br /&gt;
&lt;br /&gt;
''const'' can go on either side of a type. However once you get into references and pointers and such with C++, you generally read those from right-to-left. So it makes the code a little more legible if the ''const'' comes between the variable type and name.&lt;br /&gt;
&lt;br /&gt;
 int const foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a constant int&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
And then:&lt;br /&gt;
&lt;br /&gt;
 int const &amp;amp; foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a reference to a constant int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 int const * foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a pointer to a constant int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
whereas:&lt;br /&gt;
&lt;br /&gt;
 int * const foo;&lt;br /&gt;
 // RTL reading gives &amp;quot;foo is a constant pointer to an int&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Read also:&lt;br /&gt;
* [http://www.cprogramming.com/tutorial/const_correctness.html Const Correctness]&lt;br /&gt;
* [http://yosefk.com/c++fqa/const.html Const Correctness]&lt;br /&gt;
&lt;br /&gt;
== Strings ==&lt;br /&gt;
Please make sure any user-visible strings are localizable.  This requires wrapping them with &amp;quot;_(&amp;quot; and &amp;quot;)&amp;quot;, like so:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;Select object&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
becomes&lt;br /&gt;
 &amp;lt;code&amp;gt;_(&amp;quot;Select object&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In case the interpretation of the string may be ambiguous or may differ according to context, you can add a context prefix (that won't be displayed) in order to eliminate the ambiguity. &lt;br /&gt;
 &amp;lt;code&amp;gt;&amp;quot;Ambiguous string&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
can then become&lt;br /&gt;
 &amp;lt;code&amp;gt;C_(&amp;quot;Context&amp;quot;, &amp;quot;Ambiguous string&amp;quot;)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For more complex things, please check the gettext/localization documentation.&lt;br /&gt;
See also http://library.gnome.org/devel/glib/unstable/glib-I18N.html&lt;br /&gt;
&lt;br /&gt;
== Implementing User Interface Changes ==&lt;br /&gt;
&lt;br /&gt;
[[UI improvements]] are enjoyable to work on because they produce visible changes in how Inkscape works.  These improvements are one of the most tangible ways to help improve how Inkscape works; thus, we strongly support new developers wishing to work in these areas.&lt;br /&gt;
&lt;br /&gt;
It is also very important to us that Inkscape presents an organized, productive, and easily discoverable interface to users.  Because of this it is important that new Inkscape UI developers work to ensure changes make Inkscape’s UI *more* consistent, *more* flexible, *more* cohesive, and so on.  We don’t have firm rules about what can and cannot done, in order to ensure plenty of freedom for innovation.  However, we can outline some general principles and guidelines that are important to keep in mind:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Don’t please the artist—BE the artist.&amp;lt;/strong&amp;gt;  Many times UI is designed and created by programmers who “understand what the user wants”.  But in Inkscape we believe that the best requirements list is the list inside the user’s head.  Requirements docs, usability studies, and so on are very indirect ways of transferring this gut-level understanding from user to programmer.  We believe the best way to ensure this information is communicated clearly is for the user to BE the programmer.  Or, alternatively, for the programmer to BECOME a user.&lt;br /&gt;
&lt;br /&gt;
This is why we so strongly encourage users to get involved in coding, and why we so strongly encourage programmers to focus on the features that are most important to them personally.  This is also why it is absolutely critical to pay close attention to what users report when using a new feature—often they can tip you off to alternate designs that achieve the same result in a better way.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;strong&amp;gt;Eliminate limitations.&amp;lt;/strong&amp;gt; Commercial software is often developed to fulfill feature requirement lists from a marketing department.  As such, it’s common to see the feature implemented to meet the requirement exactly, and no more.  However, especially with artistic software, art is often found outside what seems reasonable.  So when putting in a new feature, avoid the temptation to limit it to what you expect people to use it for—instead generalize it and open as many parameters as possible for tweaking, and let the artist decide what is reasonable.  That’s their job.  &lt;br /&gt;
&lt;br /&gt;
As an example, a drawing program might want to support the features “feather” and “drop shadow”.  Obviously, users need these important features.  Commercial software may well implement these as distinct features, each with their own UI controls.  However, these features are just special cases of the more general gaussian blur, and in Inkscape we implemented *that*.  With that in place, artists can do feathering and blur, &amp;lt;em&amp;gt;and&amp;lt;/em&amp;gt; a variety of other effects.&lt;br /&gt;
&lt;br /&gt;
It is interesting to note that, as an open collaborative standard, SVG&lt;br /&gt;
necessarily has the same goals as Inkscape: a minimum set of&lt;br /&gt;
universal, well thought-out building blocks that can accommodate the&lt;br /&gt;
widest possible range of graphics and applications. Thus, simply by&lt;br /&gt;
following the SVG philosophy, Inkscape scores quite a few important&lt;br /&gt;
points over commercial software. Live clones, patterns that can be contain any&lt;br /&gt;
objects, layers that are essentially groups and can be easily&lt;br /&gt;
converted to/from groups.  These are all examples where the underlying&lt;br /&gt;
universality of SVG directly translates into extremely valuable user&lt;br /&gt;
features.&lt;br /&gt;
&lt;br /&gt;
== Implementing New SVG Features ==&lt;br /&gt;
&lt;br /&gt;
The most important way to help Inkscape is to implement a new SVG feature in it.  Our hope is to eventually support ALL SVG features, so if you can help check one off the list, it brings us close to the nirvana of 100% SVG compliance.  :-)&lt;br /&gt;
&lt;br /&gt;
Generally we find that implementation of an SVG feature goes through three discrete stages:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Find the appropriate tags and attributes in the SVG spec&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Implement support for rendering files with these tags&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Implement support for UI controls to edit the tags&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Step 1 is mostly a research project.  Start by reading the SVG spec so you&lt;br /&gt;
can learn about the tag, the attributes that go with it, and so forth.&lt;br /&gt;
It is good practice to set up a page in the Wiki for storing your notes&lt;br /&gt;
as you do this process, so that in case you don’t make it to steps 2 and&lt;br /&gt;
3, then maybe someone else can benefit from your research.&lt;br /&gt;
&lt;br /&gt;
Step 2 is the fun part.  It helps to be comfortable with Inkscape internals&lt;br /&gt;
for this part.  Depending on the feature, it may require advanced&lt;br /&gt;
knowledge of transformation, rendering, document management, and so on.&lt;br /&gt;
For this part, just hand-edit an SVG file to put the tags in that you&lt;br /&gt;
found in step #1, and keep plugging away at the code until Inkscape&lt;br /&gt;
displays things as the specification dictates.  It can help to compare&lt;br /&gt;
your work with Batik, as we use that program as our reference&lt;br /&gt;
implementation.&lt;br /&gt;
&lt;br /&gt;
Step 3 is the most important stage. It is the point at which the&lt;br /&gt;
feature becomes available for users.  This step often requires knowledge&lt;br /&gt;
of Gtk+, for creating dialogs, widgets, menus, etc. for allowing the&lt;br /&gt;
user to edit the characteristics of the feature.  Be sure to listen to&lt;br /&gt;
feedback from other developers and users—especially if there are&lt;br /&gt;
different opinions.  It is hard to come up with UI that everyone can&lt;br /&gt;
agree on, but it is worth the work to achieve this—the more critique&lt;br /&gt;
your UI survives, the better loved the feature will be for future users.&lt;br /&gt;
&lt;br /&gt;
Looking through Inkscape’s history, these stages are often done by different people.  If you’re new to Inkscape, you may find working on stages 1 and 3 easiest, but there are many developers who can answer questions when you’re ready to dig into the internals, so don’t be afraid to ask questions!&lt;br /&gt;
&lt;br /&gt;
== Standards Compliance - Extension Namespaces ==&lt;br /&gt;
&lt;br /&gt;
* Only elements and attributes from our extension namespaces that ''do not affect rendering'' may be saved in SVG documents.&lt;br /&gt;
* Generally, this means that extension elements and attributes should only be used to provide UI hints.&lt;br /&gt;
* Extension elements and attributes should ''only'' be used where an existing facility provided by XML or SVG is not sufficient.&lt;br /&gt;
&lt;br /&gt;
== Global Verbs ==&lt;br /&gt;
&lt;br /&gt;
Here’s a readers’ digest summary of how Inkscape accelerators work:&lt;br /&gt;
&lt;br /&gt;
A global mapping between key combinations and integer [[verb]] IDs&lt;br /&gt;
(&amp;lt;code&amp;gt;sp_verb_t&amp;lt;/code&amp;gt;) is maintained in &amp;lt;code&amp;gt;shortcuts.cpp&amp;lt;/code&amp;gt;; these are registered using&lt;br /&gt;
&amp;lt;code&amp;gt;sp_shortcut_set()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Given an &amp;lt;code&amp;gt;sp_verb_t&amp;lt;/code&amp;gt; and an &amp;lt;code&amp;gt;SPView&amp;lt;/code&amp;gt;, you can get an SPAction which&lt;br /&gt;
represents that action in that view.  These mappings are currently&lt;br /&gt;
hard-coded in &amp;lt;code&amp;gt;verbs.cpp&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPActions&amp;lt;/code&amp;gt; derive from &amp;lt;code&amp;gt;NRActiveObject&amp;lt;/code&amp;gt;, which putatively provides a&lt;br /&gt;
“lightweight” method of doing callbacks (vs &amp;lt;code&amp;gt;GObject&amp;lt;/code&amp;gt; signals).  I&lt;br /&gt;
don’t completely understand how it works.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPActions&amp;lt;/code&amp;gt; also contain the label, image, etc, used for buttons and&lt;br /&gt;
menuitems.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;sp_shortcut_invoke()&amp;lt;/code&amp;gt; looks up the &amp;lt;code&amp;gt;SPAction&amp;lt;/code&amp;gt; for a keypress and &amp;lt;code&amp;gt;SPView&amp;lt;/code&amp;gt; and&lt;br /&gt;
invokes it automatically. &amp;lt;code&amp;gt;SPEventContexts&amp;lt;/code&amp;gt; call it for keypresses that they do not handle themselves.&lt;br /&gt;
&lt;br /&gt;
== Garbage collection ==&lt;br /&gt;
&lt;br /&gt;
As you know, many automatic garbage collectors (like &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;) only&lt;br /&gt;
free and recycle memory periodically.  This means you may have some&lt;br /&gt;
extra slush that could be freed, but hasn’t yet.&lt;br /&gt;
&lt;br /&gt;
There are other forces at work, though...&lt;br /&gt;
&lt;br /&gt;
Pretty much all allocators, whether automatic or not, whether the&lt;br /&gt;
system &amp;lt;code&amp;gt;malloc()&amp;lt;/code&amp;gt; or some custom allocator like &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;’s, work the&lt;br /&gt;
same way:  they request large blocks of memory from the operating&lt;br /&gt;
system, then divvy those blocks into smaller ones internally to&lt;br /&gt;
satisfy application allocation requests.&lt;br /&gt;
&lt;br /&gt;
When an application frees memory, that memory is usually recycled&lt;br /&gt;
internally rather than returned to the OS immediately.  The reason&lt;br /&gt;
for this is that the large memory blocks acquired from the OS must&lt;br /&gt;
be completely unused before they can actually be freed.&lt;br /&gt;
&lt;br /&gt;
For example, let’s say an allocator acquires 16 8MB blocks from&lt;br /&gt;
the OS in response to 32768 4k application allocations...&lt;br /&gt;
&lt;br /&gt;
In a worst-case scenario, it’s possible that the application could&lt;br /&gt;
free 32752 of those 4k blocks but the remaining 16 4k just happen&lt;br /&gt;
to be distributed across the 16 8MB blocks requested from the OS.&lt;br /&gt;
&lt;br /&gt;
If that happens, from the application’s point of view it may only&lt;br /&gt;
have 64k allocated, but as far as the OS is concerned, it’s still&lt;br /&gt;
using 128MB!&lt;br /&gt;
&lt;br /&gt;
Note that this applies to nearly all allocators in common use.&lt;br /&gt;
&lt;br /&gt;
While it’s unusual for things to get quite that bad, memory&lt;br /&gt;
fragmentation is common enough that many popular allocators (for&lt;br /&gt;
example Perl’s) simply don’t bother trying to return memory to the&lt;br /&gt;
OS at all (the memory will still get forcibly reclaimed by the OS&lt;br /&gt;
when the process exits).&lt;br /&gt;
&lt;br /&gt;
[ FWIW, &amp;lt;code&amp;gt;libgc&amp;lt;/code&amp;gt;’s allocator is one of the ones that _does_ make an&lt;br /&gt;
effort to release memory to the OS, but it is limited by&lt;br /&gt;
fragmentation like any other ]&lt;br /&gt;
&lt;br /&gt;
Also note that for various reasons, the statistics you get from the&lt;br /&gt;
OS aren’t going to directly reflect the amount of heap-allocated&lt;br /&gt;
memory.  Be careful drawing conclusions from only looking at e.g.&lt;br /&gt;
the output of &amp;lt;code&amp;gt;top(1)&amp;lt;/code&amp;gt;...&lt;br /&gt;
&lt;br /&gt;
(The worst thing is, due to the modern practice of&lt;br /&gt;
overcommitting memory, the OS may literally lie to an application&lt;br /&gt;
about the amount of memory it is being given, hoping the&lt;br /&gt;
application won’t really try to use it all.)&lt;br /&gt;
&lt;br /&gt;
The best approach to evaluating memory usage is if you can ask the&lt;br /&gt;
allocator for information on memory usage directly, as that matches&lt;br /&gt;
the world from the point of view of the application.&lt;br /&gt;
&lt;br /&gt;
leftover gradients/markers/patterns will get automatically cleaned up when the objects that use them are deleted.&lt;br /&gt;
&lt;br /&gt;
Caveats:&lt;br /&gt;
&lt;br /&gt;
* this only applies to such objects created with a build of Inkscape which post-dates this commit (June 7 2004) &amp;lt;!-- (2009?) - no, June 7 2004. The date was added in [http://wiki.inkscape.org/wiki/index.php?title=Developer_manual&amp;amp;diff=prev&amp;amp;oldid=1233 Revision as of 06:00, 7 June 2004] --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* not all automatically-created objects will necessarily be collected; the code that creates them needs to be updated to set the correct collection policy&lt;br /&gt;
&lt;br /&gt;
* paint objects won’t get collected until another editing operation takes place, since &amp;lt;code&amp;gt;NRArenaShape&amp;lt;/code&amp;gt; currently holds onto an &amp;lt;code&amp;gt;SPStyle&amp;lt;/code&amp;gt; for too long&lt;br /&gt;
&lt;br /&gt;
Technical details:&lt;br /&gt;
&lt;br /&gt;
Assuming its collection policy permits it, an object will be collected&lt;br /&gt;
if neither it nor its descendants have any outstanding inter-document&lt;br /&gt;
URI references (nonzero &amp;lt;code&amp;gt;SPObject::hrefcount&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
There are two “policies” for collecting orphans:&lt;br /&gt;
&lt;br /&gt;
* “with-parent” - the object will only be collected if one of its ancestors is collected&lt;br /&gt;
&lt;br /&gt;
* “always” - the object is always collected if unused&lt;br /&gt;
&lt;br /&gt;
(a third policy might be “never”, which would necessarily also prevent&lt;br /&gt;
that object’s ancestors from ever being collected; I do not plan on&lt;br /&gt;
implementing it)&lt;br /&gt;
&lt;br /&gt;
The policy in effect is determined by the inkscape:collect attribute.&lt;br /&gt;
&lt;br /&gt;
Be careful with the “always” policy; it really only makes sense for&lt;br /&gt;
“private” objects that are indirectly created behind the scenes (e.g. by&lt;br /&gt;
selecting a fill or marker option in the GUI).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;SPDocument&amp;lt;/code&amp;gt; manages a queue of objects to collect; &amp;lt;code&amp;gt;SPObject&amp;lt;/code&amp;gt; handles the machinery for actually queueing them when their &amp;lt;code&amp;gt;hrefcount&amp;lt;/code&amp;gt; falls (based on policy), and performing the actual collection (&amp;lt;code&amp;gt;delete&amp;lt;/code&amp;gt;).&lt;br /&gt;
&amp;lt;code&amp;gt;SPDocument::collectObjects()&amp;lt;/code&amp;gt; performs a collection pass. It’s currently only called from &amp;lt;code&amp;gt;sp_document_maybe_done()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Inkscape Experimental SVN ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;experimental&amp;lt;/code&amp;gt; module in Inkscape SVN is provided as a kind of “scratchpad” for &lt;br /&gt;
working up new ideas that aren’t quite ready for folding into the main codebase.&lt;br /&gt;
This includes architectural sketches, examples, experimental patchsets, tools &amp;amp; utilities, or&lt;br /&gt;
whatever else strikes the developer’s fancy.&lt;br /&gt;
&lt;br /&gt;
Please create a subdirectory within &amp;lt;code&amp;gt;experimental/&amp;lt;/code&amp;gt; for your work. You’re welcome to either post&lt;br /&gt;
the stuff at the top level or create a subdirectory for yourself.  Things linked in at the top level&lt;br /&gt;
should be considered fair game for other developers to collaborate on; items posted under&lt;br /&gt;
a developer’s username should be considered ask-first.  Same sort of idea as wiki.&lt;br /&gt;
&lt;br /&gt;
One of the principles behind this module is the idea of a shared working space.  Other developers&lt;br /&gt;
working in experimental can fairly easily see what others are working on in the tree, and perhaps&lt;br /&gt;
borrow or contribute ideas back and forth.   Since it is by definition not ‘production’ code, the &lt;br /&gt;
work may be incomplete or in a non-compileable state...and that’s okay.&lt;br /&gt;
&lt;br /&gt;
When an experiment has matured to the point of being actually useful, please move it out of&lt;br /&gt;
the experimental module to someplace more appropriate.  Alternatively, if the experimental work has become obsolete or irrelevant, please remove it so we can avoid having the experimental tree get too bulky.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directory Organization ==&lt;br /&gt;
&lt;br /&gt;
=== Distribution / Packaging Files ===&lt;br /&gt;
&lt;br /&gt;
Files related to generation of distribution packages should go under inkscape/packaging, as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    inkscape/packaging/&lt;br /&gt;
                       common/&lt;br /&gt;
                       debian/&lt;br /&gt;
                       fedora/&lt;br /&gt;
                       fink/&lt;br /&gt;
                       mandrake/&lt;br /&gt;
                       suse/&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;Share&amp;quot; Collateral ===&lt;br /&gt;
&lt;br /&gt;
A variety of items are installed in addition to the program itself, and placed into a &amp;lt;code&amp;gt;share&amp;lt;/code&amp;gt; directory structured as follows:&lt;br /&gt;
                                                                                      &lt;br /&gt;
    AUTHORS&lt;br /&gt;
    NEWS&lt;br /&gt;
    clipart/&lt;br /&gt;
    examples/&lt;br /&gt;
    extensions/&lt;br /&gt;
    fonts/&lt;br /&gt;
    gradients/&lt;br /&gt;
    icons/&lt;br /&gt;
    keyboards/&lt;br /&gt;
    markers/&lt;br /&gt;
    palettes/&lt;br /&gt;
    patterns/&lt;br /&gt;
    screens/&lt;br /&gt;
        about.svg&lt;br /&gt;
    templates/&lt;br /&gt;
    tutorials/&lt;br /&gt;
                                                                                      &lt;br /&gt;
In the SVN codebase, all of these are placed in &amp;lt;code&amp;gt;inkscape/share/&amp;lt;/code&amp;gt; (except &amp;lt;code&amp;gt;AUTHORS&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;NEWS&amp;lt;/code&amp;gt; which will be copied to share during installation.  The idea is that in theory, this entire tree structure can be copied into place on the user’s machine.  &lt;br /&gt;
&lt;br /&gt;
However, we need to provide the user some level of control over the installation.  They may wish to exclude some items, or may wish to augment the default install with some items external to the Inkscape package.  For example, they may wish to incorporate external clipart collections.  One approach would be to install symlinks in the given component directory to the external collection.  For example, if the flags package were to install into &amp;lt;code&amp;gt;/usr/share/flags-svg/&amp;lt;/code&amp;gt;, we’d just symlink there.&lt;br /&gt;
&lt;br /&gt;
=== Code modules ===&lt;br /&gt;
Several parts of the code were written in a modular way, and they have been&lt;br /&gt;
accordingly placed in subdirectories of &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt;, while the main src directory&lt;br /&gt;
still contains the biggest part. To get a first overview of the modules, you&lt;br /&gt;
might want to have a look at these dependency graphs before you read deeper&lt;br /&gt;
into the source code (outside at the moment):&lt;br /&gt;
&amp;lt;s&amp;gt;&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-debug.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-dialogs.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-display.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-io.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libcroco.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnr.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-libnrtype.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-livarot.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-widgets.svgz]&lt;br /&gt;
[http://www.ark.in-berlin.de/gri-xml.svgz]&amp;lt;/s&amp;gt; (links broken)&lt;br /&gt;
&amp;lt;!-- Was this the equivalent to the current Doxygen graphs? http://jenkins.inkscape.org/job/Inkscape_trunk_doxygen/doxygen/ --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
These are not all modules! For questions about how to generate these graphs&lt;br /&gt;
with graph-includes, please [mailto:rwst@users.sf.net].&lt;br /&gt;
&lt;br /&gt;
Question on &amp;lt;code&amp;gt;.svgz&amp;lt;/code&amp;gt; files: Is the server sending the right &amp;lt;code&amp;gt;Content-Encoding:&amp;lt;/code&amp;gt; header?&lt;br /&gt;
This matters to Mozilla browsers in standards compliance mode! http://jwatt.org/svg/authoring/#server-configuration&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
* [[DirectoryReorgProposal]]&lt;br /&gt;
* [[InkscapeJanitors]]&lt;br /&gt;
* [[CompilingInkscape]]&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
[http://advogato.org/article/51.html Software Quality]&lt;br /&gt;
&lt;br /&gt;
[[Category:Developer Documentation]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Using_libsigc%2B%2B_signals&amp;diff=122107</id>
		<title>Using libsigc++ signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Using_libsigc%2B%2B_signals&amp;diff=122107"/>
		<updated>2023-02-04T12:24:36Z</updated>

		<summary type="html">&lt;p&gt;PBS: /* Memory safety */ Fix Emitter -&amp;gt; Receiver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a very short guide to using libsigc++ signals. They can make complex code with a lot of things to update after each change in some data structure very simple.&lt;br /&gt;
&lt;br /&gt;
==What are signals?==&lt;br /&gt;
Signals are type-safe callbacks, essentially lists of function pointers on steroids. Each signal stores a list of '''slots'''. A slot defines what should be done when the signal is '''emitted'''. Typically an object emits the signal when it changes state. When a signal is emitted, the slots from the signal's slot list are executed, and sometimes a result is returned.&lt;br /&gt;
&lt;br /&gt;
Note that libsigc++ signals have absolutely nothing to do with POSIX signals. They are however almost identical to Qt signals and slots.&lt;br /&gt;
&lt;br /&gt;
==Defining signals==&lt;br /&gt;
Signals are typically defined as public attributes like this:&lt;br /&gt;
&lt;br /&gt;
 class Emitter&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    void increaseNumber(int by) {&lt;br /&gt;
       _number += by;&lt;br /&gt;
       signal_number_changed.emit(by);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int getNumber() const { return _number; }&lt;br /&gt;
    &lt;br /&gt;
    '''sigc::signal&amp;lt;void (int)&amp;gt; signal_number_changed;'''&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    int _number = 0;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 std::ostream &amp;amp;operator&amp;lt;&amp;lt;(std::ostream &amp;amp;o, Emitter const &amp;amp;e) {&lt;br /&gt;
    o &amp;lt;&amp;lt; e.getNumber();&lt;br /&gt;
    return o;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Several Inkscape classes use private signal attributes and define accessor methods for connecting slots, but this prevents you from using some advanced features. Wrapping them all in accessors isn't worth the hassle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;signal&amp;lt;/tt&amp;gt; is a class template. It takes a function type parameter defining the types of parameters passed to each slot when the signal is ''emitted'', and the type that the slot must return.&lt;br /&gt;
&lt;br /&gt;
==Connecting to signals==&lt;br /&gt;
The &amp;lt;tt&amp;gt;signal&amp;lt;/tt&amp;gt; class has a &amp;lt;tt&amp;gt;connect&amp;lt;/tt&amp;gt; method, which takes a slot and adds it to the list of the signal's slots. Any '''function object''' can be used as a slot, including any lambda. Raw function pointers and member function pointers can also be used, provided they are wrapped as function objects using &amp;lt;tt&amp;gt;sigc::ptr_fun()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::mem_fun()&amp;lt;/tt&amp;gt; respectively. Here is a typical example:&lt;br /&gt;
&lt;br /&gt;
 class Receiver&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    Receiver(Emitter &amp;amp;emitter) {&lt;br /&gt;
       emitter.signal_number_changed.connect(&lt;br /&gt;
          '''sigc::mem_fun'''(*this, &amp;amp;Receiver::_handleNumberChange)&lt;br /&gt;
       );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    void _handleNumberChange(int increment) {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; &amp;quot;The number increased by &amp;quot; &amp;lt;&amp;lt; increment &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sigc::mem_fun()&amp;lt;/tt&amp;gt; produces a function object that invokes a given method on the given object when it is called. Now whenever the number stored in the &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; class changes, all &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; objects created with this &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; object will have the &amp;lt;tt&amp;gt;_handleNumberChange()&amp;lt;/tt&amp;gt; method called.&lt;br /&gt;
&lt;br /&gt;
==Memory safety==&lt;br /&gt;
The above example is only memory-safe if the lifetime of the &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; can be guaranteed to end before the lifetime of the &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt;. Otherwise, there is nothing stopping the slot being invoked on a destructed &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt;. If this happens in our trivial example it will be harmless, but most of the time it will be a use-after-free, and a crash.&lt;br /&gt;
&lt;br /&gt;
If you are used to Qt signals and slots, this will come as a surprise, because in Qt slots are automatically disconnected when objects are destroyed, making them memory-safe by default. There is no such guarantee in libsigc++; safety must instead be opted-into.&lt;br /&gt;
&lt;br /&gt;
There are two ways to solve this problem.&lt;br /&gt;
&lt;br /&gt;
===Automatic disconnection===&lt;br /&gt;
Make &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; publically derive from &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt;. Then use any of &amp;lt;tt&amp;gt;sigc::mem_fn()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; to create slots. The slot will then be disconnected when the object is destroyed.&lt;br /&gt;
&lt;br /&gt;
Here are some further comments and caveats with this approach: &lt;br /&gt;
&lt;br /&gt;
*If you forget to make make &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; inherit from &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt;, then &amp;lt;tt&amp;gt;sigc::mem_fn()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; will silently fall back to being unsafe, which makes code that uses them fragile. By contrast, &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; will refuse to compile. However, at the time of writing, the superior &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; cannot be used yet due to not being supported on all build targets.&lt;br /&gt;
&lt;br /&gt;
*Even with the above approach, signals will be disconnected during the destructor of the &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt; base subobject, which happens ''after'' the destructor of the &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; subobject. So it is entirely possible for a sufficiently complicated class hierarchy, written by many different authors and performing complex signal manipulations in its destructor, to invoke slots on destructed objects even when the best practices for &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; are followed. This is not an issue for simple classes, or for the approach of the next section.&lt;br /&gt;
&lt;br /&gt;
===Manual disconnection ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;connect()&amp;lt;/tt&amp;gt; function actually returns a &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; object with a &amp;lt;tt&amp;gt;disconnect()&amp;lt;/tt&amp;gt; method that can be used to disconnect the connection. We can use this to improve our example:&lt;br /&gt;
&lt;br /&gt;
 class Receiver&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    Receiver(Emitter &amp;amp;emitter) {&lt;br /&gt;
       '''_conn =''' emitter.signal_number_changed.connect(&lt;br /&gt;
          sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange)&lt;br /&gt;
       );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''~Receiver() { _conn.disconnect(); }'''&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    '''sigc::connection _conn;'''&lt;br /&gt;
 &lt;br /&gt;
    void _handleNumberChange(int increment) {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; &amp;quot;The number increased by &amp;quot; &amp;lt;&amp;lt; increment &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
However, when working with &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; there are still a number of traps that make it extremely easy to write bugs: &lt;br /&gt;
&lt;br /&gt;
*If you destroy a connection without disconnecting it, it will not automatically be disconnected.&lt;br /&gt;
*Similarly, if you overwrite a connection with another one, the original will not automatically be disconnected.&lt;br /&gt;
&lt;br /&gt;
These errors are some of the most frequent sources of use-after-frees in Inkscape. The problem is that &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; behaves a lot like a raw pointer, with &amp;lt;tt&amp;gt;disconnect()&amp;lt;/tt&amp;gt; being another way of spelling delete. What is needed is something that behaves more like a &amp;lt;tt&amp;gt;std::unique_ptr&amp;lt;/tt&amp;gt;. For that reason, Inkscape has a RAII wrapper around &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; called &amp;lt;tt&amp;gt;Inkscape::auto_connection&amp;lt;/tt&amp;gt; that does not have these issues, and should be preferred wherever possible.&lt;br /&gt;
&lt;br /&gt;
==Adaptors==&lt;br /&gt;
As you can see, we cannot directly access the object that emitted the signal from the handling method. You might think that changing the signal definition in the Emitter class to&lt;br /&gt;
&lt;br /&gt;
 sigc::signal&amp;lt;void (Emitter &amp;amp;, int)&amp;gt; signal_number_changed;&lt;br /&gt;
&lt;br /&gt;
is the way to go. However, there are a few problems: first, the Emitter parameter for this slot is always the same (when you connect to another Emitter object from the same Receiver, you are creating a different slot stored in a different Emitter object). Moreover, it may be possible that some handlers only need the information about the number change - for instance, when you derive a class from Emitter and connect to the signals of the superclass, you already have the pointer to the superclass instance in &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt;. There is a much better way to solve this problem. Another type of slots that libsigc++ provides are called '''adaptors''' - they allow you to change the type signature of your handler function by binding constant parameters to its invocation, ignoring some parameters supplied by the signal, and more.&lt;br /&gt;
&lt;br /&gt;
===Binding parameters===&lt;br /&gt;
Let's say you want to print the name of the emitter that had its number increased. Instead of modifying the signal signature (a thing you sometimes cannot do, for example when you connect to a GTK-- signal), you can '''bind''' a parameter to your functor. First you need to modify the handler function:&lt;br /&gt;
&lt;br /&gt;
 void _handleNumberChange('''Emitter &amp;amp;e''', int by) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Emitter &amp;quot; &amp;lt;&amp;lt; e.getName()&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot; increased number by &amp;quot; &amp;lt;&amp;lt; by &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
then bind the first parameter like this.&lt;br /&gt;
&lt;br /&gt;
 emitter.signal_number_changed.connect(&lt;br /&gt;
    '''sigc::bind&amp;lt;0&amp;gt;'''(&lt;br /&gt;
       sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange),&lt;br /&gt;
       emitter)&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
sigc::bind takes an integer template parameter that tells it the zero-based index of the parameter it should bind. 0 denotes the first parameter, and the default value of -1 tells it to bind the last parameter. After this, your handler function will be called with the first parameter holding a reference to the object that emitted the signal.&lt;br /&gt;
&lt;br /&gt;
===Hiding parameters===&lt;br /&gt;
&lt;br /&gt;
Let's say you only want to print the name of the emitter and the current number, and you're not interested in how much it increased. You can then '''hide''' some of the signal's parameters.&lt;br /&gt;
&lt;br /&gt;
 void _handleNumberChange(Emitter &amp;amp;e) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Emitter &amp;lt;&amp;lt; e.getName() &amp;lt;&amp;lt; &amp;quot; changed its number.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 emitter.signal_number_changed.connect(&lt;br /&gt;
    '''sigc::hide'''(&lt;br /&gt;
       sigc::bind&amp;lt;0&amp;gt;(&lt;br /&gt;
          sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange),&lt;br /&gt;
          emitter)&lt;br /&gt;
       )&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sigc::hide&amp;lt;/tt&amp;gt; takes a template parameter just like &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt;. Here we use its default value. Also notice that you can easily chain adaptors. This powerful technique allows you to bind handlers to signals even if they weren't designed for each other.&lt;br /&gt;
&lt;br /&gt;
Using the functors &amp;lt;tt&amp;gt;sigc::bind_return&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::hide_return&amp;lt;/tt&amp;gt; you can also manipulate the return type. The first one changes to return type of the slot to that of a constant bound parameter. The second ignores the return value and create a slot returning &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that there is an inversion of meaning: you use &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt; to supply something that isn't present in the signal, and &amp;lt;tt&amp;gt;sigc::hide&amp;lt;/tt&amp;gt; to ignore something that isn't needed by the slot. With return adaptors, it's the other way around: you use &amp;lt;tt&amp;gt;sigc::bind_return&amp;lt;/tt&amp;gt; to supply something that isn't present in the slot, and &amp;lt;tt&amp;gt;sigc::hide_return&amp;lt;/tt&amp;gt; to ignore something that isn't needed by the signal.&lt;br /&gt;
&lt;br /&gt;
=== Advanced: reordering parameters===&lt;br /&gt;
&lt;br /&gt;
Another powerful type of adaptor is &amp;lt;tt&amp;gt;sigc::group&amp;lt;/tt&amp;gt;. It allows you to execute arbitrary mathematical expressions on the parameter list before pasing it to the handler. Here is an example.&lt;br /&gt;
&lt;br /&gt;
 class SomeGeometricObject {&lt;br /&gt;
 ...&lt;br /&gt;
    sigc::signal&amp;lt;&lt;br /&gt;
       void,&lt;br /&gt;
       Geom::Point const &amp;amp; /* old_position */,&lt;br /&gt;
       Geom::point const &amp;amp; /* new_position */ &amp;gt; signal_position_changed;&lt;br /&gt;
&lt;br /&gt;
 void _handlePositionChange(Geom::Point const &amp;amp;delta) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Object moved by&amp;quot;&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;: X=&amp;quot; &amp;lt;&amp;lt; delta[Geom::X]&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;, Y=&amp;quot; &amp;lt;&amp;lt; delta[Geom::Y] &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 some_object.signal_position_changed.connect(&lt;br /&gt;
    '''sigc::group'''(&lt;br /&gt;
       sigc::mem_fun(*this, &amp;amp;Receiver::_handlePositionChange),&lt;br /&gt;
       sigc::_2 - sigc::_1&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
The objects &amp;lt;tt&amp;gt;sigc::_1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::_2&amp;lt;/tt&amp;gt; are called '''lambda expressions''', and are used to denote the first and second parameter of the signal. The expression will be evaluated at slot call time, thanks to operator overloading. Note however that if you use variables other than lambdas, their values will be evaluated at connection time. To use references to variables instead of their current values, use &amp;lt;tt&amp;gt;sigc::ref&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Return values of signals==&lt;br /&gt;
&lt;br /&gt;
Signals can return a value. By default, they return the value returned from the last evaluated slot, or the default value for this return type of there was none (normally zero for numerical types, &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; for pointers, &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; for booleans, etc.).&lt;br /&gt;
&lt;br /&gt;
 signal&amp;lt;double&amp;gt; signal_get_length;&lt;br /&gt;
 double length_from_last_slot = signal_get_length.emit();&lt;br /&gt;
&lt;br /&gt;
This is not ideal, because you lose data from other slots. libsigc++ provides a powerful mechanism for handling return values from multiple slots, called accumulators.&lt;br /&gt;
&lt;br /&gt;
===Accumulators===&lt;br /&gt;
&lt;br /&gt;
Accumulator is a small class template that defines a signal's return type and a call function that evaluates the slot list of a signal. Here is an example accumulator that calculates the sum of the values returned by slots.&lt;br /&gt;
 template&amp;lt;class T&amp;gt;&lt;br /&gt;
 struct sum_accumulator {&lt;br /&gt;
    typedef T result_type;&lt;br /&gt;
    template&amp;lt;class I&amp;gt;&lt;br /&gt;
    result_type operator()(I first, I last) {&lt;br /&gt;
       T sum = 0;&lt;br /&gt;
       for (; first != last; first ++) sum += *first;&lt;br /&gt;
       return sum;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
There a few important things to notice: &lt;br /&gt;
#Each accumulator must have two public members: a type called &amp;lt;tt&amp;gt;result_type&amp;lt;/tt&amp;gt; which defines the return value of the signal's &amp;lt;tt&amp;gt;emit()&amp;lt;/tt&amp;gt; function, and an overloaded operator(), taking two arguments of some type (the type in question is called &amp;lt;tt&amp;gt;sigc::internal::slot_iterator_buf&amp;lt;/tt&amp;gt;, but it's better to just use a template).&lt;br /&gt;
#The parameters of the function call operator are two iterators, pointing to the start and the end of the slot list. The expression &amp;lt;tt&amp;gt;*i&amp;lt;/tt&amp;gt; evaluates the slot (i.e. calls it and returns the result).&lt;br /&gt;
#It is safe to write things like &amp;lt;tt&amp;gt;sum += (*i) * (*i);&amp;lt;/tt&amp;gt; because the results are buffered - each slot is evaluated at most once in each signal emission.&lt;br /&gt;
&lt;br /&gt;
To use the accumulator, you need to changed the signal definition a bit.&lt;br /&gt;
 sigc::signal&amp;lt;double&amp;gt;::'''accumulated'''&amp;lt;sum_accumulator&amp;lt;int&amp;gt; &amp;gt; signal_get_length;&lt;br /&gt;
&lt;br /&gt;
 double sum_of_lengths = signal_get_length.emit();&lt;br /&gt;
Now &amp;lt;tt&amp;gt;sum_of_lengths&amp;lt;/tt&amp;gt; contains the sum of return values from all the slots.&lt;br /&gt;
&lt;br /&gt;
WARNING: There is an old bug in libsigc++ that makes accumulators severely broken, because their result type must be implicitly convertible to and from the slot return type. See [http://bugzilla.gnome.org/show_bug.cgi?id=586436 this GNOME bug.] It will be fixed in the next libsigc++ release. --[[User:Tweenk|Tweenk]] 09:27, 31 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Conventions and tips== &lt;br /&gt;
*Your signals should only have parameters that can change with each invocation. For example, a position change signal could have the old and new positions as the parameters. In particular, signals should not have the emitting object as a parameter. The proper way to connect to a signal from a different object is to use &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt; like this:&lt;br /&gt;
 class SomeObject {&lt;br /&gt;
 public:&lt;br /&gt;
    sigc::signal&amp;lt;void&amp;gt; signal_update;&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
 class OtherObject {&lt;br /&gt;
 ...&lt;br /&gt;
    void onUpdate(SomeObject &amp;amp;so);&lt;br /&gt;
 };&lt;br /&gt;
 ...&lt;br /&gt;
 some_object.signal_update.connect(&lt;br /&gt;
    sigc::bind&amp;lt;0&amp;gt;(&lt;br /&gt;
        sigc::mem_fun(other_object, &amp;amp;OtherObject::onUpdate),&lt;br /&gt;
        some_object));&lt;br /&gt;
In the example, a reference is bound (because the SomeObject parameter will never need to be NULL), but you can also use a pointer. &lt;br /&gt;
&lt;br /&gt;
*Use the C++ wrappers for GTK+ as a reference for good signal parameter choices.&lt;br /&gt;
*The memory and performance overhead of adding signals to an object is quite small - most things are handled at compile time thanks to the use of templates.&lt;br /&gt;
*When using [[Boost shared pointers]], you cannot bind them as the &amp;quot;emitting object&amp;quot; parameter to slots. That's because the shared pointer will be copied into the object's slot list, keeping it in memory indefinitely. You need to use a weak pointer, which won't prevent the object's desctruction, but can be used to obtain a regular shared pointer. See [[Shared pointers]] for a more detailed guide.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[http://libsigc.sourceforge.net/libsigc2/docs/index.html libsigc++ reference documentation]&lt;br /&gt;
[http://bugzilla.gnome.org/show_bug.cgi?id=586436 Gnome bug #586436 - epic accumulator fail]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Using_libsigc%2B%2B_signals&amp;diff=122097</id>
		<title>Using libsigc++ signals</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Using_libsigc%2B%2B_signals&amp;diff=122097"/>
		<updated>2023-02-04T05:56:58Z</updated>

		<summary type="html">&lt;p&gt;PBS: Bring earlier sections up to date, add memory safety section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a very short guide to using libsigc++ signals. They can make complex code with a lot of things to update after each change in some data structure very simple.&lt;br /&gt;
&lt;br /&gt;
==What are signals?==&lt;br /&gt;
Signals are type-safe callbacks, essentially lists of function pointers on steroids. Each signal stores a list of '''slots'''. A slot defines what should be done when the signal is '''emitted'''. Typically an object emits the signal when it changes state. When a signal is emitted, the slots from the signal's slot list are executed, and sometimes a result is returned.&lt;br /&gt;
&lt;br /&gt;
Note that libsigc++ signals have absolutely nothing to do with POSIX signals. They are however almost identical to Qt signals and slots.&lt;br /&gt;
&lt;br /&gt;
==Defining signals==&lt;br /&gt;
Signals are typically defined as public attributes like this:&lt;br /&gt;
&lt;br /&gt;
 class Emitter&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    void increaseNumber(int by) {&lt;br /&gt;
       _number += by;&lt;br /&gt;
       signal_number_changed.emit(by);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int getNumber() const { return _number; }&lt;br /&gt;
    &lt;br /&gt;
    '''sigc::signal&amp;lt;void (int)&amp;gt; signal_number_changed;'''&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    int _number = 0;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 std::ostream &amp;amp;operator&amp;lt;&amp;lt;(std::ostream &amp;amp;o, Emitter const &amp;amp;e) {&lt;br /&gt;
    o &amp;lt;&amp;lt; e.getNumber();&lt;br /&gt;
    return o;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Several Inkscape classes use private signal attributes and define accessor methods for connecting slots, but this prevents you from using some advanced features. Wrapping them all in accessors isn't worth the hassle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;signal&amp;lt;/tt&amp;gt; is a class template. It takes a function type parameter defining the types of parameters passed to each slot when the signal is ''emitted'', and the type that the slot must return.&lt;br /&gt;
&lt;br /&gt;
==Connecting to signals==&lt;br /&gt;
The &amp;lt;tt&amp;gt;signal&amp;lt;/tt&amp;gt; class has a &amp;lt;tt&amp;gt;connect&amp;lt;/tt&amp;gt; method, which takes a slot and adds it to the list of the signal's slots. Any '''function object''' can be used as a slot, including any lambda. Raw function pointers and member function pointers can also be used, provided they are wrapped as function objects using &amp;lt;tt&amp;gt;sigc::ptr_fun()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::mem_fun()&amp;lt;/tt&amp;gt; respectively. Here is a typical example:&lt;br /&gt;
&lt;br /&gt;
 class Receiver&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    Receiver(Emitter &amp;amp;emitter) {&lt;br /&gt;
       emitter.signal_number_changed.connect(&lt;br /&gt;
          '''sigc::mem_fun'''(*this, &amp;amp;Receiver::_handleNumberChange)&lt;br /&gt;
       );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    void _handleNumberChange(int increment) {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; &amp;quot;The number increased by &amp;quot; &amp;lt;&amp;lt; increment &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sigc::mem_fun()&amp;lt;/tt&amp;gt; produces a function object that invokes a given method on the given object when it is called. Now whenever the number stored in the &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; class changes, all &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; objects created with this &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; object will have the &amp;lt;tt&amp;gt;_handleNumberChange()&amp;lt;/tt&amp;gt; method called.&lt;br /&gt;
&lt;br /&gt;
==Memory safety==&lt;br /&gt;
The above example is only memory-safe if the lifetime of the &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; can be guaranteed to end before the lifetime of the &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt;. Otherwise, there is nothing stopping the slot being invoked on a destructed &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt;. If this happens in our trivial example it will be harmless, but most of the time it will be a use-after-free, and a crash.&lt;br /&gt;
&lt;br /&gt;
If you are used to Qt signals and slots, this will come as a surprise, because in Qt slots are automatically disconnected when objects are destroyed, making them memory-safe by default. There is no such guarantee in libsigc++; safety must instead be opted-into.&lt;br /&gt;
&lt;br /&gt;
There are two ways to solve this problem.&lt;br /&gt;
&lt;br /&gt;
===Automatic disconnection===&lt;br /&gt;
Make &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; publically derive from &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt;. Then use any of &amp;lt;tt&amp;gt;sigc::mem_fn()&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; to create slots. The slot will then be disconnected when the object is destroyed.&lt;br /&gt;
&lt;br /&gt;
Here are some further comments and caveats with this approach: &lt;br /&gt;
&lt;br /&gt;
*If you forget to make make &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; inherit from &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt;, then &amp;lt;tt&amp;gt;sigc::mem_fn()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; will silently fall back to being unsafe, which makes code that uses them fragile. By contrast, &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; will refuse to compile. However, at the time of writing, the superior &amp;lt;tt&amp;gt;sigc::track_object()&amp;lt;/tt&amp;gt; cannot be used yet due to not being supported on all build targets.&lt;br /&gt;
&lt;br /&gt;
*Even with the above approach, signals will be disconnected during the destructor of the &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt; base subobject, which happens ''after'' the destructor of the &amp;lt;tt&amp;gt;Emitter&amp;lt;/tt&amp;gt; subobject. So it is entirely possible for a sufficiently complicated class hierarchy, written by many different authors and performing complex signal manipulations in its destructor, to invoke slots on destructed objects even when the best practices for &amp;lt;tt&amp;gt;sigc::trackable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::track_obj()&amp;lt;/tt&amp;gt; are followed. This is not an issue for simple classes, or for the approach of the next section.&lt;br /&gt;
&lt;br /&gt;
===Manual disconnection ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;connect()&amp;lt;/tt&amp;gt; function actually returns a &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; object with a &amp;lt;tt&amp;gt;disconnect()&amp;lt;/tt&amp;gt; method that can be used to disconnect the connection. We can use this to improve our example:&lt;br /&gt;
&lt;br /&gt;
 class Receiver&lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
    Receiver(Emitter &amp;amp;emitter) {&lt;br /&gt;
       '''_conn =''' emitter.signal_number_changed.connect(&lt;br /&gt;
          sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange)&lt;br /&gt;
       );&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    '''~Receiver() { _conn.disconnect(); }'''&lt;br /&gt;
    &lt;br /&gt;
 private:&lt;br /&gt;
    '''sigc::connection _conn;'''&lt;br /&gt;
 &lt;br /&gt;
    void _handleNumberChange(int increment) {&lt;br /&gt;
       std::cout &amp;lt;&amp;lt; &amp;quot;The number increased by &amp;quot; &amp;lt;&amp;lt; increment &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
    }&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
However, when working with &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; there are still a number of traps that make it extremely easy to write bugs: &lt;br /&gt;
&lt;br /&gt;
*If you destroy a connection without disconnecting it, it will not automatically be disconnected.&lt;br /&gt;
*Similarly, if you overwrite a connection with another one, the original will not automatically be disconnected.&lt;br /&gt;
&lt;br /&gt;
These errors are some of the most frequent sources of use-after-frees in Inkscape. The problem is that &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; behaves a lot like a raw pointer, with &amp;lt;tt&amp;gt;disconnect()&amp;lt;/tt&amp;gt; being another way of spelling delete. What is needed is something that behaves more like a &amp;lt;tt&amp;gt;std::unique_ptr&amp;lt;/tt&amp;gt;. For that reason, Inkscape has a RAII wrapper around &amp;lt;tt&amp;gt;sigc::connection&amp;lt;/tt&amp;gt; called &amp;lt;tt&amp;gt;Inkscape::auto_connection&amp;lt;/tt&amp;gt; that does not have these issues, and should be preferred wherever possible.&lt;br /&gt;
&lt;br /&gt;
==Adaptors==&lt;br /&gt;
As you can see, we cannot directly access the object that emitted the signal from the handling method. You might think that changing the signal definition in the Emitter class to&lt;br /&gt;
&lt;br /&gt;
 sigc::signal&amp;lt;void (Emitter &amp;amp;, int)&amp;gt; signal_number_changed;&lt;br /&gt;
&lt;br /&gt;
is the way to go. However, there are a few problems: first, the Emitter parameter for this slot is always the same (when you connect to another Emitter object from the same Receiver, you are creating a different slot stored in a different Emitter object). Moreover, it may be possible that some handlers only need the information about the number change - for instance, when you derive a class from Emitter and connect to the signals of the superclass, you already have the pointer to the superclass instance in &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt;. There is a much better way to solve this problem. Another type of slots that libsigc++ provides are called '''adaptors''' - they allow you to change the type signature of your handler function by binding constant parameters to its invocation, ignoring some parameters supplied by the signal, and more.&lt;br /&gt;
&lt;br /&gt;
===Binding parameters===&lt;br /&gt;
Let's say you want to print the name of the emitter that had its number increased. Instead of modifying the signal signature (a thing you sometimes cannot do, for example when you connect to a GTK-- signal), you can '''bind''' a parameter to your functor. First you need to modify the handler function:&lt;br /&gt;
&lt;br /&gt;
 void _handleNumberChange('''Emitter &amp;amp;e''', int by) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Emitter &amp;quot; &amp;lt;&amp;lt; e.getName()&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot; increased number by &amp;quot; &amp;lt;&amp;lt; by &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
then bind the first parameter like this.&lt;br /&gt;
&lt;br /&gt;
 emitter.signal_number_changed.connect(&lt;br /&gt;
    '''sigc::bind&amp;lt;0&amp;gt;'''(&lt;br /&gt;
       sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange),&lt;br /&gt;
       emitter)&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
sigc::bind takes an integer template parameter that tells it the zero-based index of the parameter it should bind. 0 denotes the first parameter, and the default value of -1 tells it to bind the last parameter. After this, your handler function will be called with the first parameter holding a reference to the object that emitted the signal.&lt;br /&gt;
&lt;br /&gt;
===Hiding parameters===&lt;br /&gt;
&lt;br /&gt;
Let's say you only want to print the name of the emitter and the current number, and you're not interested in how much it increased. You can then '''hide''' some of the signal's parameters.&lt;br /&gt;
&lt;br /&gt;
 void _handleNumberChange(Emitter &amp;amp;e) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Emitter &amp;lt;&amp;lt; e.getName() &amp;lt;&amp;lt; &amp;quot; changed its number.&amp;quot; &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 emitter.signal_number_changed.connect(&lt;br /&gt;
    '''sigc::hide'''(&lt;br /&gt;
       sigc::bind&amp;lt;0&amp;gt;(&lt;br /&gt;
          sigc::mem_fun(*this, &amp;amp;Receiver::_handleNumberChange),&lt;br /&gt;
          emitter)&lt;br /&gt;
       )&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;sigc::hide&amp;lt;/tt&amp;gt; takes a template parameter just like &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt;. Here we use its default value. Also notice that you can easily chain adaptors. This powerful technique allows you to bind handlers to signals even if they weren't designed for each other.&lt;br /&gt;
&lt;br /&gt;
Using the functors &amp;lt;tt&amp;gt;sigc::bind_return&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::hide_return&amp;lt;/tt&amp;gt; you can also manipulate the return type. The first one changes to return type of the slot to that of a constant bound parameter. The second ignores the return value and create a slot returning &amp;lt;tt&amp;gt;void&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that there is an inversion of meaning: you use &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt; to supply something that isn't present in the signal, and &amp;lt;tt&amp;gt;sigc::hide&amp;lt;/tt&amp;gt; to ignore something that isn't needed by the slot. With return adaptors, it's the other way around: you use &amp;lt;tt&amp;gt;sigc::bind_return&amp;lt;/tt&amp;gt; to supply something that isn't present in the slot, and &amp;lt;tt&amp;gt;sigc::hide_return&amp;lt;/tt&amp;gt; to ignore something that isn't needed by the signal.&lt;br /&gt;
&lt;br /&gt;
=== Advanced: reordering parameters===&lt;br /&gt;
&lt;br /&gt;
Another powerful type of adaptor is &amp;lt;tt&amp;gt;sigc::group&amp;lt;/tt&amp;gt;. It allows you to execute arbitrary mathematical expressions on the parameter list before pasing it to the handler. Here is an example.&lt;br /&gt;
&lt;br /&gt;
 class SomeGeometricObject {&lt;br /&gt;
 ...&lt;br /&gt;
    sigc::signal&amp;lt;&lt;br /&gt;
       void,&lt;br /&gt;
       Geom::Point const &amp;amp; /* old_position */,&lt;br /&gt;
       Geom::point const &amp;amp; /* new_position */ &amp;gt; signal_position_changed;&lt;br /&gt;
&lt;br /&gt;
 void _handlePositionChange(Geom::Point const &amp;amp;delta) {&lt;br /&gt;
    std::cout &amp;lt;&amp;lt; &amp;quot;Object moved by&amp;quot;&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;: X=&amp;quot; &amp;lt;&amp;lt; delta[Geom::X]&lt;br /&gt;
              &amp;lt;&amp;lt; &amp;quot;, Y=&amp;quot; &amp;lt;&amp;lt; delta[Geom::Y] &amp;lt;&amp;lt; std::endl;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
 some_object.signal_position_changed.connect(&lt;br /&gt;
    '''sigc::group'''(&lt;br /&gt;
       sigc::mem_fun(*this, &amp;amp;Receiver::_handlePositionChange),&lt;br /&gt;
       sigc::_2 - sigc::_1&lt;br /&gt;
    )&lt;br /&gt;
 );&lt;br /&gt;
&lt;br /&gt;
The objects &amp;lt;tt&amp;gt;sigc::_1&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;sigc::_2&amp;lt;/tt&amp;gt; are called '''lambda expressions''', and are used to denote the first and second parameter of the signal. The expression will be evaluated at slot call time, thanks to operator overloading. Note however that if you use variables other than lambdas, their values will be evaluated at connection time. To use references to variables instead of their current values, use &amp;lt;tt&amp;gt;sigc::ref&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Return values of signals==&lt;br /&gt;
&lt;br /&gt;
Signals can return a value. By default, they return the value returned from the last evaluated slot, or the default value for this return type of there was none (normally zero for numerical types, &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; for pointers, &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; for booleans, etc.).&lt;br /&gt;
&lt;br /&gt;
 signal&amp;lt;double&amp;gt; signal_get_length;&lt;br /&gt;
 double length_from_last_slot = signal_get_length.emit();&lt;br /&gt;
&lt;br /&gt;
This is not ideal, because you lose data from other slots. libsigc++ provides a powerful mechanism for handling return values from multiple slots, called accumulators.&lt;br /&gt;
&lt;br /&gt;
===Accumulators===&lt;br /&gt;
&lt;br /&gt;
Accumulator is a small class template that defines a signal's return type and a call function that evaluates the slot list of a signal. Here is an example accumulator that calculates the sum of the values returned by slots.&lt;br /&gt;
 template&amp;lt;class T&amp;gt;&lt;br /&gt;
 struct sum_accumulator {&lt;br /&gt;
    typedef T result_type;&lt;br /&gt;
    template&amp;lt;class I&amp;gt;&lt;br /&gt;
    result_type operator()(I first, I last) {&lt;br /&gt;
       T sum = 0;&lt;br /&gt;
       for (; first != last; first ++) sum += *first;&lt;br /&gt;
       return sum;&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
There a few important things to notice: &lt;br /&gt;
#Each accumulator must have two public members: a type called &amp;lt;tt&amp;gt;result_type&amp;lt;/tt&amp;gt; which defines the return value of the signal's &amp;lt;tt&amp;gt;emit()&amp;lt;/tt&amp;gt; function, and an overloaded operator(), taking two arguments of some type (the type in question is called &amp;lt;tt&amp;gt;sigc::internal::slot_iterator_buf&amp;lt;/tt&amp;gt;, but it's better to just use a template).&lt;br /&gt;
#The parameters of the function call operator are two iterators, pointing to the start and the end of the slot list. The expression &amp;lt;tt&amp;gt;*i&amp;lt;/tt&amp;gt; evaluates the slot (i.e. calls it and returns the result).&lt;br /&gt;
#It is safe to write things like &amp;lt;tt&amp;gt;sum += (*i) * (*i);&amp;lt;/tt&amp;gt; because the results are buffered - each slot is evaluated at most once in each signal emission.&lt;br /&gt;
&lt;br /&gt;
To use the accumulator, you need to changed the signal definition a bit.&lt;br /&gt;
 sigc::signal&amp;lt;double&amp;gt;::'''accumulated'''&amp;lt;sum_accumulator&amp;lt;int&amp;gt; &amp;gt; signal_get_length;&lt;br /&gt;
&lt;br /&gt;
 double sum_of_lengths = signal_get_length.emit();&lt;br /&gt;
Now &amp;lt;tt&amp;gt;sum_of_lengths&amp;lt;/tt&amp;gt; contains the sum of return values from all the slots.&lt;br /&gt;
&lt;br /&gt;
WARNING: There is an old bug in libsigc++ that makes accumulators severely broken, because their result type must be implicitly convertible to and from the slot return type. See [http://bugzilla.gnome.org/show_bug.cgi?id=586436 this GNOME bug.] It will be fixed in the next libsigc++ release. --[[User:Tweenk|Tweenk]] 09:27, 31 December 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
==Conventions and tips== &lt;br /&gt;
*Your signals should only have parameters that can change with each invocation. For example, a position change signal could have the old and new positions as the parameters. In particular, signals should not have the emitting object as a parameter. The proper way to connect to a signal from a different object is to use &amp;lt;tt&amp;gt;sigc::bind&amp;lt;/tt&amp;gt; like this:&lt;br /&gt;
 class SomeObject {&lt;br /&gt;
 public:&lt;br /&gt;
    sigc::signal&amp;lt;void&amp;gt; signal_update;&lt;br /&gt;
 ...&lt;br /&gt;
 };&lt;br /&gt;
 class OtherObject {&lt;br /&gt;
 ...&lt;br /&gt;
    void onUpdate(SomeObject &amp;amp;so);&lt;br /&gt;
 };&lt;br /&gt;
 ...&lt;br /&gt;
 some_object.signal_update.connect(&lt;br /&gt;
    sigc::bind&amp;lt;0&amp;gt;(&lt;br /&gt;
        sigc::mem_fun(other_object, &amp;amp;OtherObject::onUpdate),&lt;br /&gt;
        some_object));&lt;br /&gt;
In the example, a reference is bound (because the SomeObject parameter will never need to be NULL), but you can also use a pointer. &lt;br /&gt;
&lt;br /&gt;
*Use the C++ wrappers for GTK+ as a reference for good signal parameter choices.&lt;br /&gt;
*The memory and performance overhead of adding signals to an object is quite small - most things are handled at compile time thanks to the use of templates.&lt;br /&gt;
*When using [[Boost shared pointers]], you cannot bind them as the &amp;quot;emitting object&amp;quot; parameter to slots. That's because the shared pointer will be copied into the object's slot list, keeping it in memory indefinitely. You need to use a weak pointer, which won't prevent the object's desctruction, but can be used to obtain a regular shared pointer. See [[Shared pointers]] for a more detailed guide.&lt;br /&gt;
&lt;br /&gt;
==See Also==&lt;br /&gt;
[http://libsigc.sourceforge.net/libsigc2/docs/index.html libsigc++ reference documentation]&lt;br /&gt;
[http://bugzilla.gnome.org/show_bug.cgi?id=586436 Gnome bug #586436 - epic accumulator fail]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122096</id>
		<title>Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122096"/>
		<updated>2023-02-04T03:33:22Z</updated>

		<summary type="html">&lt;p&gt;PBS: Remove boost::shared_ptr section; std::shared_ptr is now standard C++&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a freeform area for Inkscape development and discussion. Curious about [[wiki syntax]]?&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
== Project Info ==&lt;br /&gt;
* [http://www.inkscape.org/ Inkscape Homepage]&lt;br /&gt;
* [[About Inkscape]]&lt;br /&gt;
* [[Features of Inkscape|Features]]&lt;br /&gt;
* [[FAQ]] — Frequently Asked Questions&lt;br /&gt;
* [[Supported operating systems]]&lt;br /&gt;
* [[Tools]] — Supporting Tools and Applications&lt;br /&gt;
* [[Galleries]]&lt;br /&gt;
* [[Inkscape coverage|Coverage]] — Awards, articles, presentations, books about Inkscape&lt;br /&gt;
* [[Inkscape popularity|Popularity]]&lt;br /&gt;
* [[Inkscape invariants|Inkscape's Mission]]&lt;br /&gt;
* [https://inkscape.org/en/community/ Communication] — How to reach us&lt;br /&gt;
* [[Announcement to Sodipodi]] — This started it all&lt;br /&gt;
* [[Branding]]&lt;br /&gt;
* [[Travel Reimbursement Policy]]&lt;br /&gt;
* [[Funded Project System Development]]&lt;br /&gt;
* [[:Category:Hackfest|Hackfests]]&lt;br /&gt;
** upcoming/proposed events: [[Hackfest2023_Bensberg|2023 Bensberg]]&lt;br /&gt;
** past events:&lt;br /&gt;
::: [[Hackfest2019 SCALE|2019 Pasadena (SCALE)]], [[Hackfest2019 Saarbrücken|2019 Saarbrücken (LGM)]]&lt;br /&gt;
::: [[Hackfest2018|2018 Boston]], [[Hackfest2018 LGM|2018 Seville (LGM)]], [[Hackfest2018 Kiel|2018 Kiel]]&lt;br /&gt;
::: [[Hackfest2017|2017 Paris]]&lt;br /&gt;
::: [[Hackfest2016|2016 Leeds (LGM)]]&lt;br /&gt;
::: [[Hackfest2015|2015 Toronto (LGM)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
* [[Installing Inkscape|Installation]]&lt;br /&gt;
* [[International and Local Communities]]&lt;br /&gt;
* [[Inkscape glossary]]&lt;br /&gt;
* [[User manual information]] — Where to find the free Inkscape manual and how to contribute to it&lt;br /&gt;
* [http://inkscape.org/en/learn/tutorials/ Tutorials]&lt;br /&gt;
* [[Inkscape SVG vs. plain SVG]]&lt;br /&gt;
* [[Output format requirements]] — What's needed to save in some formats&lt;br /&gt;
* [[Extension requirements]] — What's needed to use some extensions (slightly outdated)&lt;br /&gt;
* [[Extension reference]] — What each extension does (slightly outdated)&lt;br /&gt;
* [[Connector tool tutorial]]&lt;br /&gt;
* [[Installing fonts]]&lt;br /&gt;
* [[Emergency save]] — Recovery in case Inkscape crashed&lt;br /&gt;
* [[Release notes]]&lt;br /&gt;
** ''[[Release notes/1.3|Inkscape 1.3]]'' &amp;amp;mdash; ''development branch''&lt;br /&gt;
** '''[[Release notes/1.2|Inkscape 1.2]]''' ([[Release notes/1.2.1|1.2.1]], [[Release_notes/1.2.2|1.2.2]]) &amp;amp;mdash; ''current stable release branch''&lt;br /&gt;
** [[Release notes/1.1|Inkscape 1.1]] ([[Release notes/1.1.1|1.1.1]], [[Release notes/1.1.2|1.1.2]])&lt;br /&gt;
* [[Announcing Releases]] (slightly outdated)&lt;br /&gt;
* [[Release Process Debrief]] (slightly outdated)&lt;br /&gt;
* [[Tricks and tips]] — Miscellaneous advice, may be slightly outdated&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Help Inkscape Without Coding ==&lt;br /&gt;
* [[Help wanted]]&lt;br /&gt;
* [[Bug management]]&lt;br /&gt;
** [[Projects#Bug_Triage]]&lt;br /&gt;
* [[Testing]]&lt;br /&gt;
** [[macOS alpha]]&lt;br /&gt;
* [[Translation information]]&lt;br /&gt;
* [[WebSite]]&lt;br /&gt;
* [[Inkscape Classes]]&lt;br /&gt;
* [[Conferences]]&lt;br /&gt;
* [[Fundraising Ideas]]&lt;br /&gt;
* [[Creating Inkscape distributions]] — How to build packages&lt;br /&gt;
* [[Stable branch updates]]&lt;br /&gt;
* [[Updating tracker items]]&lt;br /&gt;
* [[Tutorials and help]]&lt;br /&gt;
* [[How to start a page]] — How to use the wiki&lt;br /&gt;
* [[Creating screencasts]]&lt;br /&gt;
* [[About-Screen contest]]&lt;br /&gt;
* [[social media|Participate in social media]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top: 1em; padding: .5em 1em 1em; border: 1px solid #62C012;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 50%; padding-right: 1em;&amp;quot; |&lt;br /&gt;
=== First Steps ===&lt;br /&gt;
* [[Working with Git]] — How to obtain the source code. A quick start on how to use our version control system.&lt;br /&gt;
* [[Compiling Inkscape]]&lt;br /&gt;
* [[Developer manual]] — Various important information, be sure to read this before coding&lt;br /&gt;
* [[Debugging Inkscape|Debugging]] — Random tips to help debug problems&lt;br /&gt;
* [[Janitorial tasks]] — Small tasks that need doing&lt;br /&gt;
* [[Doxygen documentation]]&lt;br /&gt;
* [[Working with CMake]] — Getting started with CMake coding for configuring and building Inkscape&lt;br /&gt;
&lt;br /&gt;
=== Developer tutorials ===&lt;br /&gt;
* [[Architectural overview]] — A high-level look at Inkscape&lt;br /&gt;
* [[Preferences subsystem]] — Creating and using preference values&lt;br /&gt;
&amp;lt;!-- * XML subsystem — How to manipulate the XML representation of a document&lt;br /&gt;
* Display subsystem — How to make things appear on the canvas&lt;br /&gt;
* Tools subsystem — How to create a new tool --&amp;gt;&lt;br /&gt;
* Extensions&lt;br /&gt;
** [[Extension subsystem]] — An overview of the functionality provided by extensions and the possible implementations&lt;br /&gt;
** [[Script extensions]] — Extend Inkscape easily using scripting languages (Python, Perl, …)&lt;br /&gt;
** [[Python modules for extensions]] — Some helpful routines for use in Python script extensions&lt;br /&gt;
** [[INX extension descriptor format]]&lt;br /&gt;
* [[Creating Live Path Effects]]&lt;br /&gt;
* [[Using libsigc++ signals]]&lt;br /&gt;
*[[Windows development on Linux]]&lt;br /&gt;
&lt;br /&gt;
=== User Interface Discussion===&lt;br /&gt;
*[[Interface translation]]&lt;br /&gt;
* [[Adding interface verbs]]&lt;br /&gt;
*[[Accessible graphics]]&lt;br /&gt;
* [[Object Manager]]&lt;br /&gt;
*[[Dialogs reorganization]]&lt;br /&gt;
*[[Modal interfaces]]&lt;br /&gt;
*[[Text usability]] — Text tool and dialog&lt;br /&gt;
*[[KeyboardShortcutsToDo]]&lt;br /&gt;
**[[Keyboard profiles]] — How you can help&lt;br /&gt;
*[[Statusbar API]]&lt;br /&gt;
* [[Animation-(Timeline)]]&lt;br /&gt;
*[[Free Desktop Graphic Suite]]&lt;br /&gt;
*[[Skeletal Strokes]] — Brushes, Strokes, Pressure Sensibility...&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
===Development Discussion === &lt;br /&gt;
*[[Roadmap]] — The main todo list&lt;br /&gt;
*[[Tracking Dependencies|Dependencies]] — What libs are needed to build Inkscape&lt;br /&gt;
*[[C++11]] — Which C++11 features can be used&lt;br /&gt;
*[[New feature proposals]]&lt;br /&gt;
* [[Extension architecture proposals]]&lt;br /&gt;
*[[Coding Style|Coding Style Discussion]]&lt;br /&gt;
*[[File types]]&lt;br /&gt;
*[[Application icons]] — Application + Interface&lt;br /&gt;
*[[Icons]]&lt;br /&gt;
*[[Color management]]&lt;br /&gt;
*[[Printing subsystem]]&lt;br /&gt;
*[[SVG Tiny Compliance]]&lt;br /&gt;
* [[SVG Test Suite Compliance]] — [[W3C]] full test suite&lt;br /&gt;
*[[CSS Support]]&lt;br /&gt;
*[[Google Summer of Code]]&lt;br /&gt;
* [[Improved Media Management]]&lt;br /&gt;
*[[UI Mockup Screenshots]]&lt;br /&gt;
* [[Swatch Book]]&lt;br /&gt;
*[[Tablet Dialog]]&lt;br /&gt;
*[[ViewBoxToDo]] — View box support info&lt;br /&gt;
* [[Caching]]&lt;br /&gt;
*[[Canvas Rendering Profiling]]&lt;br /&gt;
*[[UI and Document coordinates‎]]&lt;br /&gt;
* [[GtkMMification]] — Replace C boilerplate with gtkmm objects&lt;br /&gt;
*[[CMake Tasks]] — Converting the Inkscape build system to CMake&lt;br /&gt;
*[[Bug Reporting Workflow]] — Options for improving Inkscape bug workflow from user to developer&lt;br /&gt;
*[[1.0 Release Bug Fix List]] — List of bugs that need to be fixed for 1.0&lt;br /&gt;
*[[1.0 Release Planning]] — Roadmap and planning for 1.0 Release&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
*[[Inkscape-specific XML attributes]] — Documentation of attributes from Inkscape's XML namespace&lt;br /&gt;
*[[Environment variables]] — Overview of important environment variables that modify the behavior of Inkscape and its dependencies.&lt;br /&gt;
*[[Extension repository]] — An Internet central for Inkscape extensions&lt;br /&gt;
*[[Related programs]]&lt;br /&gt;
*[[Sponsors list]]&lt;br /&gt;
*[[Wiki Playground]]&lt;br /&gt;
&lt;br /&gt;
===[[Lib2geom]]===&lt;br /&gt;
*[[Lib2geom]]&lt;br /&gt;
*[[Working with 2Geom FAQ]] — Real-life questions answered about using 2Geom in real code&lt;br /&gt;
*[[Lib2geom py2geom]] — Python bindings to 2geom. With this you can use the power of 2geom in Python scripts.&lt;br /&gt;
&lt;br /&gt;
===Historical pages===&lt;br /&gt;
These pages are outdated, but linked here for posterity.&lt;br /&gt;
&lt;br /&gt;
*[[Working with Bazaar]] — Our former control version system, no longer used. See [[Working with Git]] for current instructions.&lt;br /&gt;
* [[Creating a new SPObject]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*&lt;br /&gt;
[[:Category:Wiki Attic|Wiki Attic]] — Pages that are no longer relevant but kept for historical value&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Top level categories]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Boost_shared_pointers&amp;diff=122095</id>
		<title>Boost shared pointers</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Boost_shared_pointers&amp;diff=122095"/>
		<updated>2023-02-04T03:29:15Z</updated>

		<summary type="html">&lt;p&gt;PBS: Move to attic&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Notice: C++11 =&lt;br /&gt;
C++11 offers &amp;lt;tt&amp;gt;unique_ptr&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;shared_ptr&amp;lt;/tt&amp;gt;, and should be used instead.&lt;br /&gt;
&lt;br /&gt;
==Boost shared pointers==&lt;br /&gt;
The Boost library is a set of peer-reviewed C++ libraries that play well with STL, and some of them are considered for inclusion in future versions of the C++ standard. They are generally regarded as well designed, useful, and powerful. They are also cross platform. All header-only Boost libraries can be used in Inkscape, since Boost is an accepted compile time dependency.&lt;br /&gt;
&lt;br /&gt;
This short tutorial will deal with the use of Boost shared pointers. They can be used to significantly reduce the amount of code needed for efficient memory management. Shared pointers with semantics identical to Boost ones are part of the C++ Library Technical Report 1, and will be included as part of the standard library in a future revision of C++.&lt;br /&gt;
&lt;br /&gt;
If the ownership of objects is clear, investigate whether the simpler and lower overhead &amp;lt;tt&amp;gt;std::auto_ptr&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;boost::scoped_ptr&amp;lt;/tt&amp;gt; can meet your needs. If you mainly need to use &amp;lt;tt&amp;gt;shared_ptr&amp;lt;/tt&amp;gt; to put smart pointers in containers (since &amp;lt;tt&amp;gt;std::auto_ptr&amp;lt;/tt&amp;gt; cannot be used in this way), investigate Boost pointer containers like &amp;lt;tt&amp;gt;boost::ptr_list&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Rationale==&lt;br /&gt;
The memory management problem is how to guarantee that a program does not have any memory leaks. It can be solved with simple reference conuting if there are no cycles between objects. There are two approaches to solve it when :&lt;br /&gt;
# Garbage collection. Objects are created and left alone when no longer needed. When the memory is low, a background process kicks in and reclaims memory used by objects that can no longer be reached from the stack. This is the method used in most scripting languages, as well as Java and CLR. However, it has some drawbacks. Firstly, destructors can run at some indeterminate time after the object becomes unused, or never. This precludes using the RAII idiom. Secondly, there is some memory overhead associated with maintaining a garbage-collected heap. Thirdly, it requires some type information to be preserved at runtime, to determine where the garbage collector should look for object references - otherwise unrelated data can alias pointers, preventing some objects from being colleted.&lt;br /&gt;
# Shared and weak pointers. This approach uses two types of object references to break the cycles. A shared pointer will keep the pointed object in memory, while a weak pointer can be used to obtain a shared pointer to the same object, but will not prevent the object from destruction. This approach requires more programming effort and adds some (negligible) overhead to each operation on the shared pointer, but makes object destruction predictable.&lt;br /&gt;
&lt;br /&gt;
The second method suits C++ better than garbage collection. Firstly, there is generally little to no type information present at runtime to determine where to look for pointers to objects; Garbage collectors for C++ and C must assume that all data on the stack and all contents of the objects' memory are pointers to other objects (also known as conservative garbage collection). This can cause some unused memory to never be freed, because some integer in some object happens to have the same value as some other object's address. Secondly, since the C++ standard library and other libraries frequently use the RAII idiom, many C++ objects (like &amp;lt;tt&amp;gt;std::fstream&amp;lt;/tt&amp;gt;) have non-trivial destructors. If those destructors are not run right after the object becomes unused, the program may hold on to resources it no longer uses, like file descriptors or database connections. Finally, using tricks like storing the color of a red-black tree node in the low bit of a pointer can in theory cause objects to be collected before they become unused, bu this can be mitigated with anchoring.&lt;br /&gt;
&lt;br /&gt;
==Shared pointers==&lt;br /&gt;
Shared pointer is a smart pointer (a C++ object wih overloaded &amp;lt;tt&amp;gt;operator*()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;operator-&amp;gt;()&amp;lt;/tt&amp;gt;) that keeps a pointer to an object and a pointer to a shared reference count. Every time a copy of the smart pointer is made using the copy constructor, the reference count is incremented. When a shared pointer is destroyed, the reference count for its object is decremented. Shared pointers constructed from raw pointers initially have a reference count of 1. When the reference count reaches 0, the pointed object is destroyed, and the memory it occupies is freed. You do not need to explicitly destroy objects: it will be done automatically when the last pointer's destructor runs.&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
When creating a new object with &amp;lt;tt&amp;gt;new&amp;lt;/tt&amp;gt;, use it as a constructor argument of a &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; foo_ptr(new Foo());&lt;br /&gt;
You can reassign the pointer to a new object using the member function &amp;lt;tt&amp;gt;reset()&amp;lt;/tt&amp;gt;. This will decrease the reference count of the old object, if any, and reinitialize the object with the argument and a reference count of 1.&lt;br /&gt;
 foo_ptr.reset(new Foo());&lt;br /&gt;
&lt;br /&gt;
Note however that you cannot obtain a shared pointer to an object from a raw pointer. This will cause a segmentation fault:&lt;br /&gt;
 void some_function(Foo *f) {&lt;br /&gt;
    boost::shared_ptr&amp;lt;Foo&amp;gt; fptr(f);&lt;br /&gt;
    fptr-&amp;gt;something();&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
 Foo *foo = new Foo();&lt;br /&gt;
 some_function(foo);&lt;br /&gt;
 foo-&amp;gt;something();&lt;br /&gt;
That's because the temporary &amp;lt;tt&amp;gt;fptr&amp;lt;/tt&amp;gt; is initialized with a reference count of 1. After the function returns, the reference count is zero and the object is destroyed. &amp;lt;tt&amp;gt;foo-&amp;gt;something()&amp;lt;/tt&amp;gt; will then fail, because &amp;lt;tt&amp;gt;foo&amp;lt;/tt&amp;gt; no longer points to a valid object.&lt;br /&gt;
&lt;br /&gt;
An uninitialized shared pointer is ''empty''. This is equivalent to NULL for raw pointers. You can check for an empty shared pointer using this code:&lt;br /&gt;
 if (foo) {&lt;br /&gt;
    // foo points to an object&lt;br /&gt;
 } else {&lt;br /&gt;
    // foo is empty&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
A raw pointer can be retrieved using the &amp;lt;tt&amp;gt;get()&amp;lt;/tt&amp;gt; method.&lt;br /&gt;
 Foo *rawptr = fptr.get();&lt;br /&gt;
&lt;br /&gt;
==Weak pointers==&lt;br /&gt;
Weak pointers can only be used to obtain a shared pointer to the same object, and check whether the object was already destroyed. They can be used to break circular references between objects. A weak pointer that points to an object that was already destroyed is called ''expired''. Empty weak pointers (that don't point to any object) are also expired.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; foo(new Foo());&lt;br /&gt;
 boost::weak_ptr&amp;lt;Foo&amp;gt; weakfoo(foo);&lt;br /&gt;
 ...&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; fptr = weakfoo.lock();&lt;br /&gt;
 if (fptr) {&lt;br /&gt;
    // object still exists&lt;br /&gt;
 } else {&lt;br /&gt;
    // object already destroyed&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Weak pointers cannot be dereferenced for thread safety reasons. If some other thread destroyed the object after you checked the weak pointer for expiry but before you used it, you would get a crash. Shared pointers can be obtained from weak pointers using use of two methods:&lt;br /&gt;
# &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;Foo&amp;gt; fptr = weakfoo.lock();&amp;lt;/tt&amp;gt; - fptr will be empty if &amp;lt;tt&amp;gt;weakfoo&amp;lt;/tt&amp;gt; is expired. An exception will never be thrown.&lt;br /&gt;
# &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;Foo&amp;gt; fptr(weakfoo);&amp;lt;/tt&amp;gt; - the exception &amp;lt;tt&amp;gt;std::tr1::bad_weak_ptr&amp;lt;/tt&amp;gt; will be thrown if &amp;lt;tt&amp;gt;weakfoo&amp;lt;/tt&amp;gt; is expired.&lt;br /&gt;
&lt;br /&gt;
==Shared pointers in member functions==&lt;br /&gt;
Sometimes a shared pointer to the current object is needed in its member function. Boost provides a mixin template class called &amp;lt;tt&amp;gt;enable_shared_from_this&amp;lt;/tt&amp;gt;, which defines a no-argument member function called &amp;lt;tt&amp;gt;shared_from_this()&amp;lt;/tt&amp;gt;. It returns a shared pointer to &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt;. At least one instance of a shared pointer to this object must exist before the first use of this method; otherwise it has undefined results (usually crash). The best way to guarantee that this is condition met is to make the constructor protected and provide a factory method that returns a shared pointer to the newly created object.&lt;br /&gt;
 class Foo : public boost::enable_shared_from_this&amp;lt;Foo&amp;gt; {&lt;br /&gt;
 public:&lt;br /&gt;
    void someMethod() {&lt;br /&gt;
       boost::shared_ptr&amp;lt;Foo&amp;gt; this_ = shared_from_this();&lt;br /&gt;
       // use pointer...&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
    static boost::shared_ptr&amp;lt;Foo&amp;gt; create() {&lt;br /&gt;
       return boost::shared_ptr&amp;lt;Foo&amp;gt;(new Foo());&lt;br /&gt;
    }&lt;br /&gt;
 protected:&lt;br /&gt;
    Foo() { ... }&lt;br /&gt;
    ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm Full shared_ptr documentation at official Boost website]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html Boost Pointer Container library]&lt;br /&gt;
[[Category:Wiki Attic]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Boost_shared_pointers&amp;diff=122094</id>
		<title>Boost shared pointers</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Boost_shared_pointers&amp;diff=122094"/>
		<updated>2023-02-04T03:23:53Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update C++11 notice&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Notice: C++11 =&lt;br /&gt;
C++11 offers &amp;lt;tt&amp;gt;unique_ptr&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;shared_ptr&amp;lt;/tt&amp;gt;, and should be used instead.&lt;br /&gt;
&lt;br /&gt;
==Boost shared pointers==&lt;br /&gt;
The Boost library is a set of peer-reviewed C++ libraries that play well with STL, and some of them are considered for inclusion in future versions of the C++ standard. They are generally regarded as well designed, useful, and powerful. They are also cross platform. All header-only Boost libraries can be used in Inkscape, since Boost is an accepted compile time dependency.&lt;br /&gt;
&lt;br /&gt;
This short tutorial will deal with the use of Boost shared pointers. They can be used to significantly reduce the amount of code needed for efficient memory management. Shared pointers with semantics identical to Boost ones are part of the C++ Library Technical Report 1, and will be included as part of the standard library in a future revision of C++.&lt;br /&gt;
&lt;br /&gt;
If the ownership of objects is clear, investigate whether the simpler and lower overhead &amp;lt;tt&amp;gt;std::auto_ptr&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;boost::scoped_ptr&amp;lt;/tt&amp;gt; can meet your needs. If you mainly need to use &amp;lt;tt&amp;gt;shared_ptr&amp;lt;/tt&amp;gt; to put smart pointers in containers (since &amp;lt;tt&amp;gt;std::auto_ptr&amp;lt;/tt&amp;gt; cannot be used in this way), investigate Boost pointer containers like &amp;lt;tt&amp;gt;boost::ptr_list&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Rationale==&lt;br /&gt;
The memory management problem is how to guarantee that a program does not have any memory leaks. It can be solved with simple reference conuting if there are no cycles between objects. There are two approaches to solve it when :&lt;br /&gt;
# Garbage collection. Objects are created and left alone when no longer needed. When the memory is low, a background process kicks in and reclaims memory used by objects that can no longer be reached from the stack. This is the method used in most scripting languages, as well as Java and CLR. However, it has some drawbacks. Firstly, destructors can run at some indeterminate time after the object becomes unused, or never. This precludes using the RAII idiom. Secondly, there is some memory overhead associated with maintaining a garbage-collected heap. Thirdly, it requires some type information to be preserved at runtime, to determine where the garbage collector should look for object references - otherwise unrelated data can alias pointers, preventing some objects from being colleted.&lt;br /&gt;
# Shared and weak pointers. This approach uses two types of object references to break the cycles. A shared pointer will keep the pointed object in memory, while a weak pointer can be used to obtain a shared pointer to the same object, but will not prevent the object from destruction. This approach requires more programming effort and adds some (negligible) overhead to each operation on the shared pointer, but makes object destruction predictable.&lt;br /&gt;
&lt;br /&gt;
The second method suits C++ better than garbage collection. Firstly, there is generally little to no type information present at runtime to determine where to look for pointers to objects; Garbage collectors for C++ and C must assume that all data on the stack and all contents of the objects' memory are pointers to other objects (also known as conservative garbage collection). This can cause some unused memory to never be freed, because some integer in some object happens to have the same value as some other object's address. Secondly, since the C++ standard library and other libraries frequently use the RAII idiom, many C++ objects (like &amp;lt;tt&amp;gt;std::fstream&amp;lt;/tt&amp;gt;) have non-trivial destructors. If those destructors are not run right after the object becomes unused, the program may hold on to resources it no longer uses, like file descriptors or database connections. Finally, using tricks like storing the color of a red-black tree node in the low bit of a pointer can in theory cause objects to be collected before they become unused, bu this can be mitigated with anchoring.&lt;br /&gt;
&lt;br /&gt;
==Shared pointers==&lt;br /&gt;
Shared pointer is a smart pointer (a C++ object wih overloaded &amp;lt;tt&amp;gt;operator*()&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;operator-&amp;gt;()&amp;lt;/tt&amp;gt;) that keeps a pointer to an object and a pointer to a shared reference count. Every time a copy of the smart pointer is made using the copy constructor, the reference count is incremented. When a shared pointer is destroyed, the reference count for its object is decremented. Shared pointers constructed from raw pointers initially have a reference count of 1. When the reference count reaches 0, the pointed object is destroyed, and the memory it occupies is freed. You do not need to explicitly destroy objects: it will be done automatically when the last pointer's destructor runs.&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
When creating a new object with &amp;lt;tt&amp;gt;new&amp;lt;/tt&amp;gt;, use it as a constructor argument of a &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;/tt&amp;gt;.&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; foo_ptr(new Foo());&lt;br /&gt;
You can reassign the pointer to a new object using the member function &amp;lt;tt&amp;gt;reset()&amp;lt;/tt&amp;gt;. This will decrease the reference count of the old object, if any, and reinitialize the object with the argument and a reference count of 1.&lt;br /&gt;
 foo_ptr.reset(new Foo());&lt;br /&gt;
&lt;br /&gt;
Note however that you cannot obtain a shared pointer to an object from a raw pointer. This will cause a segmentation fault:&lt;br /&gt;
 void some_function(Foo *f) {&lt;br /&gt;
    boost::shared_ptr&amp;lt;Foo&amp;gt; fptr(f);&lt;br /&gt;
    fptr-&amp;gt;something();&lt;br /&gt;
 }&lt;br /&gt;
 ...&lt;br /&gt;
 Foo *foo = new Foo();&lt;br /&gt;
 some_function(foo);&lt;br /&gt;
 foo-&amp;gt;something();&lt;br /&gt;
That's because the temporary &amp;lt;tt&amp;gt;fptr&amp;lt;/tt&amp;gt; is initialized with a reference count of 1. After the function returns, the reference count is zero and the object is destroyed. &amp;lt;tt&amp;gt;foo-&amp;gt;something()&amp;lt;/tt&amp;gt; will then fail, because &amp;lt;tt&amp;gt;foo&amp;lt;/tt&amp;gt; no longer points to a valid object.&lt;br /&gt;
&lt;br /&gt;
An uninitialized shared pointer is ''empty''. This is equivalent to NULL for raw pointers. You can check for an empty shared pointer using this code:&lt;br /&gt;
 if (foo) {&lt;br /&gt;
    // foo points to an object&lt;br /&gt;
 } else {&lt;br /&gt;
    // foo is empty&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
A raw pointer can be retrieved using the &amp;lt;tt&amp;gt;get()&amp;lt;/tt&amp;gt; method.&lt;br /&gt;
 Foo *rawptr = fptr.get();&lt;br /&gt;
&lt;br /&gt;
==Weak pointers==&lt;br /&gt;
Weak pointers can only be used to obtain a shared pointer to the same object, and check whether the object was already destroyed. They can be used to break circular references between objects. A weak pointer that points to an object that was already destroyed is called ''expired''. Empty weak pointers (that don't point to any object) are also expired.&lt;br /&gt;
&lt;br /&gt;
Here is an example:&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; foo(new Foo());&lt;br /&gt;
 boost::weak_ptr&amp;lt;Foo&amp;gt; weakfoo(foo);&lt;br /&gt;
 ...&lt;br /&gt;
 boost::shared_ptr&amp;lt;Foo&amp;gt; fptr = weakfoo.lock();&lt;br /&gt;
 if (fptr) {&lt;br /&gt;
    // object still exists&lt;br /&gt;
 } else {&lt;br /&gt;
    // object already destroyed&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Weak pointers cannot be dereferenced for thread safety reasons. If some other thread destroyed the object after you checked the weak pointer for expiry but before you used it, you would get a crash. Shared pointers can be obtained from weak pointers using use of two methods:&lt;br /&gt;
# &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;Foo&amp;gt; fptr = weakfoo.lock();&amp;lt;/tt&amp;gt; - fptr will be empty if &amp;lt;tt&amp;gt;weakfoo&amp;lt;/tt&amp;gt; is expired. An exception will never be thrown.&lt;br /&gt;
# &amp;lt;tt&amp;gt;boost::shared_ptr&amp;lt;Foo&amp;gt; fptr(weakfoo);&amp;lt;/tt&amp;gt; - the exception &amp;lt;tt&amp;gt;std::tr1::bad_weak_ptr&amp;lt;/tt&amp;gt; will be thrown if &amp;lt;tt&amp;gt;weakfoo&amp;lt;/tt&amp;gt; is expired.&lt;br /&gt;
&lt;br /&gt;
==Shared pointers in member functions==&lt;br /&gt;
Sometimes a shared pointer to the current object is needed in its member function. Boost provides a mixin template class called &amp;lt;tt&amp;gt;enable_shared_from_this&amp;lt;/tt&amp;gt;, which defines a no-argument member function called &amp;lt;tt&amp;gt;shared_from_this()&amp;lt;/tt&amp;gt;. It returns a shared pointer to &amp;lt;tt&amp;gt;this&amp;lt;/tt&amp;gt;. At least one instance of a shared pointer to this object must exist before the first use of this method; otherwise it has undefined results (usually crash). The best way to guarantee that this is condition met is to make the constructor protected and provide a factory method that returns a shared pointer to the newly created object.&lt;br /&gt;
 class Foo : public boost::enable_shared_from_this&amp;lt;Foo&amp;gt; {&lt;br /&gt;
 public:&lt;br /&gt;
    void someMethod() {&lt;br /&gt;
       boost::shared_ptr&amp;lt;Foo&amp;gt; this_ = shared_from_this();&lt;br /&gt;
       // use pointer...&lt;br /&gt;
    }&lt;br /&gt;
    ...&lt;br /&gt;
    static boost::shared_ptr&amp;lt;Foo&amp;gt; create() {&lt;br /&gt;
       return boost::shared_ptr&amp;lt;Foo&amp;gt;(new Foo());&lt;br /&gt;
    }&lt;br /&gt;
 protected:&lt;br /&gt;
    Foo() { ... }&lt;br /&gt;
    ...&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_39_0/libs/smart_ptr/shared_ptr.htm Full shared_ptr documentation at official Boost website]&lt;br /&gt;
*[http://www.boost.org/doc/libs/1_39_0/libs/ptr_container/doc/ptr_container.html Boost Pointer Container library]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Release_notes/1.3&amp;diff=122066</id>
		<title>Release notes/1.3</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Release_notes/1.3&amp;diff=122066"/>
		<updated>2023-02-03T05:31:15Z</updated>

		<summary type="html">&lt;p&gt;PBS: /* OpenGL Canvas rendering  (GPU rendering) */ Add more detail and clarifications&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Box| '''These Release Notes are in Draft Status.'''&lt;br /&gt;
&lt;br /&gt;
Note: Not all animations work, due to Wiki bugs with resizing images. Release notes will be transferred to website, there animations will be working.&lt;br /&gt;
&lt;br /&gt;
Important Links:&lt;br /&gt;
* [https://gitlab.com/inkscape/inkscape/commits/master Commit History Main Program (starting from: xxx)]&lt;br /&gt;
* [https://gitlab.com/inkscape/extensions/-/commits/master Commit History Extensions (starting from: xxx)]&lt;br /&gt;
* [https://gitlab.com/inkscape/inkscape-docs/documentation/-/tree/master Commit History Documentation (starting from: xxx)]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Box| Pending questions:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Release highlights ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--'''Released on May xx, 2023 '''--&amp;gt;&lt;br /&gt;
&amp;lt;!--'''Definitely not released yet.'''--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Pattern editor , Pattern canvas controls, and pattern performance&lt;br /&gt;
*Shape builder - New tool for building complex  shapes form simple shapes. = live Boolean tool&lt;br /&gt;
*Live Path effects Dialog - Totally new improved &lt;br /&gt;
*Filter editor - New Redesign &lt;br /&gt;
* '''and so much more!'''&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
There has be lots of effort to improve performance of all aspects in Inkscape. Lots of refactoring of various inefficient code: Display- small hacks, handling of Patterns , Paint server and filters. After that we added Multi treading to Bitmap tracing, ...(more to come)&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests?scope=all&amp;amp;state=merged&amp;amp;label_name&amp;amp;#x5B;&amp;amp;#x5D;=Project%3A%3AMultithreading&lt;br /&gt;
&lt;br /&gt;
== General user interface ==&lt;br /&gt;
[[File:Indicators of used colors.png|thumb|indicators of used colors]]&lt;br /&gt;
Color palettes have indicator color of stroke and fill of selected object. The first 4 colors are pinned and have the ability to become larger than the rest. Other than the special &amp;quot;none&amp;quot; color, the remaining 3 can be customized by editing the file &amp;lt;code&amp;gt;palettes/default-fixed-colors.gpl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:Inkscape BHd0t2kzml.gif]]&lt;br /&gt;
&lt;br /&gt;
=== New feature paste on page ===&lt;br /&gt;
You can copy and paste object from one page to another. &amp;lt;code&amp;gt;Edit &amp;gt; Specials Paste &amp;gt; Paste on page&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4695&lt;br /&gt;
&lt;br /&gt;
=== Old-style permanent snapping toolbar ===&lt;br /&gt;
An option was added in &amp;lt;code&amp;gt;Settings &amp;gt; Interface &amp;gt; Toolbars&amp;lt;/code&amp;gt; to show the detailed snapping options permanently in a dedicated toolbar, similar to Inkscape version 1.1 and earlier.&lt;br /&gt;
&lt;br /&gt;
=== Keyboard shortcuts ===&lt;br /&gt;
&lt;br /&gt;
The keyboard shortcuts for aligning objects vertically and horizontally have been moved to the numeric keypad, where the other alignment shortcuts are, too:&lt;br /&gt;
&lt;br /&gt;
* Vertical alignment was moved from &amp;lt;kbd&amp;gt;Ctrl+Alt+T&amp;lt;/kbd&amp;gt; to &amp;lt;kbd&amp;gt;'''Ctrl+Alt+Numpad 1'''&amp;lt;/kbd&amp;gt;&lt;br /&gt;
* Horizontal alignment was moved from &amp;lt;kbd&amp;gt;Ctrl+Alt+H&amp;lt;/kbd&amp;gt; to &amp;lt;kbd&amp;gt;'''Ctrl+Alt+Numpad 7'''&amp;lt;/kbd&amp;gt;&lt;br /&gt;
[[File:OKLAB.png|thumb|358x358px]]&lt;br /&gt;
If you find yourself unable to reach the new shortcuts (for example, because your laptop does not have a keypad, or because the shortcuts do not work - may be the case on Linux with Xfce), you can set them to something else by changing '''both''' the alignment shortcut '''and''' the function that now uses that shortcut (if any). Use the search in &amp;lt;code&amp;gt;Edit &amp;gt; Preferences &amp;gt; Interface &amp;gt; Keyboard&amp;lt;/code&amp;gt;. It also allows searching for shortcuts, not only for their name (e.g. search for 'ctrl+alt+t' to find the new default action that is executed when that combo is pressed).&lt;br /&gt;
&lt;br /&gt;
=== Color Picker ===&lt;br /&gt;
Added support for the '''OKLab''' and '''OKLch''' color spaces which have just been adopted into the CSS Color Module Level 4  [https://www.w3.org/TR/css-color-4/#ok-lab draft recommendation]. OKLab is described in detail by its creator in an interesting blog post. The new picker is called &amp;quot;OKHSL&amp;quot; and is available from the dropdown.&lt;br /&gt;
&lt;br /&gt;
=== '''Rulers''' ===&lt;br /&gt;
Improved look. Fixed performance penalty. Added indicator of selection (its possible to trun off in preferences)&lt;br /&gt;
&lt;br /&gt;
== Canvas ==&lt;br /&gt;
&lt;br /&gt;
Pressing '''&amp;lt;code&amp;gt;F&amp;lt;/code&amp;gt;''' temporarily hides on-canvas overlays (transformation handles, grids, guides ...). This allows quick preview of final artwork without any distractions.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4395&lt;br /&gt;
&lt;br /&gt;
Added display overlay controls in top right corners. You need to have scrollbars enable to see it.&lt;br /&gt;
&lt;br /&gt;
[[File:Canvas overlays.png|399x399px]]&lt;br /&gt;
&lt;br /&gt;
=== OpenGL (GPU) accelerated canvas ===&lt;br /&gt;
An OpenGL-accelerated display mode was added to the canvas to speed up panning, zooming and rotating.&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4133&lt;br /&gt;
&lt;br /&gt;
This is NOT a fully GPU-based renderer; content is still rendered on the CPU in exactly the same way as before, so large performance improvements are not to be expected. It does however result in a smoother display and lower CPU usage, especially on HiDPI screens.&lt;br /&gt;
&lt;br /&gt;
OpenGL mode is highly experimental and is turned off by default. It can be turned on at&lt;br /&gt;
&lt;br /&gt;
Preferences -&amp;gt; Rendering -&amp;gt; Enable OpenGL&lt;br /&gt;
&lt;br /&gt;
Note however the following caveats:&lt;br /&gt;
&lt;br /&gt;
* Due to packaging problems, when using the Linux AppImage, OpenGL support either does not work (on X11) or crashes (on Wayland).&lt;br /&gt;
* Due to GTK3 bugs, OpenGL mode crashes on Windows, blacks out the screen on MacOS, is slower than software rendering on Linux X11, and is only really usable on Wayland.&lt;br /&gt;
&lt;br /&gt;
For these reasons, it is not expected to be useful until we migrate to GTK4, where we hope that at least some of these bugs have been fixed.&lt;br /&gt;
== Tools ==&lt;br /&gt;
&lt;br /&gt;
=== Selection tool ===&lt;br /&gt;
new commands:&lt;br /&gt;
&lt;br /&gt;
* '''Reapply transform''': ''Ctrl+Alt+T''  - This allows a user to perform a transformation multiple times and works from the canvas edits or from transform dialog or the select toolbar. &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Shortcut needs to change, it opens a terminal on Linux.&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Duplicate and transform''': ''Ctrl+Alt+D'' -This performs a duplication and then reapplies the previous transform to the duplicate. &amp;lt;span style=&amp;quot;color: red;&amp;quot;&amp;gt;Shortcut needs to change, it minimizes the window on Linux.&amp;lt;/span&amp;gt;&lt;br /&gt;
* '''Clone while dragging:''' drag object + C - Drag object  move it and press C to clone in current position   https://gitlab.com/inkscape/inkscape/-/merge_requests/4752&amp;lt;br /&amp;gt; https://gitlab.com/inkscape/inkscape/-/merge_requests/4506&lt;br /&gt;
&lt;br /&gt;
[[File:Inkscape xfsvsc2oY9.gif|thumb|editing pattern on canvas]]&lt;br /&gt;
&lt;br /&gt;
=== Node tool ===&lt;br /&gt;
&lt;br /&gt;
==== Pattern editing ====&lt;br /&gt;
Pattern editing on canvas is now easier you can click on any part of pattern and it will show you controls on that position. We also outline that shows you edges of pattern. First square  controls position circle controls rotation and second square controls size  hold shift to constrain proportions. &lt;br /&gt;
&lt;br /&gt;
We also fixed performance problems with patterns so now you can have smaller patterns in project and also its possible to zoom in on pattern&lt;br /&gt;
&lt;br /&gt;
==== Lasso selection mode ====&lt;br /&gt;
We added new lasso selection mode hold alt and draw around nodes you want to select. Useful fore selecting nodes inside of complicated geometry&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4747&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Shape Builder tool (New tool) ===&lt;br /&gt;
New tool for fast shape building and Boolean operations. Shortcut &amp;lt;code&amp;gt;X&amp;lt;/code&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Use: Select multiple overlapping shapes and select shipbuilder tool. Selection will be fragmented on overlapping areas everything else is going to be hidden until you confirm operation. Now you '''Click and drag''' to combine segments together or hold '''Shift  + Click and drag''' to substract  and '''Sigle click''' on segment to split. Adding is represented by Blue color removing by pink&lt;br /&gt;
&lt;br /&gt;
[[File:Shape_builder.gif]]&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4709&lt;br /&gt;
[[File:Ezgif.com-gif-maker (12).gif|right|600x600px]]&lt;br /&gt;
&lt;br /&gt;
=== Pages tool ===&lt;br /&gt;
Have controls for margins (guids):&lt;br /&gt;
&lt;br /&gt;
* An attribute on the page element to record the margin&lt;br /&gt;
* A new html/css style box model with tests&lt;br /&gt;
* New UI to set margins in the toolbar&lt;br /&gt;
* New on canvas controls for moving margins (with ctrl/shift)&lt;br /&gt;
* New display of margins in the same canvas group as the page border&lt;br /&gt;
&lt;br /&gt;
* Snapping for page margins&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4523&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Gradient tool ===&lt;br /&gt;
&lt;br /&gt;
* Allowing to change the ''repeat'' setting when multiple gradients are selected.&lt;br /&gt;
* Showing 'Multiple gradients' in the stop list when multiple gradients are selected (instead of a random stop).&lt;br /&gt;
* Allowing the editing of the offset of the start/end stops.&lt;br /&gt;
* Keeping the stop selected after the offset is changed in the toolbar (instead of selecting the 1st stop of the gradient).&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4339&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Path Operations ==&lt;br /&gt;
&lt;br /&gt;
New commands:&lt;br /&gt;
&lt;br /&gt;
'''Fracture''' Path-&amp;gt;fracture - every overlapping path will be silted in to separate object&lt;br /&gt;
&lt;br /&gt;
'''Flatten''' Path-&amp;gt;flatten - overlapping object vi be flatten visually (it  will delete path that are hidden behind a top path). Useful for separating colors for Screen printing and offset printing&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Masking / Clipping ==&lt;br /&gt;
&lt;br /&gt;
* A new option to '''preserve clips / masks when ungrouping''' objects has been added (&amp;lt;code&amp;gt;Edit → Preferences → Behavior → Clippaths and Masks: When ungroup, clip/mask is preserved in childrens&amp;lt;/code&amp;gt;). The option is active by default. This means that when you now ungroup a group that has been clipped, the elements inside it will inherit the clip. Previously, the clip was removed and everything became un-clipped. To go back to previous default behavior, deactivate this new option. ([https://gitlab.com/inkscape/inkscape/-/merge_requests/3564 MR #3564]) --&amp;gt;&lt;br /&gt;
[[File:Pattern editor1.gif|alt=Pattern editor|right|Pattern editor]]&lt;br /&gt;
&lt;br /&gt;
== Dialogs ==&lt;br /&gt;
&lt;br /&gt;
=== Fill and stroke Dialog ===&lt;br /&gt;
&lt;br /&gt;
==== New pattern editor ====&lt;br /&gt;
Added in to UI. You can preview patterns change name,  size, rotation, offset, gaps and colors for some specific patterns. We also added collections of patterns  &amp;lt;code&amp;gt;~paint/pattern.svg&amp;lt;/code&amp;gt;  so its easier to be organized .  Since  this allows  having much more patterns preset we also added search function .&lt;br /&gt;
&lt;br /&gt;
=== Filter editor ===&lt;br /&gt;
[[File:Filter-resize.gif|alt=Filter-resize|Filter-resize|left]]&lt;br /&gt;
&lt;br /&gt;
Redesign of this dialog:&lt;br /&gt;
&lt;br /&gt;
* Filter selection moved to a popover&lt;br /&gt;
* Effects are listed in a popup menu and can be selected by searching (by name)&lt;br /&gt;
* Adjusted connector sizes to make them more compact&lt;br /&gt;
* Fixed an issue where all parameters would initially be visible in a docked filter dialog&lt;br /&gt;
* Fixed min size of parameters panel to make it fit in a narrow docked dialog&lt;br /&gt;
* Reactive layout to accommodate wide dialog&lt;br /&gt;
* Added primitive filter attributes to fe-image and fe-tile (#1417)&lt;br /&gt;
* Replaced GTK color picker with Inkscape color picker&lt;br /&gt;
&lt;br /&gt;
* Sources can now be hidden (for most use cases only the source graphics is useful; other inputs are broken or need ux work) &amp;lt;br /&amp;gt;https://gitlab.com/inkscape/inkscape/-/merge_requests/4720[[File:Inkscape Y7U4yzIFTq.gif|thumb]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Layers and Objects ===&lt;br /&gt;
UX improvements:&lt;br /&gt;
&lt;br /&gt;
* you can click and drag  to change visibility of multiple objects&lt;br /&gt;
* selecting on group does not auto expand .&lt;br /&gt;
* Selecting multiple object and and changing  visibility/locking  applies to all selected&lt;br /&gt;
* We added search feature, Its limited implmentation.it does not auto apply search and you need to search for more 3 characters&lt;br /&gt;
* we added hover  indicator for rows and  layer colors&lt;br /&gt;
* added controls for opacity and blending mode&lt;br /&gt;
&lt;br /&gt;
We added shortcuts for layers navigation and actions:&lt;br /&gt;
&lt;br /&gt;
*   arrows to  navigate&lt;br /&gt;
*   space bur confirms (select, apply, open)&lt;br /&gt;
*  shift -&amp;gt; &amp;lt;- open close group&lt;br /&gt;
* shift up down to move  in Z order&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:VirtualBoxVM I675gipqe1.gif|thumb|1017x1017px|Place holder  demo of new LPE dialog]]&lt;br /&gt;
&lt;br /&gt;
=== Live Path Effects ( LPE ) ===&lt;br /&gt;
New redesigned LPE dialog. &lt;br /&gt;
&lt;br /&gt;
The compacted design merges organization and controls into one unit. You can reorder LPE by drag and drop whole effect. It adds fast search box and fast dropdown for adding effects.&lt;br /&gt;
&lt;br /&gt;
Single LPE has 5 controls:&lt;br /&gt;
&lt;br /&gt;
* Show/Hide Controls&lt;br /&gt;
* Visibility of Effect&lt;br /&gt;
* Delete Effect&lt;br /&gt;
* Context menu &lt;br /&gt;
** Re-order&lt;br /&gt;
** Duplicate&lt;br /&gt;
** Set as default&lt;br /&gt;
** Flatten&lt;br /&gt;
&lt;br /&gt;
[[File:LPE organization.png|right|266x266px]]&lt;br /&gt;
Reorganization of LPEs:&lt;br /&gt;
&lt;br /&gt;
Since we needed more compact way show All LPEs we Decided on a list that is organizes in to 6 Categories :&lt;br /&gt;
&lt;br /&gt;
Tools ,Distort, Generate, Convert, Experimental + Favorite&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
* Setting presets for LPE was moved in to contextual menu&lt;br /&gt;
* Setting Favorite LPE was moved in to contextual menu&lt;br /&gt;
* Added New feature flatten - This will apply effect to geometry , It will apply all effects in a stuck&lt;br /&gt;
* We removed LPE gallery  (you can sill enable it in Preferences if you wish &amp;lt;code&amp;gt;Preferences -&amp;gt; Behavior -&amp;gt; LPE&amp;lt;/code&amp;gt; &lt;br /&gt;
* To see experimental LPEs you need to enable it in Preferences &amp;lt;code&amp;gt;Preferences -&amp;gt; Behavior -&amp;gt; LPE&amp;lt;/code&amp;gt; &lt;br /&gt;
* Added indicator which object is selected&lt;br /&gt;
* Added conversion commands when you select text objects - Since Text does not support LPEs yet we added workaround that convert text to path or clones the text&lt;br /&gt;
* If you select Object that is assorted with other LPE (Clone, Bool operations, Bend, Fill between many etc...) You will see button in Dialog that will take you to linked geometry/controls&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4677&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== XML Editor ===&lt;br /&gt;
[[File:Syntax highlighting.png|thumb|392x392px]]&lt;br /&gt;
We did small cosmetic changes to this dialog: smaller icons 16x16px , removed text tool tips. Added responsive layout and moved layout controls to top in to dropdown (auto layout is default option). &lt;br /&gt;
&lt;br /&gt;
==== Syntax highlighting: ====&lt;br /&gt;
For improving readability we added syntax color coding and auto line braking. This work for CSS style tag, Inline styling, d &amp;lt;path data&amp;gt; . You change change color coding themes in &amp;lt;code&amp;gt;Preferences -&amp;gt; Interface -&amp;gt; Theming&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4885  &lt;br /&gt;
&lt;br /&gt;
=== Symbols ===&lt;br /&gt;
You can drag and drop symbols on canvas and they are going to be place exactly where you dropped them. New icon &amp;quot;peace&amp;quot;. Improved performance . Add visio modern formats vssx and vsdx. Symbols are load once, not in each window &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4666&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4883&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4793&lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4784&lt;br /&gt;
&lt;br /&gt;
=== Bitmap Tracer ===&lt;br /&gt;
Got significant performance boost. Now it takes advantage of CPU multithreading. &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4702&lt;br /&gt;
&lt;br /&gt;
=== Command bar ===&lt;br /&gt;
Improved UI https://gitlab.com/inkscape/inkscape/-/merge_requests/4988&lt;br /&gt;
&lt;br /&gt;
== Filters ==&lt;br /&gt;
&lt;br /&gt;
== Live path effects ==&lt;br /&gt;
All labels are no align to one line. &lt;br /&gt;
&lt;br /&gt;
Tapper Stroke and powerstroke now handle paths with multiples subpaths https://gitlab.com/inkscape/inkscape/-/merge_requests/4906 https://gitlab.com/inkscape/inkscape/-/merge_requests/4880 &lt;br /&gt;
&lt;br /&gt;
UI and Lale clean up for: &lt;br /&gt;
&lt;br /&gt;
Roughen LPE &lt;br /&gt;
&lt;br /&gt;
https://gitlab.com/inkscape/inkscape/-/merge_requests/4872 &lt;br /&gt;
&lt;br /&gt;
== Import / Export ==&lt;br /&gt;
&lt;br /&gt;
== Templates ==&lt;br /&gt;
&lt;br /&gt;
All template dialogs (Welcome screen, New from Template, Page tool default sizes) now use the same template sizes ([https://gitlab.com/inkscape/extensions/-/merge_requests/479] MR #479)&lt;br /&gt;
&lt;br /&gt;
== Customization / Theming ==&lt;br /&gt;
added user.css to UI folder to allow tweak UI without interferences or full override other css files https://gitlab.com/inkscape/inkscape/-/merge_requests/5004&lt;br /&gt;
&lt;br /&gt;
Fixed hidden icons on menus: https://gitlab.com/inkscape/inkscape/-/merge_requests/4686&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
== macOS-specific Changes ==&lt;br /&gt;
&lt;br /&gt;
== Windows-specific Changes ==&lt;br /&gt;
&lt;br /&gt;
== Extensions ==&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
Speedup processing specialy on complex docs https://gitlab.com/inkscape/inkscape/-/merge_requests/4996&lt;br /&gt;
&lt;br /&gt;
==== General Extension Changes ====&lt;br /&gt;
&lt;br /&gt;
==== New Extensions ====&lt;br /&gt;
&lt;br /&gt;
==== Particular extensions ====&lt;br /&gt;
&lt;br /&gt;
=== Bugs fixed ===&lt;br /&gt;
&lt;br /&gt;
==== All extensions ====&lt;br /&gt;
&lt;br /&gt;
==== Particular extensions ====&lt;br /&gt;
&lt;br /&gt;
=== Extension Development ===&lt;br /&gt;
&lt;br /&gt;
==== API Changes for Third-Party Extension Developers ====&lt;br /&gt;
&lt;br /&gt;
==== Extension Development Documentation ====&lt;br /&gt;
&lt;br /&gt;
==== Under the hood ====&lt;br /&gt;
&lt;br /&gt;
== Command line ==&lt;br /&gt;
Added a new parameter --actions-file you send a list like in --actions but in a file to allow bypass windows comand line limit also for beter reuse it&lt;br /&gt;
&lt;br /&gt;
?Added new parameter --active-window / -q that run all commands to the active desktop&lt;br /&gt;
&lt;br /&gt;
== Behind the curtains ==&lt;br /&gt;
&lt;br /&gt;
== Notable bugfixes ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Crash fixes ===&lt;br /&gt;
&lt;br /&gt;
Fixed a crash that occurred …&lt;br /&gt;
&lt;br /&gt;
* when …&lt;br /&gt;
&lt;br /&gt;
=== Other bug fixes ===&lt;br /&gt;
&lt;br /&gt;
* LPE related Undo bugs  https://gitlab.com/inkscape/inkscape/-/merge_requests/4520&lt;br /&gt;
*Fixed bspline LPE with cusp nodes when start using with node tool https://gitlab.com/inkscape/inkscape/-/merge_requests/5016&lt;br /&gt;
*Uses retain LPE correctly when unliked or convert to paths. Old convert to paths is available by prefs. https://gitlab.com/inkscape/inkscape/-/merge_requests/5016&lt;br /&gt;
&lt;br /&gt;
=== Even more bug fixes ===&lt;br /&gt;
&lt;br /&gt;
There were even more issues fixed than those listed above, but these probably only affect a small portion of users, or are relevant for development and packaging only.&lt;br /&gt;
&lt;br /&gt;
For a complete list, visit [https://gitlab.com/inkscape/inkscape/-/issues?milestone_title=Inkscape+1.3 our GitLab issue tracker] and see the [https://gitlab.com/inkscape/inkscape/-/commits/1.3.x commit history].&lt;br /&gt;
&lt;br /&gt;
== Translations ==&lt;br /&gt;
&lt;br /&gt;
The following UI translations received updates:&lt;br /&gt;
&lt;br /&gt;
* … &lt;br /&gt;
&lt;br /&gt;
The Windows installer translation was updated for:&lt;br /&gt;
&lt;br /&gt;
* … &lt;br /&gt;
&lt;br /&gt;
The following documentation translations received updates:&lt;br /&gt;
&lt;br /&gt;
* … &lt;br /&gt;
&lt;br /&gt;
=== Contributing to interface translations ===&lt;br /&gt;
&lt;br /&gt;
Want to help with translations? [https://inkscape.org/contribute/translations/ Learn how to help!]&lt;br /&gt;
&lt;br /&gt;
== Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Contributing to documentation and documentation translation ===&lt;br /&gt;
Contributions to the documentation translations, as well as improvements to its contents, are welcome at [https://gitlab.com/inkscape/inkscape-docs/documentation the inkscape-docs repository].&lt;br /&gt;
&lt;br /&gt;
== Website ==&lt;br /&gt;
&lt;br /&gt;
== Important changes for packagers ==&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
== Other releases ==&lt;br /&gt;
&lt;br /&gt;
{{:Release notes}}&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122065</id>
		<title>Inkscape</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Inkscape&amp;diff=122065"/>
		<updated>2023-02-03T05:08:11Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update latest hackfest to 2023 Bensberg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a freeform area for Inkscape development and discussion. Curious about [[wiki syntax]]?&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
== Project Info ==&lt;br /&gt;
* [http://www.inkscape.org/ Inkscape Homepage]&lt;br /&gt;
* [[About Inkscape]]&lt;br /&gt;
* [[Features of Inkscape|Features]]&lt;br /&gt;
* [[FAQ]] — Frequently Asked Questions&lt;br /&gt;
* [[Supported operating systems]]&lt;br /&gt;
* [[Tools]] — Supporting Tools and Applications&lt;br /&gt;
* [[Galleries]]&lt;br /&gt;
* [[Inkscape coverage|Coverage]] — Awards, articles, presentations, books about Inkscape&lt;br /&gt;
* [[Inkscape popularity|Popularity]]&lt;br /&gt;
* [[Inkscape invariants|Inkscape's Mission]]&lt;br /&gt;
* [https://inkscape.org/en/community/ Communication] — How to reach us&lt;br /&gt;
* [[Announcement to Sodipodi]] — This started it all&lt;br /&gt;
* [[Branding]]&lt;br /&gt;
* [[Travel Reimbursement Policy]]&lt;br /&gt;
* [[Funded Project System Development]]&lt;br /&gt;
* [[:Category:Hackfest|Hackfests]]&lt;br /&gt;
** upcoming/proposed events: [[Hackfest2023_Bensberg|2023 Bensberg]]&lt;br /&gt;
** past events:&lt;br /&gt;
::: [[Hackfest2019 SCALE|2019 Pasadena (SCALE)]], [[Hackfest2019 Saarbrücken|2019 Saarbrücken (LGM)]]&lt;br /&gt;
::: [[Hackfest2018|2018 Boston]], [[Hackfest2018 LGM|2018 Seville (LGM)]], [[Hackfest2018 Kiel|2018 Kiel]]&lt;br /&gt;
::: [[Hackfest2017|2017 Paris]]&lt;br /&gt;
::: [[Hackfest2016|2016 Leeds (LGM)]]&lt;br /&gt;
::: [[Hackfest2015|2015 Toronto (LGM)]]&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== User Documentation ==&lt;br /&gt;
* [[Installing Inkscape|Installation]]&lt;br /&gt;
* [[International and Local Communities]]&lt;br /&gt;
* [[Inkscape glossary]]&lt;br /&gt;
* [[User manual information]] — Where to find the free Inkscape manual and how to contribute to it&lt;br /&gt;
* [http://inkscape.org/en/learn/tutorials/ Tutorials]&lt;br /&gt;
* [[Inkscape SVG vs. plain SVG]]&lt;br /&gt;
* [[Output format requirements]] — What's needed to save in some formats&lt;br /&gt;
* [[Extension requirements]] — What's needed to use some extensions (slightly outdated)&lt;br /&gt;
* [[Extension reference]] — What each extension does (slightly outdated)&lt;br /&gt;
* [[Connector tool tutorial]]&lt;br /&gt;
* [[Installing fonts]]&lt;br /&gt;
* [[Emergency save]] — Recovery in case Inkscape crashed&lt;br /&gt;
* [[Release notes]]&lt;br /&gt;
** ''[[Release notes/1.3|Inkscape 1.3]]'' &amp;amp;mdash; ''development branch''&lt;br /&gt;
** '''[[Release notes/1.2|Inkscape 1.2]]''' ([[Release notes/1.2.1|1.2.1]], [[Release_notes/1.2.2|1.2.2]]) &amp;amp;mdash; ''current stable release branch''&lt;br /&gt;
** [[Release notes/1.1|Inkscape 1.1]] ([[Release notes/1.1.1|1.1.1]], [[Release notes/1.1.2|1.1.2]])&lt;br /&gt;
* [[Announcing Releases]] (slightly outdated)&lt;br /&gt;
* [[Release Process Debrief]] (slightly outdated)&lt;br /&gt;
* [[Tricks and tips]] — Miscellaneous advice, may be slightly outdated&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 33%; background: #EEE; padding: 1em;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Help Inkscape Without Coding ==&lt;br /&gt;
* [[Help wanted]]&lt;br /&gt;
* [[Bug management]]&lt;br /&gt;
** [[Projects#Bug_Triage]]&lt;br /&gt;
* [[Testing]]&lt;br /&gt;
** [[macOS alpha]]&lt;br /&gt;
* [[Translation information]]&lt;br /&gt;
* [[WebSite]]&lt;br /&gt;
* [[Inkscape Classes]]&lt;br /&gt;
* [[Conferences]]&lt;br /&gt;
* [[Fundraising Ideas]]&lt;br /&gt;
* [[Creating Inkscape distributions]] — How to build packages&lt;br /&gt;
* [[Stable branch updates]]&lt;br /&gt;
* [[Updating tracker items]]&lt;br /&gt;
* [[Tutorials and help]]&lt;br /&gt;
* [[How to start a page]] — How to use the wiki&lt;br /&gt;
* [[Creating screencasts]]&lt;br /&gt;
* [[About-Screen contest]]&lt;br /&gt;
* [[social media|Participate in social media]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top: 1em; padding: .5em 1em 1em; border: 1px solid #62C012;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Developer Documentation ==&lt;br /&gt;
{| style=&amp;quot;width: 100%;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;vertical-align: top;&amp;quot;&lt;br /&gt;
| style=&amp;quot;width: 50%; padding-right: 1em;&amp;quot; |&lt;br /&gt;
=== First Steps ===&lt;br /&gt;
* [[Working with Git]] — How to obtain the source code. A quick start on how to use our version control system.&lt;br /&gt;
* [[Compiling Inkscape]]&lt;br /&gt;
* [[Developer manual]] — Various important information, be sure to read this before coding&lt;br /&gt;
* [[Debugging Inkscape|Debugging]] — Random tips to help debug problems&lt;br /&gt;
* [[Janitorial tasks]] — Small tasks that need doing&lt;br /&gt;
* [[Doxygen documentation]]&lt;br /&gt;
* [[Working with CMake]] — Getting started with CMake coding for configuring and building Inkscape&lt;br /&gt;
&lt;br /&gt;
=== Developer tutorials ===&lt;br /&gt;
* [[Architectural overview]] — A high-level look at Inkscape&lt;br /&gt;
* [[Preferences subsystem]] — Creating and using preference values&lt;br /&gt;
&amp;lt;!-- * XML subsystem — How to manipulate the XML representation of a document&lt;br /&gt;
* Display subsystem — How to make things appear on the canvas&lt;br /&gt;
* Tools subsystem — How to create a new tool --&amp;gt;&lt;br /&gt;
* Extensions&lt;br /&gt;
** [[Extension subsystem]] — An overview of the functionality provided by extensions and the possible implementations&lt;br /&gt;
** [[Script extensions]] — Extend Inkscape easily using scripting languages (Python, Perl, …)&lt;br /&gt;
** [[Python modules for extensions]] — Some helpful routines for use in Python script extensions&lt;br /&gt;
** [[INX extension descriptor format]]&lt;br /&gt;
* [[Creating Live Path Effects]]&lt;br /&gt;
* [[Boost shared pointers]]&lt;br /&gt;
* [[Using libsigc++ signals]]&lt;br /&gt;
* [[Windows development on Linux]]&lt;br /&gt;
&lt;br /&gt;
=== User Interface Discussion ===&lt;br /&gt;
* [[Interface translation]]&lt;br /&gt;
* [[Adding interface verbs]]&lt;br /&gt;
* [[Accessible graphics]]&lt;br /&gt;
* [[Object Manager]]&lt;br /&gt;
* [[Dialogs reorganization]]&lt;br /&gt;
* [[Modal interfaces]]&lt;br /&gt;
* [[Text usability]] — Text tool and dialog&lt;br /&gt;
* [[KeyboardShortcutsToDo]]&lt;br /&gt;
** [[Keyboard profiles]] — How you can help &lt;br /&gt;
* [[Statusbar API]]&lt;br /&gt;
* [[Animation-(Timeline)]]&lt;br /&gt;
* [[Free Desktop Graphic Suite]]&lt;br /&gt;
* [[Skeletal Strokes]] — Brushes, Strokes, Pressure Sensibility...&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;width: 50%;&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
=== Development Discussion ===&lt;br /&gt;
* [[Roadmap]] — The main todo list&lt;br /&gt;
* [[Tracking Dependencies|Dependencies]] — What libs are needed to build Inkscape&lt;br /&gt;
* [[C++11]] — Which C++11 features can be used&lt;br /&gt;
* [[New feature proposals]]&lt;br /&gt;
* [[Extension architecture proposals]]&lt;br /&gt;
* [[Coding Style|Coding Style Discussion]]&lt;br /&gt;
* [[File types]]&lt;br /&gt;
* [[Application icons]] — Application + Interface&lt;br /&gt;
* [[Icons]]&lt;br /&gt;
* [[Color management]]&lt;br /&gt;
* [[Printing subsystem]]&lt;br /&gt;
* [[SVG Tiny Compliance]]&lt;br /&gt;
* [[SVG Test Suite Compliance]] — [[W3C]] full test suite&lt;br /&gt;
* [[CSS Support]]&lt;br /&gt;
* [[Google Summer of Code]]&lt;br /&gt;
* [[Improved Media Management]]&lt;br /&gt;
* [[UI Mockup Screenshots]]&lt;br /&gt;
* [[Swatch Book]]&lt;br /&gt;
* [[Tablet Dialog]]&lt;br /&gt;
* [[ViewBoxToDo]] — View box support info&lt;br /&gt;
* [[Caching]]&lt;br /&gt;
* [[Canvas Rendering Profiling]]&lt;br /&gt;
* [[UI and Document coordinates‎]]&lt;br /&gt;
* [[GtkMMification]] — Replace C boilerplate with gtkmm objects&lt;br /&gt;
* [[CMake Tasks]] — Converting the Inkscape build system to CMake&lt;br /&gt;
* [[Bug Reporting Workflow]] — Options for improving Inkscape bug workflow from user to developer&lt;br /&gt;
* [[1.0 Release Bug Fix List]] — List of bugs that need to be fixed for 1.0&lt;br /&gt;
* [[1.0 Release Planning]] — Roadmap and planning for 1.0 Release&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous ===&lt;br /&gt;
* [[Inkscape-specific XML attributes]] — Documentation of attributes from Inkscape's XML namespace&lt;br /&gt;
* [[Environment variables]] — Overview of important environment variables that modify the behavior of Inkscape and its dependencies. &lt;br /&gt;
* [[Extension repository]] — An Internet central for Inkscape extensions&lt;br /&gt;
* [[Related programs]]&lt;br /&gt;
* [[Sponsors list]]&lt;br /&gt;
* [[Wiki Playground]]&lt;br /&gt;
&lt;br /&gt;
=== [[Lib2geom]] ===&lt;br /&gt;
* [[Lib2geom]]&lt;br /&gt;
* [[Working with 2Geom FAQ]] — Real-life questions answered about using 2Geom in real code&lt;br /&gt;
* [[Lib2geom py2geom]] — Python bindings to 2geom. With this you can use the power of 2geom in Python scripts.&lt;br /&gt;
&lt;br /&gt;
=== Historical pages ===&lt;br /&gt;
These pages are outdated, but linked here for posterity.&lt;br /&gt;
&lt;br /&gt;
* [[Working with Bazaar]] — Our former control version system, no longer used. See [[Working with Git]] for current instructions.&lt;br /&gt;
* [[Creating a new SPObject]]&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [[:Category:Wiki Attic|Wiki Attic]] — Pages that are no longer relevant but kept for historical value&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;br /&gt;
&lt;br /&gt;
[[Category:Top level categories]]&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
	<entry>
		<id>https://wiki.inkscape.org/wiki/index.php?title=Hackfest2020_Rennes&amp;diff=122064</id>
		<title>Hackfest2020 Rennes</title>
		<link rel="alternate" type="text/html" href="https://wiki.inkscape.org/wiki/index.php?title=Hackfest2020_Rennes&amp;diff=122064"/>
		<updated>2023-02-03T04:56:09Z</updated>

		<summary type="html">&lt;p&gt;PBS: Update postponement date to 2023&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;span style=&amp;quot;font-size:32px;font-weight:bold;color:darkred&amp;quot;&amp;gt;POSTPONED TO 2023&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This page details the planning of Inkscape's &amp;lt;span style=&amp;quot;color:darkred&amp;quot;&amp;gt;PROPOSED&amp;lt;/span&amp;gt; 2020 hackfest in Rennes, France, May ? to May ?. It is just prior to LGM which is from May 26 to May 29th.&lt;br /&gt;
&lt;br /&gt;
Other pages: [[Hackfest2020 Rennes Topics]], [[Hackfest2020 Rennes Attendees]].&lt;br /&gt;
&lt;br /&gt;
Old: [[Hackfest2019 Saarbrücken]], [[Hackfest2019 SCALE]], [[Hackfest2018 Kiel]], [[Hackfest2018 LGM]], [[Hackfest2018]], [[Hackfest2017]], [[Hackfest2016]], [[Hackfest2015]].&lt;br /&gt;
&lt;br /&gt;
= Hackfest: Rennes, France =&lt;br /&gt;
&lt;br /&gt;
==Description==&lt;br /&gt;
&lt;br /&gt;
A hackfest! We will work on Inkscape bugs, new features, and packaging as well as website issues; in fact anything that can benefit from developers and users being physically in the same space.&lt;br /&gt;
&lt;br /&gt;
The hackfest will take place before (and continue informally through) the [https://libregraphicsmeeting.org/2020/ 2020 LGM conference].&lt;br /&gt;
&lt;br /&gt;
==Rennes==&lt;br /&gt;
&lt;br /&gt;
Rennes is a city about two hours by train west of Paris.&lt;br /&gt;
&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Rennes Rennes on Wikipedia]&lt;br /&gt;
* [https://www.tourisme-rennes.com/en Tourism (official)]&lt;br /&gt;
&lt;br /&gt;
==Venue==&lt;br /&gt;
&lt;br /&gt;
The hackfest will take place at Activdesign, 11b rue Jean le Hô. It's an art school who teach Inkscape, Krita, Blender and Godot.&lt;br /&gt;
&lt;br /&gt;
==LGM==&lt;br /&gt;
&lt;br /&gt;
Tuesday, 26th of May through Friday, 29th of May.&lt;br /&gt;
&lt;br /&gt;
* Tuesday and Wednesday: ISTIC - Rennes 1 University.&lt;br /&gt;
* Thursday and Friday: &amp;quot;Le Jardin Moderne&amp;quot; &amp;amp; Activdesign&lt;br /&gt;
&lt;br /&gt;
==Catering==&lt;br /&gt;
The center of the city is plenty of fast food or restaurant. The center is at 20 min by bus. Otherwise, there is some fast food near walking (burger king, and sandwich) or the restaurant of the Jardin Moderne (closed on monday) at 5 min by feet.&lt;br /&gt;
&lt;br /&gt;
==Facilities==&lt;br /&gt;
&lt;br /&gt;
* Wireless&lt;br /&gt;
* Europlug type C and F.&lt;br /&gt;
* LCD projector&lt;br /&gt;
* white board&lt;br /&gt;
* Café, Tea, micro-waves, water&lt;br /&gt;
* 1 big room with table and chair&lt;br /&gt;
* 1 sofa&lt;br /&gt;
&lt;br /&gt;
==Nearby Amenities==&lt;br /&gt;
The center is at 20 min in bus.&lt;br /&gt;
&lt;br /&gt;
==Hotels==&lt;br /&gt;
In the center of the city you have some hostels with ** or *****.&lt;br /&gt;
Near Activdesign there is an ibis budget.&lt;br /&gt;
&lt;br /&gt;
==Hackfest Dinner==&lt;br /&gt;
&lt;br /&gt;
An informal dinner will be held on ?.&lt;br /&gt;
Lot of choice of restaurant : japonese, breton, italian, marocco. All are very good. Maybe is depending on the number. Japonese restaurant is quite little and the marocco is bigger and also very good. The breton are plenty but the good one have to be booked.&lt;br /&gt;
&lt;br /&gt;
==Attendance==&lt;br /&gt;
&lt;br /&gt;
Anybody interested in Inkscape is welcome to attend. Funding support for travel expenses is based on past contributions to Inkscape. See the [[Hackfest2020 Rennes Attendees]] page for more details.&lt;br /&gt;
&lt;br /&gt;
==Hackfest Topics and Schedule==&lt;br /&gt;
&lt;br /&gt;
A schedule will be developed based on input from attendees and the Inkscape community. See the [[Hackfest2020 Rennes Topics]] page for further details.&lt;br /&gt;
&lt;br /&gt;
==Helpers==&lt;br /&gt;
&lt;br /&gt;
The following folk have offered to assist with organization work, in limited capacities:&lt;br /&gt;
&lt;br /&gt;
* You&lt;br /&gt;
* And you?&lt;br /&gt;
* Tav&lt;br /&gt;
* Elisa (working at Activdesign)&lt;br /&gt;
&lt;br /&gt;
[[Category:Hackfest]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&lt;/div&gt;</summary>
		<author><name>PBS</name></author>
	</entry>
</feed>