From 487f0940377b4fbf9ebae8ab2a53f2f992e60deb Mon Sep 17 00:00:00 2001 From: Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> Date: Thu, 10 Oct 2019 22:05:48 +1100 Subject: Reduce memory leak on editing text, etc. --- src/inkscape.cpp | 11 +++++++---- src/libnrtype/FontInstance.cpp | 2 ++ src/libnrtype/font-lister.cpp | 20 ++++++++++++++------ src/style-internal.cpp | 2 +- src/ui/toolbar/text-toolbar.cpp | 6 +++++- src/ui/widget/color-icc-selector.cpp | 4 +--- src/ui/widget/combo-box-entry-tool-item.cpp | 3 +++ src/ui/widget/combo-tool-item.cpp | 4 ++-- src/widgets/paint-selector.cpp | 23 +++++++++++++++++------ src/widgets/toolbox.cpp | 4 +++- 10 files changed, 55 insertions(+), 24 deletions(-) diff --git a/src/inkscape.cpp b/src/inkscape.cpp index f76ea3c22..030072df8 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -558,9 +558,9 @@ void Application::add_gtk_css() // Add style sheet (GTK3) auto const screen = Gdk::Screen::get_default(); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - const gchar *gtk_font_name = ""; - const gchar *gtkThemeName; - const gchar *gtkIconThemeName; + gchar *gtk_font_name = nullptr; + gchar *gtkThemeName = nullptr; + gchar *gtkIconThemeName = nullptr; Glib::ustring themeiconname; gboolean gtkApplicationPreferDarkTheme; GtkSettings *settings = gtk_settings_get_default(); @@ -587,6 +587,8 @@ void Application::add_gtk_css() g_object_get(settings, "gtk-font-name", >k_font_name, NULL); } + g_free(gtkThemeName); + g_free(gtkIconThemeName); Glib::ustring style = get_filename(UIS, "style.css"); if (!style.empty()) { @@ -613,7 +615,7 @@ void Application::add_gtk_css() } Gtk::StyleContext::add_provider_for_screen(screen, colorizeprovider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); - if (!strncmp(gtk_font_name, "Cantarell", 9)) { + if (gtk_font_name && !strncmp(gtk_font_name, "Cantarell", 9)) { auto provider = Gtk::CssProvider::create(); css_str = "#monoStrokeWidth,"; css_str += "#fillEmptySpace,"; @@ -631,6 +633,7 @@ void Application::add_gtk_css() } Gtk::StyleContext::add_provider_for_screen(screen, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); } + g_free(gtk_font_name); } void Application::readStyleSheets(bool forceupd) diff --git a/src/libnrtype/FontInstance.cpp b/src/libnrtype/FontInstance.cpp index 4204bcd11..e0fa2bec8 100644 --- a/src/libnrtype/FontInstance.cpp +++ b/src/libnrtype/FontInstance.cpp @@ -958,6 +958,7 @@ void font_instance::FindFontMetrics() { // std::cout << "Math baseline: - bbox: y_min: " << acbox.yMin // << " y_max: " << acbox.yMax // << " math: " << math << std::endl; + FT_Done_Glyph(aglyph); } // Find hanging baseline... assume it is at top of 'म'. @@ -971,6 +972,7 @@ void font_instance::FindFontMetrics() { double hanging = (double)acbox.yMax/(double)theFace->units_per_EM; _baselines[ SP_CSS_BASELINE_HANGING ] = hanging; // std::cout << "Hanging baseline: प: " << hanging << std::endl; + FT_Done_Glyph(aglyph); } } #endif diff --git a/src/libnrtype/font-lister.cpp b/src/libnrtype/font-lister.cpp index 984741adc..30283e624 100644 --- a/src/libnrtype/font-lister.cpp +++ b/src/libnrtype/font-lister.cpp @@ -411,7 +411,10 @@ void FontLister::update_font_data_recursive(SPObject& r, std::mapget_active_text(); + gchar *temp_family = _font_family_item->get_active_text(); + Glib::ustring new_family(temp_family); + g_free(temp_family); css_font_family_unquote( new_family ); // Remove quotes around font family names. // TODO: Think about how to handle handle multiple selections. While diff --git a/src/ui/widget/color-icc-selector.cpp b/src/ui/widget/color-icc-selector.cpp index 4862d6d03..31006052b 100644 --- a/src/ui/widget/color-icc-selector.cpp +++ b/src/ui/widget/color-icc-selector.cpp @@ -537,9 +537,7 @@ void ColorICCSelectorImpl::_profileSelected(GtkWidget * /*src*/, gpointer data) self->_switchToProfile(name); gtk_widget_set_tooltip_text(self->_profileSel, name); - if (name) { - g_free(name); - } + g_free(name); } } #endif // defined(HAVE_LIBLCMS2) diff --git a/src/ui/widget/combo-box-entry-tool-item.cpp b/src/ui/widget/combo-box-entry-tool-item.cpp index f3786c6f6..11dd8459d 100644 --- a/src/ui/widget/combo-box-entry-tool-item.cpp +++ b/src/ui/widget/combo-box-entry-tool-item.cpp @@ -475,6 +475,7 @@ ComboBoxEntryToolItem::get_active_row_from_text(ComboBoxEntryToolItem *action, // Case sensitive compare if( strcmp( target_text, text ) == 0 ){ found = true; + g_free(text); break; } } else { @@ -486,9 +487,11 @@ ComboBoxEntryToolItem::get_active_row_from_text(ComboBoxEntryToolItem *action, g_free( target_text_casefolded ); if( equal ) { found = true; + g_free(text); break; } } + g_free(text); } ++row; diff --git a/src/ui/widget/combo-tool-item.cpp b/src/ui/widget/combo-tool-item.cpp index 5e07efdf1..e9eee059d 100644 --- a/src/ui/widget/combo-tool-item.cpp +++ b/src/ui/widget/combo-tool-item.cpp @@ -126,12 +126,12 @@ ComboToolItem::populate_combobox() } Gtk::CellRendererPixbuf *renderer = new Gtk::CellRendererPixbuf; renderer->set_property ("stock_size", Gtk::ICON_SIZE_LARGE_TOOLBAR); - _combobox->pack_start (*renderer, false); + _combobox->pack_start (*Gtk::manage(renderer), false); _combobox->add_attribute (*renderer, "icon_name", columns.col_icon ); } else if (_use_pixbuf) { Gtk::CellRendererPixbuf *renderer = new Gtk::CellRendererPixbuf; //renderer->set_property ("stock_size", Gtk::ICON_SIZE_LARGE_TOOLBAR); - _combobox->pack_start (*renderer, false); + _combobox->pack_start (*Gtk::manage(renderer), false); _combobox->add_attribute (*renderer, "pixbuf", columns.col_pixbuf ); } diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp index e1a6c2b5b..e80951928 100644 --- a/src/widgets/paint-selector.cpp +++ b/src/widgets/paint-selector.cpp @@ -963,6 +963,8 @@ void SPPaintSelector::updateMeshList( SPMeshGradient *mesh ) gtk_tree_model_get (store, &iter, COMBO_COL_MESH, &meshid, -1); while (valid && strcmp(meshid, meshname) != 0) { valid = gtk_tree_model_iter_next (store, &iter); + g_free(meshid); + meshid = nullptr; gtk_tree_model_get (store, &iter, COMBO_COL_MESH, &meshid, -1); } @@ -971,6 +973,7 @@ void SPPaintSelector::updateMeshList( SPMeshGradient *mesh ) } g_object_set_data(G_OBJECT(combo), "update", GINT_TO_POINTER(FALSE)); + g_free(meshid); } } @@ -1068,9 +1071,11 @@ SPMeshGradient *SPPaintSelector::getMeshGradient() gchar *meshid = nullptr; gboolean stockid = FALSE; - gchar *label = nullptr; - gtk_tree_model_get (store, &iter, COMBO_COL_LABEL, &label, COMBO_COL_STOCK, &stockid, COMBO_COL_MESH, &meshid, -1); + // gchar *label = nullptr; + gtk_tree_model_get (store, &iter, COMBO_COL_STOCK, &stockid, COMBO_COL_MESH, &meshid, -1); + // gtk_tree_model_get (store, &iter, COMBO_COL_LABEL, &label, COMBO_COL_STOCK, &stockid, COMBO_COL_MESH, &meshid, -1); // std::cout << " .. meshid: " << (meshid?meshid:"null") << " label: " << (label?label:"null") << std::endl; + // g_free(label); if (meshid == nullptr) { return nullptr; } @@ -1090,11 +1095,12 @@ SPMeshGradient *SPPaintSelector::getMeshGradient() mesh = SP_MESHGRADIENT(mesh_obj); } g_free(mesh_name); - } else { std::cerr << "SPPaintSelector::getMeshGradient: Unexpected meshid value." << std::endl; } + g_free(meshid); + return mesh; } @@ -1298,8 +1304,11 @@ void SPPaintSelector::updatePatternList( SPPattern *pattern ) gtk_tree_model_get (store, &iter, COMBO_COL_PATTERN, &patid, -1); while (valid && strcmp(patid, patname) != 0) { valid = gtk_tree_model_iter_next (store, &iter); + g_free(patid); + patid = nullptr; gtk_tree_model_get (store, &iter, COMBO_COL_PATTERN, &patid, -1); } + g_free(patid); if (valid) { gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo), &iter); @@ -1433,12 +1442,12 @@ SPPattern *SPPaintSelector::getPattern() gchar *patid = nullptr; gboolean stockid = FALSE; - gchar *label = nullptr; + // gchar *label = nullptr; gtk_tree_model_get(store, &iter, - COMBO_COL_LABEL, &label, + // COMBO_COL_LABEL, &label, COMBO_COL_STOCK, &stockid, COMBO_COL_PATTERN, &patid, -1); - + // g_free(label); if (patid == nullptr) { return nullptr; } @@ -1465,6 +1474,8 @@ SPPattern *SPPaintSelector::getPattern() } } + g_free(patid); + return pat; } diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index fc5bad47a..365c0a76f 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -727,7 +727,9 @@ void update_aux_toolbox(SPDesktop * /*desktop*/, ToolBase *eventcontext, GtkWidg gchar const *tname = ( eventcontext ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) : nullptr ); - GtkWidget *stack = (GtkWidget *)gtk_container_get_children((GtkContainer *)toolbox)->data; + GList *list = gtk_container_get_children((GtkContainer *)toolbox); + GtkWidget *stack = (GtkWidget *)list->data; + g_list_free(list); gtk_stack_set_visible_child_name((GtkStack *)stack, tname); } -- cgit v1.2.3