summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-08 00:52:56 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-08 00:52:56 +0000
commite1b13312f975f38d3d7437f28299912eff6947e0 (patch)
tree563d1d7937ce87915e2055d9b2f1dae37d2b9b71
parent0a1fa495bd2186c2004fbc0f8977fe52a5f82168 (diff)
fix the performance problems with the torrent add dialog on torrents with many files/dirs. the parent size updates just walks up parents rather than a full foreach, and the inserts try to use the previous update to speed up finding/creating the directories. I'll probably do something similar to the main files treeview.
-rw-r--r--src/bencode.c6
-rw-r--r--src/bencode.h14
-rw-r--r--src/trg-cell-renderer-counter.c6
-rw-r--r--src/trg-cell-renderer-file-icon.c6
-rw-r--r--src/trg-client.c5
-rw-r--r--src/trg-file-parser.c75
-rw-r--r--src/trg-file-parser.h1
-rw-r--r--src/trg-files-model-common.c80
-rw-r--r--src/trg-files-model-common.h14
-rw-r--r--src/trg-files-model.c92
-rw-r--r--src/trg-files-tree-view-common.c8
-rw-r--r--src/trg-main-window.c15
-rw-r--r--src/trg-state-selector.c10
-rw-r--r--src/trg-torrent-add-dialog.c15
-rw-r--r--src/util.c20
-rw-r--r--src/util.h4
16 files changed, 166 insertions, 205 deletions
diff --git a/src/bencode.c b/src/bencode.c
index c9c9b6a..b6d64af 100644
--- a/src/bencode.c
+++ b/src/bencode.c
@@ -180,12 +180,12 @@ be_node *be_decode(const char *data)
return be_decoden(data, strlen(data));
}
-int be_validate_node(be_node * node, int type)
+gboolean be_validate_node(be_node * node, gint type)
{
if (!node || node->type != type)
- return 1;
+ return FALSE;
else
- return 0;
+ return TRUE;
}
static inline void _be_free_str(char *str)
diff --git a/src/bencode.h b/src/bencode.h
index 71760e0..23fc51a 100644
--- a/src/bencode.h
+++ b/src/bencode.h
@@ -52,13 +52,13 @@ extern "C" {
} val;
} be_node;
- extern gint64 be_str_len(be_node * node);
- extern be_node *be_decode(const char *bencode);
- extern be_node *be_decoden(const char *bencode, gint64 bencode_len);
- extern void be_free(be_node * node);
- extern void be_dump(be_node * node);
- extern be_node *be_dict_find(be_node * node, char *key, int type);
- extern int be_validate_node(be_node * node, int type);
+ gint64 be_str_len(be_node * node);
+ be_node *be_decode(const char *bencode);
+ be_node *be_decoden(const char *bencode, gint64 bencode_len);
+ void be_free(be_node * node);
+ void be_dump(be_node * node);
+ be_node *be_dict_find(be_node * node, char *key, int type);
+ gboolean be_validate_node(be_node * node, gint type);
#ifdef __cplusplus
}
diff --git a/src/trg-cell-renderer-counter.c b/src/trg-cell-renderer-counter.c
index 497f122..13867ab 100644
--- a/src/trg-cell-renderer-counter.c
+++ b/src/trg-cell-renderer-counter.c
@@ -32,7 +32,7 @@ G_DEFINE_TYPE(TrgCellRendererCounter, trg_cell_renderer_counter,
#define TRG_CELL_RENDERER_COUNTER_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_CELL_RENDERER_COUNTER, TrgCellRendererCounterPrivate))
typedef struct _TrgCellRendererCounterPrivate
- TrgCellRendererCounterPrivate;
+ TrgCellRendererCounterPrivate;
struct _TrgCellRendererCounterPrivate {
gint count;
@@ -102,8 +102,8 @@ static void trg_cell_renderer_counter_dispose(GObject * object)
TrgCellRendererCounterPrivate *priv =
TRG_CELL_RENDERER_COUNTER_GET_PRIVATE(object);
g_free(priv->originalLabel);
- G_OBJECT_CLASS(trg_cell_renderer_counter_parent_class)->
- dispose(object);
+ G_OBJECT_CLASS(trg_cell_renderer_counter_parent_class)->dispose
+ (object);
}
static void
diff --git a/src/trg-cell-renderer-file-icon.c b/src/trg-cell-renderer-file-icon.c
index 887ac03..4e578c8 100644
--- a/src/trg-cell-renderer-file-icon.c
+++ b/src/trg-cell-renderer-file-icon.c
@@ -34,7 +34,7 @@ G_DEFINE_TYPE(TrgCellRendererFileIcon, trg_cell_renderer_file_icon,
#define TRG_CELL_RENDERER_FILE_ICON_GET_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), TRG_TYPE_CELL_RENDERER_FILE_ICON, TrgCellRendererFileIconPrivate))
typedef struct _TrgCellRendererFileIconPrivate
- TrgCellRendererFileIconPrivate;
+ TrgCellRendererFileIconPrivate;
struct _TrgCellRendererFileIconPrivate {
gint64 file_id;
@@ -117,8 +117,8 @@ static void trg_cell_renderer_file_icon_dispose(GObject * object)
TrgCellRendererFileIconPrivate *priv =
TRG_CELL_RENDERER_FILE_ICON_GET_PRIVATE(object);
g_free(priv->text);
- G_OBJECT_CLASS(trg_cell_renderer_file_icon_parent_class)->
- dispose(object);
+ G_OBJECT_CLASS(trg_cell_renderer_file_icon_parent_class)->dispose
+ (object);
}
static void
diff --git a/src/trg-client.c b/src/trg-client.c
index cdb018f..42237ff 100644
--- a/src/trg-client.c
+++ b/src/trg-client.c
@@ -257,9 +257,8 @@ int trg_client_populate_with_settings(TrgClient * tc)
#endif
priv->url = g_strdup_printf("%s://%s:%d/transmission/rpc",
- priv->
- ssl ? HTTPS_URI_PREFIX : HTTP_URI_PREFIX,
- host, port);
+ priv->ssl ? HTTPS_URI_PREFIX :
+ HTTP_URI_PREFIX, host, port);
g_free(host);
priv->username = trg_prefs_get_string(prefs, TRG_PREFS_KEY_USERNAME,
diff --git a/src/trg-file-parser.c b/src/trg-file-parser.c
index 661596b..81010f6 100644
--- a/src/trg-file-parser.c
+++ b/src/trg-file-parser.c
@@ -28,57 +28,69 @@
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)
{
- int i;
- trg_torrent_file_node *path_el_parent = top;
be_node *file_length_node = be_dict_find(file_node, "length", BE_INT);
- be_node *file_path_node = be_dict_find(file_node, "path", BE_LIST);
+ be_node *file_path_list = be_dict_find(file_node, "path", BE_LIST);
+ trg_torrent_file_node *lastIter = last;
+ GList *parentList = NULL;
+ be_node *path_el_node;
+ GList *li;
+ int i;
- if (!file_path_node || !file_length_node)
+ if (!file_path_list || !file_length_node)
return NULL;
+ 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;;) {
- be_node *path_el_node = file_path_node->val.l[i];
-
+ 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;
- GList *li;
-
- /* Does this element exist already? */
- for (li = path_el_parent->children; li != NULL;
- li = g_list_next(li)) {
- trg_torrent_file_node *x = (trg_torrent_file_node *) li->data;
- if (!g_strcmp0(x->name, path_el_node->val.s)) {
- target_node = x;
- break;
- }
+
+ if (li && !isFile) {
+ trg_torrent_file_node *lastPathNode =
+ (trg_torrent_file_node *) li->data;
+
+ if (!g_strcmp0(lastPathNode->name, path_el_node->val.s))
+ target_node = lastPathNode;
+
+ li = g_list_next(li);
}
if (!target_node) {
- /* Create a new node and add it as a child of the parent from the
- * last iteration. */
target_node = g_new0(trg_torrent_file_node, 1);
target_node->name = g_strdup(path_el_node->val.s);
- path_el_parent->children =
- g_list_append(path_el_parent->children, target_node);
+ target_node->parent = lastIter;
+
+ if (lastIter)
+ lastIter->children =
+ g_list_append(lastIter->children, target_node);
+ else
+ top->children = g_list_append(top->children, target_node);
}
- path_el_parent = target_node;
+ lastIter = target_node;
- /* Is this the last component of the path (the file)? */
- if (!file_path_node->val.l[++i]) {
+ if (isFile) {
*total_length += (target_node->length =
(gint64) (file_length_node->val.i));
target_node->index = index;
- return target_node;
}
}
- return NULL;
+ g_list_free(parentList);
+
+ return lastIter;
}
static void trg_torrent_file_node_free(trg_torrent_file_node * node)
@@ -105,6 +117,7 @@ static trg_torrent_file_node *trg_parse_torrent_file_nodes(be_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;
int i;
/* Probably means single file mode. */
@@ -114,9 +127,11 @@ static trg_torrent_file_node *trg_parse_torrent_file_nodes(be_node *
for (i = 0; files_node->val.l[i]; ++i) {
be_node *file_node = files_node->val.l[i];
- if (be_validate_node(file_node, BE_DICT) ||
- !trg_torrent_file_node_insert(top_node, file_node, i,
- total_length)) {
+ if (!be_validate_node(file_node, BE_DICT)
+ || !(lastNode =
+ trg_torrent_file_node_insert(top_node, lastNode,
+ file_node, i,
+ total_length))) {
/* Unexpected format. Throw away everything, file indexes need to
* be correct. */
trg_torrent_file_node_free(top_node);
@@ -156,7 +171,7 @@ trg_torrent_file *trg_parse_torrent_file(const gchar * filename)
if (!top_node) {
return NULL;
- } else if (be_validate_node(top_node, BE_DICT)) {
+ } else if (!be_validate_node(top_node, BE_DICT)) {
goto out;
}
diff --git a/src/trg-file-parser.h b/src/trg-file-parser.h
index eecc04a..1d7e116 100644
--- a/src/trg-file-parser.h
+++ b/src/trg-file-parser.h
@@ -22,6 +22,7 @@ typedef struct {
gint64 length;
GList *children;
guint index;
+ gpointer parent;
} trg_torrent_file_node;
typedef struct {
diff --git a/src/trg-files-model-common.c b/src/trg-files-model-common.c
index ea23c03..6c4e41f 100644
--- a/src/trg-files-model-common.c
+++ b/src/trg-files-model-common.c
@@ -41,8 +41,8 @@ static void set_wanted_foreachfunc(GtkTreeModel * model,
gtk_tree_store_set(GTK_TREE_STORE(model), iter, args->column,
args->new_value, -1);
- trg_files_tree_model_setSubtree(model, path, iter, args->column,
- args->new_value);
+ trg_files_tree_model_set_subtree(model, path, iter, args->column,
+ args->new_value);
}
static void set_priority_foreachfunc(GtkTreeModel * model,
@@ -58,8 +58,8 @@ static void set_priority_foreachfunc(GtkTreeModel * model,
gtk_tree_store_set_value(GTK_TREE_STORE(model), iter, args->column,
&value);
- trg_files_tree_model_setSubtree(model, path, iter, args->column,
- args->new_value);
+ trg_files_tree_model_set_subtree(model, path, iter, args->column,
+ args->new_value);
}
void trg_files_model_set_wanted(GtkTreeView * tv, gint column,
@@ -108,9 +108,9 @@ static gboolean setSubtreeForeach(GtkTreeModel * model, GtkTreePath * path,
return FALSE; /* keep walking */
}
-void trg_files_tree_model_propogateChangeUp(GtkTreeModel * model,
- GtkTreeIter * iter,
- gint column, gint new_value)
+void trg_files_tree_model_propogate_change_up(GtkTreeModel * model,
+ GtkTreeIter * iter,
+ gint column, gint new_value)
{
GtkTreeIter back_iter = *iter;
gint result = new_value;
@@ -146,10 +146,10 @@ void trg_files_tree_model_propogateChangeUp(GtkTreeModel * model,
}
}
-void trg_files_tree_model_setSubtree(GtkTreeModel * model,
- GtkTreePath * path,
- GtkTreeIter * iter, gint column,
- gint new_value)
+void trg_files_tree_model_set_subtree(GtkTreeModel * model,
+ GtkTreePath * path,
+ GtkTreeIter * iter, gint column,
+ gint new_value)
{
GtkTreeIter back_iter = *iter;
@@ -166,52 +166,26 @@ void trg_files_tree_model_setSubtree(GtkTreeModel * model,
new_value, -1);
}
- trg_files_tree_model_propogateChangeUp(model, iter, column, new_value);
+ trg_files_tree_model_propogate_change_up(model, iter, column,
+ new_value);
}
-struct UpdateParentsSizeForeachData {
- gint size_column;
- GtkTreeIter *descendent_iter;
-};
-
-static gboolean trg_files_model_update_parents_size_foreach(GtkTreeModel *
- model,
- GtkTreePath *
- path,
- GtkTreeIter *
- iter,
- gpointer data)
+void trg_files_model_update_parents(GtkTreeModel * model,
+ GtkTreeIter * iter, gint size_column)
{
- struct UpdateParentsSizeForeachData *args =
- (struct UpdateParentsSizeForeachData *) data;
-
- GtkTreePath *descendentPath = gtk_tree_model_get_path(model,
- args->
- descendent_iter);
-
- if (gtk_tree_path_is_ancestor(path, descendentPath)
- && gtk_tree_model_get_iter(model, args->descendent_iter,
- descendentPath)) {
- gint64 size, oldSize;
- gtk_tree_model_get(model, args->descendent_iter, args->size_column,
- &size, -1);
- gtk_tree_model_get(model, iter, args->size_column, &oldSize, -1);
- gtk_tree_store_set(GTK_TREE_STORE(model), iter, args->size_column,
- size + oldSize, -1);
- }
+ GtkTreeIter back_iter = *iter;
+ GtkTreeIter tmp_iter;
+ gint64 size, oldSize;
- gtk_tree_path_free(descendentPath);
+ if (!gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter))
+ return;
- return FALSE;
-}
+ gtk_tree_model_get(model, iter, size_column, &size, -1);
-void trg_files_model_update_parents(GtkTreeModel * model,
- GtkTreeIter * iter, gint size_column)
-{
- struct UpdateParentsSizeForeachData args;
- args.descendent_iter = iter;
- args.size_column = size_column;
- gtk_tree_model_foreach(model,
- trg_files_model_update_parents_size_foreach,
- &args);
+ do {
+ gtk_tree_model_get(model, &tmp_iter, size_column, &oldSize, -1);
+ gtk_tree_store_set(GTK_TREE_STORE(model), &tmp_iter, size_column,
+ size + oldSize, -1);
+ back_iter = tmp_iter;
+ } while (gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter));
}
diff --git a/src/trg-files-model-common.h b/src/trg-files-model-common.h
index 76eaecc..e8f52f2 100644
--- a/src/trg-files-model-common.h
+++ b/src/trg-files-model-common.h
@@ -20,13 +20,13 @@
#ifndef TRG_FILES_TREE_MODEL_COMMON_H_
#define TRG_FILES_TREE_MODEL_COMMON_H_
-void trg_files_tree_model_propogateChangeUp(GtkTreeModel * model,
- GtkTreeIter * iter,
- gint column, gint new_value);
-void trg_files_tree_model_setSubtree(GtkTreeModel * model,
- GtkTreePath * path,
- GtkTreeIter * iter, gint column,
- gint new_value);
+void trg_files_tree_model_propogate_change_up(GtkTreeModel * model,
+ GtkTreeIter * iter,
+ gint column, gint new_value);
+void trg_files_tree_model_set_subtree(GtkTreeModel * model,
+ GtkTreePath * path,
+ GtkTreeIter * iter, gint column,
+ gint new_value);
void trg_files_tree_model_set_priority(GtkTreeView * tv, gint column,
gint new_value);
void trg_files_model_set_wanted(GtkTreeView * tv, gint column,
diff --git a/src/trg-files-model.c b/src/trg-files-model.c
index b5dc34e..2280d49 100644
--- a/src/trg-files-model.c
+++ b/src/trg-files-model.c
@@ -44,78 +44,33 @@ struct _TrgFilesModelPrivate {
gboolean accept;
};
-static void iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter,
- GtkTreeRowReference ** rr)
-{
- GtkTreePath *path = gtk_tree_model_get_path(model, iter);
-
- if (*rr)
- gtk_tree_row_reference_free(*rr);
-
- *rr = gtk_tree_row_reference_new(model, path);
- gtk_tree_path_free(path);
-}
-
-static void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr,
- GtkTreeIter * iter)
-{
- GtkTreePath *path = gtk_tree_row_reference_get_path(rr);
- gtk_tree_model_get_iter(model, iter, path);
- gtk_tree_path_free(path);
-}
-
-struct UpdateParentProgressForeachData {
- GtkTreeIter *descendentIter;
- gint64 increment;
-};
-
-static gboolean trg_files_update_parent_progress_foreachfunc(GtkTreeModel *
- model,
- GtkTreePath *
- path,
- GtkTreeIter *
- iter,
- gpointer data)
+static void trg_files_update_parent_progress(GtkTreeModel * model,
+ GtkTreeIter * iter,
+ gint64 increment)
{
- struct UpdateParentProgressForeachData *args =
- (struct UpdateParentProgressForeachData *) data;
+ GtkTreeIter back_iter = *iter;
- GtkTreePath *descendentPath = gtk_tree_model_get_path(model,
- args->
- descendentIter);
+ if (increment < 1)
+ return;
- if (gtk_tree_path_is_ancestor(path, descendentPath)) {
+ while (1) {
+ GtkTreeIter tmp_iter;
gint64 lastCompleted, newCompleted, length;
- gtk_tree_model_get(model, iter, FILESCOL_BYTESCOMPLETED,
+ if (!gtk_tree_model_iter_parent(model, &tmp_iter, &back_iter))
+ break;
+
+ gtk_tree_model_get(model, &tmp_iter, FILESCOL_BYTESCOMPLETED,
&lastCompleted, FILESCOL_SIZE, &length, -1);
- newCompleted = lastCompleted + args->increment;
+ newCompleted = lastCompleted + increment;
- gtk_tree_store_set(GTK_TREE_STORE(model), iter,
+ gtk_tree_store_set(GTK_TREE_STORE(model), &tmp_iter,
FILESCOL_BYTESCOMPLETED, newCompleted,
FILESCOL_PROGRESS, file_get_progress(length,
newCompleted),
-1);
- }
-
- gtk_tree_path_free(descendentPath);
-
- return FALSE;
-}
-
-static void trg_files_update_parent_progress(GtkTreeModel * model,
- GtkTreeIter * iter,
- gint64 increment)
-{
- if (increment > 0) {
- struct UpdateParentProgressForeachData args;
- args.descendentIter = iter;
- args.increment = increment;
-
- gtk_tree_model_foreach(GTK_TREE_MODEL(model),
- trg_files_update_parent_progress_foreachfunc,
- &args);
+ back_iter = tmp_iter;
}
}
@@ -234,8 +189,7 @@ static void trg_files_model_iter_update(TrgFilesModel * model,
gboolean wanted =
json_node_get_int(json_array_get_element(wantedArray, id))
== 1;
- gint priority =
- (gint)
+ gint priority = (gint)
json_node_get_int(json_array_get_element(prioritiesArray, id));
gdouble progress = file_get_progress(fileLength, fileCompleted);
@@ -261,13 +215,13 @@ static void trg_files_model_iter_update(TrgFilesModel * model,
priority, -1);
if (isFirst) {
- trg_files_tree_model_propogateChangeUp(GTK_TREE_MODEL(model),
- filesIter,
- FILESCOL_PRIORITY,
- priority);
- trg_files_tree_model_propogateChangeUp(GTK_TREE_MODEL(model),
- filesIter, FILESCOL_WANTED,
- wanted);
+ 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);
}
}
diff --git a/src/trg-files-tree-view-common.c b/src/trg-files-tree-view-common.c
index 5be2eef..5845778 100644
--- a/src/trg-files-tree-view-common.c
+++ b/src/trg-files-tree-view-common.c
@@ -143,15 +143,15 @@ static gboolean onViewPathToggled(GtkTreeView * view,
priority = TR_PRI_NORMAL;
break;
}
- trg_files_tree_model_setSubtree(model, path, &iter, pri_id,
- priority);
+ trg_files_tree_model_set_subtree(model, path, &iter, pri_id,
+ priority);
} else {
int enabled;
gtk_tree_model_get(model, &iter, enabled_id, &enabled, -1);
enabled = !enabled;
- trg_files_tree_model_setSubtree(model, path, &iter, enabled_id,
- enabled);
+ trg_files_tree_model_set_subtree(model, path, &iter,
+ enabled_id, enabled);
}
handled = TRUE;
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 013fa50..1a1733c 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -143,9 +143,9 @@ static void open_about_cb(GtkWidget * w, GtkWindow * parent);
static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model,
GtkTreeIter * iter,
gpointer data);
-static TrgTorrentTreeView *
-trg_main_window_torrent_tree_view_new(TrgMainWindow * win,
- GtkTreeModel * model);
+static TrgTorrentTreeView
+ * trg_main_window_torrent_tree_view_new(TrgMainWindow * win,
+ GtkTreeModel * model);
static gboolean trg_dialog_error_handler(TrgMainWindow * win,
trg_response * response);
static gboolean torrent_selection_changed(GtkTreeSelection * selection,
@@ -1192,9 +1192,8 @@ static gboolean on_torrent_get(gpointer data, int mode)
update_selected_torrent_notebook(win, mode, priv->selectedTorrentId);
trg_status_bar_update(priv->statusBar, stats, client);
update_whatever_statusicon(win,
- trg_status_bar_get_speed_text(priv->
- statusBar),
- stats);
+ trg_status_bar_get_speed_text
+ (priv->statusBar), stats);
#ifndef TRG_NO_GRAPH
if (priv->graphNotebookIndex >= 0)
@@ -1358,8 +1357,8 @@ void trg_main_window_reload_dir_aliases(TrgMainWindow * win)
}
static TrgTorrentTreeView
- *trg_main_window_torrent_tree_view_new(TrgMainWindow * win,
- GtkTreeModel * model)
+ * trg_main_window_torrent_tree_view_new(TrgMainWindow * win,
+ GtkTreeModel * model)
{
TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win);
TrgTorrentTreeView *torrentTreeView =
diff --git a/src/trg-state-selector.c b/src/trg-state-selector.c
index 3eeb1ec..8db7362 100644
--- a/src/trg-state-selector.c
+++ b/src/trg-state-selector.c
@@ -354,8 +354,8 @@ void trg_state_selector_update(TrgStateSelector * s, guint whatsChanged)
g_free(announceHost);
} else {
trg_state_selector_insert(s, priv->n_categories,
- g_hash_table_size(priv->
- trackers),
+ g_hash_table_size
+ (priv->trackers),
announceHost, &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
STATE_SELECTOR_ICON,
@@ -389,9 +389,9 @@ void trg_state_selector_update(TrgStateSelector * s, guint whatsChanged)
} else {
trg_state_selector_insert(s,
priv->n_categories +
- g_hash_table_size(priv->
- trackers), -1,
- dir, &iter);
+ g_hash_table_size
+ (priv->trackers), -1, dir,
+ &iter);
gtk_list_store_set(GTK_LIST_STORE(model), &iter,
STATE_SELECTOR_ICON,
GTK_STOCK_DIRECTORY,
diff --git a/src/trg-torrent-add-dialog.c b/src/trg-torrent-add-dialog.c
index c072b28..bf29b8b 100644
--- a/src/trg-torrent-add-dialog.c
+++ b/src/trg-torrent-add-dialog.c
@@ -51,8 +51,7 @@ enum {
};
enum {
- FC_ICON, FC_INDEX, FC_LABEL, FC_SIZE, FC_PRIORITY, FC_ENABLED,
- N_FILE_COLS
+ FC_INDEX, FC_LABEL, FC_SIZE, FC_PRIORITY, FC_ENABLED, N_FILE_COLS
};
G_DEFINE_TYPE(TrgTorrentAddDialog, trg_torrent_add_dialog, GTK_TYPE_DIALOG)
@@ -402,8 +401,7 @@ GtkWidget *gtr_file_list_new(GtkTreeStore ** store)
gtk_tree_view_column_set_sort_column_id(col, FC_PRIORITY);
gtk_tree_view_append_column(tree_view, col);
- *store = gtk_tree_store_new(N_FILE_COLS, G_TYPE_STRING, /* icon */
- G_TYPE_INT, /* index */
+ *store = gtk_tree_store_new(N_FILE_COLS, G_TYPE_INT, /* index */
G_TYPE_STRING, /* label */
G_TYPE_INT64, /* size */
G_TYPE_INT, /* priority */
@@ -473,10 +471,7 @@ static void store_add_node(GtkTreeStore * store, GtkTreeIter * parent,
if (node->name) {
gtk_tree_store_append(store, &child, parent);
gtk_tree_store_set(store, &child, FC_LABEL, node->name, FC_ENABLED,
- 1, FC_ICON,
- node->
- children ? GTK_STOCK_DIRECTORY : GTK_STOCK_FILE,
- FC_INDEX, node->children ? -1 : node->index,
+ 1, FC_INDEX, node->children ? -1 : node->index,
FC_PRIORITY, TR_PRI_NORMAL, -1);
if (!node->children) {
@@ -627,8 +622,8 @@ static void trg_torrent_add_dialog_source_click_cb(GtkWidget * w,
gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(d));
trg_torrent_add_dialog_generic_save_dir(GTK_FILE_CHOOSER(d),
- trg_client_get_prefs(priv->
- client));
+ trg_client_get_prefs
+ (priv->client));
trg_torrent_add_dialog_set_filenames(TRG_TORRENT_ADD_DIALOG(data),
priv->filenames);
}
diff --git a/src/util.c b/src/util.c
index 7594c46..1251ccb 100644
--- a/src/util.c
+++ b/src/util.c
@@ -533,3 +533,23 @@ evutil_vsnprintf(char *buf, size_t buflen, const char *format, va_list ap)
return r;
#endif
}
+
+void iter_to_row_reference(GtkTreeModel * model, GtkTreeIter * iter,
+ GtkTreeRowReference ** rr)
+{
+ GtkTreePath *path = gtk_tree_model_get_path(model, iter);
+
+ if (*rr)
+ gtk_tree_row_reference_free(*rr);
+
+ *rr = gtk_tree_row_reference_new(model, path);
+ gtk_tree_path_free(path);
+}
+
+void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr,
+ GtkTreeIter * iter)
+{
+ GtkTreePath *path = gtk_tree_row_reference_get_path(rr);
+ gtk_tree_model_get_iter(model, iter, path);
+ gtk_tree_path_free(path);
+}
diff --git a/src/util.h b/src/util.h
index 07ab0bf..f7d407e 100644
--- a/src/util.h
+++ b/src/util.h
@@ -89,5 +89,9 @@ 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,
+ GtkTreeRowReference ** rr);
+void rowref_to_iter(GtkTreeModel * model, GtkTreeRowReference * rr,
+ GtkTreeIter * iter);
#endif /* UTIL_H_ */