summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-10 22:46:33 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2011-02-10 22:46:33 +0000
commit35a8841fb865b0b3ba9cd779dc5a5d19691a07af (patch)
treeff4f781201ad1e5ee5e7bcac96e3ad6b66ad6fd6 /src
parentcd80ecf7db43141bbf3be4228b3d75f3604a8e93 (diff)
speed limits from a status icon menu
Diffstat (limited to 'src')
-rw-r--r--src/trg-main-window.c114
1 files changed, 103 insertions, 11 deletions
diff --git a/src/trg-main-window.c b/src/trg-main-window.c
index 6826c8c..0181b44 100644
--- a/src/trg-main-window.c
+++ b/src/trg-main-window.c
@@ -1210,6 +1210,89 @@ trg_torrent_tv_view_menu(GtkWidget * treeview G_GNUC_UNUSED,
gdk_event_get_time((GdkEvent *) event));
}
+static void set_limit_cb(GtkWidget *w, gpointer data)
+{
+ TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data);
+
+ GtkWidget *parent = gtk_widget_get_parent(w);
+ JsonNode *req = session_set();
+ JsonObject *args = node_get_arguments(req);
+
+ gint speed = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(w), "limit"));
+ gchar *speedKey = g_object_get_data(G_OBJECT(parent), "speedKey");
+ gchar *enabledKey = g_object_get_data(G_OBJECT(parent), "enabledKey");
+
+ if (speed >= 0)
+ json_object_set_int_member(args, speedKey, speed);
+
+ json_object_set_boolean_member(args, enabledKey, speed >= 0);
+
+ dispatch_async(priv->client, req, on_session_set, data);
+}
+
+static GtkWidget *limit_item_new(TrgMainWindow *win, GtkWidget *menu,
+ gint64 currentLimit, gint limit)
+{
+ char speed[32];
+ GtkWidget *item;
+ gboolean active = limit < 0 ? FALSE : (currentLimit == (gint64)limit);
+
+ g_snprintf(speed, sizeof(speed), "%d KB/s", limit);
+ item = gtk_check_menu_item_new_with_label (speed);
+
+ g_object_set_data(G_OBJECT(item), "limit", GINT_TO_POINTER(limit));
+ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), active);
+ g_signal_connect(item, "activate", G_CALLBACK(set_limit_cb), win);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+ return item;
+}
+
+static GtkWidget *limit_menu_new(TrgMainWindow *win, gchar *title, gchar *enabledKey, gchar *speedKey)
+{
+ TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win);
+ JsonObject *session = priv->client->session;
+
+ GtkWidget *toplevel, *menu, *item;
+ gint64 limit = json_object_get_boolean_member(session, enabledKey) ?
+ json_object_get_int_member(session, speedKey) : -1;
+ toplevel = gtk_image_menu_item_new_with_label(GTK_STOCK_NETWORK);
+ gtk_image_menu_item_set_use_stock(GTK_IMAGE_MENU_ITEM(toplevel), TRUE);
+ gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM
+ (toplevel), TRUE);
+ gtk_menu_item_set_label(GTK_MENU_ITEM(toplevel), title);
+
+ menu = gtk_menu_new();
+
+ g_object_set_data_full(G_OBJECT(menu), "speedKey",
+ g_strdup(speedKey), g_free);
+ g_object_set_data_full(G_OBJECT(menu), "enabledKey",
+ g_strdup(enabledKey), g_free);
+
+ item = gtk_check_menu_item_new_with_label("No Limit");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), limit < 0);
+ g_object_set_data(G_OBJECT(item), "limit", GINT_TO_POINTER(-1));
+ g_signal_connect(item, "activate", G_CALLBACK(set_limit_cb), win);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
+
+ limit_item_new(win, menu, limit, 5);
+ limit_item_new(win, menu, limit, 10);
+ limit_item_new(win, menu, limit, 25);
+ limit_item_new(win, menu, limit, 50);
+ limit_item_new(win, menu, limit, 75);
+ limit_item_new(win, menu, limit, 100);
+ limit_item_new(win, menu, limit, 150);
+ limit_item_new(win, menu, limit, 200);
+ limit_item_new(win, menu, limit, 300);
+ limit_item_new(win, menu, limit, 500);
+
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(toplevel), menu);
+
+ return toplevel;
+}
+
static void
trg_status_icon_view_menu(GtkStatusIcon * icon G_GNUC_UNUSED,
GdkEventButton * event, gpointer data)
@@ -1220,17 +1303,26 @@ trg_status_icon_view_menu(GtkStatusIcon * icon G_GNUC_UNUSED,
menu = gtk_menu_new();
- trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Connect",
- GTK_STOCK_CONNECT, !connected,
- G_CALLBACK(connect_cb), data);
- trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Disconnect",
- GTK_STOCK_DISCONNECT, connected,
- G_CALLBACK(disconnect_cb), data);
- trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add", GTK_STOCK_ADD,
- connected, G_CALLBACK(add_cb), data);
- trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add from URL",
- GTK_STOCK_ADD, connected, G_CALLBACK(add_url_cb),
- data);
+ if (!connected) {
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Connect",
+ GTK_STOCK_CONNECT, !connected,
+ G_CALLBACK(connect_cb), data);
+ } else {
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Disconnect",
+ GTK_STOCK_DISCONNECT, connected,
+ G_CALLBACK(disconnect_cb), data);
+
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add", GTK_STOCK_ADD,
+ connected, G_CALLBACK(add_cb), data);
+ trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Add from URL",
+ GTK_STOCK_ADD, connected, G_CALLBACK(add_url_cb),
+ data);
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), limit_menu_new(TRG_MAIN_WINDOW(data), "Down Limit", SGET_SPEED_LIMIT_DOWN_ENABLED, SGET_SPEED_LIMIT_DOWN));
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), limit_menu_new(TRG_MAIN_WINDOW(data), "Up Limit", SGET_SPEED_LIMIT_UP_ENABLED, SGET_SPEED_LIMIT_UP));
+ }
+
+ gtk_menu_shell_append(GTK_MENU_SHELL(menu), gtk_separator_menu_item_new());
trg_imagemenuitem_new(GTK_MENU_SHELL(menu), "Quit", GTK_STOCK_QUIT,
TRUE, G_CALLBACK(quit_cb), data);