570
onAltSpeedToggledIdle( gpointer vp )
572
PrivateData * p = vp;
573
gboolean b = tr_sessionUsesAltSpeed( tr_core_session( p->core ) );
574
tr_core_set_pref_bool( p->core, TR_PREFS_KEY_ALT_SPEED_ENABLED, b );
580
onAltSpeedToggled( tr_session * s UNUSED, tr_bool isEnabled UNUSED, tr_bool byUser UNUSED, void * p )
582
g_idle_add( onAltSpeedToggledIdle, p );
586
**** Speed limit menu
589
#define DIRECTION_KEY "direction-key"
590
#define ENABLED_KEY "enabled-key"
591
#define SPEED_KEY "speed-key"
594
onSpeedToggled( GtkCheckMenuItem * check, gpointer vp )
596
PrivateData * p = vp;
597
GObject * o = G_OBJECT( check );
598
gboolean isEnabled = g_object_get_data( o, ENABLED_KEY ) != 0;
599
tr_direction dir = GPOINTER_TO_INT( g_object_get_data( o, DIRECTION_KEY ) );
600
const char * key = dir == TR_UP ? TR_PREFS_KEY_USPEED_ENABLED
601
: TR_PREFS_KEY_DSPEED_ENABLED;
603
if( gtk_check_menu_item_get_active( check ) )
604
tr_core_set_pref_bool( p->core, key, isEnabled );
608
onSpeedSet( GtkCheckMenuItem * check, gpointer vp )
611
PrivateData * p = vp;
612
GObject * o = G_OBJECT( check );
613
const int speed = GPOINTER_TO_INT( g_object_get_data( o, SPEED_KEY ) );
614
tr_direction dir = GPOINTER_TO_INT( g_object_get_data( o, DIRECTION_KEY ) );
616
key = dir==TR_UP ? TR_PREFS_KEY_USPEED : TR_PREFS_KEY_DSPEED;
617
tr_core_set_pref_int( p->core, key, speed );
619
key = dir==TR_UP ? TR_PREFS_KEY_USPEED_ENABLED : TR_PREFS_KEY_DSPEED_ENABLED;
620
tr_core_set_pref_bool( p->core, key, TRUE );
624
createSpeedMenu( PrivateData * p, tr_direction dir )
628
const int speeds[] = { 5, 10, 20, 30, 40, 50, 75, 100, 150, 200, 250, 500, 750 };
632
w = gtk_radio_menu_item_new_with_label( NULL, _( "Unlimited" ) );
633
p->speedlimit_off_item[dir] = w;
634
g_object_set_data( G_OBJECT( w ), DIRECTION_KEY, GINT_TO_POINTER( dir ) );
635
g_object_set_data( G_OBJECT( w ), ENABLED_KEY, GINT_TO_POINTER( FALSE ) );
636
g_signal_connect( w, "toggled", G_CALLBACK(onSpeedToggled), p );
637
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
639
w = gtk_radio_menu_item_new_with_label_from_widget( GTK_RADIO_MENU_ITEM( w ), "" );
640
p->speedlimit_on_item[dir] = w;
641
g_object_set_data( G_OBJECT( w ), DIRECTION_KEY, GINT_TO_POINTER( dir ) );
642
g_object_set_data( G_OBJECT( w ), ENABLED_KEY, GINT_TO_POINTER( TRUE ) );
643
g_signal_connect( w, "toggled", G_CALLBACK(onSpeedToggled), p );
644
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
646
w = gtk_separator_menu_item_new( );
647
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
649
for( i=0, n=G_N_ELEMENTS(speeds); i<n; ++i )
652
tr_strlspeed( buf, speeds[i], sizeof( buf ) );
653
w = gtk_menu_item_new_with_label( buf );
654
g_object_set_data( G_OBJECT( w ), DIRECTION_KEY, GINT_TO_POINTER( dir ) );
655
g_object_set_data( G_OBJECT( w ), SPEED_KEY, GINT_TO_POINTER( speeds[i] ) );
656
g_signal_connect( w, "activate", G_CALLBACK(onSpeedSet), p );
657
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
664
**** Speed limit menu
667
#define RATIO_KEY "stock-ratio-index"
669
static const double stockRatios[] = { 0.25, 0.5, 0.75, 1, 1.5, 2, 3 };
672
onRatioToggled( GtkCheckMenuItem * check, gpointer vp )
674
PrivateData * p = vp;
675
if( gtk_check_menu_item_get_active( check ) )
677
gboolean f = g_object_get_data( G_OBJECT( check ), ENABLED_KEY ) != 0;
678
tr_core_set_pref_bool( p->core, TR_PREFS_KEY_RATIO_ENABLED, f );
682
onRatioSet( GtkCheckMenuItem * check, gpointer vp )
684
PrivateData * p = vp;
685
int i = GPOINTER_TO_INT( g_object_get_data( G_OBJECT( check ), RATIO_KEY ) );
686
const double ratio = stockRatios[i];
687
tr_core_set_pref_double( p->core, TR_PREFS_KEY_RATIO, ratio );
688
tr_core_set_pref_bool ( p->core, TR_PREFS_KEY_RATIO_ENABLED, TRUE );
692
createRatioMenu( PrivateData * p )
699
w = gtk_radio_menu_item_new_with_label( NULL, _( "Seed Forever" ) );
700
p->ratio_off_item = w;
701
g_object_set_data( G_OBJECT( w ), ENABLED_KEY, GINT_TO_POINTER( FALSE ) );
702
g_signal_connect( w, "toggled", G_CALLBACK(onRatioToggled), p );
703
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
705
w = gtk_radio_menu_item_new_with_label_from_widget( GTK_RADIO_MENU_ITEM( w ), "" );
706
p->ratio_on_item = w;
707
g_object_set_data( G_OBJECT( w ), ENABLED_KEY, GINT_TO_POINTER( TRUE ) );
708
g_signal_connect( w, "toggled", G_CALLBACK(onRatioToggled), p );
709
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
711
w = gtk_separator_menu_item_new( );
712
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
714
for( i=0, n=G_N_ELEMENTS(stockRatios); i<n; ++i )
717
tr_strlratio( buf, stockRatios[i], sizeof( buf ) );
718
w = gtk_menu_item_new_with_label( buf );
719
g_object_set_data( G_OBJECT( w ), RATIO_KEY, GINT_TO_POINTER( i ) );
720
g_signal_connect( w, "activate", G_CALLBACK(onRatioSet), p );
721
gtk_menu_shell_append( GTK_MENU_SHELL( m ), w );
732
createOptionsMenu( PrivateData * p )
735
GtkWidget * top = gtk_menu_new( );
737
m = gtk_menu_item_new_with_label( _( "Limit Download Speed" ) );
738
gtk_menu_item_set_submenu( GTK_MENU_ITEM( m ), createSpeedMenu( p, TR_DOWN ) );
739
gtk_menu_shell_append( GTK_MENU_SHELL( top ), m );
741
m = gtk_menu_item_new_with_label( _( "Limit Upload Speed" ) );
742
gtk_menu_item_set_submenu( GTK_MENU_ITEM( m ), createSpeedMenu( p, TR_UP ) );
743
gtk_menu_shell_append( GTK_MENU_SHELL( top ), m );
745
m = gtk_separator_menu_item_new( );
746
gtk_menu_shell_append( GTK_MENU_SHELL( top ), m );
748
m = gtk_menu_item_new_with_label( _( "Stop Seeding at Ratio" ) );
749
gtk_menu_item_set_submenu( GTK_MENU_ITEM( m ), createRatioMenu( p ) );
750
gtk_menu_shell_append( GTK_MENU_SHELL( top ), m );
752
gtk_widget_show_all( top );
757
onOptionsClicked( GtkButton * button UNUSED, gpointer vp )
763
PrivateData * p = vp;
765
w = p->speedlimit_on_item[TR_DOWN];
766
tr_strlspeed( buf1, pref_int_get( TR_PREFS_KEY_DSPEED ), sizeof( buf1 ) );
767
gtk_label_set_text( GTK_LABEL( gtk_bin_get_child( GTK_BIN( w ) ) ), buf1 );
769
b = pref_flag_get( TR_PREFS_KEY_DSPEED_ENABLED );
770
w = b ? p->speedlimit_on_item[TR_DOWN] : p->speedlimit_off_item[TR_DOWN];
771
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), TRUE );
773
w = p->speedlimit_on_item[TR_UP];
774
tr_strlspeed( buf1, pref_int_get( TR_PREFS_KEY_USPEED ), sizeof( buf1 ) );
775
gtk_label_set_text( GTK_LABEL( gtk_bin_get_child( GTK_BIN( w ) ) ), buf1 );
777
b = pref_flag_get( TR_PREFS_KEY_USPEED_ENABLED );
778
w = b ? p->speedlimit_on_item[TR_UP] : p->speedlimit_off_item[TR_UP];
779
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( w ), TRUE );
781
tr_strlratio( buf1, pref_double_get( TR_PREFS_KEY_RATIO ), sizeof( buf1 ) );
782
g_snprintf( buf2, sizeof( buf2 ), _( "Stop at Ratio (%s)" ), buf1 );
783
gtk_label_set_text( GTK_LABEL( gtk_bin_get_child( GTK_BIN( p->ratio_on_item ) ) ), buf2 );
785
b = pref_flag_get( TR_PREFS_KEY_RATIO_ENABLED );
786
gtk_check_menu_item_set_active( GTK_CHECK_MENU_ITEM( b ? p->ratio_on_item : p->ratio_off_item ), TRUE );
788
gtk_menu_popup ( GTK_MENU( p->options_menu ), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time( ) );
614
903
h = status = p->status = gtk_hbox_new( FALSE, GUI_PAD );
615
gtk_container_set_border_width( GTK_CONTAINER( h ), GUI_PAD );
616
w = p->gutter_lb = gtk_label_new( "N Torrents" );
617
gtk_box_pack_start( GTK_BOX( h ), w, 0, 0, 0 );
618
w = p->ul_lb = gtk_label_new( NULL );
619
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
620
w = gtk_image_new_from_stock( GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU );
621
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
622
w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
623
gtk_widget_set_size_request( w, GUI_PAD, 0u );
624
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
625
w = p->dl_lb = gtk_label_new( NULL );
626
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
627
w = gtk_image_new_from_stock( GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU );
628
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
629
w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
630
gtk_widget_set_size_request( w, GUI_PAD, 0u );
631
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
632
w = p->stats_lb = gtk_label_new( NULL );
633
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
634
w = gtk_image_new_from_stock( GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU );
635
c = gtk_event_box_new( );
636
gtk_container_add( GTK_CONTAINER( c ), w );
638
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
639
g_signal_connect( w, "button-release-event",
640
G_CALLBACK( onYinYangReleased ), p );
904
gtk_container_set_border_width( GTK_CONTAINER( h ), GUI_PAD_SMALL );
906
w = gtk_button_new( );
907
gtk_container_add( GTK_CONTAINER( w ), gtk_image_new_from_stock( "options", GTK_ICON_SIZE_SMALL_TOOLBAR ) );
908
gtk_box_pack_start( GTK_BOX( h ), w, 0, 0, 0 );
909
gtk_button_set_relief( GTK_BUTTON( w ), GTK_RELIEF_NONE );
910
p->options_menu = createOptionsMenu( p );
911
g_signal_connect( w, "clicked", G_CALLBACK(onOptionsClicked), p );
913
p->alt_speed_image[0] = gtk_image_new_from_stock( "alt-speed-off", -1 );
914
p->alt_speed_image[1] = gtk_image_new_from_stock( "alt-speed-on", -1 );
915
w = p->alt_speed_button = gtk_toggle_button_new( );
916
gtk_button_set_relief( GTK_BUTTON( w ), GTK_RELIEF_NONE );
917
g_object_ref( G_OBJECT( p->alt_speed_image[0] ) );
918
g_object_ref( G_OBJECT( p->alt_speed_image[1] ) );
919
g_signal_connect( w, "toggled", G_CALLBACK(alt_speed_toggled_cb ), p );
920
gtk_box_pack_start( GTK_BOX( h ), w, 0, 0, 0 );
922
w = p->gutter_lb = gtk_label_new( "N Torrents" );
923
gtk_box_pack_start( GTK_BOX( h ), w, 1, 1, GUI_PAD_BIG );
925
hbox = p->ul_hbox = gtk_hbox_new( FALSE, GUI_PAD_SMALL );
926
w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
927
gtk_widget_set_size_request( w, GUI_PAD, 0u );
928
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
929
w = gtk_image_new_from_stock( GTK_STOCK_GO_UP, GTK_ICON_SIZE_MENU );
930
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
931
w = p->ul_lb = gtk_label_new( NULL );
932
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
933
gtk_box_pack_end( GTK_BOX( h ), hbox, FALSE, FALSE, 0 );
935
hbox = p->dl_hbox = gtk_hbox_new( FALSE, GUI_PAD_SMALL );
936
w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
937
gtk_widget_set_size_request( w, GUI_PAD, 0u );
938
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
939
w = gtk_image_new_from_stock( GTK_STOCK_GO_DOWN, GTK_ICON_SIZE_MENU );
940
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
941
w = p->dl_lb = gtk_label_new( NULL );
942
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
943
gtk_box_pack_end( GTK_BOX( h ), hbox, FALSE, FALSE, 0 );
945
hbox = gtk_hbox_new( FALSE, GUI_PAD_SMALL );
946
w = gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f );
947
gtk_widget_set_size_request( w, GUI_PAD, 0u );
948
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
949
w = gtk_image_new_from_stock( GTK_STOCK_REFRESH, GTK_ICON_SIZE_MENU );
950
c = gtk_event_box_new( );
951
gtk_container_add( GTK_CONTAINER( c ), w );
953
g_signal_connect( w, "button-release-event", G_CALLBACK( onYinYangReleased ), p );
954
gtk_box_pack_start( GTK_BOX( hbox ), w, FALSE, FALSE, 0 );
955
w = p->stats_lb = gtk_label_new( NULL );
956
gtk_box_pack_end( GTK_BOX( h ), w, FALSE, FALSE, 0 );
957
gtk_box_pack_end( GTK_BOX( h ), hbox, FALSE, FALSE, 0 );
642
960
menu = gtk_menu_new( );