summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Vaněk <arkamar@atlas.cz>2021-07-05 11:17:05 +0200
committerAndreas K. Hüttel <dilfridge@gentoo.org>2021-09-25 17:58:54 +0200
commitb5cf24fbb7854095f11b294e4999374fe2cdaadc (patch)
tree398f2a4c0a019e19b017a37ef9e4ca42e1ba0d7a /media-gfx
parentmedia-gfx/inkscape: sync live (diff)
downloadgentoo-b5cf24fbb7854095f11b294e4999374fe2cdaadc.tar.gz
gentoo-b5cf24fbb7854095f11b294e4999374fe2cdaadc.tar.bz2
gentoo-b5cf24fbb7854095f11b294e4999374fe2cdaadc.zip
media-gfx/inkscape: add 1.1
- Add optional readline support - gtkspell dependency was changed to gspell, aspell is not required anymore - backported sentinel patch from upstream in order to support musl libc - dropping ~hppa and ~ia64 keyword because they are missing in app-text/gspell dependency Closes: https://bugs.gentoo.org/791925 Signed-off-by: Petr Vaněk <arkamar@atlas.cz> Closes: https://github.com/gentoo/gentoo/pull/22353 Signed-off-by: Andreas K. Hüttel <dilfridge@gentoo.org>
Diffstat (limited to 'media-gfx')
-rw-r--r--media-gfx/inkscape/Manifest1
-rw-r--r--media-gfx/inkscape/files/inkscape-1.1-sentinels.patch727
-rw-r--r--media-gfx/inkscape/inkscape-1.1.ebuild162
3 files changed, 890 insertions, 0 deletions
diff --git a/media-gfx/inkscape/Manifest b/media-gfx/inkscape/Manifest
index 595bd98db344..1810db369290 100644
--- a/media-gfx/inkscape/Manifest
+++ b/media-gfx/inkscape/Manifest
@@ -1 +1,2 @@
DIST inkscape-1.0.2.tar.xz 32421620 BLAKE2B c3f9c37b15343ba0955a6d06810aef5fb9e035a240f99579301b8cd93858a62b5ed1a3ff528a9642ec74b8900305495236cf7f4c672864369a4e33dca3b34bd4 SHA512 f4fbc627c0f07db11194715c505b771a60af29a9a7f8be0232e4f7eb6b1c5814c3f160c2003d64ec62aeb92ef44174320a47aa6b6abc7a67cc27c996cba9522d
+DIST inkscape-1.1.tar.xz 34203156 BLAKE2B 38896509dcdcf1ef18523c790855035ef16dfae75e27c2d69f782270f52a579557edcb790bef30f3210b9f797a619369d7d16dd23f098debdd8e5b6abf9b30aa SHA512 54b75f8794d748ef59d5b719ea04e3debadc1a5cf3f62f14254502567973bbd634850edd0a3bc082be878dacf041e9bd10982c4846bf154f89aa5319eda4ee80
diff --git a/media-gfx/inkscape/files/inkscape-1.1-sentinels.patch b/media-gfx/inkscape/files/inkscape-1.1-sentinels.patch
new file mode 100644
index 000000000000..b4768d44f278
--- /dev/null
+++ b/media-gfx/inkscape/files/inkscape-1.1-sentinels.patch
@@ -0,0 +1,727 @@
+From 3abc0aac5ffed8a130086e93b1fdba596f505a1c Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Petr=20Van=C4=9Bk?= <arkamar@atlas.cz>
+Date: Fri, 2 Jul 2021 12:10:48 +0200
+Subject: [PATCH] Fix sentinel errors for builds against musl libc
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This change fixes failing builds on systems with musl libc, where one
+can experience lots of errors similar to following one:
+
+```
+FAILED: src/libnrtype/CMakeFiles/nrtype_LIB.dir/font-lister.cpp.o
+/usr/bin/c++ ... -c ../src/libnrtype/font-lister.cpp
+../src/libnrtype/font-lister.cpp: In function ‘void font_lister_cell_data_func2(GtkCellLayout*, GtkCellRenderer*, GtkTreeModel*, GtkTreeIter*, gpointer)’:
+../src/libnrtype/font-lister.cpp:1236:64: error: missing sentinel in function call [-Werror=format=]
+ 1236 | g_object_set(G_OBJECT(cell), "markup", markup.c_str(), NULL);
+ | ^
+```
+
+Those errors are triggered by the compiler, because musl does not use
+GCC's or Clang's __null extension for NULL definition, because it seems
+non-conforming to the standard's requirements [1]. However, it is
+possible to trigger this error with -Wstrict-null-sentinel GCC flag on
+systems with glibc.
+
+[1]: https://git.musl-libc.org/cgit/musl/commit/?id=c8a9c22173f485c8c053709e1dfa0a617cb6be1a
+
+---
+
+The patch is taken from upstream 1.1.x branch.
+
+Upstream-issue: https://gitlab.com/inkscape/inkscape/-/issues/1880
+Upstream-MR: https://gitlab.com/inkscape/inkscape/-/merge_requests/3378
+Backported-from: https://gitlab.com/inkscape/inkscape/-/merge_requests/3378/diffs?commit_id=8d8d7adb07649fa64f9879b56187708ab7166149
+
+
+
+diff --git a/src/display/nr-filter-image.cpp b/src/display/nr-filter-image.cpp
+index bfc2b6bb1f..5311d8cbce 100644
+--- a/src/display/nr-filter-image.cpp
++++ b/src/display/nr-filter-image.cpp
+@@ -158,7 +158,7 @@ void FilterImage::render_cairo(FilterSlot &slot)
+ if ( !g_file_test( fullname, G_FILE_TEST_EXISTS ) ) {
+ // Try to load from relative position combined with document base
+ if( document ) {
+- fullname = g_build_filename( document->getDocumentBase(), feImageHref, NULL );
++ fullname = g_build_filename( document->getDocumentBase(), feImageHref, nullptr );
+ }
+ }
+ if ( !g_file_test( fullname, G_FILE_TEST_EXISTS ) ) {
+diff --git a/src/extension/dbus/document-interface.cpp b/src/extension/dbus/document-interface.cpp
+index 5021734722..f490b5b6d5 100644
+--- a/src/extension/dbus/document-interface.cpp
++++ b/src/extension/dbus/document-interface.cpp
+@@ -474,7 +474,7 @@ document_interface_spiral (DocumentInterface *doc_interface, int cx, int cy,
+ sp_repr_set_int(newNode, "sodipodi:expansion", 1);
+ gchar * retval = finish_create_shape (doc_interface, error, newNode, (gchar *)"create spiral");
+ //Makes sure there is no fill for spirals by default.
+- gchar* newString = g_strconcat(newNode->attribute("style"), ";fill:none", NULL);
++ gchar* newString = g_strconcat(newNode->attribute("style"), ";fill:none", nullptr);
+ newNode->setAttribute("style", newString);
+ g_free(newString);
+ return retval;
+diff --git a/src/extension/dependency.cpp b/src/extension/dependency.cpp
+index f94634bbc3..09928c64f7 100644
+--- a/src/extension/dependency.cpp
++++ b/src/extension/dependency.cpp
+@@ -186,7 +186,7 @@ bool Dependency::check ()
+ break;
+ }
+ /* Look for deprecated locations next */
+- auto deprloc = g_build_filename("inkex", "deprecated-simple", location.c_str(), NULL);
++ auto deprloc = g_build_filename("inkex", "deprecated-simple", location.c_str(), nullptr);
+ std::string tempdepr =
+ Inkscape::IO::Resource::get_filename_string(Inkscape::IO::Resource::EXTENSIONS, deprloc, false, true);
+ g_free(deprloc);
+diff --git a/src/inkscape.cpp b/src/inkscape.cpp
+index 29b7e08c25..07794fd8b9 100644
+--- a/src/inkscape.cpp
++++ b/src/inkscape.cpp
+@@ -434,15 +434,15 @@ void Application::add_gtk_css(bool only_providers)
+ gboolean gtkApplicationPreferDarkTheme;
+ GtkSettings *settings = gtk_settings_get_default();
+ if (settings && !only_providers) {
+- g_object_get(settings, "gtk-icon-theme-name", &gtkIconThemeName, NULL);
+- g_object_get(settings, "gtk-theme-name", &gtkThemeName, NULL);
+- g_object_get(settings, "gtk-application-prefer-dark-theme", &gtkApplicationPreferDarkTheme, NULL);
++ g_object_get(settings, "gtk-icon-theme-name", &gtkIconThemeName, nullptr);
++ g_object_get(settings, "gtk-theme-name", &gtkThemeName, nullptr);
++ g_object_get(settings, "gtk-application-prefer-dark-theme", &gtkApplicationPreferDarkTheme, nullptr);
+ prefs->setBool("/theme/defaultPreferDarkTheme", gtkApplicationPreferDarkTheme);
+ prefs->setString("/theme/defaultGtkTheme", Glib::ustring(gtkThemeName));
+ prefs->setString("/theme/defaultIconTheme", Glib::ustring(gtkIconThemeName));
+ Glib::ustring gtkthemename = prefs->getString("/theme/gtkTheme");
+ if (gtkthemename != "") {
+- g_object_set(settings, "gtk-theme-name", gtkthemename.c_str(), NULL);
++ g_object_set(settings, "gtk-theme-name", gtkthemename.c_str(), nullptr);
+ } else {
+ Glib::RefPtr<Gdk::Display> display = Gdk::Display::get_default();
+ Glib::RefPtr<Gdk::Screen> screen = display->get_default_screen();
+@@ -451,13 +451,13 @@ void Application::add_gtk_css(bool only_providers)
+ prefs->setBool("/theme/symbolicIcons", iconinfo.is_symbolic());
+ }
+ bool preferdarktheme = prefs->getBool("/theme/preferDarkTheme", false);
+- g_object_set(settings, "gtk-application-prefer-dark-theme", preferdarktheme, NULL);
++ g_object_set(settings, "gtk-application-prefer-dark-theme", preferdarktheme, nullptr);
+ themeiconname = prefs->getString("/theme/iconTheme");
+ // legacy cleanup
+ if (themeiconname == prefs->getString("/theme/defaultIconTheme")) {
+ prefs->setString("/theme/iconTheme", "");
+ } else if (themeiconname != "") {
+- g_object_set(settings, "gtk-icon-theme-name", themeiconname.c_str(), NULL);
++ g_object_set(settings, "gtk-icon-theme-name", themeiconname.c_str(), nullptr);
+ }
+ }
+
+@@ -684,7 +684,7 @@ Application::crash_handler (int /*signum*/)
+ FILE *file = nullptr;
+ for(auto & location : locations) {
+ if (!location) continue; // It seems to be okay, but just in case
+- gchar * filename = g_build_filename(location, c, NULL);
++ gchar * filename = g_build_filename(location, c, nullptr);
+ Inkscape::IO::dump_fopen_call(filename, "E");
+ file = Inkscape::IO::fopen_utf8name(filename, "w");
+ if (file) {
+diff --git a/src/io/resource.cpp b/src/io/resource.cpp
+index fec933f1a9..c75c4ed6cf 100644
+--- a/src/io/resource.cpp
++++ b/src/io/resource.cpp
+@@ -445,14 +445,14 @@ char const *profile_path()
+ }
+
+ if (prefdir) {
+- const char *prefdir_profile = g_build_filename(prefdir, INKSCAPE_PROFILE_DIR, NULL);
++ const char *prefdir_profile = g_build_filename(prefdir, INKSCAPE_PROFILE_DIR, nullptr);
+ g_free((void *)prefdir);
+ prefdir = prefdir_profile;
+ }
+ }
+ #endif
+ if (!prefdir) {
+- prefdir = g_build_filename(g_get_user_config_dir(), INKSCAPE_PROFILE_DIR, NULL);
++ prefdir = g_build_filename(g_get_user_config_dir(), INKSCAPE_PROFILE_DIR, nullptr);
+ // In case the XDG user config dir of the moment does not yet exist...
+ int mode = S_IRWXU;
+ #ifdef S_IRGRP
+@@ -471,7 +471,7 @@ char const *profile_path()
+ gchar const *userDirs[] = { "keys", "templates", "icons", "extensions", "ui",
+ "symbols", "paint", "themes", "palettes", nullptr };
+ for (gchar const** name = userDirs; *name; ++name) {
+- gchar *dir = g_build_filename(prefdir, *name, NULL);
++ gchar *dir = g_build_filename(prefdir, *name, nullptr);
+ g_mkdir_with_parents(dir, mode);
+ g_free(dir);
+ }
+@@ -495,7 +495,7 @@ char *homedir_path(const char *filename)
+ static const gchar *homedir = nullptr;
+ homedir = g_get_home_dir();
+
+- return g_build_filename(homedir, filename, NULL);
++ return g_build_filename(homedir, filename, nullptr);
+ }
+
+ }
+diff --git a/src/libnrtype/font-lister.cpp b/src/libnrtype/font-lister.cpp
+index 6177e7479d..75ff172c05 100644
+--- a/src/libnrtype/font-lister.cpp
++++ b/src/libnrtype/font-lister.cpp
+@@ -1233,7 +1233,7 @@ void font_lister_cell_data_func2(GtkCellLayout * /*cell_layout*/,
+ g_free(sample_escaped);
+ }
+
+- g_object_set(G_OBJECT(cell), "markup", markup.c_str(), NULL);
++ g_object_set(G_OBJECT(cell), "markup", markup.c_str(), nullptr);
+ g_free(family);
+ g_free(family_escaped);
+ }
+diff --git a/src/object/color-profile.cpp b/src/object/color-profile.cpp
+index da103e90d1..a2464194dc 100644
+--- a/src/object/color-profile.cpp
++++ b/src/object/color-profile.cpp
+@@ -700,7 +700,7 @@ std::set<ColorProfile::FilePlusHome> ColorProfile::getBaseProfileDirs() {
+ std::set<ColorProfile::FilePlusHome> sources;
+
+ // first try user's local dir
+- gchar* path = g_build_filename(g_get_user_data_dir(), "color", "icc", NULL);
++ gchar* path = g_build_filename(g_get_user_data_dir(), "color", "icc", nullptr);
+ sources.insert(FilePlusHome(path, true));
+ g_free(path);
+
+@@ -708,11 +708,11 @@ std::set<ColorProfile::FilePlusHome> ColorProfile::getBaseProfileDirs() {
+ // (see https://github.com/hughsie/colord/blob/fe10f76536bb27614ced04e0ff944dc6fb4625c0/lib/colord/cd-icc-store.c#L590)
+
+ // user store
+- path = g_build_filename(g_get_user_data_dir(), "icc", NULL);
++ path = g_build_filename(g_get_user_data_dir(), "icc", nullptr);
+ sources.insert(FilePlusHome(path, true));
+ g_free(path);
+
+- path = g_build_filename(g_get_home_dir(), ".color", "icc", NULL);
++ path = g_build_filename(g_get_home_dir(), ".color", "icc", nullptr);
+ sources.insert(FilePlusHome(path, true));
+ g_free(path);
+
+@@ -722,7 +722,7 @@ std::set<ColorProfile::FilePlusHome> ColorProfile::getBaseProfileDirs() {
+
+ const gchar* const * dataDirs = g_get_system_data_dirs();
+ for ( int i = 0; dataDirs[i]; i++ ) {
+- gchar* path = g_build_filename(dataDirs[i], "color", "icc", NULL);
++ gchar* path = g_build_filename(dataDirs[i], "color", "icc", nullptr);
+ sources.insert(FilePlusHome(path, false));
+ g_free(path);
+ }
+@@ -732,7 +732,7 @@ std::set<ColorProfile::FilePlusHome> ColorProfile::getBaseProfileDirs() {
+ sources.insert(FilePlusHome("/System/Library/ColorSync/Profiles", false));
+ sources.insert(FilePlusHome("/Library/ColorSync/Profiles", false));
+
+- gchar *path = g_build_filename(g_get_home_dir(), "Library", "ColorSync", "Profiles", NULL);
++ gchar *path = g_build_filename(g_get_home_dir(), "Library", "ColorSync", "Profiles", nullptr);
+ sources.insert(FilePlusHome(path, true));
+ g_free(path);
+ }
+diff --git a/src/object/sp-guide.cpp b/src/object/sp-guide.cpp
+index 01e7596801..678c2b20bc 100644
+--- a/src/object/sp-guide.cpp
++++ b/src/object/sp-guide.cpp
+@@ -538,7 +538,7 @@ char* SPGuide::description(bool const verbose) const
+
+ if (verbose) {
+ gchar *oldDescr = descr;
+- descr = g_strconcat(oldDescr, shortcuts, NULL);
++ descr = g_strconcat(oldDescr, shortcuts, nullptr);
+ g_free(oldDescr);
+ }
+
+diff --git a/src/object/sp-image.cpp b/src/object/sp-image.cpp
+index 3c3fc5dd8a..459ecd4243 100644
+--- a/src/object/sp-image.cpp
++++ b/src/object/sp-image.cpp
+@@ -756,7 +756,7 @@ void sp_embed_image(Inkscape::XML::Node *image_node, Inkscape::Pixbuf *pb)
+ if (data == nullptr) {
+ // if there is no supported MIME data, embed as PNG
+ data_mimetype = "image/png";
+- gdk_pixbuf_save_to_buffer(pb->getPixbufRaw(), reinterpret_cast<gchar**>(&data), &len, "png", nullptr, NULL);
++ gdk_pixbuf_save_to_buffer(pb->getPixbufRaw(), reinterpret_cast<gchar**>(&data), &len, "png", nullptr, nullptr);
+ free_data = true;
+ }
+
+diff --git a/src/rdf.cpp b/src/rdf.cpp
+index 563776a19b..3aeb0afa9d 100644
+--- a/src/rdf.cpp
++++ b/src/rdf.cpp
+@@ -543,7 +543,7 @@ const gchar *RDFImpl::getReprText( Inkscape::XML::Node const * repr, struct rdf_
+ const gchar * str = temp->firstChild()->content();
+ if (bag) {
+ holder = bag;
+- bag = g_strconcat(holder, ", ", str, NULL);
++ bag = g_strconcat(holder, ", ", str, nullptr);
+ g_free(holder);
+ }
+ else {
+diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
+index 5596030a64..38c5d59063 100644
+--- a/src/selection-chemistry.cpp
++++ b/src/selection-chemistry.cpp
+@@ -3663,7 +3663,7 @@ void ObjectSet::createBitmapCopy()
+ if (directory == nullptr) {
+ directory = Inkscape::IO::Resource::homedir_path(nullptr);
+ }
+- gchar *filepath = g_build_filename(directory, basename, NULL);
++ gchar *filepath = g_build_filename(directory, basename, nullptr);
+ g_free(directory);
+
+ //g_print("%s\n", filepath);
+diff --git a/src/ui/clipboard.cpp b/src/ui/clipboard.cpp
+index 0cddf4586c..426ec52e81 100644
+--- a/src/ui/clipboard.cpp
++++ b/src/ui/clipboard.cpp
+@@ -1221,7 +1221,7 @@ bool ClipboardManagerImpl::_pasteImage(SPDocument *doc)
+ prefs->setBool("/dialogs/import/ask", false);
+ png->set_gui(false);
+
+- gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-import", NULL );
++ gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-import", nullptr );
+ img->save(filename, "png");
+ file_import(doc, filename, png);
+ g_free(filename);
+@@ -1320,7 +1320,7 @@ std::unique_ptr<SPDocument> ClipboardManagerImpl::_retrieveClipboard(Glib::ustri
+
+ // FIXME: Temporary hack until we add memory input.
+ // Save the clipboard contents to some file, then read it
+- gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-import", NULL );
++ gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-import", nullptr );
+
+ bool file_saved = false;
+ Glib::ustring target = best_target;
+@@ -1413,7 +1413,7 @@ void ClipboardManagerImpl::_onGet(Gtk::SelectionData &sel, guint /*info*/)
+
+ // FIXME: Temporary hack until we add support for memory output.
+ // Save to a temporary file, read it back and then set the clipboard contents
+- gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-export", NULL );
++ gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-export", nullptr );
+ gchar *data = nullptr;
+ gsize len;
+
+@@ -1675,7 +1675,7 @@ void ClipboardManagerImpl::_setClipboardTargets()
+ if ( out != outlist.end() ) {
+ // FIXME: Temporary hack until we add support for memory output.
+ // Save to a temporary file, read it back and then set the clipboard contents
+- gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-export.emf", NULL );
++ gchar *filename = g_build_filename( g_get_user_cache_dir(), "inkscape-clipboard-export.emf", nullptr );
+
+ try {
+ (*out)->save(_clipboardSPDoc.get(), filename);
+diff --git a/src/ui/dialog/clonetiler.cpp b/src/ui/dialog/clonetiler.cpp
+index 7802c37449..cd8af7f4a8 100644
+--- a/src/ui/dialog/clonetiler.cpp
++++ b/src/ui/dialog/clonetiler.cpp
+@@ -159,7 +159,7 @@ CloneTiler::CloneTiler()
+ auto cell_list = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo->gobj()));
+ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo->gobj()),
+ GTK_CELL_RENDERER(cell_list->data),
+- "markup", 0, NULL);
++ "markup", 0, nullptr);
+
+ for (const auto & sg : sym_groups) {
+ // Add the description of the symgroup to a new row
+diff --git a/src/ui/dialog/export.cpp b/src/ui/dialog/export.cpp
+index 7496284cec..7f83143992 100644
+--- a/src/ui/dialog/export.cpp
++++ b/src/ui/dialog/export.cpp
+@@ -490,7 +490,7 @@ void Export::set_default_filename () {
+ extension_point = g_strrstr(uri_copy, old_extension);
+ extension_point[0] = '\0';
+
+- final_name = g_strconcat(uri_copy, ".png", NULL);
++ final_name = g_strconcat(uri_copy, ".png", nullptr);
+ filename_entry.set_text(final_name);
+ filename_entry.set_position(strlen(final_name));
+
+@@ -498,7 +498,7 @@ void Export::set_default_filename () {
+ g_free(uri_copy);
+ }
+ } else {
+- gchar *name = g_strconcat(uri, ".png", NULL);
++ gchar *name = g_strconcat(uri, ".png", nullptr);
+ filename_entry.set_text(name);
+ filename_entry.set_position(strlen(name));
+
+diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp
+index 940ef1b834..520e6091d1 100644
+--- a/src/ui/dialog/inkscape-preferences.cpp
++++ b/src/ui/dialog/inkscape-preferences.cpp
+@@ -1623,7 +1623,7 @@ void InkscapePreferences::initPageUI()
+ _page_theme.add_line(false, _("Change GTK theme:"), _gtk_theme, "", "", false);
+ _gtk_theme.signal_changed().connect(sigc::mem_fun(*this, &InkscapePreferences::themeChange));
+ }
+- _sys_user_themes_dir_copy.init(g_build_filename(g_get_user_data_dir(), "themes", NULL), _("Open themes folder"));
++ _sys_user_themes_dir_copy.init(g_build_filename(g_get_user_data_dir(), "themes", nullptr), _("Open themes folder"));
+ _page_theme.add_line(true, _("User themes:"), _sys_user_themes_dir_copy, "", _("Location of the user’s themes"), true, Gtk::manage(new Gtk::Box()));
+ //_contrast_theme.init("/theme/contrast", 1, 10, 1, 2, 10, 1);
+ Gtk::Widget *space = new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL);
+@@ -3351,7 +3351,7 @@ void InkscapePreferences::initPageSystem()
+ _("Open fonts folder"));
+ _page_system.add_line(true, _("User fonts:"), _sys_user_fonts_dir, "", _("Location of the user’s fonts"), true);
+
+- _sys_user_themes_dir.init(g_build_filename(g_get_user_data_dir(), "themes", NULL), _("Open themes folder"));
++ _sys_user_themes_dir.init(g_build_filename(g_get_user_data_dir(), "themes", nullptr), _("Open themes folder"));
+ _page_system.add_line(true, _("User themes:"), _sys_user_themes_dir, "", _("Location of the user’s themes"), true);
+
+ _sys_user_icons_dir.init((char const *)IO::Resource::get_path(IO::Resource::USER, IO::Resource::ICONS, ""),
+diff --git a/src/ui/drag-and-drop.cpp b/src/ui/drag-and-drop.cpp
+index 880906c34b..c99bd0f4f5 100644
+--- a/src/ui/drag-and-drop.cpp
++++ b/src/ui/drag-and-drop.cpp
+@@ -357,7 +357,7 @@ ink_drag_data_received(GtkWidget *widget,
+ ext->set_param_optiongroup("link", "embed");
+ ext->set_gui(false);
+
+- gchar *filename = g_build_filename( g_get_tmp_dir(), "inkscape-dnd-import", NULL );
++ gchar *filename = g_build_filename( g_get_tmp_dir(), "inkscape-dnd-import", nullptr );
+ g_file_set_contents(filename,
+ reinterpret_cast<gchar const *>(gtk_selection_data_get_data (data)),
+ gtk_selection_data_get_length (data),
+diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
+index 089327c7ac..8ae64382d6 100644
+--- a/src/ui/interface.cpp
++++ b/src/ui/interface.cpp
+@@ -203,7 +203,7 @@ sp_ui_overwrite_file(gchar const *filename)
+ gtk_dialog_add_buttons( GTK_DIALOG(dialog),
+ _("_Cancel"), GTK_RESPONSE_NO,
+ _("Replace"), GTK_RESPONSE_YES,
+- NULL );
++ nullptr );
+ gtk_dialog_set_default_response( GTK_DIALOG(dialog), GTK_RESPONSE_YES );
+
+ if ( gtk_dialog_run( GTK_DIALOG(dialog) ) == GTK_RESPONSE_YES ) {
+diff --git a/src/ui/themes.cpp b/src/ui/themes.cpp
+index f874c4c1a8..ff1eca4a9f 100644
+--- a/src/ui/themes.cpp
++++ b/src/ui/themes.cpp
+@@ -30,15 +30,15 @@
+ static void inkscape_fill_gtk(const gchar *path, gtkThemeList &themes)
+ {
+ const gchar *dir_entry;
+- GDir *dir = g_dir_open(path, 0, NULL);
++ GDir *dir = g_dir_open(path, 0, nullptr);
+ if (!dir)
+ return;
+ while ((dir_entry = g_dir_read_name(dir))) {
+- gchar *filename = g_build_filename(path, dir_entry, "gtk-3.0", "gtk.css", NULL);
++ gchar *filename = g_build_filename(path, dir_entry, "gtk-3.0", "gtk.css", nullptr);
+ bool has_prefer_dark = false;
+
+ Glib::ustring theme = dir_entry;
+- gchar *filenamedark = g_build_filename(path, dir_entry, "gtk-3.0", "gtk-dark.css", NULL);
++ gchar *filenamedark = g_build_filename(path, dir_entry, "gtk-3.0", "gtk-dark.css", nullptr);
+ if (g_file_test(filenamedark, G_FILE_TEST_IS_REGULAR))
+ has_prefer_dark = true;
+ if (themes.find(theme) != themes.end() && !has_prefer_dark) {
+@@ -67,7 +67,7 @@ std::map<Glib::ustring, bool> get_available_themes()
+ const gchar *const *dirs;
+
+ /* Builtin themes */
+- builtin_themes = g_resources_enumerate_children("/org/gtk/libgtk/theme", G_RESOURCE_LOOKUP_FLAGS_NONE, NULL);
++ builtin_themes = g_resources_enumerate_children("/org/gtk/libgtk/theme", G_RESOURCE_LOOKUP_FLAGS_NONE, nullptr);
+ for (i = 0; builtin_themes[i] != NULL; i++) {
+ if (g_str_has_suffix(builtin_themes[i], "/")) {
+ theme = builtin_themes[i];
+@@ -75,7 +75,7 @@ std::map<Glib::ustring, bool> get_available_themes()
+ Glib::ustring theme_path = "/org/gtk/libgtk/theme";
+ theme_path += "/" + theme;
+ gchar **builtin_themes_files =
+- g_resources_enumerate_children(theme_path.c_str(), G_RESOURCE_LOOKUP_FLAGS_NONE, NULL);
++ g_resources_enumerate_children(theme_path.c_str(), G_RESOURCE_LOOKUP_FLAGS_NONE, nullptr);
+ bool has_prefer_dark = false;
+ if (builtin_themes_files != NULL) {
+ for (j = 0; builtin_themes_files[j] != NULL; j++) {
+@@ -92,17 +92,17 @@ std::map<Glib::ustring, bool> get_available_themes()
+
+ g_strfreev(builtin_themes);
+
+- path = g_build_filename(g_get_user_data_dir(), "themes", NULL);
++ path = g_build_filename(g_get_user_data_dir(), "themes", nullptr);
+ inkscape_fill_gtk(path, themes);
+ g_free(path);
+
+- path = g_build_filename(g_get_home_dir(), ".themes", NULL);
++ path = g_build_filename(g_get_home_dir(), ".themes", nullptr);
+ inkscape_fill_gtk(path, themes);
+ g_free(path);
+
+ dirs = g_get_system_data_dirs();
+ for (i = 0; dirs[i]; i++) {
+- path = g_build_filename(dirs[i], "themes", NULL);
++ path = g_build_filename(dirs[i], "themes", nullptr);
+ inkscape_fill_gtk(path, themes);
+ g_free(path);
+ }
+diff --git a/src/ui/tool/control-point.cpp b/src/ui/tool/control-point.cpp
+index c29b09d93f..13f2e60c6e 100644
+--- a/src/ui/tool/control-point.cpp
++++ b/src/ui/tool/control-point.cpp
+@@ -185,7 +185,7 @@ void ControlPoint::_setControlType(Inkscape::CanvasItemCtrlType type)
+
+ void ControlPoint::_setAnchor(SPAnchorType anchor)
+ {
+-// g_object_set(_canvas_item_ctrl, "anchor", anchor, NULL);
++// g_object_set(_canvas_item_ctrl, "anchor", anchor, nullptr);
+ }
+
+ void ControlPoint::_setPixbuf(Glib::RefPtr<Gdk::Pixbuf> p)
+diff --git a/src/ui/toolbar/arc-toolbar.cpp b/src/ui/toolbar/arc-toolbar.cpp
+index b663d905f4..986b28b3f8 100644
+--- a/src/ui/toolbar/arc-toolbar.cpp
++++ b/src/ui/toolbar/arc-toolbar.cpp
+@@ -309,7 +309,7 @@ ArcToolbar::startend_value_changed(Glib::RefPtr<Gtk::Adjustment>& adj,
+ // in turn, prevent listener from responding
+ _freeze = true;
+
+- gchar* namespaced_name = g_strconcat("sodipodi:", value_name, NULL);
++ gchar* namespaced_name = g_strconcat("sodipodi:", value_name, nullptr);
+
+ bool modmade = false;
+ auto itemlist= _desktop->getSelection()->items();
+diff --git a/src/ui/toolbar/spiral-toolbar.cpp b/src/ui/toolbar/spiral-toolbar.cpp
+index 05ce654242..bae2f8c064 100644
+--- a/src/ui/toolbar/spiral-toolbar.cpp
++++ b/src/ui/toolbar/spiral-toolbar.cpp
+@@ -175,7 +175,7 @@ SpiralToolbar::value_changed(Glib::RefPtr<Gtk::Adjustment> &adj,
+ // in turn, prevent listener from responding
+ _freeze = true;
+
+- gchar* namespaced_name = g_strconcat("sodipodi:", value_name.data(), NULL);
++ gchar* namespaced_name = g_strconcat("sodipodi:", value_name.data(), nullptr);
+
+ bool modmade = false;
+ auto itemlist= _desktop->getSelection()->items();
+diff --git a/src/ui/tools/gradient-tool.cpp b/src/ui/tools/gradient-tool.cpp
+index e83d2b4613..6aecf92ce4 100644
+--- a/src/ui/tools/gradient-tool.cpp
++++ b/src/ui/tools/gradient-tool.cpp
+@@ -116,7 +116,7 @@ void GradientTool::selection_changed(Inkscape::Selection*) {
+ _("%s selected"),
+ //TRANSLATORS: Mind the space in front. This is part of a compound message
+ ngettext(" out of %d gradient handle"," out of %d gradient handles",n_tot),
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ message_context->setF(Inkscape::NORMAL_MESSAGE,
+ message,_(gr_handle_descr[drag->singleSelectedDraggerSingleDraggableType()]), n_tot, n_obj);
+ } else {
+@@ -125,14 +125,14 @@ void GradientTool::selection_changed(Inkscape::Selection*) {
+ ngettext("One handle merging %d stop (drag with <b>Shift</b> to separate) selected",
+ "One handle merging %d stops (drag with <b>Shift</b> to separate) selected",drag->singleSelectedDraggerNumDraggables()),
+ ngettext(" out of %d gradient handle"," out of %d gradient handles",n_tot),
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj);
+ }
+ } else if (n_sel > 1) {
+ //TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count)
+ gchar * message = g_strconcat(ngettext("<b>%d</b> gradient handle selected out of %d","<b>%d</b> gradient handles selected out of %d",n_sel),
+ //TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj);
+ } else if (n_sel == 0) {
+ message_context->setF(Inkscape::NORMAL_MESSAGE,
+diff --git a/src/ui/tools/mesh-tool.cpp b/src/ui/tools/mesh-tool.cpp
+index 07bf68bd12..fbde77f36f 100644
+--- a/src/ui/tools/mesh-tool.cpp
++++ b/src/ui/tools/mesh-tool.cpp
+@@ -131,7 +131,7 @@ void MeshTool::selection_changed(Inkscape::Selection* /*sel*/) {
+ _("%s selected"),
+ //TRANSLATORS: Mind the space in front. This is part of a compound message
+ ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot),
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ this->message_context->setF(Inkscape::NORMAL_MESSAGE,
+ message,_(ms_handle_descr[drag->singleSelectedDraggerSingleDraggableType()]), n_tot, n_obj);
+ } else {
+@@ -142,7 +142,7 @@ void MeshTool::selection_changed(Inkscape::Selection* /*sel*/) {
+ "One handle merging %d stops (drag with <b>Shift</b> to separate) selected",
+ drag->singleSelectedDraggerNumDraggables()),
+ ngettext(" out of %d mesh handle"," out of %d mesh handles",n_tot),
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ this->message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj);
+ }
+ } else if (n_sel > 1) {
+@@ -150,7 +150,7 @@ void MeshTool::selection_changed(Inkscape::Selection* /*sel*/) {
+ gchar * message =
+ g_strconcat(ngettext("<b>%d</b> mesh handle selected out of %d","<b>%d</b> mesh handles selected out of %d",n_sel),
+ //TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message
+- ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL);
++ ngettext(" on %d selected object"," on %d selected objects",n_obj),nullptr);
+ this->message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj);
+ } else if (n_sel == 0) {
+ this->message_context->setF(Inkscape::NORMAL_MESSAGE,
+diff --git a/src/ui/tools/text-tool.cpp b/src/ui/tools/text-tool.cpp
+index 4d0d7f5885..8f7aba97b1 100644
+--- a/src/ui/tools/text-tool.cpp
++++ b/src/ui/tools/text-tool.cpp
+@@ -100,8 +100,8 @@ TextTool::~TextTool() {
+ void TextTool::setup() {
+ GtkSettings* settings = gtk_settings_get_default();
+ gint timeout = 0;
+- g_object_get( settings, "gtk-cursor-blink-time", &timeout, NULL );
+-
++ g_object_get( settings, "gtk-cursor-blink-time", &timeout, nullptr );
++
+ if (timeout < 0) {
+ timeout = 200;
+ } else {
+diff --git a/src/ui/widget/color-icc-selector.cpp b/src/ui/widget/color-icc-selector.cpp
+index 99c6b57af0..cf3b4b4b9b 100644
+--- a/src/ui/widget/color-icc-selector.cpp
++++ b/src/ui/widget/color-icc-selector.cpp
+@@ -369,7 +369,7 @@ void ColorICCSelector::init()
+
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, TRUE);
+- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, "text", 0, NULL);
++ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, "text", 0, nullptr);
+
+ GtkTreeIter iter;
+ gtk_list_store_append(store, &iter);
+diff --git a/src/ui/widget/combo-box-entry-tool-item.cpp b/src/ui/widget/combo-box-entry-tool-item.cpp
+index 60f87d938b..9bce9ce91b 100644
+--- a/src/ui/widget/combo-box-entry-tool-item.cpp
++++ b/src/ui/widget/combo-box-entry-tool-item.cpp
+@@ -74,8 +74,8 @@ ComboBoxEntryToolItem::ComboBoxEntryToolItem(Glib::ustring name,
+ set_name(name);
+
+ gchar *action_name = g_strdup( get_name().c_str() );
+- gchar *combobox_name = g_strjoin( nullptr, action_name, "_combobox", NULL );
+- gchar *entry_name = g_strjoin( nullptr, action_name, "_entry", NULL );
++ gchar *combobox_name = g_strjoin( nullptr, action_name, "_combobox", nullptr );
++ gchar *entry_name = g_strjoin( nullptr, action_name, "_entry", nullptr );
+ g_free( action_name );
+
+ GtkWidget* comboBoxEntry = gtk_combo_box_new_with_model_and_entry (_model);
+diff --git a/src/ui/widget/marker-combo-box.cpp b/src/ui/widget/marker-combo-box.cpp
+index 6ecc77be14..82199c547d 100644
+--- a/src/ui/widget/marker-combo-box.cpp
++++ b/src/ui/widget/marker-combo-box.cpp
+@@ -201,7 +201,7 @@ const gchar * MarkerComboBox::get_active_marker_uri()
+ gchar *markurn;
+ if (stockid)
+ {
+- markurn = g_strconcat("urn:inkscape:marker:",markid,NULL);
++ markurn = g_strconcat("urn:inkscape:marker:",markid,nullptr);
+ }
+ else
+ {
+@@ -211,7 +211,7 @@ const gchar * MarkerComboBox::get_active_marker_uri()
+ g_free(markurn);
+ if (mark) {
+ Inkscape::XML::Node *repr = mark->getRepr();
+- marker = g_strconcat("url(#", repr->attribute("id"), ")", NULL);
++ marker = g_strconcat("url(#", repr->attribute("id"), ")", nullptr);
+ }
+ } else {
+ marker = g_strdup(markid);
+@@ -366,7 +366,7 @@ void MarkerComboBox::add_markers (std::vector<SPMarker *> const& marker_list, SP
+ void
+ MarkerComboBox::update_marker_image(gchar const *mname)
+ {
+- gchar *cache_name = g_strconcat(combo_id, mname, NULL);
++ gchar *cache_name = g_strconcat(combo_id, mname, nullptr);
+ Glib::ustring key = svg_preview_cache.cache_key(doc->getDocumentURI(), cache_name, 24);
+ g_free (cache_name);
+ svg_preview_cache.remove_preview_from_cache(key);
+@@ -403,7 +403,7 @@ MarkerComboBox::create_marker_image(unsigned psize, gchar const *mname,
+ }
+
+ /* Get from cache right away */
+- gchar *cache_name = g_strconcat(combo_id, mname, NULL);
++ gchar *cache_name = g_strconcat(combo_id, mname, nullptr);
+ Glib::ustring key = svg_preview_cache.cache_key(source->getDocumentURI(), cache_name, psize);
+ g_free (cache_name);
+ GdkPixbuf *pixbuf = svg_preview_cache.get_preview_from_cache(key); // no ref created
+diff --git a/src/ui/widget/paint-selector.cpp b/src/ui/widget/paint-selector.cpp
+index 26a5a56032..d196654f2b 100644
+--- a/src/ui/widget/paint-selector.cpp
++++ b/src/ui/widget/paint-selector.cpp
+@@ -878,7 +878,7 @@ void PaintSelector::set_mode_mesh(PaintSelector::Mode mode)
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
+ gtk_cell_renderer_set_padding(renderer, 2, 0);
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo), renderer, TRUE);
+- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", COMBO_COL_LABEL, NULL);
++ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(combo), renderer, "text", COMBO_COL_LABEL, nullptr);
+
+ ink_mesh_menu(combo);
+ g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(PaintSelector::mesh_change), this);
+@@ -947,7 +947,7 @@ SPMeshGradient *PaintSelector::getMeshGradient()
+
+ gchar *mesh_name;
+ if (stockid) {
+- mesh_name = g_strconcat("urn:inkscape:mesh:", meshid, NULL);
++ mesh_name = g_strconcat("urn:inkscape:mesh:", meshid, nullptr);
+ } else {
+ mesh_name = g_strdup(meshid);
+ }
+@@ -1202,7 +1202,7 @@ void PaintSelector::set_mode_pattern(PaintSelector::Mode mode)
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
+ gtk_cell_renderer_set_padding(renderer, 2, 0);
+ gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(_patternmenu), renderer, TRUE);
+- gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_patternmenu), renderer, "text", COMBO_COL_LABEL, NULL);
++ gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_patternmenu), renderer, "text", COMBO_COL_LABEL, nullptr);
+
+ ink_pattern_menu(_patternmenu);
+ g_signal_connect(G_OBJECT(_patternmenu), "changed", G_CALLBACK(PaintSelector::pattern_change), this);
+@@ -1298,7 +1298,7 @@ SPPattern *PaintSelector::getPattern()
+ gchar *paturn;
+
+ if (stockid) {
+- paturn = g_strconcat("urn:inkscape:pattern:", patid, NULL);
++ paturn = g_strconcat("urn:inkscape:pattern:", patid, nullptr);
+ } else {
+ paturn = g_strdup(patid);
+ }
+diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
+index 5a018301de..7a5607b57c 100644
+--- a/src/widgets/desktop-widget.cpp
++++ b/src/widgets/desktop-widget.cpp
+@@ -612,8 +612,8 @@ void SPDesktopWidget::on_realize()
+ GtkSettings *settings = gtk_settings_get_default();
+ Gtk::Container *window = get_toplevel();
+ if (settings && window) {
+- g_object_get(settings, "gtk-theme-name", &gtkThemeName, NULL);
+- g_object_get(settings, "gtk-application-prefer-dark-theme", &gtkApplicationPreferDarkTheme, NULL);
++ g_object_get(settings, "gtk-theme-name", &gtkThemeName, nullptr);
++ g_object_get(settings, "gtk-application-prefer-dark-theme", &gtkApplicationPreferDarkTheme, nullptr);
+ bool dark = isCurrentThemeDark(dynamic_cast<Gtk::Container *>(window));
+ if (dark) {
+ prefs->setBool("/theme/darkTheme", true);
+diff --git a/src/widgets/sp-xmlview-tree.cpp b/src/widgets/sp-xmlview-tree.cpp
+index b07ce2475e..67b0e9094b 100644
+--- a/src/widgets/sp-xmlview-tree.cpp
++++ b/src/widgets/sp-xmlview-tree.cpp
+@@ -164,7 +164,7 @@ GtkWidget *sp_xmlview_tree_new(Inkscape::XML::Node * repr, void * /*factory*/, v
+ gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(tree), search_equal_func, nullptr, nullptr);
+
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+- GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", STORE_TEXT_COL, NULL);
++ GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", STORE_TEXT_COL, nullptr);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+ gtk_cell_renderer_set_padding (renderer, 2, 0);
+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+diff --git a/src/xml/repr-io.cpp b/src/xml/repr-io.cpp
+index f3cbdcb8f3..d891f07e09 100644
+--- a/src/xml/repr-io.cpp
++++ b/src/xml/repr-io.cpp
+@@ -449,7 +449,7 @@ void promote_to_namespace(Node *repr, const gchar *prefix) {
+ if ( repr->type() == Inkscape::XML::NodeType::ELEMENT_NODE ) {
+ GQuark code = repr->code();
+ if (!qname_prefix(code).id()) {
+- gchar *svg_name = g_strconcat(prefix, ":", g_quark_to_string(code), NULL);
++ gchar *svg_name = g_strconcat(prefix, ":", g_quark_to_string(code), nullptr);
+ repr->setCodeUnsafe(g_quark_from_string(svg_name));
+ g_free(svg_name);
+ }
+--
+2.31.1
+
diff --git a/media-gfx/inkscape/inkscape-1.1.ebuild b/media-gfx/inkscape/inkscape-1.1.ebuild
new file mode 100644
index 000000000000..642643d65ca8
--- /dev/null
+++ b/media-gfx/inkscape/inkscape-1.1.ebuild
@@ -0,0 +1,162 @@
+# Copyright 1999-2021 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=7
+
+PYTHON_COMPAT=( python3_{8,9} )
+PYTHON_REQ_USE="xml"
+
+inherit cmake flag-o-matic xdg toolchain-funcs python-single-r1
+
+DESCRIPTION="SVG based generic vector-drawing program"
+HOMEPAGE="https://inkscape.org/"
+SRC_URI="https://media.inkscape.org/dl/resources/file/${P}.tar.xz"
+
+LICENSE="GPL-2 LGPL-2.1"
+SLOT="0"
+KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86"
+IUSE="cdr dbus dia exif graphicsmagick imagemagick inkjar jemalloc jpeg lcms
+openmp postscript readline spell static-libs svg2 visio wpg"
+
+REQUIRED_USE="${PYTHON_REQUIRED_USE}"
+
+BDEPEND="
+ dev-util/glib-utils
+ >=dev-util/intltool-0.40
+ >=sys-devel/gettext-0.17
+ virtual/pkgconfig
+"
+COMMON_DEPEND="${PYTHON_DEPS}
+ >=app-text/poppler-0.57.0:=[cairo]
+ >=dev-cpp/cairomm-1.12:0
+ >=dev-cpp/glibmm-2.54.1:2
+ dev-cpp/gtkmm:3.0
+ >=dev-cpp/pangomm-2.40:1.4
+ >=dev-libs/boehm-gc-7.1:=
+ dev-libs/double-conversion:=
+ >=dev-libs/glib-2.41
+ >=dev-libs/libsigc++-2.8:2
+ >=dev-libs/libxml2-2.7.4
+ >=dev-libs/libxslt-1.1.25
+ dev-libs/gdl:3
+ dev-libs/popt
+ media-gfx/potrace
+ media-libs/fontconfig
+ media-libs/freetype:2
+ media-libs/libpng:0=
+ net-libs/libsoup:2.4
+ sci-libs/gsl:=
+ x11-libs/libX11
+ >=x11-libs/pango-1.37.2
+ x11-libs/gtk+:3
+ $(python_gen_cond_dep '
+ dev-python/lxml[${PYTHON_USEDEP}]
+ media-gfx/scour[${PYTHON_USEDEP}]
+ ')
+ cdr? (
+ app-text/libwpg:0.3
+ dev-libs/librevenge
+ media-libs/libcdr
+ )
+ dbus? ( dev-libs/dbus-glib )
+ exif? ( media-libs/libexif )
+ imagemagick? (
+ !graphicsmagick? ( media-gfx/imagemagick:=[cxx] )
+ graphicsmagick? ( media-gfx/graphicsmagick:=[cxx] )
+ )
+ jemalloc? ( dev-libs/jemalloc )
+ jpeg? ( virtual/jpeg:0 )
+ lcms? ( media-libs/lcms:2 )
+ readline? ( sys-libs/readline:= )
+ spell? ( app-text/gspell )
+ visio? (
+ app-text/libwpg:0.3
+ dev-libs/librevenge
+ media-libs/libvisio
+ )
+ wpg? (
+ app-text/libwpg:0.3
+ dev-libs/librevenge
+ )
+"
+# These only use executables provided by these packages
+# See share/extensions for more details. inkscape can tell you to
+# install these so we could of course just not depend on those and rely
+# on that.
+RDEPEND="${COMMON_DEPEND}
+ $(python_gen_cond_dep '
+ dev-python/numpy[${PYTHON_USEDEP}]
+ ')
+ dia? ( app-office/dia )
+ postscript? ( app-text/ghostscript-gpl )
+"
+DEPEND="${COMMON_DEPEND}
+ >=dev-libs/boost-1.65
+"
+
+RESTRICT="test"
+
+S="${WORKDIR}/${P}_2021-05-24_c4e8f9ed74"
+
+PATCHES=(
+ "${FILESDIR}/${P}-sentinels.patch" # 1.1 is the last affected version, it is already fixed in upstream
+)
+
+pkg_pretend() {
+ if [[ ${MERGE_TYPE} != binary ]] && use openmp; then
+ tc-has-openmp || die "Please switch to an openmp compatible compiler"
+ fi
+}
+
+src_prepare() {
+ cmake_src_prepare
+ sed -i "/install.*COPYING/d" CMakeScripts/ConfigCPack.cmake || die
+}
+
+src_configure() {
+ # aliasing unsafe wrt #310393
+ append-flags -fno-strict-aliasing
+
+ local mycmakeargs=(
+ # -DWITH_LPETOOL # Compile with LPE Tool and experimental LPEs enabled
+ -DWITH_NLS=ON
+ -DENABLE_POPPLER=ON
+ -DENABLE_POPPLER_CAIRO=ON
+ -DWITH_PROFILING=OFF
+ -DBUILD_TESTING=OFF
+ -DWITH_LIBCDR=$(usex cdr)
+ -DWITH_DBUS=$(usex dbus)
+ -DWITH_IMAGE_MAGICK=$(usex imagemagick $(usex !graphicsmagick)) # requires ImageMagick 6, only IM must be enabled
+ -DWITH_GRAPHICS_MAGICK=$(usex graphicsmagick $(usex imagemagick)) # both must be enabled to use GraphicsMagick
+ -DWITH_GNU_READLINE=$(usex readline)
+ -DWITH_GSPELL=$(usex spell)
+ -DWITH_JEMALLOC=$(usex jemalloc)
+ -DENABLE_LCMS=$(usex lcms)
+ -DWITH_OPENMP=$(usex openmp)
+ -DBUILD_SHARED_LIBS=$(usex !static-libs)
+ -DWITH_SVG2=$(usex svg2)
+ -DWITH_LIBVISIO=$(usex visio)
+ -DWITH_LIBWPG=$(usex wpg)
+ )
+
+ cmake_src_configure
+}
+
+src_install() {
+ cmake_src_install
+
+ find "${ED}" -type f -name "*.la" -delete || die
+
+ find "${ED}"/usr/share/man -type f -maxdepth 3 -name '*.bz2' -exec bzip2 -d {} \; || die
+
+ find "${ED}"/usr/share/man -type f -maxdepth 3 -name '*.gz' -exec gzip -d {} \; || die
+
+ local extdir="${ED}"/usr/share/${PN}/extensions
+
+ if [[ -e "${extdir}" ]] && [[ -n $(find "${extdir}" -mindepth 1) ]]; then
+ python_optimize "${ED}"/usr/share/${PN}/extensions
+ fi
+
+ # Empty directory causes sandbox issues, see bug #761915
+ rm -r "${ED}/usr/share/inkscape/fonts" || die "Failed to remove fonts directory."
+}