fix memory leaks in texture browser::tags functions

This commit is contained in:
Garux 2020-05-05 23:36:48 +03:00
parent ef2fdfa127
commit fa2a179fd5

View File

@ -1269,41 +1269,43 @@ void BuildStoreAvailableTags( GtkListStore* storeAvailable,
TextureBrowser* textureBrowser ){ TextureBrowser* textureBrowser ){
GtkTreeIter iterAssigned; GtkTreeIter iterAssigned;
GtkTreeIter iterAvailable; GtkTreeIter iterAvailable;
std::set<CopiedString>::const_iterator iterAll;
gchar* tag_assigned;
gtk_list_store_clear( storeAvailable ); gtk_list_store_clear( storeAvailable );
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0; bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
if ( !row ) { // does the shader have tags assigned? if ( !row ) { // does the shader have tags assigned?
for ( iterAll = allTags.begin(); iterAll != allTags.end(); ++iterAll ) for ( const CopiedString& tag : allTags )
{ {
gtk_list_store_append( storeAvailable, &iterAvailable ); gtk_list_store_append( storeAvailable, &iterAvailable );
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, ( *iterAll ).c_str(), -1 ); gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, tag.c_str(), -1 );
} }
} }
else else
{ {
while ( row ) // available tags = all tags - assigned tags while ( row ) // available tags = all tags - assigned tags
{ {
gchar* tag_assigned;
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
for ( iterAll = allTags.begin(); iterAll != allTags.end(); ++iterAll ) for ( const CopiedString& tag : allTags )
{ {
if ( strcmp( (char*)tag_assigned, ( *iterAll ).c_str() ) != 0 ) { if ( !string_equal( tag_assigned, tag.c_str() ) ) {
gtk_list_store_append( storeAvailable, &iterAvailable ); gtk_list_store_append( storeAvailable, &iterAvailable );
gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, ( *iterAll ).c_str(), -1 ); gtk_list_store_set( storeAvailable, &iterAvailable, TAG_COLUMN, tag.c_str(), -1 );
} }
else else
{ {
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0; row = gtk_tree_model_iter_next( GTK_TREE_MODEL( storeAssigned ), &iterAssigned ) != 0;
if ( row ) { if ( row ) {
g_free( tag_assigned );
gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( storeAssigned ), &iterAssigned, TAG_COLUMN, &tag_assigned, -1 );
} }
} }
} }
g_free( tag_assigned );
} }
} }
} }
@ -1799,6 +1801,8 @@ void TextureBrowser_assignTags(){
gtk_list_store_remove( g_TextureBrowser.m_available_store, &iter ); gtk_list_store_remove( g_TextureBrowser.m_available_store, &iter );
gtk_list_store_append( g_TextureBrowser.m_assigned_store, &iter ); gtk_list_store_append( g_TextureBrowser.m_assigned_store, &iter );
gtk_list_store_set( g_TextureBrowser.m_assigned_store, &iter, TAG_COLUMN, (char*)tag_assigned, -1 ); gtk_list_store_set( g_TextureBrowser.m_assigned_store, &iter, TAG_COLUMN, (char*)tag_assigned, -1 );
g_free( tag_assigned );
} }
} }
} }
@ -1814,7 +1818,6 @@ void TextureBrowser_assignTags(){
void TextureBrowser_removeTags(){ void TextureBrowser_removeTags(){
GSList* selected = NULL; GSList* selected = NULL;
GSList* node; GSList* node;
gchar* tag;
GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ) ); GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( g_TextureBrowser.m_assigned_tree ) );
@ -1829,9 +1832,11 @@ void TextureBrowser_removeTags(){
GtkTreeIter iter; GtkTreeIter iter;
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, path ) ) { if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, path ) ) {
gchar* tag;
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, TAG_COLUMN, &tag, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_assigned_store ), &iter, TAG_COLUMN, &tag, -1 );
TagBuilder.DeleteShaderTag( g_TextureBrowser.shader.c_str(), tag ); TagBuilder.DeleteShaderTag( g_TextureBrowser.shader.c_str(), tag );
gtk_list_store_remove( g_TextureBrowser.m_assigned_store, &iter ); gtk_list_store_remove( g_TextureBrowser.m_assigned_store, &iter );
g_free( tag );
} }
} }
} }
@ -1863,7 +1868,6 @@ void TextureBrowser_buildTagList(){
void TextureBrowser_searchTags(){ void TextureBrowser_searchTags(){
GSList* selected = NULL; GSList* selected = NULL;
GSList* node; GSList* node;
gchar* tag;
char buffer[256]; char buffer[256];
char tags_searched[256]; char tags_searched[256];
@ -1883,10 +1887,12 @@ void TextureBrowser_searchTags(){
GtkTreeIter iter; GtkTreeIter iter;
if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, path ) ) { if ( gtk_tree_model_get_iter( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, path ) ) {
gchar* tag;
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, TAG_COLUMN, &tag, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iter, TAG_COLUMN, &tag, -1 );
strcat( buffer, tag ); strcat( buffer, tag );
strcat( tags_searched, tag ); strcat( tags_searched, tag );
g_free( tag );
if ( node != g_slist_last( node ) ) { if ( node != g_slist_last( node ) ) {
strcat( buffer, "' and tag='" ); strcat( buffer, "' and tag='" );
strcat( tags_searched, ", " ); strcat( tags_searched, ", " );
@ -2380,7 +2386,7 @@ void TextureBrowser_renameTag(){
gtk_tree_selection_get_selected() doesn't work with GTK_SELECTION_MULTIPLE, gtk_tree_selection_get_selected() doesn't work with GTK_SELECTION_MULTIPLE,
we need to count the number of selected rows first and use we need to count the number of selected rows first and use
gtk_tree_selection_selected_foreach() then to go through the list of selected gtk_tree_selection_selected_foreach() then to go through the list of selected
rows (which always containins a single row). rows (which always contains a single row).
*/ */
GSList* selected = NULL; GSList* selected = NULL;
@ -2394,18 +2400,19 @@ void TextureBrowser_renameTag(){
if ( result == eIDOK && !newTag.empty() ) { if ( result == eIDOK && !newTag.empty() ) {
GtkTreeIter iterList; GtkTreeIter iterList;
gchar* rowTag;
gchar* oldTag = (char*)selected->data; gchar* oldTag = (char*)selected->data;
bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0; bool row = gtk_tree_model_get_iter_first( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
while ( row ) while ( row )
{ {
gchar* rowTag;
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList, TAG_COLUMN, &rowTag, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList, TAG_COLUMN, &rowTag, -1 );
if ( strcmp( rowTag, oldTag ) == 0 ) { if ( string_equal( rowTag, oldTag ) ) {
gtk_list_store_set( g_TextureBrowser.m_all_tags_list, &iterList, TAG_COLUMN, newTag.c_str(), -1 ); gtk_list_store_set( g_TextureBrowser.m_all_tags_list, &iterList, TAG_COLUMN, newTag.c_str(), -1 );
} }
g_free( rowTag );
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0; row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterList ) != 0;
} }
@ -2422,6 +2429,8 @@ void TextureBrowser_renameTag(){
{ {
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for renaming." ); gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for renaming." );
} }
g_slist_free_full( selected, g_free );
} }
void TextureBrowser_deleteTag(){ void TextureBrowser_deleteTag(){
@ -2435,7 +2444,6 @@ void TextureBrowser_deleteTag(){
if ( result == eIDYES ) { if ( result == eIDYES ) {
GtkTreeIter iterSelected; GtkTreeIter iterSelected;
gchar *rowTag;
gchar* tagSelected = (char*)selected->data; gchar* tagSelected = (char*)selected->data;
@ -2443,12 +2451,15 @@ void TextureBrowser_deleteTag(){
while ( row ) while ( row )
{ {
gchar *rowTag;
gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected, TAG_COLUMN, &rowTag, -1 ); gtk_tree_model_get( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected, TAG_COLUMN, &rowTag, -1 );
if ( strcmp( rowTag, tagSelected ) == 0 ) { if ( string_equal( rowTag, tagSelected ) ) {
gtk_list_store_remove( g_TextureBrowser.m_all_tags_list, &iterSelected ); gtk_list_store_remove( g_TextureBrowser.m_all_tags_list, &iterSelected );
g_free( rowTag );
break; break;
} }
g_free( rowTag );
row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected ) != 0; row = gtk_tree_model_iter_next( GTK_TREE_MODEL( g_TextureBrowser.m_all_tags_list ), &iterSelected ) != 0;
} }
@ -2462,6 +2473,8 @@ void TextureBrowser_deleteTag(){
else { else {
gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for deletion." ); gtk_MessageBox( GTK_WIDGET( g_TextureBrowser.m_parent ), "Select a single tag for deletion." );
} }
g_slist_free_full( selected, g_free );
} }
void TextureBrowser_copyTag(){ void TextureBrowser_copyTag(){