void tree_item_selected( GtkWidget* item ) { gchar* current_path = context.current_path; memset( current_path, 0, PAKFile::MAX_FILENAMESIZE ); if( GTK_TREE( item->parent )->level != 0 ) { walk_up_tree( item ); } build_table( ); }
void walk_up_tree( GtkWidget* item ) { gchar* current_path = context.current_path; gchar* text; GtkWidget* widget = item; GtkTree* next_tree = GTK_TREE( widget->parent ); if( next_tree->level > 1 ) { walk_up_tree( next_tree->tree_owner ); } GtkLabel* label = GTK_LABEL( GTK_BIN( widget )->child ); gtk_label_get( label, &text ); strncat( current_path, text, PAKFileEntry::MAX_FILENAMESIZE - 1 ); // No "/" on front of path. if( next_tree->level >= 1 ) { strcat( current_path, "/" ); } }
/* * drop the reference count on the tree rooted at 'snap'. This traverses * the tree freeing any blocks that have a ref count of zero after being * decremented. */ int btrfs_drop_snapshot(struct btrfs_trans_handle *trans, struct btrfs_root *root, struct btrfs_buffer *snap) { int ret = 0; int wret; int level; struct btrfs_path path; int i; int orig_level; btrfs_init_path(&path); level = btrfs_header_level(&snap->node.header); orig_level = level; path.nodes[level] = snap; path.slots[level] = 0; while(1) { wret = walk_down_tree(trans, root, &path, &level); if (wret > 0) break; if (wret < 0) ret = wret; wret = walk_up_tree(trans, root, &path, &level); if (wret > 0) break; if (wret < 0) ret = wret; } for (i = 0; i <= orig_level; i++) { if (path.nodes[i]) { btrfs_block_release(root, path.nodes[i]); } } return ret; }