Changeset 8034
Legend:
- Unmodified
- Added
- Removed
-
trunk/gtk/details.c
r8021 r8034 31 31 32 32 #define UPDATE_INTERVAL_SECONDS 2 33 typedef struct 33 34 struct ResponseData 34 35 { 35 36 gpointer gtor; 36 37 TrCore * core; 37 38 guint handler; 38 } ResponseData; 39 40 41 /**** 42 ***** PIECES VIEW 43 ****/ 44 45 /* define SHOW_PIECES */ 46 47 #ifdef SHOW_PIECES 48 static int 49 getGridSize( int pieceCount, 50 int * n_rows, 51 int * n_cols ) 52 { 53 const int MAX_ACROSS = 16; 54 55 if( pieceCount >= ( MAX_ACROSS * MAX_ACROSS ) ) 56 { 57 *n_rows = *n_cols = MAX_ACROSS; 58 return MAX_ACROSS * MAX_ACROSS; 59 } 60 else 61 { 62 int i; 63 for( i = 0; ( i * i ) < pieceCount; ++i ) ; 64 *n_rows = *n_cols = i; 65 return pieceCount; 66 } 67 } 68 69 #define TO16( a ) ( (guint16)( ( a << 8 ) | ( a ) ) ) 70 #define RGB_2_GDK( R, G, B ) { 0, TO16( R ), TO16( G ), TO16( B ) } 71 72 enum { DRAW_AVAIL, DRAW_PROG }; 73 74 static void 75 release_gobject_array( gpointer data ) 76 { 77 int i; 78 GObject **objects = (GObject**) data; 79 80 for( i = 0; objects[i] != NULL; ++i ) 81 g_object_unref ( G_OBJECT( objects[i] ) ); 82 g_free ( objects ); 83 } 84 85 static gboolean 86 refresh_pieces( GtkWidget * da, 87 GdkEventExpose * event UNUSED, 88 gpointer gtor ) 89 { 90 tr_torrent * tor = tr_torrent_handle( TR_TORRENT( gtor ) ); 91 const tr_info * info = tr_torrent_info( TR_TORRENT( gtor ) ); 92 int mode = 93 GPOINTER_TO_INT ( g_object_get_data ( G_OBJECT( da ), "draw-mode" ) ); 94 95 GdkColormap * colormap = gtk_widget_get_colormap ( da ); 96 const int widget_w = da->allocation.width; 97 const int widget_h = da->allocation.height; 98 int n_rows, n_cols; 99 const int n_cells = getGridSize ( info->pieceCount, &n_rows, 100 &n_cols ); 101 const GdkRectangle grid_bounds = { 0, 0, widget_w, widget_h }; 102 const double piece_w = grid_bounds.width / (double)n_cols; 103 const double piece_h = grid_bounds.height / (double)n_rows; 104 const int piece_w_int = (int) ( piece_w + 1 ); /* pad for roundoff 105 */ 106 const int piece_h_int = (int) ( piece_h + 1 ); /* pad for roundoff 107 */ 108 const gboolean rtl = gtk_widget_get_direction( da ) == 109 GTK_TEXT_DIR_RTL; 110 111 guint8 * prev_color = NULL; 112 gboolean first_time = FALSE; 113 114 int i, x, y; 115 int8_t * pieces = NULL; 116 float * completeness = NULL; 117 118 /** 119 *** Get the Graphics Contexts... 120 **/ 121 122 enum { ALL, LOTS, SOME, FEW, NONE, 123 BLACK, GRAY, BLINK, 124 N_COLORS }; 125 GdkGC ** gcs = (GdkGC**) g_object_get_data ( G_OBJECT( 126 da ), 127 "graphics-contexts" ); 128 if( gcs == NULL ) 129 { 130 const GdkColor colors[N_COLORS] = { 131 RGB_2_GDK ( 114, 159, 207 ), /* all */ 132 RGB_2_GDK ( 52, 101, 164 ), /* lots */ 133 RGB_2_GDK ( 32, 74, 135 ), /* some */ 134 RGB_2_GDK ( 85, 87, 83 ), /* few */ 135 RGB_2_GDK ( 238, 238, 236 ), /* none - tango aluminum highlight */ 136 RGB_2_GDK ( 46, 52, 54 ), /* black - tango slate shadow */ 137 RGB_2_GDK ( 186, 189, 182 ), /* gray - tango aluminum shadow */ 138 RGB_2_GDK ( 252, 233, 79 ), /* blink - tango butter highlight */ 139 }; 140 141 gcs = g_new ( GdkGC *, N_COLORS + 1 ); 142 143 for( i = 0; i < N_COLORS; ++i ) 144 { 145 gcs[i] = gdk_gc_new ( da->window ); 146 gdk_gc_set_colormap ( gcs[i], colormap ); 147 gdk_gc_set_rgb_fg_color ( gcs[i], &colors[i] ); 148 gdk_gc_set_rgb_bg_color ( gcs[i], &colors[i] ); 149 } 150 151 gcs[N_COLORS] = NULL; /* a sentinel in the release function */ 152 g_object_set_data_full ( G_OBJECT( da ), "graphics-contexts", 153 gcs, release_gobject_array ); 154 } 155 156 /** 157 *** Get the cells' previous colors... 158 *** (this is used for blinking when the color changes) 159 **/ 160 161 prev_color = (guint8*) g_object_get_data ( G_OBJECT( da ), "prev-color" ); 162 if( prev_color == NULL ) 163 { 164 first_time = TRUE; 165 prev_color = g_new0 ( guint8, n_cells ); 166 g_object_set_data_full ( G_OBJECT( 167 da ), "prev-color", prev_color, g_free ); 168 } 169 170 /** 171 *** Get the piece data values... 172 **/ 173 174 switch( mode ) 175 { 176 case DRAW_AVAIL: 177 pieces = g_new ( int8_t, n_cells ); 178 tr_torrentAvailability ( tor, pieces, n_cells ); 179 break; 180 181 case DRAW_PROG: 182 completeness = g_new ( float, n_cells ); 183 tr_torrentAmountFinished ( tor, completeness, n_cells ); 184 break; 185 186 default: 187 g_error( "no mode defined!" ); 188 } 189 190 /** 191 *** Draw... 192 **/ 193 194 i = 0; 195 for( y = 0; y < n_rows; ++y ) 196 { 197 for( x = 0; x < n_cols; ++x ) 198 { 199 int draw_x = grid_bounds.x + (int)( x * piece_w ); 200 int draw_y = grid_bounds.y + (int)( y * piece_h ); 201 int color = BLACK; 202 int border = BLACK; 203 204 if( rtl ) 205 draw_x = grid_bounds.x + grid_bounds.width - 206 (int)( ( x + 1 ) * piece_w ); 207 else 208 draw_x = grid_bounds.x + (int)( x * piece_w ); 209 draw_y = grid_bounds.y + (int)( y * piece_h ); 210 211 if( i < n_cells ) 212 { 213 border = GRAY; 214 215 if( mode == DRAW_AVAIL ) 216 { 217 const int8_t val = pieces[i]; 218 if( val < 0 ) color = ALL; 219 else if( val == 0 ) color = NONE; 220 else if( val <= 4 ) color = FEW; 221 else if( val <= 8 ) color = SOME; 222 else color = LOTS; 223 } 224 else /* completeness */ 225 { 226 const float val = completeness[i]; 227 if( val >= 1.00 ) color = ALL; 228 else if( val >= 0.66 ) color = LOTS; 229 else if( val >= 0.33 ) color = SOME; 230 else if( val >= 0.01 ) color = FEW; 231 else color = NONE; 232 } 233 234 /* draw a "blink" for one interval when a piece changes */ 235 if( first_time ) 236 prev_color[i] = color; 237 else if( color != prev_color[i] ) 238 { 239 prev_color[i] = color; 240 color = border = BLINK; 241 } 242 } 243 244 gdk_draw_rectangle ( da->window, gcs[color], TRUE, 245 draw_x, draw_y, 246 piece_w_int, piece_h_int ); 247 248 if( i < n_cells ) 249 gdk_draw_rectangle ( da->window, gcs[border], FALSE, 250 draw_x, draw_y, 251 piece_w_int, piece_h_int ); 252 253 ++i; 254 } 255 } 256 257 gdk_draw_rectangle ( da->window, gcs[GRAY], FALSE, 258 grid_bounds.x, grid_bounds.y, 259 grid_bounds.width - 1, grid_bounds.height - 1 ); 260 261 g_free ( pieces ); 262 g_free ( completeness ); 263 return FALSE; 264 } 265 266 #endif 39 }; 267 40 268 41 /**** … … 383 156 GtkTreeIter iter; 384 157 gtk_list_store_append( store, &iter ); 385 peer_row_set 158 peer_row_set( store, &iter, &peers[i] ); 386 159 } 387 160 } … … 390 163 peer_model_new( tr_torrent * tor ) 391 164 { 392 GtkListStore * m = gtk_list_store_new 393 394 395 396 397 398 399 165 GtkListStore * m = gtk_list_store_new( N_PEER_COLS, 166 G_TYPE_STRING, /* addr */ 167 G_TYPE_FLOAT, /* downloadFromRate */ 168 G_TYPE_FLOAT, /* uploadToRate */ 169 G_TYPE_STRING, /* client */ 170 G_TYPE_INT, /* progress [0..100] */ 171 G_TYPE_BOOLEAN, /* isEncrypted */ 172 G_TYPE_STRING ); /* flagString */ 400 173 401 174 int n_peers = 0; 402 tr_peer_stat * peers = tr_torrentPeers 403 404 qsort 405 append_peers_to_model 175 tr_peer_stat * peers = tr_torrentPeers( tor, &n_peers ); 176 177 qsort( peers, n_peers, sizeof( tr_peer_stat ), compare_peers ); 178 append_peers_to_model( m, peers, n_peers ); 406 179 tr_torrentPeersFree( peers, 0 ); 407 return GTK_TREE_MODEL 180 return GTK_TREE_MODEL( m ); 408 181 } 409 182 … … 417 190 gboolean is_encrypted = FALSE; 418 191 419 gtk_tree_model_get ( tree_model, iter, PEER_COL_IS_ENCRYPTED, 420 &is_encrypted, 421 -1 ); 422 g_object_set ( renderer, "xalign", (gfloat)0.0, 423 "yalign", (gfloat)0.5, 424 "stock-id", ( is_encrypted ? "transmission-lock" : NULL ), 425 NULL ); 192 gtk_tree_model_get( tree_model, iter, PEER_COL_IS_ENCRYPTED, &is_encrypted, -1 ); 193 g_object_set( renderer, "xalign", (gfloat)0.0, 194 "yalign", (gfloat)0.5, 195 "stock-id", ( is_encrypted ? "transmission-lock" : NULL ), 196 NULL ); 197 } 198 199 static void 200 render_speed( GtkCellRenderer * renderer, 201 GtkTreeModel * tree_model, 202 GtkTreeIter * iter, 203 int col ) 204 { 205 float rate = 0.0; 206 char str[64]; 207 gtk_tree_model_get( tree_model, iter, col, &rate, -1 ); 208 if( rate < 0.01 ) 209 *str = '\0'; 210 else 211 tr_strlspeed( str, rate, sizeof( str ) ); 212 g_object_set( renderer, "text", str, NULL ); 426 213 } 427 214 428 215 static void 429 216 render_ul_rate( GtkTreeViewColumn * column UNUSED, 430 GtkCellRenderer *renderer,431 GtkTreeModel *tree_model,432 GtkTreeIter *iter,217 GtkCellRenderer * renderer, 218 GtkTreeModel * tree_model, 219 GtkTreeIter * iter, 433 220 gpointer data UNUSED ) 434 221 { 435 float rate = 0.0; 436 437 gtk_tree_model_get ( tree_model, iter, PEER_COL_UPLOAD_RATE, &rate, -1 ); 438 if( rate < 0.01 ) 439 g_object_set ( renderer, "text", "", NULL ); 440 else 441 { 442 char speedStr[64]; 443 tr_strlspeed( speedStr, rate, sizeof( speedStr ) ); 444 g_object_set( renderer, "text", speedStr, NULL ); 445 } 222 render_speed( renderer, tree_model, iter, PEER_COL_UPLOAD_RATE ); 446 223 } 447 224 448 225 static void 449 226 render_dl_rate( GtkTreeViewColumn * column UNUSED, 450 GtkCellRenderer *renderer,451 GtkTreeModel *tree_model,452 GtkTreeIter *iter,227 GtkCellRenderer * renderer, 228 GtkTreeModel * tree_model, 229 GtkTreeIter * iter, 453 230 gpointer data UNUSED ) 454 231 { 455 float rate = 0.0; 456 457 gtk_tree_model_get ( tree_model, iter, PEER_COL_DOWNLOAD_RATE, &rate, 458 -1 ); 459 if( rate < 0.01 ) 460 g_object_set ( renderer, "text", "", NULL ); 461 else 462 { 463 char speedStr[64]; 464 tr_strlspeed( speedStr, rate, sizeof( speedStr ) ); 465 g_object_set( renderer, "text", speedStr, NULL ); 466 } 232 render_speed( renderer, tree_model, iter, PEER_COL_DOWNLOAD_RATE ); 467 233 } 468 234 … … 476 242 char * client = NULL; 477 243 478 gtk_tree_model_get ( tree_model, iter, PEER_COL_CLIENT, &client, 479 -1 ); 480 g_object_set ( renderer, "text", ( client ? client : "" ), NULL ); 481 g_free ( client ); 244 gtk_tree_model_get( tree_model, iter, PEER_COL_CLIENT, &client, -1 ); 245 g_object_set( renderer, "text", ( client ? client : "" ), NULL ); 246 g_free( client ); 482 247 } 483 248 … … 518 283 int n_peers; 519 284 GtkTreeIter iter; 520 PeerData * p = (PeerData*) g_object_get_data ( G_OBJECT( 521 top ), 522 "peer-data" ); 523 tr_torrent * tor = tr_torrent_handle ( p->gtor ); 285 PeerData * p = (PeerData*) g_object_get_data( G_OBJECT( top ), "peer-data" ); 286 tr_torrent * tor = tr_torrent_handle( p->gtor ); 524 287 GtkTreeModel * model = p->model; 525 288 GtkListStore * store = p->store; … … 534 297 { 535 298 GtkTreeIter iter; 536 gtk_tree_model_iter_nth_child( GTK_TREE_MODEL( 537 p->webseeds ), &iter, NULL, 538 i ); 539 gtk_list_store_set( p->webseeds, &iter, 540 WEBSEED_COL_DOWNLOAD_RATE, speeds[i], 541 -1 ); 299 gtk_tree_model_iter_nth_child( GTK_TREE_MODEL( p->webseeds ), &iter, NULL, i ); 300 gtk_list_store_set( p->webseeds, &iter, WEBSEED_COL_DOWNLOAD_RATE, speeds[i], -1 ); 542 301 } 543 302 tr_free( speeds ); … … 553 312 554 313 n_peers = 0; 555 peers = tr_torrentPeers 556 qsort 557 558 if( gtk_tree_model_get_iter_first 314 peers = tr_torrentPeers( tor, &n_peers ); 315 qsort( peers, n_peers, sizeof( tr_peer_stat ), compare_peers ); 316 317 if( gtk_tree_model_get_iter_first( model, &iter ) ) do 559 318 { 560 319 char * addr = NULL; 561 320 tr_peer_stat * peer = NULL; 562 gtk_tree_model_get 563 peer = bsearch 564 565 g_free 321 gtk_tree_model_get( model, &iter, PEER_COL_ADDRESS, &addr, -1 ); 322 peer = bsearch( addr, peers, n_peers, sizeof( tr_peer_stat ), 323 compare_addr_to_peer ); 324 g_free( addr ); 566 325 567 326 if( peer ) /* update a pre-existing row */ … … 569 328 const int pos = peer - peers; 570 329 const int n_rhs = n_peers - ( pos + 1 ); 571 g_assert 572 573 peer_row_set 330 g_assert( n_rhs >= 0 ); 331 332 peer_row_set( store, &iter, peer ); 574 333 575 334 /* remove it from the tr_peer_stat list */ 576 g_memmove 335 g_memmove( peer, peer + 1, sizeof( tr_peer_stat ) * n_rhs ); 577 336 --n_peers; 578 337 } 579 else if( !gtk_list_store_remove 338 else if( !gtk_list_store_remove( store, &iter ) ) 580 339 break; /* we removed the model's last item */ 581 340 } 582 while( gtk_tree_model_iter_next ( model, &iter ) ); 583 584 append_peers_to_model ( store, peers, n_peers ); /* all these are new */ 585 586 #ifdef SHOW_PIECES 587 if( GDK_IS_DRAWABLE ( p->completeness->window ) ) 588 refresh_pieces ( p->completeness, NULL, p->gtor ); 589 #endif 590 591 fmtpeercount ( p->seeders_lb, stat->seeders ); 592 fmtpeercount ( p->leechers_lb, stat->leechers ); 593 fmtpeercount ( p->completed_lb, stat->timesCompleted ); 341 while( gtk_tree_model_iter_next( model, &iter ) ); 342 343 append_peers_to_model( store, peers, n_peers ); /* all these are new */ 344 345 fmtpeercount( p->seeders_lb, stat->seeders ); 346 fmtpeercount( p->leechers_lb, stat->leechers ); 347 fmtpeercount( p->completed_lb, stat->timesCompleted ); 594 348 595 349 free( peers ); … … 624 378 switch( *pch ) 625 379 { 626 case 'O': 627 txt = _( "Optimistic unchoke" ); break; 628 629 case 'D': 630 txt = _( "Downloading from this peer" ); break; 631 632 case 'd': 633 txt = _( 634 "We would download from this peer if they would let us" ); 635 break; 636 637 case 'U': 638 txt = _( "Uploading to peer" ); break; 639 640 case 'u': 641 txt = _( "We would upload to this peer if they asked" ); 642 break; 643 644 case 'K': 645 txt = _( 646 "Peer has unchoked us, but we're not interested" ); 647 break; 648 649 case '?': 650 txt = _( 651 "We unchoked this peer, but they're not interested" ); 652 break; 653 654 case 'E': 655 txt = _( "Encrypted connection" ); break; 656 657 case 'X': 658 txt = _( 659 "Peer was discovered through Peer Exchange (PEX)" ); 660 break; 661 662 case 'I': 663 txt = _( "Peer is an incoming connection" ); break; 380 case 'O': txt = _( "Optimistic unchoke" ); break; 381 case 'D': txt = _( "Downloading from this peer" ); break; 382 case 'd': txt = _( "We would download from this peer if they would let us" ); break; 383 case 'U': txt = _( "Uploading to peer" ); break; 384 case 'u': txt = _( "We would upload to this peer if they asked" ); break; 385 case 'K': txt = _( "Peer has unchoked us, but we're not interested" ); break; 386 case '?': txt = _( "We unchoked this peer, but they're not interested" ); break; 387 case 'E': txt = _( "Encrypted connection" ); break; 388 case 'X': txt = _( "Peer was discovered through Peer Exchange (PEX)" ); break; 389 case 'I': txt = _( "Peer is an incoming connection" ); break; 664 390 } 665 391 if( txt ) … … 686 412 GtkWidget * v, *w, *ret, *sw, *l, *vbox, *hbox; 687 413 GtkWidget * webtree = NULL; 688 tr_torrent * tor = tr_torrent_handle 689 PeerData * p = g_new 414 tr_torrent * tor = tr_torrent_handle( gtor ); 415 PeerData * p = g_new( PeerData, 1 ); 690 416 const tr_info * inf = tr_torrent_info( gtor ); 691 417 … … 716 442 717 443 t = _( webseed_column_names[WEBSEED_COL_URL] ); 718 r = gtk_cell_renderer_text_new 444 r = gtk_cell_renderer_text_new( ); 719 445 g_object_set( G_OBJECT( r ), "ellipsize", PANGO_ELLIPSIZE_END, NULL ); 720 446 c = gtk_tree_view_column_new_with_attributes( t, r, "text", WEBSEED_COL_URL, NULL ); … … 724 450 725 451 t = _( webseed_column_names[WEBSEED_COL_DOWNLOAD_RATE] ); 726 r = gtk_cell_renderer_text_new 727 c = gtk_tree_view_column_new_with_attributes 728 gtk_tree_view_column_set_cell_data_func 452 r = gtk_cell_renderer_text_new( ); 453 c = gtk_tree_view_column_new_with_attributes( t, r, "text", WEBSEED_COL_DOWNLOAD_RATE, NULL ); 454 gtk_tree_view_column_set_cell_data_func( c, r, render_dl_rate, NULL, NULL ); 729 455 gtk_tree_view_column_set_sort_column_id( c, WEBSEED_COL_DOWNLOAD_RATE ); 730 456 gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c ); 731 457 732 w = gtk_scrolled_window_new ( NULL, NULL ); 733 gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW( w ), 734 GTK_POLICY_AUTOMATIC, 735 GTK_POLICY_AUTOMATIC ); 736 gtk_scrolled_window_set_shadow_type ( GTK_SCROLLED_WINDOW( w ), 737 GTK_SHADOW_IN ); 738 gtk_container_add ( GTK_CONTAINER( w ), v ); 458 w = gtk_scrolled_window_new( NULL, NULL ); 459 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); 460 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( w ), GTK_SHADOW_IN ); 461 gtk_container_add( GTK_CONTAINER( w ), v ); 739 462 740 463 webtree = w; 741 464 } 742 465 743 m = peer_model_new 466 m = peer_model_new( tor ); 744 467 v = GTK_WIDGET( g_object_new( GTK_TYPE_TREE_VIEW, 745 468 "model", gtk_tree_model_sort_new_with_model( m ), … … 756 479 #endif 757 480 gtk_widget_set_size_request( v, 550, 0 ); 758 g_object_unref 481 g_object_unref( G_OBJECT( m ) ); 759 482 g_signal_connect( v, "button-release-event", 760 483 G_CALLBACK( on_tree_view_button_released ), NULL ); … … 770 493 { 771 494 case PEER_COL_ADDRESS: 772 r = gtk_cell_renderer_text_new 773 c = gtk_tree_view_column_new_with_attributes 495 r = gtk_cell_renderer_text_new( ); 496 c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); 774 497 break; 775 498 776 499 case PEER_COL_CLIENT: 777 r = gtk_cell_renderer_text_new 778 c = gtk_tree_view_column_new_with_attributes 779 gtk_tree_view_column_set_cell_data_func 500 r = gtk_cell_renderer_text_new( ); 501 c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); 502 gtk_tree_view_column_set_cell_data_func( c, r, render_client, NULL, NULL ); 780 503 break; 781 504 782 505 case PEER_COL_PROGRESS: 783 r = gtk_cell_renderer_progress_new 784 c = gtk_tree_view_column_new_with_attributes 506 r = gtk_cell_renderer_progress_new( ); 507 c = gtk_tree_view_column_new_with_attributes( t, r, "value", PEER_COL_PROGRESS, NULL ); 785 508 break; 786 509 787 510 case PEER_COL_IS_ENCRYPTED: 788 r = gtk_cell_renderer_pixbuf_new 789 c = gtk_tree_view_column_new_with_attributes 790 gtk_tree_view_column_set_sizing 791 gtk_tree_view_column_set_fixed_width 792 gtk_tree_view_column_set_cell_data_func 511 r = gtk_cell_renderer_pixbuf_new( ); 512 c = gtk_tree_view_column_new_with_attributes( t, r, NULL ); 513 gtk_tree_view_column_set_sizing( c, GTK_TREE_VIEW_COLUMN_FIXED ); 514 gtk_tree_view_column_set_fixed_width( c, 20 ); 515 gtk_tree_view_column_set_cell_data_func( c, r, render_encrypted, NULL, NULL ); 793 516 break; 794 517 795 518 case PEER_COL_DOWNLOAD_RATE: 796 r = gtk_cell_renderer_text_new 797 c = gtk_tree_view_column_new_with_attributes 798 gtk_tree_view_column_set_cell_data_func 519 r = gtk_cell_renderer_text_new( ); 520 c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); 521 gtk_tree_view_column_set_cell_data_func( c, r, render_dl_rate, NULL, NULL ); 799 522 break; 800 523 801 524 case PEER_COL_UPLOAD_RATE: 802 r = gtk_cell_renderer_text_new 803 c = gtk_tree_view_column_new_with_attributes 804 gtk_tree_view_column_set_cell_data_func 525 r = gtk_cell_renderer_text_new( ); 526 c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); 527 gtk_tree_view_column_set_cell_data_func( c, r, render_ul_rate, NULL, NULL ); 805 528 break; 806 529 807 530 case PEER_COL_STATUS: 808 531 r = gtk_cell_renderer_text_new( ); 809 c = gtk_tree_view_column_new_with_attributes 532 c = gtk_tree_view_column_new_with_attributes( t, r, "text", col, NULL ); 810 533 break; 811 534 812 535 default: 813 abort 536 abort( ); 814 537 } 815 538 816 gtk_tree_view_column_set_resizable 817 gtk_tree_view_column_set_sort_column_id 818 gtk_tree_view_append_column 539 gtk_tree_view_column_set_resizable( c, FALSE ); 540 gtk_tree_view_column_set_sort_column_id( c, col ); 541 gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c ); 819 542 } 820 543 … … 824 547 'expander column. */ 825 548 { 826 GtkTreeViewColumn *c = gtk_tree_view_column_new 827 gtk_tree_view_column_set_visible 828 gtk_tree_view_append_column 829 gtk_tree_view_set_expander_column 549 GtkTreeViewColumn *c = gtk_tree_view_column_new( ); 550 gtk_tree_view_column_set_visible( c, FALSE ); 551 gtk_tree_view_append_column( GTK_TREE_VIEW( v ), c ); 552 gtk_tree_view_set_expander_column( GTK_TREE_VIEW( v ), c ); 830 553 } 831 554 832 w = sw = gtk_scrolled_window_new 833 gtk_scrolled_window_set_policy 834 835 836 gtk_scrolled_window_set_shadow_type 837 838 gtk_container_add 839 840 841 vbox = gtk_vbox_new 842 gtk_container_set_border_width 555 w = sw = gtk_scrolled_window_new( NULL, NULL ); 556 gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( w ), 557 GTK_POLICY_AUTOMATIC, 558 GTK_POLICY_AUTOMATIC ); 559 gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( w ), 560 GTK_SHADOW_IN ); 561 gtk_container_add( GTK_CONTAINER( w ), v ); 562 563 564 vbox = gtk_vbox_new( FALSE, GUI_PAD ); 565 gtk_container_set_border_width( GTK_CONTAINER( vbox ), GUI_PAD_BIG ); 843 566 844 567 if( webtree == NULL ) … … 851 574 } 852 575 853 hbox = gtk_hbox_new ( FALSE, GUI_PAD ); 854 l = gtk_label_new ( NULL ); 855 gtk_label_set_markup ( GTK_LABEL( l ), _( "<b>Seeders:</b>" ) ); 856 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 857 l = p->seeders_lb = gtk_label_new ( NULL ); 858 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 859 gtk_box_pack_start( GTK_BOX( hbox ), 860 gtk_alignment_new ( 0.0f, 0.0f, 0.0f, 0.0f ), 861 TRUE, TRUE, 0 ); 862 l = gtk_label_new ( NULL ); 863 gtk_label_set_markup ( GTK_LABEL( l ), _( "<b>Leechers:</b>" ) ); 864 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 865 l = p->leechers_lb = gtk_label_new ( NULL ); 866 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 867 gtk_box_pack_start( GTK_BOX( hbox ), 868 gtk_alignment_new ( 0.0f, 0.0f, 0.0f, 0.0f ), 869 TRUE, TRUE, 0 ); 870 l = gtk_label_new ( NULL ); 871 gtk_label_set_markup ( GTK_LABEL( l ), _( "<b>Times Completed:</b>" ) ); 872 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 873 l = p->completed_lb = gtk_label_new ( NULL ); 874 gtk_box_pack_start ( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 875 gtk_box_pack_start ( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 ); 576 hbox = gtk_hbox_new( FALSE, GUI_PAD ); 577 l = gtk_label_new( NULL ); 578 gtk_label_set_markup( GTK_LABEL( l ), _( "<b>Seeders:</b>" ) ); 579 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 580 l = p->seeders_lb = gtk_label_new( NULL ); 581 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 582 gtk_box_pack_start( GTK_BOX( hbox ), gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f ), TRUE, TRUE, 0 ); 583 l = gtk_label_new( NULL ); 584 gtk_label_set_markup( GTK_LABEL( l ), _( "<b>Leechers:</b>" ) ); 585 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 586 l = p->leechers_lb = gtk_label_new( NULL ); 587 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 588 gtk_box_pack_start( GTK_BOX( hbox ), gtk_alignment_new( 0.0f, 0.0f, 0.0f, 0.0f ), TRUE, TRUE, 0 ); 589 l = gtk_label_new( NULL ); 590 gtk_label_set_markup( GTK_LABEL( l ), _( "<b>Times Completed:</b>" ) ); 591 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 592 l = p->completed_lb = gtk_label_new( NULL ); 593 gtk_box_pack_start( GTK_BOX( hbox ), l, FALSE, FALSE, 0 ); 594 gtk_box_pack_start( GTK_BOX( vbox ), hbox, FALSE, FALSE, 0 ); 876 595 877 596 ret = vbox; … … 879 598 p->model = m; 880 599 p->store = GTK_LIST_STORE( m ); 881 g_object_set_data_full 600 g_object_set_data_full( G_OBJECT( ret ), "peer-data", p, g_free ); 882 601 return ret; 883 602 } … … 907 626 { 908 627 int row = 0; 909 GtkWidget * t = hig_workarea_create 628 GtkWidget * t = hig_workarea_create( ); 910 629 GtkWidget * l, *w, *fr; 911 630 char * pch; … … 916 635 const tr_info * info = tr_torrentInfo( tor ); 917 636 918 hig_workarea_add_section_title 637 hig_workarea_add_section_title( t, &row, _( "Details" ) ); 919 638 920 639 g_snprintf( countStr, sizeof( countStr ), … … 928 647 countStr, sizeStr ); 929 648 930 l = gtk_label_new ( buf ); 931 hig_workarea_add_row ( t, &row, _( "Pieces:" ), l, NULL ); 932 933 l = 934 g_object_new( GTK_TYPE_LABEL, "label", info->hashString, 935 "selectable", 936 TRUE, 649 l = gtk_label_new( buf ); 650 hig_workarea_add_row( t, &row, _( "Pieces:" ), l, NULL ); 651 652 l = g_object_new( GTK_TYPE_LABEL, "label", info->hashString, 653 "selectable", TRUE, 937 654 "ellipsize", PANGO_ELLIPSIZE_END, 938 655 NULL ); 939 hig_workarea_add_row 656 hig_workarea_add_row( t, &row, _( "Hash:" ), l, NULL ); 940 657 941 658 pch = ( info->isPrivate ) 942 659 ? _( "Private to this tracker -- PEX disabled" ) 943 660 : _( "Public torrent" ); 944 l = gtk_label_new 945 hig_workarea_add_row 946 947 b = gtk_text_buffer_new 661 l = gtk_label_new( pch ); 662 hig_workarea_add_row( t, &row, _( "Privacy:" ), l, NULL ); 663 664 b = gtk_text_buffer_new( NULL ); 948 665 if( info->comment ) 949 gtk_text_buffer_set_text 950 w = gtk_text_view_new_with_buffer 951 gtk_widget_set_size_request 952 gtk_text_view_set_wrap_mode 953 gtk_text_view_set_editable 954 fr = gtk_frame_new 955 gtk_frame_set_shadow_type 956 gtk_container_add 957 w = hig_workarea_add_row 958 gtk_misc_set_alignment 959 960 hig_workarea_add_section_divider 961 hig_workarea_add_section_title 962 963 l = gtk_label_new 666 gtk_text_buffer_set_text( b, info->comment, -1 ); 667 w = gtk_text_view_new_with_buffer( b ); 668 gtk_widget_set_size_request( w, 0u, 100u ); 669 gtk_text_view_set_wrap_mode( GTK_TEXT_VIEW( w ), GTK_WRAP_WORD ); 670 gtk_text_view_set_editable( GTK_TEXT_VIEW( w ), FALSE ); 671 fr = gtk_frame_new( NULL ); 672 gtk_frame_set_shadow_type( GTK_FRAME( fr ), GTK_SHADOW_IN ); 673 gtk_container_add( GTK_CONTAINER( fr ), w ); 674 w = hig_workarea_add_row( t, &row, _( "Comment:" ), fr, NULL ); 675 gtk_misc_set_alignment( GTK_MISC( w ), 0.0f, 0.0f ); 676 677 hig_workarea_add_section_divider( t, &row ); 678 hig_workarea_add_section_title( t, &row, _( "Origins" ) ); 679 680 l = gtk_label_new( *info->creator ? info->creator : _( "Unknown" ) ); 964 681 gtk_label_set_ellipsize( GTK_LABEL( l ), PANGO_ELLIPSIZE_END ); 965 hig_workarea_add_row 682 hig_workarea_add_row( t, &row, _( "Creator:" ), l, NULL ); 966 683 967 684 l = gtk_label_new( NULL ); 968 685 refresh_time_lb( l, info->dateCreated ); 969 hig_workarea_add_row ( t, &row, _( "Date:" ), l, NULL ); 970 971 hig_workarea_add_section_divider ( t, &row ); 972 hig_workarea_add_section_title ( t, &row, _( "Location" ) ); 973 974 l = 975 g_object_new( GTK_TYPE_LABEL, "label", tr_torrentGetDownloadDir( 976 tor ), "selectable", TRUE, 977 "ellipsize", PANGO_ELLIPSIZE_END, NULL ); 978 hig_workarea_add_row ( t, &row, _( "Destination folder:" ), l, NULL ); 979 980 l = 981 g_object_new( GTK_TYPE_LABEL, "label", info->torrent, "selectable", 982 TRUE, 983 "ellipsize", PANGO_ELLIPSIZE_END, 984 NULL ); 985 hig_workarea_add_row ( t, &row, _( "Torrent file:" ), l, NULL ); 986 987 hig_workarea_finish ( t, &row ); 686 hig_workarea_add_row( t, &row, _( "Date:" ), l, NULL ); 687 688 hig_workarea_add_section_divider( t, &row ); 689 hig_workarea_add_section_title( t, &row, _( "Location" ) ); 690 691 l = g_object_new( GTK_TYPE_LABEL, "label", tr_torrentGetDownloadDir( tor ), 692 "selectable", TRUE, 693 "ellipsize", PANGO_ELLIPSIZE_END, 694 NULL ); 695 hig_workarea_add_row( t, &row, _( "Destination folder:" ), l, NULL ); 696 697 l = g_object_new( GTK_TYPE_LABEL, "label", info->torrent, 698 "selectable", TRUE, 699 "ellipsize", PANGO_ELLIPSIZE_END, 700 NULL ); 701 hig_workarea_add_row( t, &row, _( "Torrent file:" ), l, NULL ); 702 703 hig_workarea_finish( t, &row ); 988 704 return t; 989 705 } … … 995 711 typedef struct 996 712 { 997 GtkWidget * 998 GtkWidget * 999 GtkWidget * 1000 GtkWidget * 1001 GtkWidget * 1002 GtkWidget * 1003 GtkWidget * 1004 GtkWidget * 1005 GtkWidget * 1006 GtkWidget * 1007 GtkWidget * 1008 GtkWidget * 1009 TrTorrent * 713 GtkWidget * state_lb; 714 GtkWidget * progress_lb; 715 GtkWidget * have_lb; 716 GtkWidget * dl_lb; 717 GtkWidget * ul_lb; 718 GtkWidget * failed_lb; 719 GtkWidget * ratio_lb; 720 GtkWidget * err_lb; 721 GtkWidget * swarm_lb; 722 GtkWidget * date_added_lb; 723 GtkWidget * last_activity_lb; 724 GtkWidget * availability_da; 725 TrTorrent * gtor; 1010 726 } 1011 727 Activity; … … 1018 734 char buf1[128]; 1019 735 char buf2[128]; 1020 Activity * a = g_object_get_data 736 Activity * a = g_object_get_data( G_OBJECT( top ), "activity-data" ); 1021 737 const tr_stat * stat = tr_torrent_stat( a->gtor ); 1022 738 const tr_info * info = tr_torrent_info( a->gtor ); … … 1026 742 1027 743 pch = tr_torrent_status_str( a->gtor ); 1028 gtk_label_set_text 1029 g_free 744 gtk_label_set_text( GTK_LABEL( a->state_lb ), pch ); 745 g_free( pch ); 1030 746 1031 747 if( (int)complete == (int)done ) … … 1036 752 pch = g_strdup_printf( _( "%1$.1f%% (%2$.1f%% selected)" ), 1037 753 complete, done ); 1038 gtk_label_set_text 1039 g_free 754 gtk_label_set_text( GTK_LABEL( a->progress_lb ), pch ); 755 g_free( pch ); 1040 756 1041 757 i = (int) ceil( verifiedPieceCount ); … … 1045 761 * %2$s is how much of it's passed the checksum test 1046 762 * %3$s is how many pieces are verified */ 1047 pch = g_strdup_printf( ngettext( "%1$s (%2$s verified in %3$d piece)", 1048 "%1$s (%2$s verified in %3$d pieces)", i ), 1049 buf1, buf2, i ); 763 if( !i ) 764 pch = tr_strdup( buf1 ); 765 else 766 pch = g_strdup_printf( ngettext( "%1$s (%2$s verified in %3$d piece)", 767 "%1$s (%2$s verified in %3$d pieces)", i ), 768 buf1, buf2, i ); 1050 769 gtk_label_set_text( GTK_LABEL( a->have_lb ), pch ); 1051 770 g_free( pch ); … … 1064 783 1065 784 tr_strlspeed( buf1, stat->swarmSpeed, sizeof( buf1 ) ); 1066 gtk_label_set_text 1067 1068 gtk_label_set_text 785 gtk_label_set_text( GTK_LABEL( a->swarm_lb ), buf1 ); 786 787 gtk_label_set_text( GTK_LABEL( a->err_lb ), 1069 788 *stat->errorString ? stat->errorString : _( "None" ) ); 1070 789 … … 1072 791 1073 792 refresh_time_lb( a->last_activity_lb, stat->activityDate ); 1074 1075 #ifdef SHOW_PIECES1076 if( GDK_IS_DRAWABLE ( a->availability_da->window ) )1077 refresh_pieces ( a->availability_da, NULL, a->gtor );1078 #endif1079 793 } 1080 794 … … 1082 796 activity_page_new( TrTorrent * gtor ) 1083 797 { 1084 Activity * a = g_new 798 Activity * a = g_new( Activity, 1 ); 1085 799 int row = 0; 1086 GtkWidget *t = hig_workarea_create 800 GtkWidget *t = hig_workarea_create( ); 1087 801 GtkWidget *l; 1088 802 1089 803 a->gtor = gtor; 1090 804 1091 hig_workarea_add_section_title 1092 1093 l = a->state_lb = gtk_label_new 1094 hig_workarea_add_row 1095 1096 l = a->progress_lb = gtk_label_new 1097 hig_workarea_add_row 1098 1099 l = a->have_lb = gtk_label_new 805 hig_workarea_add_section_title( t, &row, _( "Transfer" ) ); 806 807 l = a->state_lb = gtk_label_new( NULL ); 808 hig_workarea_add_row( t, &row, _( "State:" ), l, NULL ); 809 810 l = a->progress_lb = gtk_label_new( NULL ); 811 hig_workarea_add_row( t, &row, _( "Progress:" ), l, NULL ); 812 813 l = a->have_lb = gtk_label_new( NULL ); 1100 814 /* "Have" refers to how much of the torrent we have */ 1101 hig_workarea_add_row 1102 1103 l = a->dl_lb = gtk_label_new 1104 hig_workarea_add_row 1105 1106 l = a->ul_lb = gtk_label_new 1107 hig_workarea_add_row 815 hig_workarea_add_row( t, &row, _( "Have:" ), l, NULL ); 816 817 l = a->dl_lb = gtk_label_new( NULL ); 818 hig_workarea_add_row( t, &row, _( "Downloaded:" ), l, NULL ); 819 820 l = a->ul_lb = gtk_label_new( NULL ); 821 hig_workarea_add_row( t, &row, _( "Uploaded:" ), l, NULL ); 1108 822 1109 823 /* how much downloaded data was corrupt */ 1110 l = a->failed_lb = gtk_label_new ( NULL ); 1111 hig_workarea_add_row ( t, &row, _( "Failed DL:" ), l, NULL ); 1112 1113 l = a->ratio_lb = gtk_label_new ( NULL ); 1114 hig_workarea_add_row ( t, &row, _( "Ratio:" ), l, NULL ); 1115 1116 l = a->swarm_lb = gtk_label_new ( NULL ); 1117 hig_workarea_add_row ( t, &row, _( "Swarm rate:" ), l, NULL ); 1118 1119 l = a->err_lb = gtk_label_new ( NULL ); 1120 hig_workarea_add_row ( t, &row, _( "Error:" ), l, NULL ); 1121 1122 #ifdef SHOW_PIECES 1123 hig_workarea_add_section_divider ( t, &row ); 1124 hig_workarea_add_section_title ( t, &row, _( "Completion" ) ); 1125 1126 w = a->availability_da = gtk_drawing_area_new ( ); 1127 gtk_widget_set_size_request ( w, 0u, 100u ); 1128 g_object_set_data ( G_OBJECT( w ), "draw-mode", 1129 GINT_TO_POINTER( DRAW_PROG ) ); 1130 g_signal_connect ( w, "expose-event", G_CALLBACK( 1131 refresh_pieces ), gtor ); 1132 hig_workarea_add_wide_control( t, &row, w ); 1133 #endif 1134 1135 hig_workarea_add_section_divider ( t, &row ); 1136 hig_workarea_add_section_title ( t, &row, _( "Dates" ) ); 1137 1138 l = a->date_added_lb = gtk_label_new ( NULL ); 1139 hig_workarea_add_row ( t, &row, _( "Started at:" ), l, NULL ); 1140 1141 l = a->last_activity_lb = gtk_label_new ( NULL ); 1142 hig_workarea_add_row ( t, &row, _( "Last activity at:" ), l, NULL ); 1143 1144 hig_workarea_add_section_divider ( t, &row ); 1145 hig_workarea_finish ( t, &row ); 1146 g_object_set_data_full ( G_OBJECT( t ), "activity-data", a, g_free ); 824 l = a->failed_lb = gtk_label_new( NULL ); 825 hig_workarea_add_row( t, &row, _( "Failed DL:" ), l, NULL ); 826 827 l = a->ratio_lb = gtk_label_new( NULL ); 828 hig_workarea_add_row( t, &row, _( "Ratio:" ), l, NULL ); 829 830 l = a->swarm_lb = gtk_label_new( NULL ); 831 hig_workarea_add_row( t, &row, _( "Swarm rate:" ), l, NULL ); 832 833 l = a->err_lb = gtk_label_new( NULL ); 834 hig_workarea_add_row( t, &row, _( "Error:" ), l, NULL ); 835 836 hig_workarea_add_section_divider( t, &row ); 837 hig_workarea_add_section_title( t, &row, _( "Dates" ) ); 838 839 l = a->date_added_lb = gtk_label_new( NULL ); 840 hig_workarea_add_row( t, &row, _( "Started at:" ), l, NULL ); 841 842 l = a->last_activity_lb = gtk_label_new( NULL ); 843 hig_workarea_add_row( t, &row, _( "Last activity at:" ), l, NULL ); 844 845 hig_workarea_add_section_divider( t, &row ); 846 hig_workarea_finish( t, &row ); 847 g_object_set_data_full( G_OBJECT( t ), "activity-data", a, g_free ); 1147 848 return t; 1148 849 } … … 1156 857 gpointer gtor ) 1157 858 { 1158 tr_torrent * tor = tr_torrent_handle 859 tr_torrent * tor = tr_torrent_handle( gtor ); 1159 860 const gboolean b = gtk_toggle_button_get_active( tb ); 1160 861 … … 1166 867 gpointer gtor ) 1167 868 { 1168 tr_torrent * tor = tr_torrent_handle 869 tr_torrent * tor = tr_torrent_handle( gtor ); 1169 870 const gboolean b = gtk_toggle_button_get_active( tb ); 1170 871 … … 1175 876 global_speed_toggled_cb( GtkToggleButton * tb, gpointer gtor ) 1176 877 { 1177 tr_torrent * tor = tr_torrent_handle 878 tr_torrent * tor = tr_torrent_handle( gtor ); 1178 879 const gboolean b = gtk_toggle_button_get_active( tb ); 1179 880 … … 1198 899 sensitize_from_check_cb( GtkToggleButton * toggle, gpointer w ) 1199 900 { 1200 gtk_widget_set_sensitive 1201 901 gtk_widget_set_sensitive( GTK_WIDGET( w ), 902 gtk_toggle_button_get_active( toggle ) ); 1202 903 } 1203 904 … … 1205 906 setSpeedLimit( GtkSpinButton* spin, gpointer gtor, int up_or_down ) 1206 907 { 1207 tr_torrent * tor = tr_torrent_handle 1208 const int kb_sec = gtk_spin_button_get_value_as_int 908 tr_torrent * tor = tr_torrent_handle( gtor ); 909 const int kb_sec = gtk_spin_button_get_value_as_int( spin ); 1209 910 1210 911 tr_torrentSetSpeedLimit( tor, up_or_down, kb_sec ); … … 1226 927 ratio_spun_cb( GtkSpinButton * spin, gpointer gtor ) 1227 928 { 1228 tr_torrent * tor = tr_torrent_handle 1229 float ratio = gtk_spin_button_get_value 929 tr_torrent * tor = tr_torrent_handle( gtor ); 930 float ratio = gtk_spin_button_get_value( spin ); 1230 931 1231 932 tr_torrentSetRatioLimit( tor, ratio ); … … 1267 968 1268 969 static GtkWidget* 1269 options_page_new( ResponseData * data )970 options_page_new( struct ResponseData * data ) 1270 971 { 1271 972 uint16_t maxConnectedPeers; … … 1279 980 TrCore * core = data->core; 1280 981 TrTorrent * gtor = data->gtor; 1281 tr_torrent * tor = tr_torrent_handle 982 tr_torrent * tor = tr_torrent_handle( gtor ); 1282 983 1283 984 row = 0; 1284 t = hig_workarea_create 1285 hig_workarea_add_section_title 985 t = hig_workarea_create( ); 986 hig_workarea_add_section_title( t, &row, _( "Speed Limits" ) ); 1286 987 1287 988 b = tr_torrentIsUsingGlobalSpeedLimit( tor, TR_UP ); … … 1289 990 g_signal_connect( tb, "toggled", G_CALLBACK( global_speed_toggled_cb ), gtor ); 1290 991 1291 tb = gtk_check_button_new_with_mnemonic 992 tb = gtk_check_button_new_with_mnemonic( _( "Limit _download speed (KB/s):" ) ); 1292 993 b = tr_torrentIsUsingSpeedLimit( tor, TR_DOWN ); 1293 gtk_toggle_button_set_active 1294 g_signal_connect 994 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( tb ), b ); 995 g_signal_connect( tb, "toggled", G_CALLBACK( down_speed_toggled_cb ), gtor ); 1295 996 1296 997 i = tr_torrentGetSpeedLimit( tor, TR_DOWN ); 1297 998 w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 ); 1298 999 gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i ); 1299 g_signal_connect 1300 g_signal_connect 1301 sensitize_from_check_cb 1302 hig_workarea_add_row_w 1303 1304 tb = gtk_check_button_new_with_mnemonic 1000 g_signal_connect( w, "value-changed", G_CALLBACK( down_speed_spun_cb ), gtor ); 1001 g_signal_connect( tb, "toggled", G_CALLBACK( sensitize_from_check_cb ), w ); 1002 sensitize_from_check_cb( GTK_TOGGLE_BUTTON( tb ), w ); 1003 hig_workarea_add_row_w( t, &row, tb, w, NULL ); 1004 1005 tb = gtk_check_button_new_with_mnemonic( _( "Limit _upload speed (KB/s):" ) ); 1305 1006 b = tr_torrentIsUsingSpeedLimit( tor, TR_UP ); 1306 gtk_toggle_button_set_active 1307 g_signal_connect 1007 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( tb ), b ); 1008 g_signal_connect( tb, "toggled", G_CALLBACK( up_speed_toggled_cb ), gtor ); 1308 1009 1309 1010 i = tr_torrentGetSpeedLimit( tor, TR_UP ); 1310 1011 w = gtk_spin_button_new_with_range( 1, INT_MAX, 5 ); 1311 1012 gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), i ); 1312 g_signal_connect 1313 g_signal_connect 1314 sensitize_from_check_cb 1315 hig_workarea_add_row_w 1316 1317 hig_workarea_add_section_divider 1318 hig_workarea_add_section_title 1013 g_signal_connect( w, "value-changed", G_CALLBACK( up_speed_spun_cb ), gtor ); 1014 g_signal_connect( tb, "toggled", G_CALLBACK( sensitize_from_check_cb ), w ); 1015 sensitize_from_check_cb( GTK_TOGGLE_BUTTON( tb ), w ); 1016 hig_workarea_add_row_w( t, &row, tb, w, NULL ); 1017 1018 hig_workarea_add_section_divider( t, &row ); 1019 hig_workarea_add_section_title( t, &row, _( "Seed-Until Ratio" ) ); 1319 1020 1320 1021 group = NULL; … … 1324 1025 data->handler = g_signal_connect( core, "prefs-changed", G_CALLBACK( prefsChanged ), w ); 1325 1026 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) ); 1326 gtk_toggle_button_set_active 1027 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), mode == TR_RATIOLIMIT_GLOBAL); 1327 1028 hig_workarea_add_wide_control( t, &row, w ); 1328 1029 g_free( s ); … … 1332 1033 w = gtk_radio_button_new_with_mnemonic( group, _( "Seed _regardless of ratio" ) ); 1333 1034 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) ); 1334 gtk_toggle_button_set_active 1035 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), mode == TR_RATIOLIMIT_UNLIMITED); 1335 1036 hig_workarea_add_wide_control( t, &row, w ); 1336 1037 g_object_set_data( G_OBJECT( w ), RATIO_MODE_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_UNLIMITED ) ); 1337 1038 g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), gtor ); 1338 1039 1339 h = gtk_hbox_new 1040 h = gtk_hbox_new( FALSE, GUI_PAD ); 1340 1041 w = gtk_radio_button_new_with_mnemonic( group, _( "_Stop seeding when a torrent's ratio reaches" ) ); 1341 1042 g_object_set_data( G_OBJECT( w ), RATIO_MODE_KEY, GINT_TO_POINTER( TR_RATIOLIMIT_SINGLE ) ); 1342 gtk_toggle_button_set_active 1043 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON( w ), mode == TR_RATIOLIMIT_SINGLE); 1343 1044 g_signal_connect( w, "toggled", G_CALLBACK( ratio_mode_changed_cb ), gtor ); 1344 1045 group = gtk_radio_button_get_group( GTK_RADIO_BUTTON( w ) ); 1345 gtk_box_pack_start 1046 gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 ); 1346 1047 d = tr_torrentGetRatioLimit( tor ); 1347 1048 w = gtk_spin_button_new_with_range( 0.5, INT_MAX, .05 ); 1348 1049 gtk_spin_button_set_digits( GTK_SPIN_BUTTON( w ), 2 ); 1349 1050 gtk_spin_button_set_value( GTK_SPIN_BUTTON( w ), d ); 1350 g_signal_connect 1351 gtk_box_pack_start 1051 g_signal_connect( w, "value-changed", G_CALLBACK( ratio_spun_cb ), gtor ); 1052 gtk_box_pack_start( GTK_BOX( h ), w, FALSE, FALSE, 0 ); 1352 1053 hig_workarea_add_wide_control( t, &row, h ); 1353 1054 1354 hig_workarea_add_section_divider 1355 hig_workarea_add_section_title 1055 hig_workarea_add_section_divider( t, &row ); 1056 hig_workarea_add_section_title( t, &row, _( "Peer Connections" ) ); 1356 1057 1357 1058 maxConnectedPeers = tr_torrentGetPeerLimit( tor ); … … 1362 1063 max_peers_spun_cb ), gtor ); 1363 1064 1364 hig_workarea_finish 1065 hig_workarea_finish( t, &row ); 1365 1066 return t; 1366 1067 } 1367 1368 static void1369 refresh_options( GtkWidget * top UNUSED )1370 {}1371 1068 1372 1069 /**** … … 1408 1105 const char * s; 1409 1106 struct tracker_page * page = g_new0( struct tracker_page, 1 ); 1410 const tr_info * info = tr_torrent_info 1107 const tr_info * info = tr_torrent_info( gtor ); 1411 1108 1412 1109 page->gtor = gtor; … … 1441 1138 l = gtk_label_new( info->trackers[0].announce ); 1442 1139 gtk_label_set_ellipsize( GTK_LABEL( l ), PANGO_ELLIPSIZE_END ); 1443 hig_workarea_add_row 1140 hig_workarea_add_row( t, &row, _( "Tracker:" ), l, NULL ); 1444 1141 1445 1142 s = _( "Last announce at:" ); … … 1482 1179 else if( t < now ) 1483 1180 gtk_label_set_text( l, countdown_done ); 1484 else 1485 { 1486 char buf[1024]; 1181 else { 1182 char buf[512]; 1487 1183 const int seconds = t - now; 1488 1184 tr_strltime( buf, seconds, sizeof( buf ) ); … … 1532 1228 1533 1229 static void 1534 torrent_destroyed( gpointer dialog, 1535 GObject * dead_torrent UNUSED ) 1536 { 1537 gtk_widget_destroy ( GTK_WIDGET( dialog ) ); 1230 torrent_destroyed( gpointer dialog, GObject * dead_torrent UNUSED ) 1231 { 1232 gtk_widget_destroy( GTK_WIDGET( dialog ) ); 1538 1233 } 1539 1234 … … 1541 1236 remove_tag( gpointer tag ) 1542 1237 { 1543 g_source_remove 1238 g_source_remove( GPOINTER_TO_UINT( tag ) ); /* stop the periodic refresh */ 1544 1239 } 1545 1240 … … 1549 1244 gpointer data ) 1550 1245 { 1551 ResponseData *rd = data;1246 struct ResponseData *rd = data; 1552 1247 TrCore * core = rd->core; 1553 1248 gulong handler = rd-> handler; 1554 1249 1555 1250 g_signal_handler_disconnect( core, handler ); 1556 g_object_weak_unref 1557 gtk_widget_destroy 1558 1559 g_free 1251 g_object_weak_unref( G_OBJECT( rd->gtor ), torrent_destroyed, dialog ); 1252 gtk_widget_destroy( GTK_WIDGET( dialog ) ); 1253 1254 g_free( rd ); 1560 1255 } 1561 1256 … … 1563 1258 periodic_refresh( gpointer data ) 1564 1259 { 1565 refresh_tracker ( g_object_get_data ( G_OBJECT( data ), "tracker-top" ) ); 1566 refresh_peers ( g_object_get_data ( G_OBJECT( data ), "peers-top" ) ); 1567 refresh_activity ( g_object_get_data ( G_OBJECT( data ), 1568 "activity-top" ) ); 1569 refresh_options ( g_object_get_data ( G_OBJECT( data ), "options-top" ) ); 1260 refresh_tracker ( g_object_get_data( G_OBJECT( data ), "tracker-top" ) ); 1261 refresh_peers ( g_object_get_data( G_OBJECT( data ), "peers-top" ) ); 1262 refresh_activity ( g_object_get_data( G_OBJECT( data ), "activity-top" ) ); 1570 1263 return TRUE; 1571 1264 } … … 1577 1270 { 1578 1271 guint tag; 1579 GtkWidget * d, *n, *w; 1580 tr_torrent * tor = tr_torrent_handle ( gtor ); 1272 GtkWidget * d, *n, *w, *lb; 1581 1273 char title[512]; 1582 const tr_info * info = tr_torrent_info ( gtor ); 1583 ResponseData * rd; 1274 struct ResponseData * rd; 1275 tr_torrent * tor = tr_torrent_handle( gtor ); 1276 const tr_info * info = tr_torrent_info( gtor ); 1584 1277 1585 1278 /* create the dialog */ 1586 rd = g_new0( ResponseData, 1);1279 rd = g_new0(struct ResponseData, 1); 1587 1280 rd->gtor = gtor; 1588 1281 rd->core = core; 1589 1282 g_snprintf( title, sizeof( title ), _( "%s Properties" ), info->name ); 1590 d = gtk_dialog_new_with_buttons 1591 1592 1593 gtk_window_set_role 1594 g_signal_connect ( d, "response", G_CALLBACK( response_cb ), rd );1283 d = gtk_dialog_new_with_buttons( title, parent, 0, 1284 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, 1285 NULL ); 1286 gtk_window_set_role( GTK_WINDOW( d ), "tr-info" ); 1287 g_signal_connect( d, "response", G_CALLBACK( response_cb ), rd ); 1595 1288 gtk_dialog_set_has_separator( GTK_DIALOG( d ), FALSE ); 1596 1289 gtk_container_set_border_width( GTK_CONTAINER( d ), GUI_PAD ); 1597 g_object_weak_ref 1290 g_object_weak_ref( G_OBJECT( gtor ), torrent_destroyed, d ); 1598 1291 1599 1292 1600 1293 /* add the notebook */ 1601 n = gtk_notebook_new 1602 gtk_container_set_border_width ( GTK_CONTAINER( n ), GUI_PAD );1603 1604 w = activity_page_new 1605 g_object_set_data ( G_OBJECT( d ), "activity-top", w);1606 gtk_notebook_append_page ( GTK_NOTEBOOK( n ), w,1607 gtk_label_new ( _( "Activity" ) ));1608 1609 w = peer_page_new 1610 g_object_set_data ( G_OBJECT( d ), "peers-top", w);1611 gtk_notebook_append_page ( GTK_NOTEBOOK( n ), w,1612 gtk_label_new ( _( "Peers" ) ));1294 n = gtk_notebook_new( ); 1295 gtk_container_set_border_width( GTK_CONTAINER( n ), GUI_PAD ); 1296 1297 w = activity_page_new( gtor ); 1298 lb = gtk_label_new( _( "Activity" ) ); 1299 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1300 g_object_set_data( G_OBJECT( d ), "activity-top", w ); 1301 1302 w = peer_page_new( gtor ); 1303 lb = gtk_label_new( _( "Peers" ) ); 1304 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1305 g_object_set_data( G_OBJECT( d ), "peers-top", w ); 1613 1306 1614 1307 w = tracker_page_new( gtor ); 1308 lb = gtk_label_new( _( "Tracker" ) ); 1309 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1615 1310 g_object_set_data( G_OBJECT( d ), "tracker-top", w ); 1616 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, 1617 gtk_label_new( _( "Tracker" ) ) ); 1618 1619 gtk_notebook_append_page ( GTK_NOTEBOOK( n ), 1620 info_page_new ( tor ), 1621 gtk_label_new ( _( "Information" ) ) ); 1311 1312 w = info_page_new( tor ); 1313 lb = gtk_label_new( _( "Information" ) ); 1314 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1622 1315 1623 1316 w = file_list_new( gtor ); 1624 1317 gtk_container_set_border_width( GTK_CONTAINER( w ), GUI_PAD_BIG ); 1625 g_object_set_data ( G_OBJECT( d ), "files-top", w ); 1626 gtk_notebook_append_page ( GTK_NOTEBOOK( n ), w, 1627 gtk_label_new ( _( "Files" ) ) ); 1628 1629 w = options_page_new ( rd ); 1630 g_object_set_data ( G_OBJECT( d ), "options-top", w ); 1631 gtk_notebook_append_page ( GTK_NOTEBOOK( n ), w, 1632 gtk_label_new ( _( "Options" ) ) ); 1318 lb = gtk_label_new( _( "Files" ) ); 1319 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1320 g_object_set_data( G_OBJECT( d ), "files-top", w ); 1321 1322 w = options_page_new( rd ); 1323 lb = gtk_label_new( _( "Options" ) ); 1324 gtk_notebook_append_page( GTK_NOTEBOOK( n ), w, lb ); 1633 1325 1634 1326 gtk_box_pack_start( GTK_BOX( GTK_DIALOG( d )->vbox ), n, TRUE, TRUE, 0 ); 1635 1327 1636 1328 tag = gtr_timeout_add_seconds( UPDATE_INTERVAL_SECONDS, periodic_refresh, d ); 1637 g_object_set_data_full ( G_OBJECT( d ), "tag", 1638 GUINT_TO_POINTER( tag ), remove_tag ); 1639 1640 /* return the results */ 1641 periodic_refresh ( d ); 1642 gtk_widget_show_all ( GTK_DIALOG( d )->vbox ); 1329 g_object_set_data_full( G_OBJECT( d ), "tag", GUINT_TO_POINTER( tag ), remove_tag ); 1330 periodic_refresh( d ); 1331 gtk_widget_show_all( GTK_DIALOG( d )->vbox ); 1643 1332 return d; 1644 1333 } -
trunk/gtk/hig.c
r7658 r8034 113 113 GtkWidget * w = rowNew( l ); 114 114 115 gtk_table_attach( GTK_TABLE( 116 t ), w, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 117 0 ); 115 gtk_table_attach( GTK_TABLE( t ), w, 0, 1, row, row + 1, GTK_FILL, GTK_FILL, 0, 0 ); 118 116 } 119 117 -
trunk/gtk/main.c
r8026 r8034 36 36 #include <glib/gstdio.h> 37 37 38 #include <gdk/gdk.h>39 #ifdef GDK_WINDOWING_X1140 #include <X11/Xatom.h>41 #include <gdk/gdkx.h>42 #endif43 44 38 #include <libtransmission/transmission.h> 45 39 #include <libtransmission/rpcimpl.h> … … 66 60 #include "ui.h" 67 61 68 #include <libtransmission/transmission.h>69 #include <libtransmission/version.h>70 71 62 #define MY_NAME "transmission" 72 63 73 /* interval in milliseconds to update the torrent list display */ 74 #define UPDATE_INTERVAL 1666 75 76 /* interval in milliseconds to check for stopped torrents and update display */ 77 #define EXIT_CHECK_INTERVAL 500 64 #define REFRESH_INTERVAL_SECONDS 2 78 65 79 66 #if GTK_CHECK_VERSION( 2, 8, 0 ) … … 353 340 gboolean startpaused = FALSE; 354 341 gboolean startminimized = FALSE; 355 c har *domain = MY_NAME;342 const char * domain = MY_NAME; 356 343 char * configDir = NULL; 357 344 tr_lockfile_state_t tr_state; … … 389 376 gerr = NULL; 390 377 if( !gtk_init_with_args( &argc, &argv, _( "[torrent files]" ), entries, 391 domain, &gerr ) )378 (char*)domain, &gerr ) ) 392 379 { 393 380 fprintf( stderr, "%s\n", gerr->message ); … … 613 600 614 601 /* start model update timer */ 615 cbdata->timer = g _timeout_add( UPDATE_INTERVAL, updatemodel, cbdata );602 cbdata->timer = gtr_timeout_add_seconds( REFRESH_INTERVAL_SECONDS, updatemodel, cbdata ); 616 603 updatemodel( cbdata ); 617 604 … … 901 888 { 902 889 GtkTargetEntry targets[] = { 903 { "STRING", 0, 0 },904 { "text/plain", 0, 0 },905 { "text/uri-list", 0, 0 },890 { (char*)"STRING", 0, 0 }, 891 { (char*)"text/plain", 0, 0 }, 892 { (char*)"text/uri-list", 0, 0 }, 906 893 }; 907 894 -
trunk/gtk/util.c
r8021 r8034 558 558 if( !opened ) 559 559 { 560 char * argv[] = { "xdg-open", (char*)path, NULL };560 char * argv[] = { (char*)"xdg-open", (char*)path, NULL }; 561 561 g_spawn_async( NULL, argv, NULL, G_SPAWN_SEARCH_PATH, 562 562 NULL, NULL, NULL, NULL ); … … 645 645 646 646 guint 647 gtr_timeout_add_seconds( guint interval, 648 GSourceFunc function, 649 gpointer data ) 647 gtr_timeout_add_seconds( guint seconds, GSourceFunc function, gpointer data ) 650 648 { 651 649 #if GLIB_CHECK_VERSION( 2,14,0 ) 652 return g_timeout_add_seconds( interval, function, data );650 return g_timeout_add_seconds( seconds, function, data ); 653 651 #else 654 return g_timeout_add( interval*1000, function, data );655 #endif 656 } 652 return g_timeout_add( seconds*1000, function, data ); 653 #endif 654 }
Note: See TracChangeset
for help on using the changeset viewer.