diff options
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/torrent.c | 6 | ||||
-rw-r--r-- | src/trg-file-parser.c | 59 | ||||
-rw-r--r-- | src/trg-file-parser.h | 11 | ||||
-rw-r--r-- | src/trg-files-model.c | 239 | ||||
-rw-r--r-- | src/trg-files-tree-view-common.c | 3 | ||||
-rw-r--r-- | src/trg-files-tree-view-common.h | 22 | ||||
-rw-r--r-- | src/trg-files-tree-view.c | 1 | ||||
-rw-r--r-- | src/trg-main-window.c | 8 | ||||
-rw-r--r-- | src/trg-torrent-add-dialog.c | 5 | ||||
-rw-r--r-- | src/util.c | 13 | ||||
-rw-r--r-- | src/util.h | 3 |
12 files changed, 190 insertions, 181 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 36df2fc..65f6d22 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -64,6 +64,7 @@ transmission_remote_gtk_SOURCES = main.c \ trg-peers-model.c \ trg-peers-tree-view.c \ trg-files-model-common.c \ + trg-files-tree.c \ trg-model.c \ trg-persistent-tree-view.c \ trg-files-model.c \ diff --git a/src/torrent.c b/src/torrent.c index 0c83995..fbc5884 100644 --- a/src/torrent.c +++ b/src/torrent.c @@ -610,7 +610,11 @@ gint64 peerfrom_get_lpd(JsonObject * pf) gdouble file_get_progress(gint64 length, gint64 completed) { if (length > 0) { - return ((gdouble) completed / (gdouble) length) * 100.0; + gdouble progress = ((gdouble) completed / (gdouble) length) * 100.0; + if (progress > 100.0) + return 100.0; + else + return progress; } else { return 0.0; } diff --git a/src/trg-file-parser.c b/src/trg-file-parser.c index 81010f6..263cd2f 100644 --- a/src/trg-file-parser.c +++ b/src/trg-file-parser.c @@ -26,15 +26,14 @@ #include "bencode.h" #include "trg-file-parser.h" -static trg_torrent_file_node - * trg_torrent_file_node_insert(trg_torrent_file_node * top, - trg_torrent_file_node * last, - be_node * file_node, guint index, - gint64 * total_length) +static trg_files_tree_node + * trg_file_parser_node_insert(trg_files_tree_node * top, + trg_files_tree_node * last, + be_node * file_node, gint index) { be_node *file_length_node = be_dict_find(file_node, "length", BE_INT); be_node *file_path_list = be_dict_find(file_node, "path", BE_LIST); - trg_torrent_file_node *lastIter = last; + trg_files_tree_node *lastIter = last; GList *parentList = NULL; be_node *path_el_node; GList *li; @@ -55,11 +54,11 @@ static trg_torrent_file_node */ for (i = 0; (path_el_node = file_path_list->val.l[i]); i++) { gboolean isFile = !file_path_list->val.l[i + 1]; - trg_torrent_file_node *target_node = NULL; + trg_files_tree_node *target_node = NULL; if (li && !isFile) { - trg_torrent_file_node *lastPathNode = - (trg_torrent_file_node *) li->data; + trg_files_tree_node *lastPathNode = + (trg_files_tree_node *) li->data; if (!g_strcmp0(lastPathNode->name, path_el_node->val.s)) target_node = lastPathNode; @@ -68,7 +67,7 @@ static trg_torrent_file_node } if (!target_node) { - target_node = g_new0(trg_torrent_file_node, 1); + target_node = g_new0(trg_files_tree_node, 1); target_node->name = g_strdup(path_el_node->val.s); target_node->parent = lastIter; @@ -82,8 +81,7 @@ static trg_torrent_file_node lastIter = target_node; if (isFile) { - *total_length += (target_node->length = - (gint64) (file_length_node->val.i)); + target_node->length = (gint64)file_length_node->val.i; target_node->index = index; } } @@ -93,31 +91,19 @@ static trg_torrent_file_node return lastIter; } -static void trg_torrent_file_node_free(trg_torrent_file_node * node) -{ - GList *li; - for (li = node->children; li != NULL; li = g_list_next(li)) - trg_torrent_file_node_free((trg_torrent_file_node *) li->data); - g_list_free(node->children); - g_free(node->name); - g_free(node); -} - void trg_torrent_file_free(trg_torrent_file * t) { - trg_torrent_file_node_free(t->top_node); + trg_files_tree_node_free(t->top_node); g_free(t->name); g_free(t); } -static trg_torrent_file_node *trg_parse_torrent_file_nodes(be_node * - info_node, - gint64 * - total_length) +static trg_files_tree_node *trg_parse_torrent_file_nodes(be_node * + info_node) { be_node *files_node = be_dict_find(info_node, "files", BE_LIST); - trg_torrent_file_node *top_node = g_new0(trg_torrent_file_node, 1); - trg_torrent_file_node *lastNode = NULL; + trg_files_tree_node *top_node = g_new0(trg_files_tree_node, 1); + trg_files_tree_node *lastNode = NULL; int i; /* Probably means single file mode. */ @@ -129,12 +115,11 @@ static trg_torrent_file_node *trg_parse_torrent_file_nodes(be_node * if (!be_validate_node(file_node, BE_DICT) || !(lastNode = - trg_torrent_file_node_insert(top_node, lastNode, - file_node, i, - total_length))) { + trg_file_parser_node_insert(top_node, lastNode, + file_node, i))) { /* Unexpected format. Throw away everything, file indexes need to * be correct. */ - trg_torrent_file_node_free(top_node); + trg_files_tree_node_free(top_node); return NULL; } } @@ -187,9 +172,9 @@ trg_torrent_file *trg_parse_torrent_file(const gchar * filename) ret->name = g_strdup(name_node->val.s); ret->top_node = - trg_parse_torrent_file_nodes(info_node, &(ret->total_length)); + trg_parse_torrent_file_nodes(info_node); if (!ret->top_node) { - trg_torrent_file_node *file_node; + trg_files_tree_node *file_node; be_node *length_node = be_dict_find(info_node, "length", BE_INT); if (!length_node) { @@ -198,8 +183,8 @@ trg_torrent_file *trg_parse_torrent_file(const gchar * filename) goto out; } - file_node = g_new0(trg_torrent_file_node, 1); - file_node->length = ret->total_length = + file_node = g_new0(trg_files_tree_node, 1); + file_node->length = (gint64) (length_node->val.i); file_node->name = g_strdup(ret->name); ret->top_node = file_node; diff --git a/src/trg-file-parser.h b/src/trg-file-parser.h index 1d7e116..f2d6fb7 100644 --- a/src/trg-file-parser.h +++ b/src/trg-file-parser.h @@ -17,18 +17,11 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -typedef struct { - char *name; - gint64 length; - GList *children; - guint index; - gpointer parent; -} trg_torrent_file_node; +#include "trg-files-tree.h" typedef struct { char *name; - trg_torrent_file_node *top_node; - gint64 total_length; + trg_files_tree_node *top_node; } trg_torrent_file; void trg_torrent_file_free(trg_torrent_file * t); diff --git a/src/trg-files-model.c b/src/trg-files-model.c index 2280d49..521f99b 100644 --- a/src/trg-files-model.c +++ b/src/trg-files-model.c @@ -24,6 +24,7 @@ #include "protocol-constants.h" #include "trg-files-model-common.h" #include "trg-files-tree-view-common.h" +#include "trg-files-tree.h" #include "trg-files-model.h" #include "trg-client.h" #include "torrent.h" @@ -65,105 +66,136 @@ static void trg_files_update_parent_progress(GtkTreeModel * model, newCompleted = lastCompleted + increment; gtk_tree_store_set(GTK_TREE_STORE(model), &tmp_iter, - FILESCOL_BYTESCOMPLETED, newCompleted, FILESCOL_PROGRESS, file_get_progress(length, newCompleted), + FILESCOL_BYTESCOMPLETED, newCompleted, -1); back_iter = tmp_iter; } } -static void trg_files_model_iter_new(TrgFilesModel * model, - GtkTreeIter * iter, JsonObject * file, - gint id) +static void trg_files_tree_update_ancestors( + trg_files_tree_node *node) { - TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model); - gchar **elements = g_strsplit(file_get_name(file), "/", -1); - gchar *existingName; - gint i, existingId; - GtkTreeRowReference *parentRowRef = NULL; - GtkTreeIter parentIter; - - for (i = 0; elements[i]; i++) { - GtkTreeIter *found = NULL; + trg_files_tree_node *back_iter = node; + gint pri_result = node->priority; + gint enabled_result = node->enabled; + + while ((back_iter = back_iter->parent)) { + GList *li; + for (li = back_iter->children; li; li = g_list_next(li)) { + trg_files_tree_node *back_node = (trg_files_tree_node*)li->data; + gboolean stop = FALSE; + + if (back_node->priority != pri_result) { + pri_result = TR_PRI_MIXED; + stop = TRUE; + } - if (parentRowRef) - rowref_to_iter(GTK_TREE_MODEL(model), parentRowRef, - &parentIter); + if (back_node->enabled != enabled_result) { + enabled_result = TR_PRI_MIXED; + stop = TRUE; + } - /* If this is the last component of the path, create a file node. */ + if (stop) + break; + } - if (!elements[i + 1]) { - gtk_tree_store_append(GTK_TREE_STORE(model), iter, - parentRowRef ? &parentIter : NULL); - gtk_tree_store_set(GTK_TREE_STORE(model), iter, FILESCOL_NAME, - elements[i], FILESCOL_SIZE, - file_get_length(file), FILESCOL_ID, id, -1); + back_iter->bytesCompleted += node->bytesCompleted; + back_iter->length += node->length; + back_iter->priority = pri_result; + back_iter->enabled = enabled_result; + } +} - if (parentRowRef) - trg_files_model_update_parents(GTK_TREE_MODEL(model), iter, - FILESCOL_SIZE); +static void store_add_node(GtkTreeStore * store, GtkTreeIter * parent, + trg_files_tree_node * node) +{ + GtkTreeIter child; + GList *li; + + if (node->name) { + gdouble progress = file_get_progress(node->length, node->bytesCompleted); + gtk_tree_store_append(store, &child, parent); + gtk_tree_store_set(store, &child, FILESCOL_WANTED, node->enabled, + FILESCOL_PROGRESS, progress, + FILESCOL_SIZE, node->length, + FILESCOL_ID, node->children ? -1 : node->index, + FILESCOL_PRIORITY, node->priority, FILESCOL_NAME, node->name, + -1); + } - break; - } + for (li = node->children; li; li = g_list_next(li)) + store_add_node(store, node->name ? &child : NULL, + (trg_files_tree_node *) li->data); +} - /* Search for the directory this files goes under, under the saved - * GtkTreeRowReferece *parent. */ - - if (gtk_tree_model_iter_children(GTK_TREE_MODEL(model), iter, - parentRowRef ? &parentIter : - NULL)) { - do { - gtk_tree_model_get(GTK_TREE_MODEL(model), iter, - FILESCOL_NAME, &existingName, - FILESCOL_ID, &existingId, -1); - - if (existingId == -1 - && !g_strcmp0(elements[i], existingName)) { - found = iter; - iter_to_row_reference(GTK_TREE_MODEL(model), iter, - &parentRowRef); - } - - g_free(existingName); - - if (found) - break; - } while (gtk_tree_model_iter_next - (GTK_TREE_MODEL(model), iter)); +static trg_files_tree_node + * trg_file_parser_node_insert(trg_files_tree_node * top, + trg_files_tree_node * last, + JsonObject *file, gint index, + JsonArray *enabled, JsonArray *priorities) +{ + gchar **path = g_strsplit(file_get_name(file), "/", -1); + trg_files_tree_node *lastIter = last; + GList *parentList = NULL; + gchar *path_el; + GList *li; + int i; + + if (lastIter) + while ((lastIter = lastIter->parent)) + parentList = g_list_prepend(parentList, lastIter); + + li = parentList; + lastIter = NULL; + + /* Iterate over the path list which contains each file/directory + * component of the path in order. + */ + for (i = 0; (path_el = path[i]); i++) { + gboolean isFile = !path[i + 1]; + trg_files_tree_node *target_node = NULL; + + if (li && !isFile) { + trg_files_tree_node *lastPathNode = + (trg_files_tree_node *) li->data; + + if (!g_strcmp0(lastPathNode->name, path[i])) + target_node = lastPathNode; + + li = g_list_next(li); } - if (!found) { - GValue gvalue = { 0 }; + if (!target_node) { + target_node = g_new0(trg_files_tree_node, 1); + target_node->name = g_strdup(path[i]); + target_node->parent = lastIter; - gtk_tree_store_append(GTK_TREE_STORE(model), iter, - parentRowRef ? &parentIter : NULL); - gtk_tree_store_set(GTK_TREE_STORE(model), iter, - FILESCOL_PRIORITY, TR_PRI_UNSET, - FILESCOL_NAME, elements[i], -1); + if (lastIter) + lastIter->children = + g_list_append(lastIter->children, target_node); + else + top->children = g_list_append(top->children, target_node); + } - g_value_init(&gvalue, G_TYPE_INT); - g_value_set_int(&gvalue, -1); - gtk_tree_store_set_value(GTK_TREE_STORE(model), iter, - FILESCOL_ID, &gvalue); + lastIter = target_node; - memset(&gvalue, 0, sizeof(GValue)); - g_value_init(&gvalue, G_TYPE_INT); - g_value_set_int(&gvalue, TR_PRI_UNSET); - gtk_tree_store_set_value(GTK_TREE_STORE(model), iter, - FILESCOL_PRIORITY, &gvalue); + if (isFile) { + target_node->length = file_get_length(file); + target_node->bytesCompleted = file_get_bytes_completed(file); + target_node->index = index; + target_node->enabled = (gint)json_array_get_int_element(enabled, index); + target_node->priority = (gint)json_array_get_int_element(priorities, index); - iter_to_row_reference(GTK_TREE_MODEL(model), iter, - &parentRowRef); + trg_files_tree_update_ancestors(target_node); } } - if (parentRowRef) - gtk_tree_row_reference_free(parentRowRef); + g_list_free(parentList); - g_strfreev(elements); - priv->n_items++; + return lastIter; } void trg_files_model_set_accept(TrgFilesModel * model, gboolean accept) @@ -174,17 +206,15 @@ void trg_files_model_set_accept(TrgFilesModel * model, gboolean accept) static void trg_files_model_iter_update(TrgFilesModel * model, GtkTreeIter * filesIter, - gboolean isFirst, JsonObject * file, JsonArray * wantedArray, JsonArray * prioritiesArray, - int id) + gint id) { TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model); - gint64 fileLength = file_get_length(file); gint64 fileCompleted = file_get_bytes_completed(file); - gint64 increment; + gint64 lastCompleted; gboolean wanted = json_node_get_int(json_array_get_element(wantedArray, id)) @@ -193,36 +223,20 @@ static void trg_files_model_iter_update(TrgFilesModel * model, json_node_get_int(json_array_get_element(prioritiesArray, id)); gdouble progress = file_get_progress(fileLength, fileCompleted); - if (isFirst) { - increment = fileCompleted; - } else { - gint64 lastCompleted; - gtk_tree_model_get(GTK_TREE_MODEL(model), filesIter, + gtk_tree_model_get(GTK_TREE_MODEL(model), filesIter, FILESCOL_BYTESCOMPLETED, &lastCompleted, -1); - increment = fileCompleted - lastCompleted; - } gtk_tree_store_set(GTK_TREE_STORE(model), filesIter, FILESCOL_PROGRESS, progress, FILESCOL_BYTESCOMPLETED, fileCompleted, -1); trg_files_update_parent_progress(GTK_TREE_MODEL(model), filesIter, - increment); + fileCompleted - lastCompleted); if (priv->accept) gtk_tree_store_set(GTK_TREE_STORE(model), filesIter, FILESCOL_WANTED, wanted, FILESCOL_PRIORITY, priority, -1); - - if (isFirst) { - trg_files_tree_model_propogate_change_up(GTK_TREE_MODEL(model), - filesIter, - FILESCOL_PRIORITY, - priority); - trg_files_tree_model_propogate_change_up(GTK_TREE_MODEL(model), - filesIter, - FILESCOL_WANTED, wanted); - } } static void trg_files_model_class_init(TrgFilesModelClass * klass) @@ -261,7 +275,7 @@ gboolean trg_files_model_update_foreach(GtkListStore * model, if (id >= 0) { file = json_node_get_object(g_list_nth_data(files, id)); - trg_files_model_iter_update(TRG_FILES_MODEL(model), iter, FALSE, + trg_files_model_iter_update(TRG_FILES_MODEL(model), iter, file, priv->wanted, priv->priorities, id); } @@ -274,42 +288,39 @@ void trg_files_model_update(TrgFilesModel * model, gint64 updateSerial, { TrgFilesModelPrivate *priv = TRG_FILES_MODEL_GET_PRIVATE(model); GList *filesList, *li; - GtkTreeIter filesIter; JsonObject *file; gint j = 0; + guint n_updates; priv->torrentId = torrent_get_id(t); priv->priorities = torrent_get_priorities(t); priv->wanted = torrent_get_wanted(t); filesList = json_array_get_elements(torrent_get_files(t)); + n_updates = g_list_length(filesList); - if (mode == TORRENT_GET_MODE_FIRST) { + if (mode == TORRENT_GET_MODE_FIRST || priv->n_items != n_updates) { + trg_files_tree_node *top_node = g_new0(trg_files_tree_node, 1); + trg_files_tree_node *lastNode = NULL; gtk_tree_store_clear(GTK_TREE_STORE(model)); priv->accept = TRUE; + for (li = filesList; li; li = g_list_next(li)) { file = json_node_get_object((JsonNode *) li->data); - trg_files_model_iter_new(model, &filesIter, file, j); - trg_files_model_iter_update(model, &filesIter, TRUE, file, - priv->wanted, priv->priorities, j); - j++; + lastNode = + trg_file_parser_node_insert(top_node, lastNode, + file, j++, priv->wanted, priv->priorities); } + + priv->n_items = j; + + store_add_node(GTK_TREE_STORE(model), NULL, top_node); + } else { - guint n_updates = g_list_length(filesList); gtk_tree_model_foreach(GTK_TREE_MODEL(model), (GtkTreeModelForeachFunc) trg_files_model_update_foreach, filesList); - if (n_updates > priv->n_items) { - gint n_new = n_updates - priv->n_items; - for (j = n_updates - n_new; j < n_updates; j++) { - file = json_node_get_object(g_list_nth_data(filesList, j)); - trg_files_model_iter_new(model, &filesIter, file, j); - trg_files_model_iter_update(model, &filesIter, TRUE, file, - priv->wanted, priv->priorities, - j); - } - } } g_list_free(filesList); diff --git a/src/trg-files-tree-view-common.c b/src/trg-files-tree-view-common.c index 5845778..c405323 100644 --- a/src/trg-files-tree-view-common.c +++ b/src/trg-files-tree-view-common.c @@ -184,6 +184,7 @@ gboolean trg_files_tree_view_onViewButtonPressed(GtkWidget * w, GdkEventButton * event, gint pri_id, gint enabled_id, + gboolean one_click, GCallback low_cb, GCallback normal_cb, GCallback high_cb, @@ -197,7 +198,7 @@ gboolean trg_files_tree_view_onViewButtonPressed(GtkWidget * w, gboolean handled = FALSE; GtkTreeView *treeview = GTK_TREE_VIEW(w); - if (event->type == GDK_BUTTON_PRESS && event->button == 1 + if (one_click && event->type == GDK_BUTTON_PRESS && event->button == 1 && !(event->state & (GDK_SHIFT_MASK | GDK_CONTROL_MASK)) && getAndSelectEventPath(treeview, event, &col, &path)) { handled = diff --git a/src/trg-files-tree-view-common.h b/src/trg-files-tree-view-common.h index 1dccf7f..de21e43 100644 --- a/src/trg-files-tree-view-common.h +++ b/src/trg-files-tree-view-common.h @@ -20,16 +20,18 @@ #ifndef TRG_FILES_TREE_VIEW_COMMON_H_ #define TRG_FILES_TREE_VIEW_COMMON_H_ -gboolean -trg_files_tree_view_onViewButtonPressed(GtkWidget * w, - GdkEventButton * event, - gint pri_id, gint enabled_id, - GCallback low_cb, - GCallback normal_cb, - GCallback high_cb, - GCallback wanted_cb, - GCallback unwanted_cb, - gpointer gdata); +gboolean trg_files_tree_view_onViewButtonPressed(GtkWidget * w, + GdkEventButton * event, + gint pri_id, + gint enabled_id, + gboolean one_click, + GCallback low_cb, + GCallback normal_cb, + GCallback high_cb, + GCallback wanted_cb, + GCallback unwanted_cb, + gpointer gdata); + gboolean trg_files_tree_view_viewOnPopupMenu(GtkWidget * treeview, GCallback low_cb, GCallback normal_cb, diff --git a/src/trg-files-tree-view.c b/src/trg-files-tree-view.c index bf0d9c8..3aae35d 100644 --- a/src/trg-files-tree-view.c +++ b/src/trg-files-tree-view.c @@ -164,6 +164,7 @@ static gboolean view_onButtonPressed(GtkWidget * treeview, trg_files_tree_view_onViewButtonPressed(treeview, event, FILESCOL_PRIORITY, FILESCOL_WANTED, + FALSE, G_CALLBACK(set_low), G_CALLBACK(set_normal), G_CALLBACK(set_high), diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 1a1733c..d06f250 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -1879,7 +1879,8 @@ static void exec_cmd_cb(GtkWidget * w, gpointer data) GList *selectedRows = gtk_tree_selection_get_selected_rows(selection, &model); GError *cmd_error = NULL; - gchar *cmd_line, **argv; + gchar *cmd_line = NULL; + gchar **argv = NULL; cmd_line = build_remote_exec_cmd(priv->client, model, @@ -1901,7 +1902,10 @@ static void exec_cmd_cb(GtkWidget * w, gpointer data) g_list_foreach(selectedRows, (GFunc) gtk_tree_path_free, NULL); g_list_free(selectedRows); - g_strfreev(argv); + + if (argv) + g_strfreev(argv); + g_free(cmd_line); if (cmd_error) { diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c index bf29b8b..0c25058 100644 --- a/src/trg-torrent-add-dialog.c +++ b/src/trg-torrent-add-dialog.c @@ -292,6 +292,7 @@ static gboolean onViewButtonPressed(GtkWidget * w, GdkEventButton * event, { return trg_files_tree_view_onViewButtonPressed(w, event, FC_PRIORITY, FC_ENABLED, + TRUE, G_CALLBACK(set_low), G_CALLBACK(set_normal), G_CALLBACK(set_high), @@ -463,7 +464,7 @@ static void addTorrentFilters(GtkFileChooser * chooser) } static void store_add_node(GtkTreeStore * store, GtkTreeIter * parent, - trg_torrent_file_node * node) + trg_files_tree_node * node) { GtkTreeIter child; GList *li; @@ -483,7 +484,7 @@ static void store_add_node(GtkTreeStore * store, GtkTreeIter * parent, for (li = node->children; li; li = g_list_next(li)) store_add_node(store, node->name ? &child : NULL, - (trg_torrent_file_node *) li->data); + (trg_files_tree_node *) li->data); } static void torrent_not_parsed_warning(GtkWindow * parent) @@ -534,16 +534,21 @@ evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap) #endif } -void iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter, - GtkTreeRowReference ** rr) +GtkTreeRowReference* iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter) { GtkTreePath *path = gtk_tree_model_get_path(model, iter); + GtkTreeRowReference *rr = gtk_tree_row_reference_new(model, path); + gtk_tree_path_free(path); + return rr; +} +void iter_replace_row_reference(GtkTreeModel * model, GtkTreeIter * iter, + GtkTreeRowReference ** rr) +{ if (*rr) gtk_tree_row_reference_free(*rr); - *rr = gtk_tree_row_reference_new(model, path); - gtk_tree_path_free(path); + *rr = iter_to_row_reference(model, iter); } void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr, @@ -89,9 +89,10 @@ GtkWidget *my_scrolledwin_new(GtkWidget * child); gboolean is_url(gchar * string); gboolean is_magnet(gchar * string); GtkWidget *gtr_combo_box_new_enum(const char *text_1, ...); -void iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter, +void iter_replace_row_reference(GtkTreeModel * model, GtkTreeIter * iter, GtkTreeRowReference ** rr); void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr, GtkTreeIter * iter); +GtkTreeRowReference* iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter); #endif /* UTIL_H_ */ |