Changeset 6677


Ignore:
Timestamp:
Sep 1, 2008, 4:47:02 AM (13 years ago)
Author:
muks
Message:

Add simple scheduled bandwidth control for the GTK client (bug #964)

This is similar to how the Mac OS X version of Transmission
does it.

Location:
trunk/gtk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/gtk/main.c

    r6561 r6677  
    4242#endif
    4343
     44#include <libtransmission/transmission.h>
     45#include <libtransmission/utils.h>
    4446#include <libtransmission/version.h>
    4547
     
    477479}
    478480
     481static gboolean
     482updateScheduledLimits(gpointer data)
     483{
     484    tr_handle *tr = (tr_handle *) data;
     485    static gboolean last_state = FALSE;
     486    gboolean in_sched_state = FALSE;
     487
     488    if( !pref_flag_get( PREF_KEY_SCHED_LIMIT_ENABLED ) )
     489    {
     490        in_sched_state = FALSE;
     491    }
     492    else
     493    {
     494        time_t t;
     495        struct tm *tm;
     496        int begin_hour, begin_minute, end_hour, end_minute;
     497        int begin_time, end_time, cur_time;
     498
     499        begin_hour = pref_int_get( PREF_KEY_SCHED_BEGIN_HOUR );
     500        begin_minute = pref_int_get( PREF_KEY_SCHED_BEGIN_MINUTE );
     501        end_hour = pref_int_get( PREF_KEY_SCHED_END_HOUR );
     502        end_minute = pref_int_get( PREF_KEY_SCHED_END_MINUTE );
     503
     504        time( &t );
     505        tm = localtime (&t);
     506        cur_time = (tm->tm_hour * 60) + tm->tm_min;
     507        begin_time = (begin_hour * 60) + begin_minute;
     508        end_time = (end_hour * 60) + end_minute;
     509
     510        if( (end_time - begin_time) >= 0 )
     511        {
     512            if( (cur_time >= begin_time) && (cur_time <= end_time) )
     513                in_sched_state = TRUE;
     514        }
     515        else
     516        {
     517            if ( (cur_time >= begin_time) || (cur_time <= end_time) )
     518                in_sched_state = TRUE;
     519        }
     520    }
     521
     522    if( last_state != in_sched_state )
     523    {
     524        if( in_sched_state )
     525        {
     526            int limit;
     527
     528            tr_inf ( _( "Enabling scheduled bandwidth limits" ) );
     529
     530            tr_sessionSetSpeedLimitEnabled( tr, TR_DOWN, TRUE );
     531            limit = pref_int_get( PREF_KEY_SCHED_DL_LIMIT );
     532            tr_sessionSetSpeedLimit( tr, TR_DOWN, limit );
     533            tr_sessionSetSpeedLimitEnabled( tr, TR_UP, TRUE );
     534            limit = pref_int_get( PREF_KEY_SCHED_UL_LIMIT );
     535            tr_sessionSetSpeedLimit( tr, TR_UP, limit );
     536        }
     537        else
     538        {
     539            gboolean b;
     540            int limit;
     541
     542            tr_inf ( _( "Disabling scheduled bandwidth limits" ) );
     543
     544            b = pref_flag_get( PREF_KEY_DL_LIMIT_ENABLED );
     545            tr_sessionSetSpeedLimitEnabled( tr, TR_DOWN, b );
     546            limit = pref_int_get( PREF_KEY_DL_LIMIT );
     547            tr_sessionSetSpeedLimit( tr, TR_DOWN, limit );
     548            b = pref_flag_get( PREF_KEY_UL_LIMIT_ENABLED );
     549            tr_sessionSetSpeedLimitEnabled( tr, TR_UP, b );
     550            limit = pref_int_get( PREF_KEY_UL_LIMIT );
     551            tr_sessionSetSpeedLimit( tr, TR_UP, limit );
     552        }
     553
     554        last_state = in_sched_state;
     555    }
     556
     557    return TRUE;
     558}
     559
    479560static void
    480561appsetup( TrWindow * wind, GSList * torrentFiles,
     
    525606    cbdata->timer = g_timeout_add( UPDATE_INTERVAL, updatemodel, cbdata );
    526607    updatemodel( cbdata );
     608
     609    /* start scheduled rate timer */
     610    updateScheduledLimits (tr_core_handle( cbdata->core ));
     611    g_timeout_add_seconds( 60, updateScheduledLimits, tr_core_handle( cbdata->core ) );
    527612
    528613    /* either show the window or iconify it */
  • trunk/gtk/tr-prefs.c

    r6556 r6677  
    7272    pref_flag_set_default   ( PREF_KEY_UL_LIMIT_ENABLED, FALSE );
    7373    pref_int_set_default    ( PREF_KEY_UL_LIMIT, 50 );
     74    pref_flag_set_default   ( PREF_KEY_SCHED_LIMIT_ENABLED, FALSE );
     75    pref_int_set_default    ( PREF_KEY_SCHED_BEGIN_HOUR, 0 );
     76    pref_int_set_default    ( PREF_KEY_SCHED_BEGIN_MINUTE, 0 );
     77    pref_int_set_default    ( PREF_KEY_SCHED_END_HOUR, 0 );
     78    pref_int_set_default    ( PREF_KEY_SCHED_END_MINUTE, 0 );
     79    pref_int_set_default    ( PREF_KEY_SCHED_DL_LIMIT, 100 );
     80    pref_int_set_default    ( PREF_KEY_SCHED_UL_LIMIT, 50 );
     81
    7482    pref_flag_set_default   ( PREF_KEY_OPTIONS_PROMPT, TRUE );
    7583
     
    10611069}
    10621070
     1071struct NetworkPage
     1072{
     1073    TrCore * core;
     1074    GSList * sched_widgets;
     1075};
     1076
     1077static void
     1078refreshNetworkSensitivity( struct NetworkPage * p )
     1079{
     1080    GSList * l;
     1081    const gboolean sched_enabled = pref_flag_get( PREF_KEY_SCHED_LIMIT_ENABLED );
     1082
     1083    for( l=p->sched_widgets; l!=NULL; l=l->next )
     1084        gtk_widget_set_sensitive( GTK_WIDGET( l->data ), sched_enabled );
     1085}
     1086
     1087static void
     1088onNetworkToggled( GtkToggleButton * tb UNUSED, gpointer user_data )
     1089{
     1090    refreshNetworkSensitivity( user_data );
     1091}
     1092
     1093static void
     1094networkPageFree( gpointer gpage )
     1095{
     1096    struct NetworkPage * page = gpage;
     1097    g_slist_free( page->sched_widgets );
     1098    g_free( page );
     1099}
     1100
    10631101static GtkWidget*
    10641102networkPage( GObject * core )
     
    10671105    const char * s;
    10681106    GtkWidget * t;
    1069     GtkWidget * w, * w2;
     1107    GtkWidget * w, * w2, * h;
     1108    struct NetworkPage * page = tr_new0( struct NetworkPage, 1 );
     1109
     1110    page->core = TR_CORE( core );
    10701111
    10711112    t = hig_workarea_create( );
     
    10931134        hig_workarea_add_row_w( t, &row, w, w2, NULL );
    10941135
     1136    hig_workarea_add_section_divider( t, &row );
     1137    hig_workarea_add_section_title (t, &row, _("Scheduled Bandwidth Limit"));
     1138
     1139        h = gtk_hbox_new( FALSE, 0 );
     1140        w2 = new_spin_button( PREF_KEY_SCHED_BEGIN_HOUR, core, 0, 23, 1 );
     1141        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1142        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1143        w2 = gtk_label_new (":");
     1144        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1145        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1146        w2 = new_spin_button( PREF_KEY_SCHED_BEGIN_MINUTE, core, 0, 59, 1 );
     1147        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1148        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1149        w2 = gtk_label_new (_(" and "));
     1150        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1151        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1152        w2 = new_spin_button( PREF_KEY_SCHED_END_HOUR, core, 0, 23, 1 );
     1153        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1154        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1155        w2 = gtk_label_new (":");
     1156        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1157        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1158        w2 = new_spin_button( PREF_KEY_SCHED_END_MINUTE, core, 0, 59, 1 );
     1159        page->sched_widgets = g_slist_append( page->sched_widgets, w2 );
     1160        gtk_box_pack_start( GTK_BOX(h), w2, FALSE, FALSE, 0 );
     1161
     1162        s = _( "Limit bandwidth between" );
     1163        w = new_check_button( s, PREF_KEY_SCHED_LIMIT_ENABLED, core );
     1164        g_signal_connect( w, "toggled", G_CALLBACK(onNetworkToggled), page );
     1165        hig_workarea_add_row_w( t, &row, w, h, NULL );
     1166
     1167        w = new_spin_button( PREF_KEY_SCHED_DL_LIMIT, core, 0, INT_MAX, 5 );
     1168        gtk_widget_set_sensitive( GTK_WIDGET(w), pref_flag_get( PREF_KEY_SCHED_LIMIT_ENABLED ) );
     1169        page->sched_widgets = g_slist_append( page->sched_widgets, w );
     1170        hig_workarea_add_row( t, &row, _( "Scheduled download speed (KB/s):" ), w, NULL );
     1171        w = new_spin_button( PREF_KEY_SCHED_DL_LIMIT, core, 0, INT_MAX, 5 );
     1172        gtk_widget_set_sensitive( GTK_WIDGET(w), pref_flag_get( PREF_KEY_SCHED_LIMIT_ENABLED ) );
     1173        page->sched_widgets = g_slist_append( page->sched_widgets, w );
     1174        hig_workarea_add_row( t, &row, _( "Scheduled upload speed (KB/s):" ), w, NULL );
     1175
    10951176    hig_workarea_finish( t, &row );
     1177    g_object_set_data_full( G_OBJECT( t ), "page", page, networkPageFree );
     1178
     1179    refreshNetworkSensitivity( page );
    10961180    return t;
    10971181}
  • trunk/gtk/tr-prefs.h

    r6556 r6677  
    2525#define PREF_KEY_UL_LIMIT_ENABLED       "upload-limit-enabled"
    2626#define PREF_KEY_UL_LIMIT               "upload-limit"
     27#define PREF_KEY_SCHED_LIMIT_ENABLED    "sched-limit-enabled"
     28#define PREF_KEY_SCHED_BEGIN_HOUR       "sched-begin-hour"
     29#define PREF_KEY_SCHED_BEGIN_MINUTE     "sched-begin-minute"
     30#define PREF_KEY_SCHED_END_HOUR         "sched-end-hour"
     31#define PREF_KEY_SCHED_END_MINUTE       "sched-end-minute"
     32#define PREF_KEY_SCHED_DL_LIMIT         "sched-download-limit"
     33#define PREF_KEY_SCHED_UL_LIMIT         "sched-upload-limit"
    2734#define PREF_KEY_OPTIONS_PROMPT         "show-options-window"
    2835#define PREF_KEY_DOWNLOAD_DIR           "download-dir"
Note: See TracChangeset for help on using the changeset viewer.