From a49511bc49c0d7f1cc5a46b570e471de07aca4f5 Mon Sep 17 00:00:00 2001 From: Charles Kerr Date: Wed, 3 Dec 2008 05:15:17 +0000 Subject: [PATCH] (gtk) #1300: "pause all" button in the right-click menu of the system tray icon --- gtk/actions.c | 82 ++++++++++++--------------------------- gtk/main.c | 104 +++++++++++++++++++++++++++++--------------------- gtk/ui.h | 2 + 3 files changed, 88 insertions(+), 100 deletions(-) diff --git a/gtk/actions.c b/gtk/actions.c index 4f72513f5..ddf16f9e7 100644 --- a/gtk/actions.c +++ b/gtk/actions.c @@ -108,63 +108,31 @@ static GtkToggleActionEntry pref_toggle_entries[] = static GtkActionEntry entries[] = { - { "torrent-menu", NULL, N_( - "_Torrent" ), - NULL, NULL, NULL }, - { "view-menu", NULL, N_( "_View" ), - NULL, NULL, NULL }, - { "sort-menu", NULL, N_( - "_Sort Torrents By" ), NULL, NULL, - NULL }, - { "edit-menu", NULL, N_( "_Edit" ), - NULL, NULL, NULL }, - { "help-menu", NULL, N_( "_Help" ), - NULL, NULL, NULL }, - { "add-torrent-toolbar", GTK_STOCK_ADD, NULL, - NULL, N_( "Add a torrent" ), G_CALLBACK( action_cb ) }, - { "add-torrent-menu", GTK_STOCK_ADD, N_( "_Add..." ), - "D", N_( "Add a torrent" ), G_CALLBACK( action_cb ) }, - { "start-torrent", GTK_STOCK_MEDIA_PLAY, - N_( "_Start" ), "S", N_( "Start torrent" ), G_CALLBACK( - action_cb ) }, - { "show-stats", NULL, N_( "_Statistics" ), - NULL, NULL, G_CALLBACK( action_cb ) }, - { "verify-torrent", NULL, - N_( "_Verify Local Data" ), NULL, NULL, G_CALLBACK( action_cb ) }, - { "pause-torrent", GTK_STOCK_MEDIA_PAUSE, - N_( "_Pause" ), "P", N_( "Pause torrent" ), G_CALLBACK( - action_cb ) }, - { "remove-torrent", GTK_STOCK_REMOVE, NULL, - "Delete", N_( "Remove torrent" ), G_CALLBACK( action_cb ) }, - { "delete-torrent", GTK_STOCK_DELETE, N_( - "_Delete Files and Remove" ), "Delete", NULL, - G_CALLBACK( action_cb ) }, - { "new-torrent", GTK_STOCK_NEW, N_( "_New..." ), - NULL, - N_( "Create a torrent" ), - G_CALLBACK( action_cb ) }, - { "quit", GTK_STOCK_QUIT, N_( "_Quit" ), - NULL, NULL, G_CALLBACK( action_cb ) }, - { "select-all", GTK_STOCK_SELECT_ALL, - N_( "Select _All" ), "A", NULL, G_CALLBACK( action_cb ) }, - { "deselect-all", NULL, - N_( "Dese_lect All" ), "A", NULL, G_CALLBACK( - action_cb ) }, - { "edit-preferences", GTK_STOCK_PREFERENCES, NULL, - NULL, NULL, G_CALLBACK( action_cb ) }, - { "show-torrent-properties", GTK_STOCK_PROPERTIES, - NULL, "Return", N_( "Torrent properties" ), G_CALLBACK( action_cb ) }, - { "open-torrent-folder", GTK_STOCK_OPEN, - N_( "_Open Folder" ), NULL, NULL, G_CALLBACK( action_cb ) }, - { "show-about-dialog", GTK_STOCK_ABOUT, NULL, - NULL, NULL, G_CALLBACK( action_cb ) }, - { "help", GTK_STOCK_HELP, N_( "_Contents" ), - "F1", NULL, G_CALLBACK( action_cb ) }, - { "update-tracker", GTK_STOCK_NETWORK, - N_( "Ask Tracker for _More Peers" ), NULL, NULL, G_CALLBACK( - action_cb ) }, - { "present-main-window", NULL, NULL, - NULL, NULL, G_CALLBACK( action_cb ) }, + { "torrent-menu", NULL, N_( "_Torrent" ), NULL, NULL, NULL }, + { "view-menu", NULL, N_( "_View" ), NULL, NULL, NULL }, + { "sort-menu", NULL, N_( "_Sort Torrents By" ), NULL, NULL, NULL }, + { "edit-menu", NULL, N_( "_Edit" ), NULL, NULL, NULL }, + { "help-menu", NULL, N_( "_Help" ), NULL, NULL, NULL }, + { "add-torrent-toolbar", GTK_STOCK_ADD, NULL, NULL, N_( "Add a torrent" ), G_CALLBACK( action_cb ) }, + { "add-torrent-menu", GTK_STOCK_ADD, N_( "_Add..." ), "D", N_( "Add a torrent" ), G_CALLBACK( action_cb ) }, + { "start-torrent", GTK_STOCK_MEDIA_PLAY, N_( "_Start" ), "S", N_( "Start torrent" ), G_CALLBACK( action_cb ) }, + { "show-stats", NULL, N_( "_Statistics" ), NULL, NULL, G_CALLBACK( action_cb ) }, + { "verify-torrent", NULL, N_( "_Verify Local Data" ), NULL, NULL, G_CALLBACK( action_cb ) }, + { "pause-torrent", GTK_STOCK_MEDIA_PAUSE, N_( "_Pause" ), "P", N_( "Pause torrent" ), G_CALLBACK( action_cb ) }, + { "pause-all-torrents", GTK_STOCK_MEDIA_PAUSE, N_( "_Pause All" ), NULL, N_( "Pause all torrents" ), G_CALLBACK( action_cb ) }, + { "remove-torrent", GTK_STOCK_REMOVE, NULL, "Delete", N_( "Remove torrent" ), G_CALLBACK( action_cb ) }, + { "delete-torrent", GTK_STOCK_DELETE, N_( "_Delete Files and Remove" ), "Delete", NULL, G_CALLBACK( action_cb ) }, + { "new-torrent", GTK_STOCK_NEW, N_( "_New..." ), NULL, N_( "Create a torrent" ), G_CALLBACK( action_cb ) }, + { "quit", GTK_STOCK_QUIT, N_( "_Quit" ), NULL, NULL, G_CALLBACK( action_cb ) }, + { "select-all", GTK_STOCK_SELECT_ALL, N_( "Select _All" ), "A", NULL, G_CALLBACK( action_cb ) }, + { "deselect-all", NULL, N_( "Dese_lect All" ), "A", NULL, G_CALLBACK( action_cb ) }, + { "edit-preferences", GTK_STOCK_PREFERENCES, NULL, NULL, NULL, G_CALLBACK( action_cb ) }, + { "show-torrent-properties", GTK_STOCK_PROPERTIES, NULL, "Return", N_( "Torrent properties" ), G_CALLBACK( action_cb ) }, + { "open-torrent-folder", GTK_STOCK_OPEN, N_( "_Open Folder" ), NULL, NULL, G_CALLBACK( action_cb ) }, + { "show-about-dialog", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK( action_cb ) }, + { "help", GTK_STOCK_HELP, N_( "_Contents" ), "F1", NULL, G_CALLBACK( action_cb ) }, + { "update-tracker", GTK_STOCK_NETWORK, N_( "Ask Tracker for _More Peers" ), NULL, NULL, G_CALLBACK( action_cb ) }, + { "present-main-window", NULL, NULL, NULL, NULL, G_CALLBACK( action_cb ) }, }; typedef struct diff --git a/gtk/main.c b/gtk/main.c index b1c999b79..adfb9e10e 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -42,6 +42,7 @@ #endif #include +#include #include #include @@ -120,6 +121,7 @@ struct cbdata GSList * dupqueue; GHashTable * tor2details; GHashTable * details2tor; + GtkTreeSelection * sel; }; #define CBDATA_PTR "callback-data-pointer" @@ -197,22 +199,21 @@ accumulateCanUpdateForeach( GtkTreeModel * model, gpointer accumulated_status ) { tr_torrent * tor; - gtk_tree_model_get( model, iter, MC_TORRENT_RAW, &tor, -1 ); *(int*)accumulated_status |= tr_torrentCanManualUpdate( tor ); } static void -refreshTorrentActions( GtkTreeSelection * s ) +refreshTorrentActions( struct cbdata * data ) { int canUpdate; struct counts_data counts; + GtkTreeSelection * s = data->sel; counts.activeCount = 0; counts.inactiveCount = 0; counts.totalCount = 0; - gtk_tree_selection_selected_foreach( s, accumulateStatusForeach, - &counts ); + gtk_tree_selection_selected_foreach( s, accumulateStatusForeach, &counts ); action_sensitize( "pause-torrent", counts.activeCount != 0 ); action_sensitize( "start-torrent", counts.inactiveCount != 0 ); action_sensitize( "remove-torrent", counts.totalCount != 0 ); @@ -222,26 +223,32 @@ refreshTorrentActions( GtkTreeSelection * s ) action_sensitize( "show-torrent-properties", counts.totalCount == 1 ); canUpdate = 0; - gtk_tree_selection_selected_foreach( s, accumulateCanUpdateForeach, - &canUpdate ); + gtk_tree_selection_selected_foreach( s, accumulateCanUpdateForeach, &canUpdate ); action_sensitize( "update-tracker", canUpdate != 0 ); { GtkTreeView * view = gtk_tree_selection_get_tree_view( s ); GtkTreeModel * model = gtk_tree_view_get_model( view ); - const int torrentCount = gtk_tree_model_iter_n_children( model, - NULL ) - != 0; + const int torrentCount = gtk_tree_model_iter_n_children( model, NULL ) != 0; action_sensitize( "select-all", torrentCount != 0 ); action_sensitize( "deselect-all", torrentCount != 0 ); } + + { + tr_torrent * tor = NULL; + tr_session * session = tr_core_session( data->core ); + int activeCount = 0; + while(( tor = tr_torrentNext( session, tor ))) + if( TR_STATUS_IS_ACTIVE( tr_torrentGetActivity( tor ))) + ++activeCount; + action_sensitize( "pause-all-torrents", activeCount != 0 ); + } } static void -selectionChangedCB( GtkTreeSelection * s, - gpointer unused UNUSED ) +selectionChangedCB( GtkTreeSelection * s UNUSED, gpointer data ) { - refreshTorrentActions( s ); + refreshTorrentActions( data ); } static void @@ -702,12 +709,13 @@ winclose( GtkWidget * w UNUSED, static void rowChangedCB( GtkTreeModel * model UNUSED, - GtkTreePath * path, + GtkTreePath * path, GtkTreeIter * iter UNUSED, - gpointer sel ) + gpointer gdata ) { - if( gtk_tree_selection_path_is_selected ( sel, path ) ) - refreshTorrentActions( GTK_TREE_SELECTION( sel ) ); + struct cbdata * data = gdata; + if( gtk_tree_selection_path_is_selected ( data->sel, path ) ) + refreshTorrentActions( gdata ); } static void @@ -719,15 +727,14 @@ winsetup( struct cbdata * cbdata, g_assert( NULL == cbdata->wind ); cbdata->wind = GTK_WINDOW( wind ); + cbdata->sel = sel = GTK_TREE_SELECTION( tr_window_get_selection( cbdata->wind ) ); - sel = tr_window_get_selection( cbdata->wind ); - g_signal_connect( sel, "changed", G_CALLBACK( - selectionChangedCB ), NULL ); - selectionChangedCB( sel, NULL ); + g_signal_connect( sel, "changed", G_CALLBACK( selectionChangedCB ), cbdata ); + selectionChangedCB( sel, cbdata ); model = tr_core_model( cbdata->core ); - g_signal_connect( model, "row-changed", G_CALLBACK( rowChangedCB ), sel ); + g_signal_connect( model, "row-changed", G_CALLBACK( rowChangedCB ), cbdata ); g_signal_connect( wind, "delete-event", G_CALLBACK( winclose ), cbdata ); - refreshTorrentActions( sel ); + refreshTorrentActions( cbdata ); setupdrag( GTK_WIDGET( wind ), cbdata ); } @@ -1187,7 +1194,7 @@ updatemodel( gpointer gdata ) tr_window_update( data->wind ); /* update the actions */ - refreshTorrentActions( tr_window_get_selection( data->wind ) ); + refreshTorrentActions( data ); } return !done; @@ -1380,48 +1387,59 @@ removeSelected( struct cbdata * data, } } +static void +pauseAllTorrents( struct cbdata * data ) +{ + tr_session * session = tr_core_session( data->core ); + const char * cmd = "{ \"method\": \"torrent-stop\" }"; + char * response = tr_rpc_request_exec_json( session, cmd, strlen( cmd ), NULL ); + tr_free( response ); +} + void -doAction( const char * action_name, - gpointer user_data ) +doAction( const char * action_name, gpointer user_data ) { struct cbdata * data = user_data; gboolean changed = FALSE; - if( !strcmp ( action_name, "add-torrent-menu" ) + if( !strcmp( action_name, "add-torrent-menu" ) || !strcmp( action_name, "add-torrent-toolbar" ) ) { addDialog( data->wind, data->core ); } - else if( !strcmp ( action_name, "show-stats" ) ) + else if( !strcmp( action_name, "show-stats" ) ) { - GtkWidget * dialog = stats_dialog_create( data->wind, - data->core ); + GtkWidget * dialog = stats_dialog_create( data->wind, data->core ); gtk_widget_show( dialog ); } - else if( !strcmp ( action_name, "start-torrent" ) ) + else if( !strcmp( action_name, "start-torrent" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_selected_foreach( s, startTorrentForeach, NULL ); changed |= gtk_tree_selection_count_selected_rows( s ) != 0; } - else if( !strcmp ( action_name, "pause-torrent" ) ) + else if( !strcmp( action_name, "pause-all-torrents" ) ) + { + pauseAllTorrents( data ); + } + else if( !strcmp( action_name, "pause-torrent" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_selected_foreach( s, stopTorrentForeach, NULL ); changed |= gtk_tree_selection_count_selected_rows( s ) != 0; } - else if( !strcmp ( action_name, "verify-torrent" ) ) + else if( !strcmp( action_name, "verify-torrent" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_selected_foreach( s, recheckTorrentForeach, NULL ); changed |= gtk_tree_selection_count_selected_rows( s ) != 0; } - else if( !strcmp ( action_name, "open-torrent-folder" ) ) + else if( !strcmp( action_name, "open-torrent-folder" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_selected_foreach( s, openFolderForeach, data ); } - else if( !strcmp ( action_name, "show-torrent-properties" ) ) + else if( !strcmp( action_name, "show-torrent-properties" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_selected_foreach( s, showInfoForeach, data ); @@ -1432,7 +1450,7 @@ doAction( const char * action_name, gtk_tree_selection_selected_foreach( s, updateTrackerForeach, data->wind ); } - else if( !strcmp ( action_name, "new-torrent" ) ) + else if( !strcmp( action_name, "new-torrent" ) ) { GtkWidget * w = make_meta_ui( GTK_WINDOW( data->wind ), tr_core_session( data->core ) ); @@ -1446,21 +1464,21 @@ doAction( const char * action_name, { removeSelected( data, TRUE ); } - else if( !strcmp ( action_name, "quit" ) ) + else if( !strcmp( action_name, "quit" ) ) { askquit( data->core, data->wind, wannaquit, data ); } - else if( !strcmp ( action_name, "select-all" ) ) + else if( !strcmp( action_name, "select-all" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_select_all( s ); } - else if( !strcmp ( action_name, "deselect-all" ) ) + else if( !strcmp( action_name, "deselect-all" ) ) { GtkTreeSelection * s = tr_window_get_selection( data->wind ); gtk_tree_selection_unselect_all( s ); } - else if( !strcmp ( action_name, "edit-preferences" ) ) + else if( !strcmp( action_name, "edit-preferences" ) ) { if( NULL == data->prefs ) { @@ -1471,7 +1489,7 @@ doAction( const char * action_name, gtk_widget_show( GTK_WIDGET( data->prefs ) ); } } - else if( !strcmp ( action_name, "toggle-message-log" ) ) + else if( !strcmp( action_name, "toggle-message-log" ) ) { if( !data->msgwin ) { @@ -1487,7 +1505,7 @@ doAction( const char * action_name, data->msgwin = NULL; } } - else if( !strcmp ( action_name, "show-about-dialog" ) ) + else if( !strcmp( action_name, "show-about-dialog" ) ) { about( data->wind ); } @@ -1497,11 +1515,11 @@ doAction( const char * action_name, gtr_open_file( url ); g_free( url ); } - else if( !strcmp ( action_name, "toggle-main-window" ) ) + else if( !strcmp( action_name, "toggle-main-window" ) ) { toggleMainWindow( data, FALSE ); } - else if( !strcmp ( action_name, "present-main-window" ) ) + else if( !strcmp( action_name, "present-main-window" ) ) { toggleMainWindow( data, TRUE ); } diff --git a/gtk/ui.h b/gtk/ui.h index 7a4921441..35b0a71c2 100644 --- a/gtk/ui.h +++ b/gtk/ui.h @@ -78,6 +78,8 @@ static const char * fallback_ui_file = " \n" " \n" " \n" + " \n" + " \n" " \n" " \n" "\n"