summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-02 21:14:40 +0000
committerGravatar Alan Fitton <ajf@eth0.org.uk>2012-01-02 21:14:40 +0000
commit242819dc8bef16af32d115f593cc83c1d4662f0e (patch)
treeb0306e836b9fd66476a06285d30c5c5615eb7f0d
parent91acc8d364b58889e6061ca51c17af828dd89104 (diff)
keyboard accelerators
-rw-r--r--src/trg-client.c2
-rw-r--r--src/trg-main-window.c179
-rw-r--r--src/trg-menu-bar.c86
-rw-r--r--src/trg-menu-bar.h2
-rw-r--r--src/trg-torrent-model.c3
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(