*/
#include <assert.h>
-#include <errno.h>
#include <math.h> /* ceil() */
#include <stddef.h>
-#include <stdio.h>
+#include <stdio.h> /* sscanf */
#include <stdlib.h>
#include <glib/gi18n.h>
#include <gtk/gtk.h>
#include <libtransmission/transmission.h>
-#include <libtransmission/utils.h> /* tr_httpIsValidURL */
+#include <libtransmission/utils.h> /* tr_free */
#include "actions.h"
#include "details.h"
#include "file-list.h"
-#include "tr-torrent.h"
#include "tracker-list.h"
#include "hig.h"
#include "util.h"
if( baseline != tr_torrentUsesSessionLimits( torrents[i] ) )
break;
if( i == n )
- set_togglebutton_if_different( di->honorLimitsCheck, di->honorLimitsCheckTag, baseline );
+ set_togglebutton_if_different( di->honorLimitsCheck,
+ di->honorLimitsCheckTag, baseline );
}
/* downLimitedCheck */
if( baseline != tr_torrentUsesSpeedLimit( torrents[i], TR_DOWN ) )
break;
if( i == n )
- set_togglebutton_if_different( di->downLimitedCheck, di->downLimitedCheckTag, baseline );
+ set_togglebutton_if_different( di->downLimitedCheck,
+ di->downLimitedCheckTag, baseline );
}
/* downLimitSpin */
if( baseline != tr_torrentGetSpeedLimit( torrents[i], TR_DOWN ) )
break;
if( i == n )
- set_int_spin_if_different( di->downLimitSpin, di->downLimitSpinTag, baseline );
+ set_int_spin_if_different( di->downLimitSpin,
+ di->downLimitSpinTag, baseline );
}
/* upLimitedCheck */
if( baseline != tr_torrentUsesSpeedLimit( torrents[i], TR_UP ) )
break;
if( i == n )
- set_togglebutton_if_different( di->upLimitedCheck, di->upLimitedCheckTag, baseline );
+ set_togglebutton_if_different( di->upLimitedCheck,
+ di->upLimitedCheckTag, baseline );
}
/* upLimitSpin */
if( baseline != tr_torrentGetSpeedLimit( torrents[i], TR_UP ) )
break;
if( i == n )
- set_int_spin_if_different( di->upLimitSpin, di->upLimitSpinTag, baseline );
+ set_int_spin_if_different( di->upLimitSpin,
+ di->upLimitSpinTag, baseline );
}
/* bandwidthCombo */
if( baseline != tr_torrentGetPriority( torrents[i] ) )
break;
if( i == n )
- set_int_combo_if_different( di->bandwidthCombo, di->bandwidthComboTag, 0, baseline );
+ set_int_combo_if_different( di->bandwidthCombo,
+ di->bandwidthComboTag, 0, baseline );
else
unset_combo( di->bandwidthCombo, di->bandwidthComboTag );
}
if( (int)(100*baseline) != (int)(100*tr_torrentGetRatioLimit(torrents[i])) )
break;
if( i == n )
- set_double_spin_if_different( di->seedCustomSpin, di->seedCustomSpinTag, baseline );
+ set_double_spin_if_different( di->seedCustomSpin,
+ di->seedCustomSpinTag, baseline );
}
}
}
static void
-up_speed_toggled_cb( GtkToggleButton * tb, gpointer data )
+up_speed_toggled_cb( GtkToggleButton * tb, gpointer d )
{
- torrent_set_bool( data, "uploadLimited", gtk_toggle_button_get_active( tb ) );
+ torrent_set_bool( d, "uploadLimited", gtk_toggle_button_get_active( tb ) );
}
static void
-down_speed_toggled_cb( GtkToggleButton *tb, gpointer data )
+down_speed_toggled_cb( GtkToggleButton *tb, gpointer d )
{
- torrent_set_bool( data, "downloadLimited", gtk_toggle_button_get_active( tb ) );
+ torrent_set_bool( d, "downloadLimited", gtk_toggle_button_get_active( tb ) );
}
static void
-global_speed_toggled_cb( GtkToggleButton * tb, gpointer data )
+global_speed_toggled_cb( GtkToggleButton * tb, gpointer d )
{
- torrent_set_bool( data, "honorsSessionLimits", gtk_toggle_button_get_active( tb ) );
+ torrent_set_bool( d, "honorsSessionLimits", gtk_toggle_button_get_active( tb ) );
}
-#define RATIO_MODE_KEY "ratio-mode"
+#define RATIO_KEY "ratio-mode"
static void
-ratio_mode_changed_cb( GtkToggleButton * tb, struct DetailsImpl * data )
+ratio_mode_changed_cb( GtkToggleButton * tb, struct DetailsImpl * d )
{
if( gtk_toggle_button_get_active( tb ) )
{
- const int mode = GPOINTER_TO_INT( g_object_get_data( G_OBJECT( tb ), RATIO_MODE_KEY ) );
- torrent_set_int( data, "seedRatioMode", mode );
+ GObject * o = G_OBJECT( tb );
+ const int mode = GPOINTER_TO_INT( g_object_get_data( o, RATIO_KEY ) );
+ torrent_set_int( d, "seedRatioMode", mode );
}
}
static void
-up_speed_spun_cb( GtkSpinButton * spin, struct DetailsImpl * di )
+up_speed_spun_cb( GtkSpinButton * s, struct DetailsImpl * di )
{
- torrent_set_int( di, "uploadLimit", gtk_spin_button_get_value_as_int( spin ) );
+ torrent_set_int( di, "uploadLimit", gtk_spin_button_get_value_as_int( s ) );
}
static void
-down_speed_spun_cb( GtkSpinButton * spin, struct DetailsImpl * di )
+down_speed_spun_cb( GtkSpinButton * s, struct DetailsImpl * di )
{
- torrent_set_int( di, "downloadLimit", gtk_spin_button_get_value_as_int( spin ) );
+ torrent_set_int( di, "downloadLimit", gtk_spin_button_get_value_as_int( s ) );
}
static void
-ratio_spun_cb( GtkSpinButton * spin, struct DetailsImpl * di )
+ratio_spun_cb( GtkSpinButton * s, struct DetailsImpl * di )
{
- torrent_set_real( di, "seedRatioLimit", gtk_spin_button_get_value( spin ) );
+ torrent_set_real( di, "seedRatioLimit", gtk_spin_button_get_value( s ) );
}
static void
-max_peers_spun_cb( GtkSpinButton * spin, struct DetailsImpl * di )
+max_peers_spun_cb( GtkSpinButton * s, struct DetailsImpl * di )
{
- torrent_set_int( di, "peer-limit", gtk_spin_button_get_value( spin ) );
+ torrent_set_int( di, "peer-limit", gtk_spin_button_get_value( s ) );
}
static char*
static void
prefsChanged( TrCore * core UNUSED, const char * key, gpointer rb )
{
- if( !strcmp( key, TR_PREFS_KEY_RATIO_ENABLED ) || !strcmp( key, TR_PREFS_KEY_RATIO ) )
+ if( !strcmp( key, TR_PREFS_KEY_RATIO_ENABLED ) ||
+ !strcmp( key, TR_PREFS_KEY_RATIO ) )
{
char * s = get_global_ratio_radiobutton_string( );
gtk_button_set_label( GTK_BUTTON( rb ), s );
for( i=0; i<(int)G_N_ELEMENTS(items); ++i ) {
GtkTreeIter iter;
gtk_list_store_append( store, &iter );
- gtk_list_store_set( store, &iter, 0, items[i].value, 1, _( items[i].text ), -1 );
+ gtk_list_store_set( store, &iter, 0, items[i].value,
+ 1, _( items[i].text ),
+ -1 );
}
/* build the widget */
t = hig_workarea_create( );
hig_workarea_add_section_title( t, &row, _( "Speed" ) );
- tb = hig_workarea_add_wide_checkbutton( t, &row, _( "Honor global _limits" ), FALSE );
- d->honorLimitsCheck = tb;
- tag = g_signal_connect( tb, "toggled", G_CALLBACK( global_speed_toggled_cb ), d );
- d->honorLimitsCheckTag = tag;
-
- tb = gtk_check_button_new_with_mnemonic( _( "Limit _download speed (KB/s):" ) );
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( tb ), FALSE );
- d->downLimitedCheck = tb;
- tag = g_signal_connect( tb, "toggled", G_CALLBACK( down_speed_toggled_cb ), d );
- d->downLimitedCheckTag = tag;
-
- w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 );
- gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i );
- tag = g_signal_connect( w, "value-changed", G_CALLBACK( down_speed_spun_cb ), d );
- d->downLimitSpinTag = tag;
- hig_workarea_add_row_w( t, &row, tb, w, NULL );
- d->downLimitSpin = w;
-
- tb = gtk_check_button_new_with_mnemonic( _( "Limit _upload speed (KB/s):" ) );
- d->upLimitedCheck = tb;
- tag = g_signal_connect( tb, "toggled", G_CALLBACK( up_speed_toggled_cb ), d );
- d->upLimitedCheckTag = tag;
-
- w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 );
- gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i );
- tag = g_signal_connect( w, "value-changed", G_CALLBACK( up_speed_spun_cb ), d );
- d->upLimitSpinTag = tag;
- hig_workarea_add_row_w( t, &row, tb, w, NULL );
- d->upLimitSpin = w;
-
- w = new_priority_combo( d );
- hig_workarea_add_row( t, &row, _( "_Bandwidth priority:" ), w, NULL );
- d->bandwidthCombo = w;
+ tb = hig_workarea_add_wide_checkbutton( t, &row, _( "Honor global _limits" ), FALSE );
+ d->honorLimitsCheck = tb;
+ tag = g_signal_connect( tb, "toggled", G_CALLBACK( global_speed_toggled_cb ), d );
+ d->honorLimitsCheckTag = tag;
+
+ tb = gtk_check_button_new_with_mnemonic( _( "Limit _download speed (KB/s):" ) );
+ gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( tb ), FALSE );
+ d->downLimitedCheck = tb;
+ tag = g_signal_connect( tb, "toggled", G_CALLBACK( down_speed_toggled_cb ), d );
+ d->downLimitedCheckTag = tag;
+
+ w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i );
+ tag = g_signal_connect( w, "value-changed", G_CALLBACK( down_speed_spun_cb ), d );
+ d->downLimitSpinTag = tag;
+ hig_workarea_add_row_w( t, &row, tb, w, NULL );
+ d->downLimitSpin = w;
+
+ tb = gtk_check_button_new_with_mnemonic( _( "Limit _upload speed (KB/s):" ) );
+ d->upLimitedCheck = tb;
+ tag = g_signal_connect( tb, "toggled", G_CALLBACK( up_speed_toggled_cb ), d );
+ d->upLimitedCheckTag = tag;
+
+ w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 );
+ gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i );
+ tag = g_signal_connect( w, "value-changed", G_CALLBACK( up_speed_spun_cb ), d );
+ d->upLimitSpinTag = tag;
+ hig_workarea_add_row_w( t, &row, tb, w, NULL );
+ d->upLimitSpin = w;
+
+ w = new_priority_combo( d );
+ hig_workarea_add_row( t, &row, _( "_Bandwidth priority:" ), w, NULL );
+ d->bandwidthCombo = w;
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Seed-Until Ratio" ) );
- group = NULL;
- s = get_global_ratio_radiobutton_string( );
- w = gtk_radio_button_new_with_mnemonic( group, s );
- tag = g_signal_connect( d->core, "prefs-changed", G_CALLBACK( prefsChanged ), w );
- d->prefs_changed_tag = tag;
- group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
- hig_workarea_add_wide_control( t, &row, w );
- g_free( s );
- g_object_set_data( G_OBJECT( w ), RATIO_MODE_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_GLOBAL ) );
- tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
- d->seedGlobalRadio = w;
- d->seedGlobalRadioTag = tag;
-
- w = gtk_radio_button_new_with_mnemonic( group, _( "Seed _regardless of ratio" ) );
- group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
- hig_workarea_add_wide_control( t, &row, w );
- g_object_set_data( G_OBJECT( w ), RATIO_MODE_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_UNLIMITED ) );
- tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
- d->seedForeverRadio = w;
- d->seedForeverRadioTag = tag;
-
- h = gtk_hbox_new( FALSE, GUI_PAD );
- w = gtk_radio_button_new_with_mnemonic( group, _( "_Stop seeding when a torrent's ratio reaches" ) );
- d->seedCustomRadio = w;
- g_object_set_data( G_OBJECT( w ), RATIO_MODE_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_SINGLE ) );
- tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
- d->seedCustomRadioTag = tag;
- group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
- gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
- w = gtk_spin_button_new_with_range( 0.5, INT_MAX, .05 );
- gtk_spin_button_set_digits( GTK_SPIN_BUTTON( w ), 2 );
- tag = g_signal_connect( w, "value-changed", G_CALLBACK( ratio_spun_cb ), d );
- gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
- hig_workarea_add_wide_control( t, &row, h );
- d->seedCustomSpin = w;
- d->seedCustomSpinTag = tag;
+ group = NULL;
+ s = get_global_ratio_radiobutton_string( );
+ w = gtk_radio_button_new_with_mnemonic( group, s );
+ tag = g_signal_connect( d->core, "prefs-changed", G_CALLBACK( prefsChanged ), w );
+ d->prefs_changed_tag = tag;
+ group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
+ hig_workarea_add_wide_control( t, &row, w );
+ g_free( s );
+ g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_GLOBAL ) );
+ tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
+ d->seedGlobalRadio = w;
+ d->seedGlobalRadioTag = tag;
+
+ w = gtk_radio_button_new_with_mnemonic( group, _( "Seed _regardless of ratio" ) );
+ group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
+ hig_workarea_add_wide_control( t, &row, w );
+ g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_UNLIMITED ) );
+ tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
+ d->seedForeverRadio = w;
+ d->seedForeverRadioTag = tag;
+
+ h = gtk_hbox_new( FALSE, GUI_PAD );
+ w = gtk_radio_button_new_with_mnemonic( group, _( "_Stop seeding when a torrent's ratio reaches" ) );
+ d->seedCustomRadio = w;
+ g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_SINGLE ) );
+ tag = g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), d );
+ d->seedCustomRadioTag = tag;
+ group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) );
+ gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
+ w = gtk_spin_button_new_with_range( 0.5, INT_MAX, .05 );
+ gtk_spin_button_set_digits( GTK_SPIN_BUTTON( w ), 2 );
+ tag = g_signal_connect( w, "value-changed", G_CALLBACK( ratio_spun_cb ), d );
+ gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 );
+ hig_workarea_add_wide_control( t, &row, h );
+ d->seedCustomSpin = w;
+ d->seedCustomSpinTag = tag;
hig_workarea_add_section_divider( t, &row );
hig_workarea_add_section_title( t, &row, _( "Peer Connections" ) );
- w = gtk_spin_button_new_with_range( 1, 3000, 5 );
- hig_workarea_add_row( t, &row, _( "_Maximum peers:" ), w, w );
- g_signal_connect( w, "value-changed", G_CALLBACK( max_peers_spun_cb ), d );
- d->maxPeersSpin = w;
+ w = gtk_spin_button_new_with_range( 1, 3000, 5 );
+ hig_workarea_add_row( t, &row, _( "_Maximum peers:" ), w, w );
+ g_signal_connect( w, "value-changed", G_CALLBACK( max_peers_spun_cb ), d );
+ d->maxPeersSpin = w;
hig_workarea_finish( t, &row );
return t;
tr_strlsize( buf2, haveValid, sizeof( buf2 ) );
i = (int) ceil( verifiedPieces );
g_snprintf( buf, sizeof( buf ), ngettext( "%1$s (%2$s verified in %3$d piece)",
- "%1$s (%2$s verified in %3$d pieces)", verifiedPieces ),
+ "%1$s (%2$s verified in %3$d pieces)",
+ verifiedPieces ),
buf1, buf2, i );
str = buf;
}
if( n <= 0 )
str = none;
else {
- uint64_t downloadedEver = 0;
- uint64_t uploadedEver = 0;
+ uint64_t up = 0;
+ uint64_t down = 0;
for( i=0; i<n; ++i ) {
- downloadedEver += stats[i]->downloadedEver;
- uploadedEver += stats[i]->uploadedEver;
+ up += stats[i]->uploadedEver;
+ down += stats[i]->downloadedEver;
}
- tr_strlratio( buf, tr_getRatio( uploadedEver, downloadedEver ), sizeof( buf ) );
+ tr_strlratio( buf, tr_getRatio( up, down ), sizeof( buf ) );
str = buf;
}
gtk_label_set_text( GTK_LABEL( di->ratio_lb ), str );
for( i=1; i<n; ++i )
if( baseline != infos[i]->isPrivate )
break;
- if( i==n )
- str = baseline ? _( "Private to this tracker -- PEX disabled" ) : _( "Public torrent" );
- else
+ if( i!=n )
str = mixed;
+ else if( baseline )
+ str = _( "Private to this tracker -- PEX disabled" );
+ else
+ str = _( "Public torrent" );
}
gtk_label_set_text( GTK_LABEL( di->privacy_lb ), str );
str = "";
else {
const char * baseline = infos[0]->comment ? infos[0]->comment : "";
- for( i=1; i<n; ++i ) {
- const char * tmp = infos[i]->comment ? infos[i]->comment : "";
- if( strcmp( baseline, tmp ) )
+ for( i=1; i<n; ++i )
+ if( strcmp( baseline, infos[i]->comment ? infos[i]->comment : "" ) )
break;
- }
if( i==n )
str = baseline;
else
str = none;
else {
const char * baseline = infos[0]->creator ? infos[0]->creator : "";
- for( i=1; i<n; ++i ) {
- const char * tmp = infos[i]->creator ? infos[i]->creator : "";
- if( strcmp( baseline, tmp ) )
+ for( i=1; i<n; ++i )
+ if( strcmp( baseline, infos[i]->creator ? infos[i]->creator : "" ) )
break;
- }
if( i==n )
str = baseline;
else
else
str = mixed;
gtk_label_set_text( GTK_LABEL( di->torrentfile_lb ), str );
+
+ g_free( infos );
}
static GtkWidget*
enum
{
+ WEBSEED_COL_KEY,
+ WEBSEED_COL_WAS_UPDATED,
WEBSEED_COL_URL,
WEBSEED_COL_DOWNLOAD_RATE,
- WEBSEED_COL_WAS_UPDATED,
N_WEBSEED_COLS
};
webseed_model_new( void )
{
return gtk_list_store_new( N_WEBSEED_COLS,
- G_TYPE_STRING,
- G_TYPE_FLOAT,
- G_TYPE_BOOLEAN );
+ G_TYPE_STRING, /* key */
+ G_TYPE_BOOLEAN, /* was-updated */
+ G_TYPE_STRING, /* url */
+ G_TYPE_FLOAT); /* download rate */
}
enum
{
+ PEER_COL_KEY,
+ PEER_COL_WAS_UPDATED,
PEER_COL_ADDRESS,
PEER_COL_ADDRESS_COLLATED,
PEER_COL_DOWNLOAD_RATE_DOUBLE,
PEER_COL_PROGRESS,
PEER_COL_IS_ENCRYPTED,
PEER_COL_STATUS,
- PEER_COL_WAS_UPDATED,
- PEER_COL_KEY,
N_PEER_COLS
};
peer_store_new( void )
{
return gtk_list_store_new( N_PEER_COLS,
+ G_TYPE_STRING, /* key */
+ G_TYPE_BOOLEAN, /* was-updated */
G_TYPE_STRING, /* address */
G_TYPE_STRING, /* collated address */
G_TYPE_FLOAT, /* download speed float */
G_TYPE_STRING, /* client */
G_TYPE_INT, /* progress [0..100] */
G_TYPE_BOOLEAN, /* isEncrypted */
- G_TYPE_STRING, /* flagString */
- G_TYPE_BOOLEAN, /* was-updated */
- G_TYPE_STRING); /* key */
+ G_TYPE_STRING); /* flagString */
}
static void
-init_peer( GtkListStore * store, GtkTreeIter * iter, const char * key, const tr_peer_stat * peer )
+init_peer( GtkListStore * store,
+ GtkTreeIter * iter,
+ const char * key,
+ const tr_peer_stat * peer )
{
- int quads[4];
- char upload_speed[128];
+ int q[4];
+ char up_speed[128];
+ char down_speed[128];
char collated_name[128];
- char download_speed[128];
const char * client = peer->client;
if( !client || !strcmp( client, "Unknown Client" ) )
client = "";
- tr_strlspeed( upload_speed, peer->rateToPeer, sizeof( upload_speed ) );
- tr_strlspeed( download_speed, peer->rateToClient, sizeof( download_speed ) );
- if( sscanf( peer->addr, "%d.%d.%d.%d", quads, quads+1, quads+2, quads+3 ) != 4 )
+ tr_strlspeed( up_speed, peer->rateToPeer, sizeof( up_speed ) );
+ tr_strlspeed( down_speed, peer->rateToClient, sizeof( down_speed ) );
+ if( sscanf( peer->addr, "%d.%d.%d.%d", q, q+1, q+2, q+3 ) != 4 )
g_strlcpy( collated_name, peer->addr, sizeof( collated_name ) );
else
g_snprintf( collated_name, sizeof( collated_name ),
- "%03d.%03d.%03d.%03d", quads[0], quads[1], quads[2], quads[3] );
+ "%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3] );
gtk_list_store_set( store, iter,
PEER_COL_ADDRESS, peer->addr,
GtkTreeIter * iter,
gpointer data UNUSED )
{
- gboolean is_encrypted = FALSE;
+ gboolean b = FALSE;
- gtk_tree_model_get( tree_model, iter, PEER_COL_IS_ENCRYPTED, &is_encrypted, -1 );
+ gtk_tree_model_get( tree_model, iter, PEER_COL_IS_ENCRYPTED, &b, -1 );
g_object_set( renderer, "xalign", (gfloat)0.0,
"yalign", (gfloat)0.5,
- "stock-id", ( is_encrypted ? "transmission-lock" : NULL ),
+ "stock-id", ( b ? "transmission-lock" : NULL ),
NULL );
}
-#if GTK_CHECK_VERSION( 2,12,0 )
-static gboolean
-onPeerViewQueryTooltip( GtkWidget * widget,
- gint x,
- gint y,
- gboolean keyboard_tip,
- GtkTooltip * tooltip,
- gpointer user_data UNUSED )
-{
- gboolean show_tip = FALSE;
- GtkTreeModel * model;
- GtkTreeIter iter;
-
- if( gtk_tree_view_get_tooltip_context( GTK_TREE_VIEW( widget ),
- &x, &y, keyboard_tip,
- &model, NULL, &iter ) )
- {
- const char * pch;
- char * str = NULL;
- GString * gstr = g_string_new( NULL );
- gtk_tree_model_get( model, &iter, PEER_COL_STATUS, &str, -1 );
- for( pch = str; pch && *pch; ++pch )
- {
- const char * txt = NULL;
- switch( *pch )
- {
- case 'O': txt = _( "Optimistic unchoke" ); break;
- case 'D': txt = _( "Downloading from this peer" ); break;
- case 'd': txt = _( "We would download from this peer if they would let us" ); break;
- case 'U': txt = _( "Uploading to peer" ); break;
- case 'u': txt = _( "We would upload to this peer if they asked" ); break;
- case 'K': txt = _( "Peer has unchoked us, but we're not interested" ); break;
- case '?': txt = _( "We unchoked this peer, but they're not interested" ); break;
- case 'E': txt = _( "Encrypted connection" ); break;
- case 'X': txt = _( "Peer was discovered through Peer Exchange (PEX)" ); break;
- case 'I': txt = _( "Peer is an incoming connection" ); break;
- }
- if( txt )
- g_string_append_printf( gstr, "%c: %s\n", *pch, txt );
- }
- if( gstr->len ) /* remove the last linefeed */
- g_string_set_size( gstr, gstr->len - 1 );
- gtk_tooltip_set_text( tooltip, gstr->str );
- g_string_free( gstr, TRUE );
- g_free( str );
- show_tip = TRUE;
- }
-
- return show_tip;
-}
-#endif
-
static void
-refreshPeerRow( GtkListStore * store, GtkTreeIter * iter, const tr_peer_stat * peer )
+refreshPeerRow( GtkListStore * store,
+ GtkTreeIter * iter,
+ const tr_peer_stat * peer )
{
- char upload_speed[128];
- char download_speed[128];
+ char up_speed[128];
+ char down_speed[128];
if( peer->rateToPeer > 0.01 )
- tr_strlspeed( upload_speed, peer->rateToPeer, sizeof( upload_speed ) );
+ tr_strlspeed( up_speed, peer->rateToPeer, sizeof( up_speed ) );
else
- *upload_speed = '\0';
+ *up_speed = '\0';
if( peer->rateToClient > 0.01 )
- tr_strlspeed( download_speed, peer->rateToClient, sizeof( download_speed ) );
+ tr_strlspeed( down_speed, peer->rateToClient, sizeof( down_speed ) );
else
- *download_speed = '\0';
+ *down_speed = '\0';
gtk_list_store_set( store, iter,
PEER_COL_PROGRESS, (int)( 100.0 * peer->progress ),
PEER_COL_DOWNLOAD_RATE_DOUBLE, peer->rateToClient,
- PEER_COL_DOWNLOAD_RATE_STRING, download_speed,
+ PEER_COL_DOWNLOAD_RATE_STRING, down_speed,
PEER_COL_UPLOAD_RATE_DOUBLE, peer->rateToPeer,
- PEER_COL_UPLOAD_RATE_STRING, upload_speed,
+ PEER_COL_UPLOAD_RATE_STRING, up_speed,
PEER_COL_STATUS, peer->flagStr,
PEER_COL_WAS_UPDATED, TRUE,
-1 );
int i;
int * peerCount;
GtkTreeIter iter;
- GtkTreeModel * model;
+ GHashTable * hash = di->peer_hash;
+ GtkListStore * store = di->peer_store;
+ GtkTreeModel * model = GTK_TREE_MODEL( store );
struct tr_peer_stat ** peers;
/* step 1: get all the peers */
peers[i] = tr_torrentPeers( torrents[i], &peerCount[i] );
/* step 2: mark all the peers in the list as not-updated */
- model = GTK_TREE_MODEL( di->peer_store );
+ model = GTK_TREE_MODEL( store );
if( gtk_tree_model_get_iter_first( model, &iter ) ) do
- gtk_list_store_set( di->peer_store, &iter, PEER_COL_WAS_UPDATED, FALSE, -1 );
+ gtk_list_store_set( store, &iter, PEER_COL_WAS_UPDATED, FALSE, -1 );
while( gtk_tree_model_iter_next( model, &iter ) );
/* step 3: add any new peers */
const tr_peer_stat * s = &peers[i][j];
char key[128];
g_snprintf( key, sizeof( key ), "%d.%s", tr_torrentId(tor), s->addr );
- if( g_hash_table_lookup( di->peer_hash, key ) == NULL ) {
+ if( g_hash_table_lookup( hash, key ) == NULL ) {
GtkTreePath * path;
- gtk_list_store_append( di->peer_store, &iter );
- init_peer( di->peer_store, &iter, key, s );
+ gtk_list_store_append( store, &iter );
+ init_peer( store, &iter, key, s );
/* fprintf( stderr, "adding peer key %s\n", key ); */
path = gtk_tree_model_get_path( model, &iter );
- g_hash_table_insert( di->peer_hash, g_strdup( key ), gtk_tree_row_reference_new( model, path ) );
+ g_hash_table_insert( hash, g_strdup( key ),
+ gtk_tree_row_reference_new( model, path ) );
gtk_tree_path_free( path );
}
}
GtkTreeRowReference * ref;
GtkTreePath * path;
g_snprintf( key, sizeof( key ), "%d.%s", tr_torrentId(tor), s->addr );
- ref = g_hash_table_lookup( di->peer_hash, key );
+ ref = g_hash_table_lookup( hash, key );
assert( ref != NULL );
path = gtk_tree_row_reference_get_path( ref );
assert( path );
gtk_tree_model_get_iter( model, &iter, path );
- refreshPeerRow( di->peer_store, &iter, s );
+ refreshPeerRow( store, &iter, s );
gtk_tree_path_free( path );
}
}
/* step 5: remove peers that have disappeared */
- model = GTK_TREE_MODEL( di->peer_store );
+ model = GTK_TREE_MODEL( store );
if( gtk_tree_model_get_iter_first( model, &iter ) ) {
gboolean more = TRUE;
while( more ) {
- gboolean wasUpdated;
- gtk_tree_model_get( model, &iter, PEER_COL_WAS_UPDATED, &wasUpdated, -1 );
- if( wasUpdated )
+ gboolean b;
+ gtk_tree_model_get( model, &iter, PEER_COL_WAS_UPDATED, &b, -1 );
+ if( b )
more = gtk_tree_model_iter_next( model, &iter );
else {
char * key;
gtk_tree_model_get( model, &iter, PEER_COL_KEY, &key, -1 );
/* fprintf( stderr, "removing key %s\n", key ); */
- g_hash_table_remove( di->peer_hash, key );
- more = gtk_list_store_remove( di->peer_store, &iter );
+ g_hash_table_remove( hash, key );
+ more = gtk_list_store_remove( store, &iter );
g_free( key );
}
}
GHashTable * hash = di->webseed_hash;
GtkListStore * store = di->webseed_store;
GtkTreeModel * model = GTK_TREE_MODEL( store );
+
/* step 1: mark all webseeds as not-updated */
if( gtk_tree_model_get_iter_first( model, &iter ) ) do
gtk_list_store_append( store, &iter );
gtk_list_store_set( store, &iter, WEBSEED_COL_URL, url, -1 );
path = gtk_tree_model_get_path( model, &iter );
- g_hash_table_insert( hash, g_strdup( key ), gtk_tree_row_reference_new( model, path ) );
+ g_hash_table_insert( hash, g_strdup( key ),
+ gtk_tree_row_reference_new( model, path ) );
gtk_tree_path_free( path );
}
}
if( gtk_tree_model_get_iter_first( model, &iter ) ) {
gboolean more = TRUE;
while( more ) {
- gboolean wasUpdated;
- gtk_tree_model_get( model, &iter, WEBSEED_COL_WAS_UPDATED, &wasUpdated, -1 );
- if( wasUpdated )
+ gboolean b;
+ gtk_tree_model_get( model, &iter, WEBSEED_COL_WAS_UPDATED, &b, -1 );
+ if( b )
more = gtk_tree_model_iter_next( model, &iter );
else {
char * key;
- gtk_tree_model_get( model, &iter, PEER_COL_KEY, &key, -1 );
+ gtk_tree_model_get( model, &iter, WEBSEED_COL_KEY, &key, -1 );
g_hash_table_remove( hash, key );
more = gtk_list_store_remove( store, &iter );
g_free( key );
refreshWebseedList( di, torrents, n );
}
+#if GTK_CHECK_VERSION( 2,12,0 )
+static gboolean
+onPeerViewQueryTooltip( GtkWidget * widget,
+ gint x,
+ gint y,
+ gboolean keyboard_tip,
+ GtkTooltip * tooltip,
+ gpointer user_data UNUSED )
+{
+ gboolean show_tip = FALSE;
+ GtkTreeModel * model;
+ GtkTreeIter iter;
+
+ if( gtk_tree_view_get_tooltip_context( GTK_TREE_VIEW( widget ),
+ &x, &y, keyboard_tip,
+ &model, NULL, &iter ) )
+ {
+ const char * pch;
+ char * str = NULL;
+ GString * gstr = g_string_new( NULL );
+ gtk_tree_model_get( model, &iter, PEER_COL_STATUS, &str, -1 );
+ for( pch = str; pch && *pch; ++pch )
+ {
+ const char * txt = NULL;
+ switch( *pch )
+ {
+ case 'O': txt = _( "Optimistic unchoke" ); break;
+ case 'D': txt = _( "Downloading from this peer" ); break;
+ case 'd': txt = _( "We would download from this peer if they would let us" ); break;
+ case 'U': txt = _( "Uploading to peer" ); break;
+ case 'u': txt = _( "We would upload to this peer if they asked" ); break;
+ case 'K': txt = _( "Peer has unchoked us, but we're not interested" ); break;
+ case '?': txt = _( "We unchoked this peer, but they're not interested" ); break;
+ case 'E': txt = _( "Encrypted connection" ); break;
+ case 'X': txt = _( "Peer was discovered through Peer Exchange (PEX)" ); break;
+ case 'I': txt = _( "Peer is an incoming connection" ); break;
+ }
+ if( txt )
+ g_string_append_printf( gstr, "%c: %s\n", *pch, txt );
+ }
+ if( gstr->len ) /* remove the last linefeed */
+ g_string_set_size( gstr, gstr->len - 1 );
+ gtk_tooltip_set_text( tooltip, gstr->str );
+ g_string_free( gstr, TRUE );
+ g_free( str );
+ show_tip = TRUE;
+ }
+
+ return show_tip;
+}
+#endif
+
static GtkWidget*
peer_page_new( struct DetailsImpl * di )
{
guint i;
+ const char * str;
GtkListStore *store;
GtkWidget *v, *w, *ret, *sw, *l, *vbox, *hbox;
GtkWidget *webtree = NULL;
-
- /* TODO: make this configurable? */
+ GtkTreeViewColumn * c;
+ GtkCellRenderer * r;
int view_columns[] = { PEER_COL_IS_ENCRYPTED,
PEER_COL_UPLOAD_RATE_STRING,
PEER_COL_DOWNLOAD_RATE_STRING,
PEER_COL_CLIENT };
- {
- GtkListStore * store;
- GtkTreeViewColumn * c;
- GtkCellRenderer * r;
- const char * t;
- GtkWidget * w;
- GtkWidget * v;
-
- store = di->webseed_store = webseed_model_new( );
- v = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
- g_signal_connect( v, "button-release-event", G_CALLBACK( on_tree_view_button_released ), NULL );
- gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( v ), TRUE );
- //p->webseeds = GTK_LIST_STORE( GTK_TREE_MODEL( store ) );
- g_object_unref( G_OBJECT( store ) );
-
- t = getWebseedColumnNames( WEBSEED_COL_URL );
- r = gtk_cell_renderer_text_new( );
- g_object_set( G_OBJECT( r ), "ellipsize", PANGO_ELLIPSIZE_END, NULL );
- c = gtk_tree_view_column_new_with_attributes( t, r, "text", WEBSEED_COL_URL, NULL );
- g_object_set( G_OBJECT( c ), "expand", TRUE, NULL );
- gtk_tree_view_column_set_sort_column_id( c, WEBSEED_COL_URL );
- gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
+ /* webseeds */
- t = getWebseedColumnNames( WEBSEED_COL_DOWNLOAD_RATE );
- r = gtk_cell_renderer_text_new( );
- c = gtk_tree_view_column_new_with_attributes( t, r, "text", WEBSEED_COL_DOWNLOAD_RATE, NULL );
- gtk_tree_view_column_set_sort_column_id( c, WEBSEED_COL_DOWNLOAD_RATE );
- gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
+ store = di->webseed_store = webseed_model_new( );
+ v = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
+ g_signal_connect( v, "button-release-event", G_CALLBACK( on_tree_view_button_released ), NULL );
+ gtk_tree_view_set_rules_hint( GTK_TREE_VIEW( v ), TRUE );
+ g_object_unref( G_OBJECT( store ) );
- w = gtk_scrolled_window_new( NULL, NULL );
- gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
- gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( w ), GTK_SHADOW_IN );
- gtk_container_add( GTK_CONTAINER( w ), v );
+ str = getWebseedColumnNames( WEBSEED_COL_URL );
+ r = gtk_cell_renderer_text_new( );
+ g_object_set( G_OBJECT( r ), "ellipsize", PANGO_ELLIPSIZE_END, NULL );
+ c = gtk_tree_view_column_new_with_attributes( str, r, "text", WEBSEED_COL_URL, NULL );
+ g_object_set( G_OBJECT( c ), "expand", TRUE, NULL );
+ gtk_tree_view_column_set_sort_column_id( c, WEBSEED_COL_URL );
+ gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
- webtree = w;
- di->webseed_view = w;
- }
+ str = getWebseedColumnNames( WEBSEED_COL_DOWNLOAD_RATE );
+ r = gtk_cell_renderer_text_new( );
+ c = gtk_tree_view_column_new_with_attributes( str, r, "text", WEBSEED_COL_DOWNLOAD_RATE, NULL );
+ gtk_tree_view_column_set_sort_column_id( c, WEBSEED_COL_DOWNLOAD_RATE );
+ gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c );
+
+ w = gtk_scrolled_window_new( NULL, NULL );
+ gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ),
+ GTK_POLICY_AUTOMATIC,
+ GTK_POLICY_AUTOMATIC );
+ gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( w ),
+ GTK_SHADOW_IN );
+ gtk_container_add( GTK_CONTAINER( w ), v );
+
+ webtree = w;
+ di->webseed_view = w;
+
+ /* peers */
store = di->peer_store = peer_store_new( );
v = GTK_WIDGET( g_object_new( GTK_TYPE_TREE_VIEW,
g_signal_connect( v, "button-release-event",
G_CALLBACK( on_tree_view_button_released ), NULL );
- for( i = 0; i < G_N_ELEMENTS( view_columns ); ++i )
+ for( i=0; i<G_N_ELEMENTS( view_columns ); ++i )
{
const int col = view_columns[i];
const char * t = getPeerColumnName( col );
int sort_col = col;
- GtkTreeViewColumn * c;
- GtkCellRenderer * r;
switch( col )
{
gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 );
l = di->seeders_lb = gtk_label_new( NULL );
gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 );
- gtk_box_pack_start( GTK_BOX( hbox ), gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f ), TRUE, TRUE, 0 );
+ w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
l = gtk_label_new( NULL );
gtk_label_set_markup( GTK_LABEL( l ), _( "<b>Leechers:</b>" ) );
gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 );
l = di->leechers_lb = gtk_label_new( NULL );
gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 );
- gtk_box_pack_start( GTK_BOX( hbox ), gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f ), TRUE, TRUE, 0 );
+ w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
+ gtk_box_pack_start( GTK_BOX( hbox ), w, TRUE, TRUE, 0 );
l = gtk_label_new( NULL );
gtk_label_set_markup( GTK_LABEL( l ), _( "<b>Times Completed:</b>" ) );
gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 );
***** TRACKER
****/
-#define TRACKER_PAGE "tracker-page"
-
-struct tracker_page
-{
- GtkTreeView * view;
- GtkListStore * store;
- GtkTreeSelection * sel;
-
- GtkWidget * add_button;
- GtkWidget * remove_button;
- GtkWidget * save_button;
- GtkWidget * revert_button;
-
-};
-
static void
refreshTracker( struct DetailsImpl * di, tr_torrent ** torrents, int n )
{
gtk_label_set_text( GTK_LABEL( di->manual_announce_countdown_lb ), str );
- /* tracker list */
+ g_free( stats );
}
static GtkWidget*
}
static void
-details_impl_free( gpointer gdata )
+details_free( gpointer gdata )
{
struct DetailsImpl * data = gdata;
g_signal_handler_disconnect( data->core, data->prefs_changed_tag );
GtkWidget*
torrent_inspector_new( GtkWindow * parent, TrCore * core )
{
- char title[512];
+ guint tag;
struct DetailsImpl * data;
GtkWidget * d, * n, * w, * l;
/* create the dialog */
data = g_new0( struct DetailsImpl, 1 );
data->core = core;
- /*FIXME g_snprintf( title, sizeof( title ), _( "%s Properties" ), info->name );*/
- d = gtk_dialog_new_with_buttons( title, parent, 0,
+ d = gtk_dialog_new_with_buttons( NULL, parent, 0,
GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE,
NULL );
gtk_window_set_role( GTK_WINDOW( d ), "tr-info" );
g_signal_connect( d, "response", G_CALLBACK( response_cb ), NULL );
gtk_dialog_set_has_separator( GTK_DIALOG( d ), FALSE );
gtk_container_set_border_width( GTK_CONTAINER( d ), GUI_PAD );
- g_object_set_data_full( G_OBJECT( d ), DETAILS_KEY, data, details_impl_free );
+ g_object_set_data_full( G_OBJECT( d ), DETAILS_KEY, data, details_free );
n = gtk_notebook_new( );
gtk_container_set_border_width( GTK_CONTAINER( n ), GUI_PAD );
gtk_box_pack_start( GTK_BOX( GTK_DIALOG( d )->vbox ), n, TRUE, TRUE, 0 );
- data->periodic_refresh_tag = gtr_timeout_add_seconds( UPDATE_INTERVAL_SECONDS, periodic_refresh, data );
+ tag = gtr_timeout_add_seconds( UPDATE_INTERVAL_SECONDS, periodic_refresh, data );
+ data->periodic_refresh_tag = tag;
periodic_refresh( data );
gtk_widget_show_all( GTK_DIALOG( d )->vbox );
return d;
torrent_inspector_set_torrents( GtkWidget * w, GSList * ids )
{
struct DetailsImpl * data = g_object_get_data( G_OBJECT( w ), DETAILS_KEY );
+ const int len = g_slist_length( ids );
+ char title[256];
g_slist_free( data->ids );
data->ids = g_slist_copy( ids );
- if( g_slist_length( ids ) == 1 ) {
+ if( len == 1 )
+ {
const int id = GPOINTER_TO_INT( ids->data );
+ tr_session * session = tr_core_session( data->core );
+ tr_torrent * tor = tr_torrentFindFromId( session, id );
+ const tr_info * inf = tr_torrentInfo( tor );
+ g_snprintf( title, sizeof( title ), _( "%s Properties" ), inf->name );
+
file_list_set_torrent( data->file_list, id );
tracker_list_set_torrent( data->tracker_list, id );
- } else {
+
+ }
+ else
+ {
file_list_clear( data->file_list );
tracker_list_clear( data->tracker_list );
+ g_snprintf( title, sizeof( title ), _( "%'d Torrent Properties" ), len );
}
+ gtk_window_set_title( GTK_WINDOW( w ), title );
+
refresh( data );
}