summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-08 10:14:46 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-08 10:14:46 +0000
commit2a1c6fc96ff03c84723ca1fb7d3a48e0cd3df115 (patch)
treedd4eec987c7dcb2b7f0c361831c697c95901f4c9 /src
parent3938a1340d62d6e207b117e0bc84ddb4f62cf6c8 (diff)
if the torrent selection changes as a result of an update, was possible that it would select another item which has no JSON but isn't removed from the model yet. use updateSerial and updateMutex to ignore these.
Diffstat (limited to 'src')
-rw-r--r--src/trg-main-window.c15
-rw-r--r--src/trg-peers-model.c16
-rw-r--r--src/trg-torrent-props-dialog.c2
-rw-r--r--src/trg-torrent-tree-view.c20
-rw-r--r--src/trg-torrent-tree-view.h2
5 files changed, 37 insertions, 18 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 3f8e9fd..fe650c0 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -172,7 +172,7 @@ static gboolean update_selected_torrent_notebook(TrgMainWindow * win,
priv = TRG_MAIN_WINDOW_GET_PRIVATE(win);
newFirstSelected =
- get_first_selected(priv->torrentTreeView, &iter, &json);
+ get_first_selected(priv->client, priv->torrentTreeView, &iter, &json);
if (priv->selectedTorrentId >= 0
&& (priv->selectedTorrentId != newFirstSelected
@@ -574,20 +574,20 @@ static void remove_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data)
{
TrgMainWindowPrivate *priv;
GtkTreeSelection *selection;
+ JsonArray *ids;
priv = TRG_MAIN_WINDOW_GET_PRIVATE(data);
selection =
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->torrentTreeView));
-
+ ids = build_json_id_array(priv->torrentTreeView);
if (confirm_action_dialog
(GTK_WINDOW(data), selection,
"<big><b>Remove torrent \"%s\"?</b></big>",
"<big><b>Remove %d torrents?</b></big>",
GTK_STOCK_REMOVE) == GTK_RESPONSE_ACCEPT)
dispatch_async(priv->client,
- torrent_remove(build_json_id_array
- (priv->torrentTreeView),
+ torrent_remove(ids,
FALSE),
on_generic_interactive_action, data);
}
@@ -596,11 +596,13 @@ static void delete_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data)
{
TrgMainWindowPrivate *priv;
GtkTreeSelection *selection;
+ JsonArray *ids;
priv = TRG_MAIN_WINDOW_GET_PRIVATE(data);
selection =
gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->torrentTreeView));
+ ids = build_json_id_array(priv->torrentTreeView);
if (confirm_action_dialog
(GTK_WINDOW(data), selection,
@@ -608,8 +610,7 @@ static void delete_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data)
"<big><b>Remove and delete %d torrents?</b></big>",
GTK_STOCK_DELETE) == GTK_RESPONSE_ACCEPT)
dispatch_async(priv->client,
- torrent_remove(build_json_id_array
- (priv->torrentTreeView),
+ torrent_remove(ids,
TRUE),
on_generic_interactive_action, data);
}
@@ -1122,6 +1123,8 @@ static gboolean torrent_tv_key_press_event(GtkWidget * w,
delete_cb(w, data);
else
remove_cb(w, data);
+ } else if (key->keyval == GDK_Return) {
+ open_props_cb(w, data);
}
return FALSE;
}
diff --git a/src/trg-peers-model.c b/src/trg-peers-model.c
index 9119678..d2e0191 100644
--- a/src/trg-peers-model.c
+++ b/src/trg-peers-model.c
@@ -43,16 +43,18 @@ G_DEFINE_TYPE(TrgPeersModel, trg_peers_model, GTK_TYPE_LIST_STORE)
typedef struct _TrgPeersModelPrivate TrgPeersModelPrivate;
-struct _TrgPeersModelPrivate {
#ifdef HAVE_GEOIP
+struct _TrgPeersModelPrivate {
GeoIP *geoip;
-#endif
};
+#endif
static void
trg_peers_model_class_init(TrgPeersModelClass * klass G_GNUC_UNUSED)
{
+#ifdef HAVE_GEOIP
g_type_class_add_private (klass, sizeof (TrgPeersModelPrivate));
+#endif
}
gboolean
@@ -126,7 +128,9 @@ static void resolved_dns_cb(GObject * source_object,
void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial,
JsonObject * t, gboolean first)
{
+#ifdef HAVE_GEOIP
TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(model);
+#endif
JsonArray *peers;
GtkTreeIter peerIter;
@@ -141,7 +145,7 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial,
for (j = 0; j < json_array_get_length(peers); j++) {
JsonObject *peer;
const gchar *address=NULL, *flagStr;
-#if HAVE_GEOIP
+#ifdef HAVE_GEOIP
const gchar *country = NULL;
#endif
peer = json_node_get_object(json_array_get_element(peers, j));
@@ -151,7 +155,7 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial,
gtk_list_store_append(GTK_LIST_STORE(model), &peerIter);
address = peer_get_address(peer);
-#if HAVE_GEOIP
+#ifdef HAVE_GEOIP
if (priv->geoip != NULL)
country = GeoIP_country_name_by_addr(priv->geoip, address);
#endif
@@ -210,7 +214,9 @@ void trg_peers_model_update(TrgPeersModel * model, gint64 updateSerial,
static void trg_peers_model_init(TrgPeersModel * self)
{
- TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(self);
+#ifdef HAVE_GEOIP
+ TrgPeersModelPrivate *priv = TRG_PEERS_MODEL_GET_PRIVATE(self);
+#endif
GType column_types[PEERSCOL_COLUMNS];
diff --git a/src/trg-torrent-props-dialog.c b/src/trg-torrent-props-dialog.c
index 100b876..d45fe66 100644
--- a/src/trg-torrent-props-dialog.c
+++ b/src/trg-torrent-props-dialog.c
@@ -265,7 +265,7 @@ static GObject *trg_torrent_props_dialog_constructor(GType type,
selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(priv->tv));
rowCount = gtk_tree_selection_count_selected_rows(selection);
- get_first_selected(priv->tv, &iter, &json);
+ get_first_selected(priv->client, priv->tv, &iter, &json);
priv->targetIds = build_json_id_array(priv->tv);
if (rowCount > 1) {
diff --git a/src/trg-torrent-tree-view.c b/src/trg-torrent-tree-view.c
index 9fc0a41..43a49db 100644
--- a/src/trg-torrent-tree-view.c
+++ b/src/trg-torrent-tree-view.c
@@ -60,14 +60,15 @@ static void trg_torrent_tree_view_init(TrgTorrentTreeView * tv)
TORRENT_COLUMN_RATIO, -1);
}
-gint get_first_selected(TrgTorrentTreeView * view, GtkTreeIter * iter,
+gint get_first_selected(trg_client *client, TrgTorrentTreeView * view, GtkTreeIter * iter,
JsonObject ** json)
{
GtkTreeModel *model;
GtkTreeSelection *selection;
GList *selectionList;
GList *firstNode;
- gint id = -1;
+ gint64 id = -1;
+ gint64 updateSerial = -1;
model = gtk_tree_view_get_model(GTK_TREE_VIEW(view));
@@ -76,9 +77,18 @@ gint get_first_selected(TrgTorrentTreeView * view, GtkTreeIter * iter,
if ((firstNode = g_list_first(selectionList)) != NULL) {
if (gtk_tree_model_get_iter(model, iter, firstNode->data) == TRUE) {
- gtk_tree_model_get(model, iter,
+ gboolean locked;
+ gtk_tree_model_get(model, iter,
TORRENT_COLUMN_JSON, json,
- TORRENT_COLUMN_ID, &id, -1);
+ TORRENT_COLUMN_ID, &id,
+ TORRENT_COLUMN_UPDATESERIAL, &updateSerial, -1);
+
+ locked = g_mutex_trylock(client->updateMutex);
+ if (locked)
+ g_mutex_unlock(client->updateMutex);
+
+ if (updateSerial < (locked ? client->updateSerial-1 : client->updateSerial))
+ id = -1;
}
}
@@ -94,7 +104,7 @@ trg_torrent_model_get_json_id_array_foreach(GtkTreeModel * model,
gpointer data)
{
JsonArray *output = (JsonArray *) data;
- gint id;
+ gint64 id;
gtk_tree_model_get(model, iter, TORRENT_COLUMN_ID, &id, -1);
json_array_add_int_element(output, id);
}
diff --git a/src/trg-torrent-tree-view.h b/src/trg-torrent-tree-view.h
index 48f7265..6e642af 100644
--- a/src/trg-torrent-tree-view.h
+++ b/src/trg-torrent-tree-view.h
@@ -51,7 +51,7 @@ GType trg_torrent_tree_view_get_type(void);
TrgTorrentTreeView *trg_torrent_tree_view_new(GtkTreeModel * model);
JsonArray *build_json_id_array(TrgTorrentTreeView * tv);
-gint get_first_selected(TrgTorrentTreeView * view, GtkTreeIter * iter,
+gint get_first_selected(trg_client *client, TrgTorrentTreeView * view, GtkTreeIter * iter,
JsonObject ** json);
G_END_DECLS