diff options
author | Alan Fitton <ajf@eth0.org.uk> | 2012-01-02 21:14:40 +0000 |
---|---|---|
committer | Alan Fitton <ajf@eth0.org.uk> | 2012-01-02 21:14:40 +0000 |
commit | 242819dc8bef16af32d115f593cc83c1d4662f0e (patch) | |
tree | b0306e836b9fd66476a06285d30c5c5615eb7f0d | |
parent | 91acc8d364b58889e6061ca51c17af828dd89104 (diff) |
keyboard accelerators
-rw-r--r-- | src/trg-client.c | 2 | ||||
-rw-r--r-- | src/trg-main-window.c | 179 | ||||
-rw-r--r-- | src/trg-menu-bar.c | 86 | ||||
-rw-r--r-- | src/trg-menu-bar.h | 2 | ||||
-rw-r--r-- | src/trg-torrent-model.c | 3 |
5 files changed, 179 insertions, 93 deletions
diff --git a/src/trg-client.c b/src/trg-client.c index daaa25f..0cfd4fc 100644 --- a/src/trg-client.c +++ b/src/trg-client.c @@ -522,7 +522,7 @@ trg_tls *trg_tls_new(TrgClient * tc) tls->curl = curl_easy_init(); curl_easy_setopt(tls->curl, CURLOPT_USERAGENT, PACKAGE_NAME); curl_easy_setopt(tls->curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_easy_setopt(tls->curl, CURLOPT_TIMEOUT, 20); + curl_easy_setopt(tls->curl, CURLOPT_TIMEOUT, 40); curl_easy_setopt(tls->curl, CURLOPT_WRITEFUNCTION, &http_receive_callback); curl_easy_setopt(tls->curl, CURLOPT_HEADERFUNCTION, &header_callback); diff --git a/src/trg-main-window.c b/src/trg-main-window.c index 711c21d..4d847c0 100644 --- a/src/trg-main-window.c +++ b/src/trg-main-window.c @@ -161,8 +161,6 @@ static gboolean status_icon_button_press_event(GtkStatusIcon * icon, #endif static void clear_filter_entry_cb(GtkEntry * entry, GtkEntryIconPosition icon_pos, GdkEvent * event, gpointer user_data); -static gboolean torrent_tv_key_press_event(GtkWidget * w, GdkEventKey * key, - gpointer data); static GtkWidget *trg_imagemenuitem_new(GtkMenuShell * shell, const gchar * text, char *stock_id, gboolean sensitive, GCallback cb, gpointer cbdata); @@ -179,6 +177,7 @@ static gboolean torrent_tv_button_pressed_cb(GtkWidget * treeview, GdkEventButton * event, gpointer userdata); static gboolean torrent_tv_popup_menu_cb(GtkWidget * treeview, gpointer userdata); +static gboolean is_ready_for_torrent_action(TrgMainWindow *win); static gboolean window_state_event(GtkWidget * widget, GdkEventWindowState * event, gpointer trayIcon); @@ -279,8 +278,7 @@ static void update_selected_torrent_notebook(TrgMainWindow * win, gint mode, TRG_TREE_VIEW(priv->peersTreeView), trg_client_get_serial(client), t, mode); - if (mode == TORRENT_GET_MODE_FIRST - ) + if (mode == TORRENT_GET_MODE_FIRST) gtk_tree_view_expand_all(GTK_TREE_VIEW(priv->filesTreeView)); } else if (id < 0) { @@ -376,8 +374,13 @@ static void destroy_window(GtkWidget * w, gpointer data G_GNUC_UNUSED) { static void open_props_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - TrgTorrentPropsDialog *dialog = trg_torrent_props_dialog_new( - GTK_WINDOW(data), priv->torrentTreeView, priv->client); + TrgTorrentPropsDialog *dialog; + + if (priv->selectedTorrentId < 0) + return; + + dialog = trg_torrent_props_dialog_new(GTK_WINDOW(data), + priv->torrentTreeView, priv->client); gtk_widget_show_all(GTK_WIDGET(dialog)); } @@ -400,22 +403,25 @@ static void add_url_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { static void add_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - trg_torrent_add_dialog(TRG_MAIN_WINDOW(data), priv->client); + if (trg_client_is_connected(priv->client)) + trg_torrent_add_dialog(TRG_MAIN_WINDOW(data), priv->client); } static void pause_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_pause(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (trg_client_is_connected(priv->client)) + dispatch_async(priv->client, + torrent_pause(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void pause_all_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, torrent_pause(NULL), - on_generic_interactive_action, data); + if (trg_client_is_connected(priv->client)) + dispatch_async(priv->client, torrent_pause(NULL), + on_generic_interactive_action, data); } gboolean trg_add_from_filename(TrgMainWindow * win, gchar ** uris) { @@ -456,16 +462,18 @@ gboolean trg_add_from_filename(TrgMainWindow * win, gchar ** uris) { static void resume_all_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, torrent_start(NULL), - on_generic_interactive_action, data); + if (trg_client_is_connected(priv->client)) + dispatch_async(priv->client, torrent_start(NULL), + on_generic_interactive_action, data); } static void resume_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_start(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (trg_client_is_connected(priv->client)) + dispatch_async(priv->client, + torrent_start(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void disconnect_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { @@ -534,10 +542,9 @@ static void open_local_prefs_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { static void open_remote_prefs_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - TrgRemotePrefsDialog *dlg = trg_remote_prefs_dialog_get_instance( - TRG_MAIN_WINDOW(data), priv->client); - - gtk_widget_show_all(GTK_WIDGET(dlg)); + if (trg_client_is_connected(priv->client)) + gtk_widget_show_all(GTK_WIDGET(trg_remote_prefs_dialog_get_instance( + TRG_MAIN_WINDOW(data), priv->client))); } static void main_window_toggle_filter_dirs(GtkCheckMenuItem * w, gpointer win) { @@ -588,59 +595,76 @@ static TrgToolbar *trg_main_window_toolbar_new(TrgMainWindow * win) { static void reannounce_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_reannounce(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (trg_client_is_connected(priv->client)) + dispatch_async(priv->client, + torrent_reannounce(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void verify_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_verify(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async(priv->client, + torrent_verify(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void start_now_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_start_now(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async(priv->client, + torrent_start_now(build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void up_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_queue_move_up(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (priv->queuesEnabled + && is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async( + priv->client, + torrent_queue_move_up( + build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void top_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_queue_move_top(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (priv->queuesEnabled + && is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async( + priv->client, + torrent_queue_move_top( + build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void bottom_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async( - priv->client, - torrent_queue_move_bottom( - build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (priv->queuesEnabled + && is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async( + priv->client, + torrent_queue_move_bottom( + build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static void down_queue_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - dispatch_async(priv->client, - torrent_queue_move_down(build_json_id_array(priv->torrentTreeView)), - on_generic_interactive_action, data); + if (priv->queuesEnabled + && is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + dispatch_async( + priv->client, + torrent_queue_move_down( + build_json_id_array(priv->torrentTreeView)), + on_generic_interactive_action, data); } static gint confirm_action_dialog(GtkWindow * win, GtkTreeSelection * selection, @@ -694,23 +718,32 @@ static gint confirm_action_dialog(GtkWindow * win, GtkTreeSelection * selection, return response; } +static gboolean is_ready_for_torrent_action(TrgMainWindow *win) { + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(win); + return priv->selectedTorrentId >= 0 && trg_client_is_connected(priv->client); +} + static void move_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - TrgTorrentMoveDialog *dlg = trg_torrent_move_dialog_new( - TRG_MAIN_WINDOW(data), priv->client, priv->torrentTreeView); - gtk_widget_show_all(GTK_WIDGET(dlg)); + + if (is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + gtk_widget_show_all( + GTK_WIDGET(trg_torrent_move_dialog_new( + TRG_MAIN_WINDOW(data), priv->client, priv->torrentTreeView))); } static void remove_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { - TrgMainWindowPrivate *priv; + TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); GtkTreeSelection *selection; JsonArray *ids; - priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); + if (!is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + return; selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(priv->torrentTreeView)); ids = build_json_id_array(priv->torrentTreeView); + if (confirm_action_dialog(GTK_WINDOW(data), selection, _ ("<big><b>Remove torrent \"%s\"?</b></big>"), _("<big><b>Remove %d torrents?</b></big>"), GTK_STOCK_REMOVE) @@ -727,11 +760,13 @@ static void delete_cb(GtkWidget * w G_GNUC_UNUSED, gpointer data) { JsonArray *ids; priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(priv->torrentTreeView)); ids = build_json_id_array(priv->torrentTreeView); + if (!is_ready_for_torrent_action(TRG_MAIN_WINDOW(data))) + return; + if (confirm_action_dialog(GTK_WINDOW(data), selection, _ ("<big><b>Remove and delete torrent \"%s\"?</b></big>"), _ ("<big><b>Remove and delete %d torrents?</b></big>"), @@ -790,11 +825,11 @@ static GtkWidget *trg_main_window_notebook_new(TrgMainWindow * win) { priv->genDetails = trg_general_panel_new(GTK_TREE_MODEL(priv->torrentModel), priv->client); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(genScrolledWin), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(genScrolledWin), GTK_WIDGET(priv->genDetails)); - gtk_notebook_append_page(GTK_NOTEBOOK(notebook), - genScrolledWin, gtk_label_new(_("General"))); + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(genScrolledWin), + GTK_WIDGET(priv->genDetails)); + gtk_notebook_append_page(GTK_NOTEBOOK(notebook), genScrolledWin, + gtk_label_new(_("General"))); priv->trackersModel = trg_trackers_model_new(); priv->trackersTreeView = trg_trackers_tree_view_new(priv->trackersModel, @@ -832,7 +867,7 @@ gboolean on_session_set(gpointer data) { if (response->status == CURLE_OK || response->status == FAIL_RESPONSE_UNSUCCESSFUL - ) + ) dispatch_async(priv->client, session_get(), on_session_get, response->cb_data); @@ -1024,8 +1059,7 @@ static gboolean on_torrent_get(gpointer data, int mode) { trg_torrent_graph_set_speed(priv->graph, stats); #endif - if (mode != TORRENT_GET_MODE_INTERACTION - ) + if (mode != TORRENT_GET_MODE_INTERACTION) priv->timerId = g_timeout_add_seconds(interval, trg_update_torrents_timerfunc, win); @@ -1384,8 +1418,13 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win) { *b_start_now; TrgMenuBar *menuBar; + GtkAccelGroup *accel_group; + + accel_group = gtk_accel_group_new(); + + menuBar = trg_menu_bar_new(win, trg_client_get_prefs(priv->client), + accel_group); - menuBar = trg_menu_bar_new(win, trg_client_get_prefs(priv->client)); g_object_get(menuBar, "disconnect-button", &b_disconnect, "add-button", &b_add, "add-url-button", &b_add_url, "resume-button", &b_resume, "resume-all-button", &b_resume_all, "pause-button", &b_pause, @@ -1449,6 +1488,8 @@ static TrgMenuBar *trg_main_window_menu_bar_new(TrgMainWindow * win) { g_signal_connect(b_props, "activate", G_CALLBACK(open_props_cb), win); g_signal_connect(b_quit, "activate", G_CALLBACK(quit_cb), win); + gtk_window_add_accel_group(GTK_WINDOW(win), accel_group); + return menuBar; } @@ -1496,24 +1537,6 @@ static void clear_filter_entry_cb(GtkEntry * entry, gtk_entry_set_text(entry, ""); } -static gboolean torrent_tv_key_press_event(GtkWidget * w, GdkEventKey * key, - gpointer data) { - TrgMainWindowPrivate *priv = TRG_MAIN_WINDOW_GET_PRIVATE(data); - if (key->keyval == GDK_Delete) { - if (key->state & GDK_SHIFT_MASK) - delete_cb(w, data); - else - remove_cb(w, data); - } else if (priv->queuesEnabled && (key->state & GDK_MOD1_MASK) - && key->keyval == GDK_Up) { - up_queue_cb(w, data); - } else if (priv->queuesEnabled && (key->state & GDK_MOD1_MASK) - && key->keyval == GDK_Down) { - down_queue_cb(w, data); - } - return FALSE; -} - static GtkWidget *trg_imagemenuitem_new(GtkMenuShell * shell, const gchar * text, char *stock_id, gboolean sensitive, GCallback cb, gpointer cbdata) { @@ -2137,8 +2160,6 @@ static GObject *trg_main_window_constructor(GType type, priv->torrentTreeView = trg_main_window_torrent_tree_view_new(self, priv->filteredTorrentModel); - g_signal_connect(priv->torrentTreeView, "key-press-event", - G_CALLBACK(torrent_tv_key_press_event), self); g_signal_connect(priv->torrentTreeView, "popup-menu", G_CALLBACK(torrent_tv_popup_menu_cb), self); g_signal_connect(priv->torrentTreeView, "button-press-event", diff --git a/src/trg-menu-bar.c b/src/trg-menu-bar.c index ea3311f..e7c2cf0 100644 --- a/src/trg-menu-bar.c +++ b/src/trg-menu-bar.c @@ -19,6 +19,7 @@ #include <glib/gi18n.h> #include <gtk/gtk.h> +#include <gdk/gdkkeysyms.h> #include "trg-main-window.h" #include "trg-menu-bar.h" @@ -48,6 +49,7 @@ enum { PROP_QUIT, PROP_PREFS, PROP_MAIN_WINDOW, + PROP_ACCEL_GROUP, PROP_DIR_FILTERS, PROP_TRACKER_FILTERS, PROP_VIEW_SHOW_GRAPH, @@ -96,6 +98,7 @@ struct _TrgMenuBarPrivate { GtkWidget *mb_top_queue; GtkWidget *mb_start_now; GtkWidget *mb_queues_seperator; + GtkAccelGroup *accel_group; TrgPrefs *prefs; TrgMainWindow *main_window; }; @@ -154,6 +157,9 @@ static void trg_menu_bar_set_property(GObject * object, TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(object); switch (prop_id) { + case PROP_ACCEL_GROUP: + priv->accel_group = g_value_get_object(value); + break; case PROP_PREFS: priv->prefs = g_value_get_object(value); break; @@ -299,6 +305,15 @@ GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, const gchar * text, return item; } +static void trg_menu_bar_accel_add(TrgMenuBar *menu, GtkWidget *item, guint key, GdkModifierType mods) +{ + TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(menu); + + gtk_widget_add_accelerator(item, "activate", priv->accel_group, + key, mods, GTK_ACCEL_VISIBLE); + +} + static void view_menu_item_toggled_cb(GtkCheckMenuItem * w, gpointer data) { TrgPrefs *p = TRG_PREFS(data); @@ -406,8 +421,10 @@ static GtkWidget *trg_menu_bar_view_menu_new(TrgMenuBar * mb) } static -GtkWidget *trg_menu_bar_options_menu_new(TrgMenuBarPrivate * priv) +GtkWidget *trg_menu_bar_options_menu_new(TrgMenuBar *menu) { + TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(menu); + GtkWidget *opts = gtk_menu_item_new_with_mnemonic(_("_Options")); GtkWidget *optsMenu = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(opts), optsMenu); @@ -416,11 +433,13 @@ GtkWidget *trg_menu_bar_options_menu_new(TrgMenuBarPrivate * priv) trg_menu_bar_item_new(GTK_MENU_SHELL(optsMenu), _("_Local Preferences"), GTK_STOCK_PREFERENCES, TRUE); + trg_menu_bar_accel_add(menu, priv->mb_local_prefs, GDK_s, GDK_CONTROL_MASK); priv->mb_remote_prefs = trg_menu_bar_item_new(GTK_MENU_SHELL(optsMenu), _("_Remote Preferences"), GTK_STOCK_NETWORK, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_remote_prefs, GDK_s, GDK_MOD1_MASK); return opts; } @@ -432,11 +451,14 @@ static void trg_menu_bar_file_connect_item_new(TrgMainWindow * win, JsonObject * profile) { GtkWidget *item = gtk_check_menu_item_new_with_label(text); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), checked); g_object_set_data(G_OBJECT(item), "profile", profile); gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(item), TRUE); + g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(connect_cb), win); + gtk_menu_shell_append(shell, item); } @@ -471,8 +493,10 @@ GtkWidget *trg_menu_bar_file_connect_menu_new(TrgMainWindow * win, } static -GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBarPrivate * priv) +GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBar * menu) { + TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(menu); + GtkWidget *file = gtk_menu_item_new_with_mnemonic(_("_File")); GtkWidget *fileMenu = gtk_menu_new(); @@ -488,12 +512,17 @@ GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBarPrivate * priv) priv->mb_disconnect = trg_menu_bar_item_new(GTK_MENU_SHELL(fileMenu), _("_Disconnect"), GTK_STOCK_DISCONNECT, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_disconnect, GDK_d, GDK_CONTROL_MASK); + priv->mb_add = trg_menu_bar_item_new(GTK_MENU_SHELL(fileMenu), _("_Add"), GTK_STOCK_ADD, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_add, GDK_a, GDK_CONTROL_MASK); + priv->mb_add_url = trg_menu_bar_item_new(GTK_MENU_SHELL(fileMenu), _("Add from _URL"), GTK_STOCK_ADD, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_add_url, GDK_u, GDK_CONTROL_MASK); priv->mb_quit = trg_menu_bar_item_new(GTK_MENU_SHELL(fileMenu), _("_Quit"), @@ -505,38 +534,54 @@ GtkWidget *trg_menu_bar_file_file_menu_new(TrgMenuBarPrivate * priv) } static -GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv) +GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBar *menu) { + TrgMenuBarPrivate *priv = TRG_MENU_BAR_GET_PRIVATE(menu); GtkWidget *torrent = gtk_menu_item_new_with_mnemonic(_("_Torrent")); GtkWidget *torrentMenu = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(torrent), torrentMenu); priv->mb_props = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Properties"), GTK_STOCK_PROPERTIES, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_props, GDK_i, GDK_CONTROL_MASK); + priv->mb_resume = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Resume"), GTK_STOCK_MEDIA_PLAY, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_resume, GDK_r, GDK_CONTROL_MASK); + priv->mb_pause = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Pause"), GTK_STOCK_MEDIA_PAUSE, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_pause, GDK_p, GDK_CONTROL_MASK); + priv->mb_verify = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Verify"), GTK_STOCK_REFRESH, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_verify, GDK_v, GDK_CONTROL_MASK); + priv->mb_reannounce = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Re-_announce"), GTK_STOCK_REFRESH, FALSE); + priv->mb_move = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Move"), GTK_STOCK_HARDDISK, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_move, GDK_m, GDK_CONTROL_MASK); + priv->mb_remove = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Remove"), GTK_STOCK_REMOVE, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_remove, GDK_Delete, 0); + priv->mb_delete = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Remove and Delete"), GTK_STOCK_CLEAR, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_delete, GDK_Delete, GDK_SHIFT_MASK); priv->mb_queues_seperator = gtk_separator_menu_item_new(); gtk_menu_shell_append(GTK_MENU_SHELL(torrentMenu), @@ -550,11 +595,13 @@ GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv) priv->mb_up_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Move Up Queue"), GTK_STOCK_GO_UP, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_up_queue, GDK_Up, GDK_SHIFT_MASK); priv->mb_down_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("Move Down Queue"), GTK_STOCK_GO_DOWN, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_down_queue, GDK_Down, GDK_SHIFT_MASK); priv->mb_bottom_queue = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), @@ -572,9 +619,12 @@ GtkWidget *trg_menu_bar_torrent_menu_new(TrgMenuBarPrivate * priv) trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Resume All"), GTK_STOCK_MEDIA_PLAY, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_resume_all, GDK_r, GDK_SHIFT_MASK | GDK_CONTROL_MASK); + priv->mb_pause_all = trg_menu_bar_item_new(GTK_MENU_SHELL(torrentMenu), _("_Pause All"), GTK_STOCK_MEDIA_PAUSE, FALSE); + trg_menu_bar_accel_add(menu, priv->mb_pause_all, GDK_p, GDK_SHIFT_MASK | GDK_CONTROL_MASK); return torrent; } @@ -616,22 +666,23 @@ static GObject *trg_menu_bar_constructor(GType type, { GObject *object; TrgMenuBarPrivate *priv; + TrgMenuBar *menu; object = G_OBJECT_CLASS (trg_menu_bar_parent_class)->constructor(type, n_construct_properties, construct_params); + menu = TRG_MENU_BAR(object); priv = TRG_MENU_BAR_GET_PRIVATE(object); gtk_menu_shell_append(GTK_MENU_SHELL(object), - trg_menu_bar_file_file_menu_new(priv)); + trg_menu_bar_file_file_menu_new(menu)); gtk_menu_shell_append(GTK_MENU_SHELL(object), - trg_menu_bar_torrent_menu_new(priv)); + trg_menu_bar_torrent_menu_new(menu)); gtk_menu_shell_append(GTK_MENU_SHELL(object), - trg_menu_bar_options_menu_new(priv)); + trg_menu_bar_options_menu_new(menu)); gtk_menu_shell_append(GTK_MENU_SHELL(object), - trg_menu_bar_view_menu_new(TRG_MENU_BAR - (object))); + trg_menu_bar_view_menu_new(menu)); trg_menu_bar_help_menu_new(TRG_MENU_BAR(object)); g_signal_connect(G_OBJECT(priv->prefs), "pref-profile-changed", @@ -736,6 +787,21 @@ static void trg_menu_bar_class_init(TrgMenuBarClass * klass) G_PARAM_STATIC_BLURB)); g_object_class_install_property(object_class, + PROP_ACCEL_GROUP, + g_param_spec_object("accel-group", + "accel-group", + "accel-group", + GTK_TYPE_ACCEL_GROUP, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY + | + G_PARAM_STATIC_NAME + | + G_PARAM_STATIC_NICK + | + G_PARAM_STATIC_BLURB)); + + g_object_class_install_property(object_class, PROP_MAIN_WINDOW, g_param_spec_object("mainwin", "mainwin", @@ -756,8 +822,8 @@ static void trg_menu_bar_init(TrgMenuBar * self) { } -TrgMenuBar *trg_menu_bar_new(TrgMainWindow * win, TrgPrefs * prefs) +TrgMenuBar *trg_menu_bar_new(TrgMainWindow * win, TrgPrefs * prefs, GtkAccelGroup *accel_group) { return g_object_new(TRG_TYPE_MENU_BAR, - "prefs", prefs, "mainwin", win, NULL); + "prefs", prefs, "mainwin", win, "accel-group", accel_group, NULL); } diff --git a/src/trg-menu-bar.h b/src/trg-menu-bar.h index a15e28e..7a47a07 100644 --- a/src/trg-menu-bar.h +++ b/src/trg-menu-bar.h @@ -48,7 +48,7 @@ typedef struct { GType trg_menu_bar_get_type(void); -TrgMenuBar *trg_menu_bar_new(TrgMainWindow * win, TrgPrefs * prefs); +TrgMenuBar *trg_menu_bar_new(TrgMainWindow * win, TrgPrefs * prefs, GtkAccelGroup *accel_group); GtkWidget *trg_menu_bar_item_new(GtkMenuShell * shell, const gchar * text, const gchar * stock_id, gboolean sensitive); diff --git a/src/trg-torrent-model.c b/src/trg-torrent-model.c index ace6bae..26a6698 100644 --- a/src/trg-torrent-model.c +++ b/src/trg-torrent-model.c @@ -679,8 +679,7 @@ trg_torrent_model_update_stats *trg_torrent_model_update( g_hash_table_insert(priv->ht, idCopy, rr); gtk_tree_path_free(path); - if (mode != TORRENT_GET_MODE_FIRST - ) + if (mode != TORRENT_GET_MODE_FIRST) g_signal_emit(model, signals[TMODEL_TORRENT_ADDED], 0, &iter); } else { path = gtk_tree_row_reference_get_path( |