summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/trg-client.c7
-rw-r--r--src/trg-client.h1
-rw-r--r--src/trg-main-window.c66
-rw-r--r--src/trg-main-window.h1
-rw-r--r--src/trg-preferences-dialog.c4
-rw-r--r--src/trg-prefs.c2
-rw-r--r--src/trg-prefs.h2
7 files changed, 74 insertions, 9 deletions
diff --git a/src/trg-client.c b/src/trg-client.c
index 87110d7..311321f 100644
--- a/src/trg-client.c
+++ b/src/trg-client.c
@@ -36,6 +36,7 @@
#include "trg-prefs.h"
#include "protocol-constants.h"
#include "util.h"
+#include "requests.h"
#include "trg-client.h"
/* This class manages/does quite a few things, and is passed around a lot. It:
@@ -688,3 +689,9 @@ dispatch_async_str(TrgClient * tc, gchar * req,
return dispatch_async_common(tc, trg_req, callback, data);
}
+
+gboolean trg_client_update_session(TrgClient *tc, GSourceFunc callback, gpointer data)
+{
+ return dispatch_async(tc, session_get(), callback,
+ data);
+}
diff --git a/src/trg-client.h b/src/trg-client.h
index b57bb4e..82e8914 100644
--- a/src/trg-client.h
+++ b/src/trg-client.h
@@ -161,6 +161,7 @@ guint trg_client_get_failcount(TrgClient * tc);
void trg_client_reset_failcount(TrgClient * tc);
void trg_client_inc_serial(TrgClient * tc);
void trg_client_inc_connid(TrgClient * tc);
+gboolean trg_client_update_session(TrgClient *tc, GSourceFunc callback, gpointer data);
G_END_DECLS
#endif /* _TRG_CLIENT_H_ */
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 7b415ea..ab9e151 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -134,12 +134,14 @@ static void view_states_toggled_cb(GtkCheckMenuItem * w,
static void view_notebook_toggled_cb(GtkCheckMenuItem * w,
TrgMainWindow * win);
static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win);
+static gboolean on_session_get_timer(gpointer data);
static gboolean on_session_get(gpointer data);
static gboolean on_torrent_get(gpointer data, int mode);
static gboolean on_torrent_get_first(gpointer data);
static gboolean on_torrent_get_active(gpointer data);
static gboolean on_torrent_get_update(gpointer data);
static gboolean on_torrent_get_interactive(gpointer data);
+static gboolean trg_session_update_timerfunc(gpointer data);
static gboolean trg_update_torrents_timerfunc(gpointer data);
static void open_about_cb(GtkWidget * w, GtkWindow * parent);
static gboolean trg_torrent_tree_view_visible_func(GtkTreeModel * model,
@@ -250,6 +252,7 @@ struct _TrgMainWindowPrivate {
gint width, height;
guint timerId;
+ guint sessionTimerId;
gboolean min_on_start;
gboolean queuesEnabled;
@@ -882,7 +885,7 @@ static void delete_cb(GtkWidget * w G_GNUC_UNUSED, TrgMainWindow * win)
("<big><b>Remove and delete %d torrents?</b></big>"),
GTK_STOCK_DELETE) == GTK_RESPONSE_ACCEPT)
dispatch_async(priv->client, torrent_remove(ids, TRUE),
- on_generic_interactive_action, win);
+ on_delete_complete, win);
else
json_array_unref(ids);
}
@@ -1006,8 +1009,7 @@ gboolean on_session_set(gpointer data)
if (response->status == CURLE_OK
|| response->status == FAIL_RESPONSE_UNSUCCESSFUL)
- dispatch_async(priv->client, session_get(), on_session_get,
- response->cb_data);
+ trg_client_update_session(priv->client, on_session_get, response->cb_data);
trg_dialog_error_handler(TRG_MAIN_WINDOW(response->cb_data), response);
trg_response_free(response);
@@ -1022,6 +1024,23 @@ hasEnabledChanged(JsonObject * a, JsonObject * b, const gchar * key)
json_object_get_boolean_member(b, key);
}
+static gboolean on_session_get_timer(gpointer data)
+{
+ trg_response *response = (trg_response *) data;
+ TrgMainWindow *win = TRG_MAIN_WINDOW(response->cb_data);
+ TrgMainWindowPrivate *priv = win->priv;
+ TrgPrefs *prefs = trg_client_get_prefs(priv->client);
+
+ on_session_get(data);
+
+ priv->sessionTimerId = g_timeout_add_seconds(trg_prefs_get_int(prefs,
+ TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, TRG_PREFS_CONNECTION),
+ trg_session_update_timerfunc,
+ win);
+
+ return FALSE;
+}
+
static gboolean on_session_get(gpointer data)
{
trg_response *response = (trg_response *) data;
@@ -1033,6 +1052,8 @@ static gboolean on_session_get(gpointer data)
JsonObject *lastSession = trg_client_get_session(client);
JsonObject *newSession = NULL;
+ g_message("session update!");
+
if (response->obj)
newSession = get_arguments(response->obj);
@@ -1311,6 +1332,16 @@ static gboolean on_torrent_get_update(gpointer data)
return on_torrent_get(data, TORRENT_GET_MODE_UPDATE);
}
+static gboolean trg_session_update_timerfunc(gpointer data)
+{
+ TrgMainWindow *win = TRG_MAIN_WINDOW(data);
+ TrgMainWindowPrivate *priv = win->priv;
+
+ trg_client_update_session(priv->client, on_session_get_timer, win);
+
+ return FALSE;
+}
+
static gboolean trg_update_torrents_timerfunc(gpointer data)
{
TrgMainWindow *win = TRG_MAIN_WINDOW(data);
@@ -1334,10 +1365,6 @@ static gboolean trg_update_torrents_timerfunc(gpointer data)
: TORRENT_GET_TAG_MODE_FULL),
activeOnly ? on_torrent_get_active :
on_torrent_get_update, data);
-
- if (trg_client_get_serial(tc) % SESSION_UPDATE_DIVISOR == 0)
- dispatch_async(priv->client, session_get(), on_session_get,
- data);
}
return FALSE;
@@ -1506,6 +1533,19 @@ torrent_selection_changed(GtkTreeSelection * selection,
return TRUE;
}
+gboolean on_delete_complete(gpointer data)
+{
+ trg_response *response = (trg_response *) data;
+ TrgMainWindow *win = TRG_MAIN_WINDOW(response->cb_data);
+ TrgMainWindowPrivate *priv = win->priv;
+ TrgClient *tc = priv->client;
+
+ if (trg_client_is_connected(tc) && response->status == CURLE_OK)
+ trg_client_update_session(priv->client, on_session_get, response->cb_data);
+
+ return on_generic_interactive_action(data);
+}
+
gboolean on_generic_interactive_action(gpointer data)
{
trg_response *response = (trg_response *) data;
@@ -1583,7 +1623,13 @@ trg_main_window_conn_changed(TrgMainWindow * win, gboolean connected)
connected);
gtk_widget_set_sensitive(GTK_WIDGET(priv->genDetails), connected);
- if (!connected) {
+ if (connected) {
+ TrgPrefs *prefs = trg_client_get_prefs(priv->client);
+ priv->sessionTimerId = g_timeout_add_seconds(trg_prefs_get_int(prefs,
+ TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, TRG_PREFS_CONNECTION),
+ trg_session_update_timerfunc,
+ win);
+ } else {
trg_main_window_torrent_scrub(win);
trg_state_selector_disconnect(priv->stateSelector);
@@ -1594,7 +1640,9 @@ trg_main_window_conn_changed(TrgMainWindow * win, gboolean connected)
trg_torrent_model_remove_all(priv->torrentModel);
- priv->timerId = 0;
+ g_source_remove(priv->timerId);
+ g_source_remove(priv->sessionTimerId);
+ priv->sessionTimerId = priv->timerId = 0;
}
trg_client_status_change(tc, connected);
diff --git a/src/trg-main-window.h b/src/trg-main-window.h
index 999ca38..59dddc8 100644
--- a/src/trg-main-window.h
+++ b/src/trg-main-window.h
@@ -62,6 +62,7 @@ typedef struct {
GType trg_main_window_get_type(void);
gint trg_add_from_filename(TrgMainWindow * win, gchar ** uris);
gboolean on_session_set(gpointer data);
+gboolean on_delete_complete(gpointer data);
gboolean on_generic_interactive_action(gpointer data);
void auto_connect_if_required(TrgMainWindow * win);
void trg_main_window_set_start_args(TrgMainWindow * win, gchar ** args);
diff --git a/src/trg-preferences-dialog.c b/src/trg-preferences-dialog.c
index 75abcd1..ca57da2 100644
--- a/src/trg-preferences-dialog.c
+++ b/src/trg-preferences-dialog.c
@@ -427,6 +427,10 @@ static GtkWidget *trg_prefs_generalPage(TrgPreferencesDialog * dlg)
hig_workarea_add_row(t, &row, _("Minimised update interval:"), w,
NULL);
+ w = trgp_spin_new(dlg, TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL, 1, INT_MAX, 1,
+ TRG_PREFS_PROFILE, NULL);
+ hig_workarea_add_row(t, &row, _("Session update interval:"), w, NULL);
+
hig_workarea_add_section_title(t, &row, _("Torrents"));
w = trgp_check_new(dlg, _("Start paused"), TRG_PREFS_KEY_START_PAUSED,
diff --git a/src/trg-prefs.c b/src/trg-prefs.c
index 3c099b2..253009d 100644
--- a/src/trg-prefs.c
+++ b/src/trg-prefs.c
@@ -102,6 +102,8 @@ static void trg_prefs_create_defaults(TrgPrefs * p)
trg_prefs_add_default_int(p, TRG_PREFS_KEY_PORT, 9091);
trg_prefs_add_default_int(p, TRG_PREFS_KEY_UPDATE_INTERVAL,
TRG_INTERVAL_DEFAULT);
+ trg_prefs_add_default_int(p, TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL,
+ TRG_SESSION_INTERVAL_DEFAULT);
trg_prefs_add_default_int(p, TRG_PREFS_KEY_MINUPDATE_INTERVAL,
TRG_INTERVAL_DEFAULT);
trg_prefs_add_default_int(p, TRG_PREFS_ACTIVEONLY_FULLSYNC_EVERY, 2);
diff --git a/src/trg-prefs.h b/src/trg-prefs.h
index e0eba8e..535eb31 100644
--- a/src/trg-prefs.h
+++ b/src/trg-prefs.h
@@ -27,6 +27,7 @@
#define TRG_PREFS_DEFAULT_DIR_MODE 448
#define TRG_PORT_DEFAULT 9091
#define TRG_INTERVAL_DEFAULT 3
+#define TRG_SESSION_INTERVAL_DEFAULT 60
#define TRG_PROFILE_NAME_DEFAULT "Default"
#define TRG_PREFS_KEY_PROFILE_ID "profile-id"
@@ -42,6 +43,7 @@
#define TRG_PREFS_KEY_TIMEOUT "timeout"
#define TRG_PREFS_KEY_RETRIES "retries"
#define TRG_PREFS_KEY_UPDATE_INTERVAL "update-interval"
+#define TRG_PREFS_KEY_SESSION_UPDATE_INTERVAL "session-update-interval"
#define TRG_PREFS_KEY_COMPLETE_NOTIFY "complete-notify"
#define TRG_PREFS_KEY_ADD_NOTIFY "add-notify"
#define TRG_PREFS_KEY_WINDOW_WIDTH "window-width"