diff --git a/gtk/details.c b/gtk/details.c index d1132b739..e8c0b2fee 100644 --- a/gtk/details.c +++ b/gtk/details.c @@ -36,91 +36,91 @@ static GQuark URL_ENTRY_KEY = 0; struct DetailsImpl { - GtkWidget * dialog; + GtkWidget * dialog; - GtkWidget * honor_limits_check; - GtkWidget * up_limited_check; - GtkWidget * up_limit_sping; - GtkWidget * down_limited_check; - GtkWidget * down_limit_spin; - GtkWidget * bandwidth_combo; + GtkWidget * honor_limits_check; + GtkWidget * up_limited_check; + GtkWidget * up_limit_sping; + GtkWidget * down_limited_check; + GtkWidget * down_limit_spin; + GtkWidget * bandwidth_combo; - GtkWidget * ratio_combo; - GtkWidget * ratio_spin; - GtkWidget * idle_combo; - GtkWidget * idle_spin; - GtkWidget * max_peers_spin; + GtkWidget * ratio_combo; + GtkWidget * ratio_spin; + GtkWidget * idle_combo; + GtkWidget * idle_spin; + GtkWidget * max_peers_spin; - gulong honor_limits_check_tag; - gulong up_limited_check_tag; - gulong down_limited_check_tag; - gulong down_limit_spin_tag; - gulong up_limit_spin_tag; - gulong bandwidth_combo_tag; - gulong ratio_combo_tag; - gulong ratio_spin_tag; - gulong idle_combo_tag; - gulong idle_spin_tag; - gulong max_peers_spin_tag; + gulong honor_limits_check_tag; + gulong up_limited_check_tag; + gulong down_limited_check_tag; + gulong down_limit_spin_tag; + gulong up_limit_spin_tag; + gulong bandwidth_combo_tag; + gulong ratio_combo_tag; + gulong ratio_spin_tag; + gulong idle_combo_tag; + gulong idle_spin_tag; + gulong max_peers_spin_tag; - GtkWidget * size_lb; - GtkWidget * state_lb; - GtkWidget * have_lb; - GtkWidget * dl_lb; - GtkWidget * ul_lb; - GtkWidget * error_lb; - GtkWidget * date_started_lb; - GtkWidget * eta_lb; - GtkWidget * last_activity_lb; + GtkWidget * size_lb; + GtkWidget * state_lb; + GtkWidget * have_lb; + GtkWidget * dl_lb; + GtkWidget * ul_lb; + GtkWidget * error_lb; + GtkWidget * date_started_lb; + GtkWidget * eta_lb; + GtkWidget * last_activity_lb; - GtkWidget * hash_lb; - GtkWidget * privacy_lb; - GtkWidget * origin_lb; - GtkWidget * destination_lb; - GtkTextBuffer * comment_buffer; + GtkWidget * hash_lb; + GtkWidget * privacy_lb; + GtkWidget * origin_lb; + GtkWidget * destination_lb; + GtkTextBuffer * comment_buffer; - GHashTable * peer_hash; - GHashTable * webseed_hash; - GtkListStore * peer_store; - GtkListStore * webseed_store; - GtkWidget * webseed_view; - GtkWidget * peer_view; - GtkWidget * more_peer_details_check; + GHashTable * peer_hash; + GHashTable * webseed_hash; + GtkListStore * peer_store; + GtkListStore * webseed_store; + GtkWidget * webseed_view; + GtkWidget * peer_view; + GtkWidget * more_peer_details_check; - GtkListStore * tracker_store; - GHashTable * tracker_hash; - GtkTreeModel * trackers_filtered; - GtkWidget * add_tracker_button; - GtkWidget * edit_trackers_button; - GtkWidget * remove_tracker_button; - GtkWidget * tracker_view; - GtkWidget * scrape_check; - GtkWidget * all_check; + GtkListStore * tracker_store; + GHashTable * tracker_hash; + GtkTreeModel * trackers_filtered; + GtkWidget * add_tracker_button; + GtkWidget * edit_trackers_button; + GtkWidget * remove_tracker_button; + GtkWidget * tracker_view; + GtkWidget * scrape_check; + GtkWidget * all_check; - GtkWidget * file_list; - GtkWidget * file_label; + GtkWidget * file_list; + GtkWidget * file_label; - GSList * ids; - TrCore * core; - guint periodic_refresh_tag; + GSList * ids; + TrCore * core; + guint periodic_refresh_tag; - GString * gstr; + GString * gstr; }; static tr_torrent** getTorrents (struct DetailsImpl * d, int * setmeCount) { - GSList * l; - int torrentCount = 0; - const int n = g_slist_length (d->ids); - tr_torrent ** torrents = g_new (tr_torrent*, n); + GSList * l; + int torrentCount = 0; + const int n = g_slist_length (d->ids); + tr_torrent ** torrents = g_new (tr_torrent*, n); - for (l=d->ids; l!=NULL; l=l->next) - if ((torrents[torrentCount] = gtr_core_find_torrent (d->core, GPOINTER_TO_INT (l->data)))) - ++torrentCount; + for (l=d->ids; l!=NULL; l=l->next) + if ((torrents[torrentCount] = gtr_core_find_torrent (d->core, GPOINTER_TO_INT (l->data)))) + ++torrentCount; - *setmeCount = torrentCount; - return torrents; + *setmeCount = torrentCount; + return torrents; } /**** @@ -132,303 +132,332 @@ getTorrents (struct DetailsImpl * d, int * setmeCount) static void set_togglebutton_if_different (GtkWidget * w, gulong tag, gboolean value) { - GtkToggleButton * toggle = GTK_TOGGLE_BUTTON (w); - const gboolean currentValue = gtk_toggle_button_get_active (toggle); - if (currentValue != value) + GtkToggleButton * toggle = GTK_TOGGLE_BUTTON (w); + const gboolean currentValue = gtk_toggle_button_get_active (toggle); + + if (currentValue != value) { - g_signal_handler_block (toggle, tag); - gtk_toggle_button_set_active (toggle, value); - g_signal_handler_unblock (toggle, tag); + g_signal_handler_block (toggle, tag); + gtk_toggle_button_set_active (toggle, value); + g_signal_handler_unblock (toggle, tag); } } static void set_int_spin_if_different (GtkWidget * w, gulong tag, int value) { - GtkSpinButton * spin = GTK_SPIN_BUTTON (w); - const int currentValue = gtk_spin_button_get_value_as_int (spin); - if (currentValue != value) + GtkSpinButton * spin = GTK_SPIN_BUTTON (w); + const int currentValue = gtk_spin_button_get_value_as_int (spin); + + if (currentValue != value) { - g_signal_handler_block (spin, tag); - gtk_spin_button_set_value (spin, value); - g_signal_handler_unblock (spin, tag); + g_signal_handler_block (spin, tag); + gtk_spin_button_set_value (spin, value); + g_signal_handler_unblock (spin, tag); } } static void set_double_spin_if_different (GtkWidget * w, gulong tag, double value) { - GtkSpinButton * spin = GTK_SPIN_BUTTON (w); - const double currentValue = gtk_spin_button_get_value (spin); - if (((int)(currentValue*100) != (int)(value*100))) + GtkSpinButton * spin = GTK_SPIN_BUTTON (w); + const double currentValue = gtk_spin_button_get_value (spin); + + if (((int)(currentValue*100) != (int)(value*100))) { - g_signal_handler_block (spin, tag); - gtk_spin_button_set_value (spin, value); - g_signal_handler_unblock (spin, tag); + g_signal_handler_block (spin, tag); + gtk_spin_button_set_value (spin, value); + g_signal_handler_unblock (spin, tag); } } static void unset_combo (GtkWidget * w, gulong tag) { - GtkComboBox * combobox = GTK_COMBO_BOX (w); + GtkComboBox * combobox = GTK_COMBO_BOX (w); - g_signal_handler_block (combobox, tag); - gtk_combo_box_set_active (combobox, -1); - g_signal_handler_unblock (combobox, tag); + g_signal_handler_block (combobox, tag); + gtk_combo_box_set_active (combobox, -1); + g_signal_handler_unblock (combobox, tag); } static void refreshOptions (struct DetailsImpl * di, tr_torrent ** torrents, int n) { - /*** - **** Options Page - ***/ + /*** + **** Options Page + ***/ - /* honor_limits_check */ - if (n) { - const bool baseline = tr_torrentUsesSessionLimits (torrents[0]); - int i; - for (i=1; ihonor_limits_check, - di->honor_limits_check_tag, baseline); + /* honor_limits_check */ + if (n) + { + int i; + const bool baseline = tr_torrentUsesSessionLimits (torrents[0]); + + for (i=1; ihonor_limits_check, di->honor_limits_check_tag, baseline); } - /* down_limited_check */ - if (n) { - const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_DOWN); - int i; - for (i=1; idown_limited_check, - di->down_limited_check_tag, baseline); + /* down_limited_check */ + if (n) + { + int i; + const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_DOWN); + + for (i=1; idown_limited_check, di->down_limited_check_tag, baseline); } - /* down_limit_spin */ - if (n) { - const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_DOWN); - int i; - for (i=1; idown_limit_spin, - di->down_limit_spin_tag, baseline); + /* down_limit_spin */ + if (n) + { + int i; + const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_DOWN); + + for (i=1; idown_limit_spin, di->down_limit_spin_tag, baseline); } - /* up_limited_check */ - if (n) { - const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_UP); - int i; - for (i=1; iup_limited_check, - di->up_limited_check_tag, baseline); + /* up_limited_check */ + if (n) + { + int i; + const bool baseline = tr_torrentUsesSpeedLimit (torrents[0], TR_UP); + + for (i=1; iup_limited_check, di->up_limited_check_tag, baseline); } - /* up_limit_sping */ - if (n) { - const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_UP); - int i; - for (i=1; iup_limit_sping, - di->up_limit_spin_tag, baseline); + /* up_limit_sping */ + if (n) + { + int i; + const unsigned int baseline = tr_torrentGetSpeedLimit_KBps (torrents[0], TR_UP); + + for (i=1; iup_limit_sping, di->up_limit_spin_tag, baseline); } - /* bandwidth_combo */ - if (n) { - const int baseline = tr_torrentGetPriority (torrents[0]); - int i; - for (i=1; ibandwidth_combo; - g_signal_handler_block (w, di->bandwidth_combo_tag); - gtr_priority_combo_set_value (GTK_COMBO_BOX (w), baseline); - g_signal_handler_unblock (w, di->bandwidth_combo_tag); + /* bandwidth_combo */ + if (n) + { + int i; + const int baseline = tr_torrentGetPriority (torrents[0]); + + for (i=1; ibandwidth_combo; + g_signal_handler_block (w, di->bandwidth_combo_tag); + gtr_priority_combo_set_value (GTK_COMBO_BOX (w), baseline); + g_signal_handler_unblock (w, di->bandwidth_combo_tag); } - else - unset_combo (di->bandwidth_combo, di->bandwidth_combo_tag); - } - - /* ratio_combo */ - /* ratio_spin */ - if (n) { - int i; - const int baseline = tr_torrentGetRatioMode (torrents[0]); - for (i=1; iratio_combo; - g_signal_handler_block (w, di->ratio_combo_tag); - gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); - gtr_widget_set_visible (di->ratio_spin, baseline == TR_RATIOLIMIT_SINGLE); - g_signal_handler_unblock (w, di->ratio_combo_tag); + else + { + unset_combo (di->bandwidth_combo, di->bandwidth_combo_tag); } } - if (n) { - const double baseline = tr_torrentGetRatioLimit (torrents[0]); - set_double_spin_if_different (di->ratio_spin, - di->ratio_spin_tag, baseline); - } - /* idle_combo */ - /* idle_spin */ - if (n) { - int i; - const int baseline = tr_torrentGetIdleMode (torrents[0]); - for (i=1; iidle_combo; - g_signal_handler_block (w, di->idle_combo_tag); - gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); - gtr_widget_set_visible (di->idle_spin, baseline == TR_IDLELIMIT_SINGLE); - g_signal_handler_unblock (w, di->idle_combo_tag); + /* ratio_combo */ + if (n) + { + int i; + const int baseline = tr_torrentGetRatioMode (torrents[0]); + + for (i=1; iratio_combo; + g_signal_handler_block (w, di->ratio_combo_tag); + gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); + gtr_widget_set_visible (di->ratio_spin, baseline == TR_RATIOLIMIT_SINGLE); + g_signal_handler_unblock (w, di->ratio_combo_tag); } } - if (n) { - const int baseline = tr_torrentGetIdleLimit (torrents[0]); - set_int_spin_if_different (di->idle_spin, - di->idle_spin_tag, baseline); + + /* ratio_spin */ + if (n) + { + const double baseline = tr_torrentGetRatioLimit (torrents[0]); + set_double_spin_if_different (di->ratio_spin, di->ratio_spin_tag, baseline); } - /* max_peers_spin */ - if (n) { - const int baseline = tr_torrentGetPeerLimit (torrents[0]); - set_int_spin_if_different (di->max_peers_spin, - di->max_peers_spin_tag, baseline); + /* idle_combo */ + if (n) + { + int i; + const int baseline = tr_torrentGetIdleMode (torrents[0]); + + for (i=1; iidle_combo; + g_signal_handler_block (w, di->idle_combo_tag); + gtr_combo_box_set_active_enum (GTK_COMBO_BOX (w), baseline); + gtr_widget_set_visible (di->idle_spin, baseline == TR_IDLELIMIT_SINGLE); + g_signal_handler_unblock (w, di->idle_combo_tag); + } + } + + /* idle_spin */ + if (n) + { + const int baseline = tr_torrentGetIdleLimit (torrents[0]); + set_int_spin_if_different (di->idle_spin, di->idle_spin_tag, baseline); + } + + /* max_peers_spin */ + if (n) + { + const int baseline = tr_torrentGetPeerLimit (torrents[0]); + set_int_spin_if_different (di->max_peers_spin, di->max_peers_spin_tag, baseline); } } static void torrent_set_bool (struct DetailsImpl * di, const tr_quark key, gboolean value) { - GSList *l; - tr_variant top, *args, *ids; + GSList *l; + tr_variant top, *args, *ids; - tr_variantInitDict (&top, 2); - tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); - args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); - tr_variantDictAddBool (args, key, value); - ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); - for (l=di->ids; l; l=l->next) - tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); + tr_variantInitDict (&top, 2); + tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); + args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); + tr_variantDictAddBool (args, key, value); + ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); + for (l=di->ids; l; l=l->next) + tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); - gtr_core_exec (di->core, &top); - tr_variantFree (&top); + gtr_core_exec (di->core, &top); + tr_variantFree (&top); } static void torrent_set_int (struct DetailsImpl * di, const tr_quark key, int value) { - GSList *l; - tr_variant top, *args, *ids; + GSList *l; + tr_variant top, *args, *ids; - tr_variantInitDict (&top, 2); - tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); - args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); - tr_variantDictAddInt (args, key, value); - ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); - for (l=di->ids; l; l=l->next) - tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); + tr_variantInitDict (&top, 2); + tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); + args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); + tr_variantDictAddInt (args, key, value); + ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); + for (l=di->ids; l; l=l->next) + tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); - gtr_core_exec (di->core, &top); - tr_variantFree (&top); + gtr_core_exec (di->core, &top); + tr_variantFree (&top); } static void torrent_set_real (struct DetailsImpl * di, const tr_quark key, double value) { - GSList *l; - tr_variant top, *args, *ids; + GSList *l; + tr_variant top, *args, *ids; - tr_variantInitDict (&top, 2); - tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); - args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); - tr_variantDictAddReal (args, key, value); - ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); - for (l=di->ids; l; l=l->next) - tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); + tr_variantInitDict (&top, 2); + tr_variantDictAddStr (&top, TR_KEY_method, "torrent-set"); + args = tr_variantDictAddDict (&top, TR_KEY_arguments, 2); + tr_variantDictAddReal (args, key, value); + ids = tr_variantDictAddList (args, TR_KEY_ids, g_slist_length (di->ids)); + for (l=di->ids; l; l=l->next) + tr_variantListAddInt (ids, GPOINTER_TO_INT (l->data)); - gtr_core_exec (di->core, &top); - tr_variantFree (&top); + gtr_core_exec (di->core, &top); + tr_variantFree (&top); } static void up_speed_toggled_cb (GtkToggleButton * tb, gpointer d) { - torrent_set_bool (d, TR_KEY_uploadLimited, gtk_toggle_button_get_active (tb)); + torrent_set_bool (d, TR_KEY_uploadLimited, gtk_toggle_button_get_active (tb)); } static void down_speed_toggled_cb (GtkToggleButton *tb, gpointer d) { - torrent_set_bool (d, TR_KEY_downloadLimited, gtk_toggle_button_get_active (tb)); + torrent_set_bool (d, TR_KEY_downloadLimited, gtk_toggle_button_get_active (tb)); } static void global_speed_toggled_cb (GtkToggleButton * tb, gpointer d) { - torrent_set_bool (d, TR_KEY_honorsSessionLimits, gtk_toggle_button_get_active (tb)); + torrent_set_bool (d, TR_KEY_honorsSessionLimits, gtk_toggle_button_get_active (tb)); } static void up_speed_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { - torrent_set_int (di, TR_KEY_uploadLimit, gtk_spin_button_get_value_as_int (s)); + torrent_set_int (di, TR_KEY_uploadLimit, gtk_spin_button_get_value_as_int (s)); } static void down_speed_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { - torrent_set_int (di, TR_KEY_downloadLimit, gtk_spin_button_get_value_as_int (s)); + torrent_set_int (di, TR_KEY_downloadLimit, gtk_spin_button_get_value_as_int (s)); } static void idle_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { - torrent_set_int (di, TR_KEY_seedIdleLimit, gtk_spin_button_get_value_as_int (s)); + torrent_set_int (di, TR_KEY_seedIdleLimit, gtk_spin_button_get_value_as_int (s)); } static void ratio_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { - torrent_set_real (di, TR_KEY_seedRatioLimit, gtk_spin_button_get_value (s)); + torrent_set_real (di, TR_KEY_seedRatioLimit, gtk_spin_button_get_value (s)); } static void max_peers_spun_cb (GtkSpinButton * s, struct DetailsImpl * di) { - torrent_set_int (di, TR_KEY_peer_limit, gtk_spin_button_get_value (s)); + torrent_set_int (di, TR_KEY_peer_limit, gtk_spin_button_get_value (s)); } static void onPriorityChanged (GtkComboBox * combo_box, struct DetailsImpl * di) { - const tr_priority_t priority = gtr_priority_combo_get_value (combo_box); - torrent_set_int (di, TR_KEY_bandwidthPriority, priority); + const tr_priority_t priority = gtr_priority_combo_get_value (combo_box); + torrent_set_int (di, TR_KEY_bandwidthPriority, priority); } static GtkWidget* new_priority_combo (struct DetailsImpl * di) { - GtkWidget * w = gtr_priority_combo_new (); - di->bandwidth_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onPriorityChanged), di); - return w; + GtkWidget * w = gtr_priority_combo_new (); + di->bandwidth_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onPriorityChanged), di); + return w; } static void refresh (struct DetailsImpl * di); @@ -436,113 +465,113 @@ static void refresh (struct DetailsImpl * di); static void onComboEnumChanged (GtkComboBox * combo_box, struct DetailsImpl * di) { - const tr_quark key = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (combo_box), ARG_KEY)); - torrent_set_int (di, key, gtr_combo_box_get_active_enum (combo_box)); - refresh (di); + const tr_quark key = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (combo_box), ARG_KEY)); + torrent_set_int (di, key, gtr_combo_box_get_active_enum (combo_box)); + refresh (di); } static GtkWidget* ratio_combo_new (void) { - GtkWidget * w = gtr_combo_box_new_enum ( - _("Use global settings"), TR_RATIOLIMIT_GLOBAL, - _("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED, - _("Stop seeding at ratio:"), TR_RATIOLIMIT_SINGLE, - NULL); - g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedRatioMode)); - return w; + GtkWidget * w = gtr_combo_box_new_enum ( + _("Use global settings"), TR_RATIOLIMIT_GLOBAL, + _("Seed regardless of ratio"), TR_RATIOLIMIT_UNLIMITED, + _("Stop seeding at ratio:"), TR_RATIOLIMIT_SINGLE, + NULL); + g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedRatioMode)); + return w; } static GtkWidget* idle_combo_new (void) { - GtkWidget * w = gtr_combo_box_new_enum ( - _("Use global settings"), TR_IDLELIMIT_GLOBAL, - _("Seed regardless of activity"), TR_IDLELIMIT_UNLIMITED, - _("Stop seeding if idle for N minutes:"), TR_IDLELIMIT_SINGLE, - NULL); - g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedIdleMode)); - return w; + GtkWidget * w = gtr_combo_box_new_enum ( + _("Use global settings"), TR_IDLELIMIT_GLOBAL, + _("Seed regardless of activity"), TR_IDLELIMIT_UNLIMITED, + _("Stop seeding if idle for N minutes:"), TR_IDLELIMIT_SINGLE, + NULL); + g_object_set_qdata (G_OBJECT (w), ARG_KEY, GINT_TO_POINTER(TR_KEY_seedIdleMode)); + return w; } static GtkWidget* options_page_new (struct DetailsImpl * d) { - guint row; - gulong tag; - char buf[128]; - GtkWidget *t, *w, *tb, *h; + guint row; + gulong tag; + char buf[128]; + GtkWidget *t, *w, *tb, *h; - row = 0; - t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Speed")); + row = 0; + t = hig_workarea_create (); + hig_workarea_add_section_title (t, &row, _("Speed")); - tb = hig_workarea_add_wide_checkbutton (t, &row, _("Honor global _limits"), 0); - d->honor_limits_check = tb; - tag = g_signal_connect (tb, "toggled", G_CALLBACK (global_speed_toggled_cb), d); - d->honor_limits_check_tag = tag; + tb = hig_workarea_add_wide_checkbutton (t, &row, _("Honor global _limits"), 0); + d->honor_limits_check = tb; + tag = g_signal_connect (tb, "toggled", G_CALLBACK (global_speed_toggled_cb), d); + d->honor_limits_check_tag = tag; - g_snprintf (buf, sizeof (buf), _("Limit _download speed (%s):"), _ (speed_K_str)); - tb = gtk_check_button_new_with_mnemonic (buf); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tb), FALSE); - d->down_limited_check = tb; - tag = g_signal_connect (tb, "toggled", G_CALLBACK (down_speed_toggled_cb), d); - d->down_limited_check_tag = tag; + g_snprintf (buf, sizeof (buf), _("Limit _download speed (%s):"), _ (speed_K_str)); + tb = gtk_check_button_new_with_mnemonic (buf); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (tb), FALSE); + d->down_limited_check = tb; + tag = g_signal_connect (tb, "toggled", G_CALLBACK (down_speed_toggled_cb), d); + d->down_limited_check_tag = tag; - w = gtk_spin_button_new_with_range (0, INT_MAX, 5); - tag = g_signal_connect (w, "value-changed", G_CALLBACK (down_speed_spun_cb), d); - d->down_limit_spin_tag = tag; - hig_workarea_add_row_w (t, &row, tb, w, NULL); - d->down_limit_spin = w; + w = gtk_spin_button_new_with_range (0, INT_MAX, 5); + tag = g_signal_connect (w, "value-changed", G_CALLBACK (down_speed_spun_cb), d); + d->down_limit_spin_tag = tag; + hig_workarea_add_row_w (t, &row, tb, w, NULL); + d->down_limit_spin = w; - g_snprintf (buf, sizeof (buf), _("Limit _upload speed (%s):"), _ (speed_K_str)); - tb = gtk_check_button_new_with_mnemonic (buf); - d->up_limited_check = tb; - tag = g_signal_connect (tb, "toggled", G_CALLBACK (up_speed_toggled_cb), d); - d->up_limited_check_tag = tag; + g_snprintf (buf, sizeof (buf), _("Limit _upload speed (%s):"), _ (speed_K_str)); + tb = gtk_check_button_new_with_mnemonic (buf); + d->up_limited_check = tb; + tag = g_signal_connect (tb, "toggled", G_CALLBACK (up_speed_toggled_cb), d); + d->up_limited_check_tag = tag; - w = gtk_spin_button_new_with_range (0, INT_MAX, 5); - tag = g_signal_connect (w, "value-changed", G_CALLBACK (up_speed_spun_cb), d); - d->up_limit_spin_tag = tag; - hig_workarea_add_row_w (t, &row, tb, w, NULL); - d->up_limit_sping = w; + w = gtk_spin_button_new_with_range (0, INT_MAX, 5); + tag = g_signal_connect (w, "value-changed", G_CALLBACK (up_speed_spun_cb), d); + d->up_limit_spin_tag = tag; + hig_workarea_add_row_w (t, &row, tb, w, NULL); + d->up_limit_sping = w; - w = new_priority_combo (d); - hig_workarea_add_row (t, &row, _("Torrent _priority:"), w, NULL); - d->bandwidth_combo = w; + w = new_priority_combo (d); + hig_workarea_add_row (t, &row, _("Torrent _priority:"), w, NULL); + d->bandwidth_combo = w; - hig_workarea_add_section_divider (t, &row); - hig_workarea_add_section_title (t, &row, _("Seeding Limits")); + hig_workarea_add_section_divider (t, &row); + hig_workarea_add_section_title (t, &row, _("Seeding Limits")); - h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); - w = d->ratio_combo = ratio_combo_new (); - d->ratio_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); - gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); - w = d->ratio_spin = gtk_spin_button_new_with_range (0, 1000, .05); - gtk_entry_set_width_chars (GTK_ENTRY (w), 7); - d->ratio_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (ratio_spun_cb), d); - gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); - hig_workarea_add_row (t, &row, _("_Ratio:"), h, NULL); + h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); + w = d->ratio_combo = ratio_combo_new (); + d->ratio_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); + gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); + w = d->ratio_spin = gtk_spin_button_new_with_range (0, 1000, .05); + gtk_entry_set_width_chars (GTK_ENTRY (w), 7); + d->ratio_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (ratio_spun_cb), d); + gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); + hig_workarea_add_row (t, &row, _("_Ratio:"), h, NULL); - h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); - w = d->idle_combo = idle_combo_new (); - d->idle_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); - gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); - w = d->idle_spin = gtk_spin_button_new_with_range (1, INT_MAX, 5); - d->idle_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (idle_spun_cb), d); - gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); - hig_workarea_add_row (t, &row, _("_Idle:"), h, NULL); + h = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD); + w = d->idle_combo = idle_combo_new (); + d->idle_combo_tag = g_signal_connect (w, "changed", G_CALLBACK (onComboEnumChanged), d); + gtk_box_pack_start (GTK_BOX (h), w, TRUE, TRUE, 0); + w = d->idle_spin = gtk_spin_button_new_with_range (1, INT_MAX, 5); + d->idle_spin_tag = g_signal_connect (w, "value-changed", G_CALLBACK (idle_spun_cb), d); + gtk_box_pack_start (GTK_BOX (h), w, FALSE, FALSE, 0); + hig_workarea_add_row (t, &row, _("_Idle:"), h, NULL); - hig_workarea_add_section_divider (t, &row); - hig_workarea_add_section_title (t, &row, _("Peer Connections")); + hig_workarea_add_section_divider (t, &row); + hig_workarea_add_section_title (t, &row, _("Peer Connections")); - w = gtk_spin_button_new_with_range (1, 3000, 5); - hig_workarea_add_row (t, &row, _("_Maximum peers:"), w, w); - tag = g_signal_connect (w, "value-changed", G_CALLBACK (max_peers_spun_cb), d); - d->max_peers_spin = w; - d->max_peers_spin_tag = tag; + w = gtk_spin_button_new_with_range (1, 3000, 5); + hig_workarea_add_row (t, &row, _("_Maximum peers:"), w, w); + tag = g_signal_connect (w, "value-changed", G_CALLBACK (max_peers_spun_cb), d); + d->max_peers_spin = w; + d->max_peers_spin_tag = tag; - return t; + return t; } /**** @@ -554,18 +583,18 @@ options_page_new (struct DetailsImpl * d) static const char * activityString (int activity, bool finished) { - switch (activity) + switch (activity) { - case TR_STATUS_CHECK_WAIT: return _("Queued for verification"); - case TR_STATUS_CHECK: return _("Verifying local data"); - case TR_STATUS_DOWNLOAD_WAIT: return _("Queued for download"); - case TR_STATUS_DOWNLOAD: return C_("Verb", "Downloading"); - case TR_STATUS_SEED_WAIT: return _("Queued for seeding"); - case TR_STATUS_SEED: return C_("Verb", "Seeding"); - case TR_STATUS_STOPPED: return finished ? _("Finished") : _("Paused"); + case TR_STATUS_CHECK_WAIT: return _("Queued for verification"); + case TR_STATUS_CHECK: return _("Verifying local data"); + case TR_STATUS_DOWNLOAD_WAIT: return _("Queued for download"); + case TR_STATUS_DOWNLOAD: return C_("Verb", "Downloading"); + case TR_STATUS_SEED_WAIT: return _("Queued for seeding"); + case TR_STATUS_SEED: return C_("Verb", "Seeding"); + case TR_STATUS_STOPPED: return finished ? _("Finished") : _("Paused"); } - return ""; + return ""; } /* Only call gtk_text_buffer_set_text () if the new text differs from the old. @@ -573,458 +602,543 @@ activityString (int activity, bool finished) static void gtr_text_buffer_set_text (GtkTextBuffer * b, const char * str) { - char * old_str; - GtkTextIter start, end; + char * old_str; + GtkTextIter start, end; - if (str == NULL) - str = ""; + if (str == NULL) + str = ""; - gtk_text_buffer_get_bounds (b, &start, &end); - old_str = gtk_text_buffer_get_text (b, &start, &end, FALSE); + gtk_text_buffer_get_bounds (b, &start, &end); + old_str = gtk_text_buffer_get_text (b, &start, &end, FALSE); - if ((old_str == NULL) || strcmp (old_str, str)) - gtk_text_buffer_set_text (b, str, -1); + if ((old_str == NULL) || strcmp (old_str, str)) + gtk_text_buffer_set_text (b, str, -1); - g_free (old_str); + g_free (old_str); } static char* get_short_date_string (time_t t) { - char buf[64]; - struct tm tm; + char buf[64]; + struct tm tm; - if (!t) - return g_strdup (_("N/A")); + if (!t) + return g_strdup (_("N/A")); - tr_localtime_r (&t, &tm); - strftime (buf, sizeof (buf), "%d %b %Y", &tm); - return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); + tr_localtime_r (&t, &tm); + strftime (buf, sizeof (buf), "%d %b %Y", &tm); + return g_locale_to_utf8 (buf, -1, NULL, NULL, NULL); }; static void refreshInfo (struct DetailsImpl * di, tr_torrent ** torrents, int n) { - int i; - const char * str; - const char * mixed = _("Mixed"); - const char * no_torrent = _("No Torrents Selected"); - const char * stateString; - char buf[512]; - uint64_t sizeWhenDone = 0; - const tr_stat ** stats = g_new (const tr_stat*, n); - const tr_info ** infos = g_new (const tr_info*, n); - for (i=0; iisPrivate; - for (i=1; iisPrivate) - break; - if (i!=n) - str = mixed; - else if (baseline) - str = _("Private to this tracker -- DHT and PEX disabled"); - else - str = _("Public torrent"); - } - gtr_label_set_text (GTK_LABEL (di->privacy_lb), str); - - - /* origin_lb */ - if (n<=0) - str = no_torrent; - else { - const char * creator = infos[0]->creator ? infos[0]->creator : ""; - const time_t date = infos[0]->dateCreated; - char * datestr = get_short_date_string (date); - gboolean mixed_creator = FALSE; - gboolean mixed_date = FALSE; - - for (i=1; icreator ? infos[i]->creator : ""); - mixed_date |= (date != infos[i]->dateCreated); - } - if (mixed_date && mixed_creator) - str = mixed; - else { - if (mixed_date) - g_snprintf (buf, sizeof (buf), _("Created by %1$s"), creator); - else if (mixed_creator || !*creator) - g_snprintf (buf, sizeof (buf), _("Created on %1$s"), datestr); - else - g_snprintf (buf, sizeof (buf), _("Created by %1$s on %2$s"), creator, datestr); - str = buf; - } - - g_free (datestr); - } - gtr_label_set_text (GTK_LABEL (di->origin_lb), str); - - - /* comment_buffer */ - if (n<=0) - str = ""; - else { - const char * baseline = infos[0]->comment ? infos[0]->comment : ""; - for (i=1; icomment ? infos[i]->comment : "")) - break; - if (i==n) - str = baseline; - else - str = mixed; - } - gtr_text_buffer_set_text (di->comment_buffer, str); - - /* destination_lb */ - if (n<=0) - str = no_torrent; - else { - const char * baseline = tr_torrentGetDownloadDir (torrents[0]); - for (i=1; idestination_lb), str); - - /* state_lb */ - if (n<=0) - str = no_torrent; - else { - const tr_torrent_activity activity = stats[0]->activity; - bool allFinished = stats[0]->finished; - for (i=1; iactivity) - break; - if (!stats[i]->finished) - allFinished = FALSE; - } - str = istate_lb), str); - - - /* date started */ - if (n<=0) - str = no_torrent; - else { - const time_t baseline = stats[0]->startDate; - for (i=1; istartDate) - break; - if (i != n) - str = mixed; - else if ((baseline<=0) || (stats[0]->activity == TR_STATUS_STOPPED)) - str = stateString; - else - str = tr_strltime (buf, time (NULL)-baseline, sizeof (buf)); - } - gtr_label_set_text (GTK_LABEL (di->date_started_lb), str); - - - /* eta */ - if (n<=0) - str = no_torrent; - else { - const int baseline = stats[0]->eta; - for (i=1; ieta) - break; - if (i!=n) - str = mixed; - else if (baseline < 0) - str = _("Unknown"); - else - str = tr_strltime (buf, baseline, sizeof (buf)); - } - gtr_label_set_text (GTK_LABEL (di->eta_lb), str); - - - /* size_lb */ + for (i=0; itotalSize; - pieces += infos[i]->pieceCount; - if (!pieceSize) - pieceSize = infos[i]->pieceSize; - else if (pieceSize != (int)infos[i]->pieceSize) - pieceSize = -1; - } - tr_strlsize (sizebuf, size, sizeof (sizebuf)); - if (!size) - str = ""; - else if (pieceSize >= 0) { - char piecebuf[128]; - tr_formatter_mem_B (piecebuf, pieceSize, sizeof (piecebuf)); - g_snprintf (buf, sizeof (buf), - ngettext ("%1$s (%2$'d piece @ %3$s)", - "%1$s (%2$'d pieces @ %3$s)", pieces), - sizebuf, pieces, piecebuf); - str = buf; - } else { - g_snprintf (buf, sizeof (buf), - ngettext ("%1$s (%2$'d piece)", - "%1$s (%2$'d pieces)", pieces), - sizebuf, pieces); - str = buf; - } - gtr_label_set_text (GTK_LABEL (di->size_lb), str); + stats[i] = tr_torrentStatCached (torrents[i]); + infos[i] = tr_torrentInfo (torrents[i]); } - - /* have_lb */ - if (n <= 0) - str = no_torrent; - else { - uint64_t leftUntilDone = 0; - uint64_t haveUnchecked = 0; - uint64_t haveValid = 0; - uint64_t available = 0; - for (i=0; ihaveUnchecked; - haveValid += st->haveValid; - sizeWhenDone += st->sizeWhenDone; - leftUntilDone += st->leftUntilDone; - available += st->sizeWhenDone - st->leftUntilDone + st->desiredAvailable; - } - { - char buf2[32], unver[64], total[64], avail[32]; - const double d = sizeWhenDone ? (100.0 * available) / sizeWhenDone : 0; - const double ratio = 100.0 * (sizeWhenDone ? (haveValid + haveUnchecked) / (double)sizeWhenDone : 1); - tr_strlpercent (avail, d, sizeof (avail)); - tr_strlpercent (buf2, ratio, sizeof (buf2)); - tr_strlsize (total, haveUnchecked + haveValid, sizeof (total)); - tr_strlsize (unver, haveUnchecked, sizeof (unver)); - if (!haveUnchecked && !leftUntilDone) - g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%%)"), total, buf2); - else if (!haveUnchecked) - g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available)"), total, buf2, avail); - else - g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available); %4$s Unverified"), total, buf2, avail, unver); - str = buf; - } + /* privacy_lb */ + if (n<=0) + { + str = no_torrent; } - gtr_label_set_text (GTK_LABEL (di->have_lb), str); + else + { + const bool baseline = infos[0]->isPrivate; - /* dl_lb */ - if (n <= 0) - str = no_torrent; - else { - char dbuf[64], fbuf[64]; - uint64_t d=0, f=0; - for (i=0; idownloadedEver; - f += stats[i]->corruptEver; - } - tr_strlsize (dbuf, d, sizeof (dbuf)); - tr_strlsize (fbuf, f, sizeof (fbuf)); - if (f) - g_snprintf (buf, sizeof (buf), _("%1$s (+%2$s corrupt)"), dbuf, fbuf); - else - tr_strlcpy (buf, dbuf, sizeof (buf)); - str = buf; - } - gtr_label_set_text (GTK_LABEL (di->dl_lb), str); + for (i=1; iisPrivate) + break; - - /* ul_lb */ - if (n <= 0) - str = no_torrent; - else { - char upstr[64]; - char ratiostr[64]; - uint64_t up = 0; - uint64_t down = 0; - for (i=0; iuploadedEver; - down += stats[i]->downloadedEver; - } - tr_strlsize (upstr, up, sizeof (upstr)); - tr_strlratio (ratiostr, tr_getRatio (up, down), sizeof (ratiostr)); - g_snprintf (buf, sizeof (buf), _("%s (Ratio: %s)"), upstr, ratiostr); - str = buf; - } - gtr_label_set_text (GTK_LABEL (di->ul_lb), str); - - /* hash_lb */ - if (n <= 0) - str = no_torrent; - else if (n==1) - str = infos[0]->hashString; - else + if (i!=n) str = mixed; - gtr_label_set_text (GTK_LABEL (di->hash_lb), str); - - /* error */ - if (n <= 0) - str = no_torrent; - else { - const char * baseline = stats[0]->errorString; - for (i=1; ierrorString)) - break; - if (i==n) - str = baseline; - else - str = mixed; + else if (baseline) + str = _("Private to this tracker -- DHT and PEX disabled"); + else + str = _("Public torrent"); } - if (!str || !*str) - str = _("No errors"); - gtr_label_set_text (GTK_LABEL (di->error_lb), str); + gtr_label_set_text (GTK_LABEL (di->privacy_lb), str); - /* activity date */ - if (n <= 0) - str = no_torrent; - else { - time_t latest = 0; - for (i=0; iactivityDate) - latest = stats[i]->activityDate; - if (latest <= 0) - str = _("Never"); - else { - const int period = time (NULL) - latest; - if (period < 5) - tr_strlcpy (buf, _("Active now"), sizeof (buf)); - else { - char tbuf[128]; - tr_strltime (tbuf, period, sizeof (tbuf)); - g_snprintf (buf, sizeof (buf), _("%1$s ago"), tbuf); + /* origin_lb */ + if (n<=0) + { + str = no_torrent; + } + else + { + const char * creator = infos[0]->creator ? infos[0]->creator : ""; + const time_t date = infos[0]->dateCreated; + char * datestr = get_short_date_string (date); + gboolean mixed_creator = FALSE; + gboolean mixed_date = FALSE; + + for (i=1; icreator ? infos[i]->creator : ""); + mixed_date |= (date != infos[i]->dateCreated); + } + + if (mixed_date && mixed_creator) + { + str = mixed; + } + else + { + if (mixed_date) + g_snprintf (buf, sizeof (buf), _("Created by %1$s"), creator); + else if (mixed_creator || !*creator) + g_snprintf (buf, sizeof (buf), _("Created on %1$s"), datestr); + else + g_snprintf (buf, sizeof (buf), _("Created by %1$s on %2$s"), creator, datestr); + str = buf; + } + + g_free (datestr); + } + gtr_label_set_text (GTK_LABEL (di->origin_lb), str); + + + /* comment_buffer */ + if (n<=0) + { + str = ""; + } + else + { + const char * baseline = infos[0]->comment ? infos[0]->comment : ""; + + for (i=1; icomment ? infos[i]->comment : "")) + break; + + if (i==n) + str = baseline; + else + str = mixed; + } + gtr_text_buffer_set_text (di->comment_buffer, str); + + /* destination_lb */ + if (n<=0) + { + str = no_torrent; + } + else + { + const char * baseline = tr_torrentGetDownloadDir (torrents[0]); + + for (i=1; idestination_lb), str); + + /* state_lb */ + if (n<=0) + { + str = no_torrent; + } + else + { + const tr_torrent_activity activity = stats[0]->activity; + bool allFinished = stats[0]->finished; + + for (i=1; iactivity) + break; + if (!stats[i]->finished) + allFinished = FALSE; + } + + str = istate_lb), str); + + + /* date started */ + if (n<=0) + { + str = no_torrent; + } + else + { + const time_t baseline = stats[0]->startDate; + + for (i=1; istartDate) + break; + + if (i != n) + str = mixed; + else if ((baseline<=0) || (stats[0]->activity == TR_STATUS_STOPPED)) + str = stateString; + else + str = tr_strltime (buf, time (NULL)-baseline, sizeof (buf)); + } + gtr_label_set_text (GTK_LABEL (di->date_started_lb), str); + + + /* eta */ + if (n<=0) + { + str = no_torrent; + } + else + { + const int baseline = stats[0]->eta; + + for (i=1; ieta) + break; + + if (i!=n) + str = mixed; + else if (baseline < 0) + str = _("Unknown"); + else + str = tr_strltime (buf, baseline, sizeof (buf)); + } + gtr_label_set_text (GTK_LABEL (di->eta_lb), str); + + + /* size_lb */ + { + char sizebuf[128]; + uint64_t size = 0; + int pieces = 0; + int32_t pieceSize = 0; + + for (i=0; itotalSize; + pieces += infos[i]->pieceCount; + + if (!pieceSize) + pieceSize = infos[i]->pieceSize; + else if (pieceSize != (int)infos[i]->pieceSize) + pieceSize = -1; + } + + tr_strlsize (sizebuf, size, sizeof (sizebuf)); + if (!size) + str = ""; + else if (pieceSize >= 0) + { + char piecebuf[128]; + tr_formatter_mem_B (piecebuf, pieceSize, sizeof (piecebuf)); + g_snprintf (buf, sizeof (buf), + ngettext ("%1$s (%2$'d piece @ %3$s)", + "%1$s (%2$'d pieces @ %3$s)", pieces), + sizebuf, pieces, piecebuf); + str = buf; + } + else + { + g_snprintf (buf, sizeof (buf), + ngettext ("%1$s (%2$'d piece)", + "%1$s (%2$'d pieces)", pieces), + sizebuf, pieces); + str = buf; + } + gtr_label_set_text (GTK_LABEL (di->size_lb), str); + } + + + /* have_lb */ + if (n <= 0) + { + str = no_torrent; + } + else + { + uint64_t leftUntilDone = 0; + uint64_t haveUnchecked = 0; + uint64_t haveValid = 0; + uint64_t available = 0; + + for (i=0; ihaveUnchecked; + haveValid += st->haveValid; + sizeWhenDone += st->sizeWhenDone; + leftUntilDone += st->leftUntilDone; + available += st->sizeWhenDone - st->leftUntilDone + st->desiredAvailable; + } + + { + char buf2[32], unver[64], total[64], avail[32]; + const double d = sizeWhenDone ? (100.0 * available) / sizeWhenDone : 0; + const double ratio = 100.0 * (sizeWhenDone ? (haveValid + haveUnchecked) / (double)sizeWhenDone : 1); + + tr_strlpercent (avail, d, sizeof (avail)); + tr_strlpercent (buf2, ratio, sizeof (buf2)); + tr_strlsize (total, haveUnchecked + haveValid, sizeof (total)); + tr_strlsize (unver, haveUnchecked, sizeof (unver)); + + if (!haveUnchecked && !leftUntilDone) + g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%%)"), total, buf2); + else if (!haveUnchecked) + g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available)"), total, buf2, avail); + else + g_snprintf (buf, sizeof (buf), _("%1$s (%2$s%% of %3$s%% Available); %4$s Unverified"), total, buf2, avail, unver); + + str = buf; + } + } + gtr_label_set_text (GTK_LABEL (di->have_lb), str); + + /* dl_lb */ + if (n <= 0) + { + str = no_torrent; + } + else + { + char dbuf[64], fbuf[64]; + uint64_t d=0, f=0; + + for (i=0; idownloadedEver; + f += stats[i]->corruptEver; + } + + tr_strlsize (dbuf, d, sizeof (dbuf)); + tr_strlsize (fbuf, f, sizeof (fbuf)); + + if (f) + g_snprintf (buf, sizeof (buf), _("%1$s (+%2$s corrupt)"), dbuf, fbuf); + else + tr_strlcpy (buf, dbuf, sizeof (buf)); + str = buf; + } + gtr_label_set_text (GTK_LABEL (di->dl_lb), str); + + + /* ul_lb */ + if (n <= 0) + { + str = no_torrent; + } + else + { + char upstr[64]; + char ratiostr[64]; + uint64_t up = 0; + uint64_t down = 0; + + for (i=0; iuploadedEver; + down += stats[i]->downloadedEver; + } + + tr_strlsize (upstr, up, sizeof (upstr)); + tr_strlratio (ratiostr, tr_getRatio (up, down), sizeof (ratiostr)); + g_snprintf (buf, sizeof (buf), _("%s (Ratio: %s)"), upstr, ratiostr); + str = buf; + } + gtr_label_set_text (GTK_LABEL (di->ul_lb), str); + + /* hash_lb */ + if (n <= 0) + str = no_torrent; + else if (n==1) + str = infos[0]->hashString; + else + str = mixed; + gtr_label_set_text (GTK_LABEL (di->hash_lb), str); + + /* error */ + if (n <= 0) + { + str = no_torrent; + } + else + { + const char * baseline = stats[0]->errorString; + + for (i=1; ierrorString)) + break; + + if (i==n) + str = baseline; + else + str = mixed; + } + if (!str || !*str) + str = _("No errors"); + gtr_label_set_text (GTK_LABEL (di->error_lb), str); + + + /* activity date */ + if (n <= 0) + { + str = no_torrent; + } + else + { + time_t latest = 0; + + for (i=0; iactivityDate) + latest = stats[i]->activityDate; + + if (latest <= 0) + { + str = _("Never"); + } + else + { + const int period = time (NULL) - latest; + if (period < 5) + { + tr_strlcpy (buf, _("Active now"), sizeof (buf)); } - str = buf; + else + { + char tbuf[128]; + tr_strltime (tbuf, period, sizeof (tbuf)); + g_snprintf (buf, sizeof (buf), _("%1$s ago"), tbuf); + } + str = buf; } } - gtr_label_set_text (GTK_LABEL (di->last_activity_lb), str); + gtr_label_set_text (GTK_LABEL (di->last_activity_lb), str); - g_free (stats); - g_free (infos); + g_free (stats); + g_free (infos); } static GtkWidget* info_page_new (struct DetailsImpl * di) { - guint row = 0; - GtkTextBuffer * b; - GtkWidget *l, *w, *fr, *sw; - GtkWidget *t = hig_workarea_create (); + guint row = 0; + GtkTextBuffer * b; + GtkWidget *l, *w, *fr, *sw; + GtkWidget *t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Activity")); + hig_workarea_add_section_title (t, &row, _("Activity")); - /* size */ - l = di->size_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Torrent size:"), l, NULL); + /* size */ + l = di->size_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Torrent size:"), l, NULL); - /* have */ - l = di->have_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Have:"), l, NULL); + /* have */ + l = di->have_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Have:"), l, NULL); - /* downloaded */ - l = di->dl_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); + /* downloaded */ + l = di->dl_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); - /* uploaded */ - l = di->ul_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); + /* uploaded */ + l = di->ul_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); - /* state */ - l = di->state_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("State:"), l, NULL); + /* state */ + l = di->state_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("State:"), l, NULL); - /* running for */ - l = di->date_started_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Running time:"), l, NULL); + /* running for */ + l = di->date_started_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Running time:"), l, NULL); - /* eta */ - l = di->eta_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Remaining time:"), l, NULL); + /* eta */ + l = di->eta_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Remaining time:"), l, NULL); - /* last activity */ - l = di->last_activity_lb = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Last activity:"), l, NULL); + /* last activity */ + l = di->last_activity_lb = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Last activity:"), l, NULL); - /* error */ - l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - hig_workarea_add_row (t, &row, _("Error:"), l, NULL); - di->error_lb = l; + /* error */ + l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + hig_workarea_add_row (t, &row, _("Error:"), l, NULL); + di->error_lb = l; + hig_workarea_add_section_divider (t, &row); + hig_workarea_add_section_title (t, &row, _("Details")); - hig_workarea_add_section_divider (t, &row); - hig_workarea_add_section_title (t, &row, _("Details")); + /* destination */ + l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + hig_workarea_add_row (t, &row, _("Location:"), l, NULL); + di->destination_lb = l; - /* destination */ - l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - hig_workarea_add_row (t, &row, _("Location:"), l, NULL); - di->destination_lb = l; + /* hash */ + l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + hig_workarea_add_row (t, &row, _("Hash:"), l, NULL); + di->hash_lb = l; - /* hash */ - l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - hig_workarea_add_row (t, &row, _("Hash:"), l, NULL); - di->hash_lb = l; + /* privacy */ + l = gtk_label_new (NULL); + gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); + hig_workarea_add_row (t, &row, _("Privacy:"), l, NULL); + di->privacy_lb = l; - /* privacy */ - l = gtk_label_new (NULL); - gtk_label_set_single_line_mode (GTK_LABEL (l), TRUE); - hig_workarea_add_row (t, &row, _("Privacy:"), l, NULL); - di->privacy_lb = l; + /* origins */ + l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, + "ellipsize", PANGO_ELLIPSIZE_END, + NULL); + hig_workarea_add_row (t, &row, _("Origin:"), l, NULL); + di->origin_lb = l; - /* origins */ - l = g_object_new (GTK_TYPE_LABEL, "selectable", TRUE, - "ellipsize", PANGO_ELLIPSIZE_END, - NULL); - hig_workarea_add_row (t, &row, _("Origin:"), l, NULL); - di->origin_lb = l; + /* comment */ + b = di->comment_buffer = gtk_text_buffer_new (NULL); + w = gtk_text_view_new_with_buffer (b); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (w), GTK_WRAP_WORD); + gtk_text_view_set_editable (GTK_TEXT_VIEW (w), FALSE); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_size_request (sw, 350, 36); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), w); + fr = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (fr), sw); + w = hig_workarea_add_tall_row (t, &row, _("Comment:"), fr, NULL); + gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.0f); - /* comment */ - b = di->comment_buffer = gtk_text_buffer_new (NULL); - w = gtk_text_view_new_with_buffer (b); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (w), GTK_WRAP_WORD); - gtk_text_view_set_editable (GTK_TEXT_VIEW (w), FALSE); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_set_size_request (sw, 350, 36); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), w); - fr = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (fr), sw); - w = hig_workarea_add_tall_row (t, &row, _("Comment:"), fr, NULL); - gtk_misc_set_alignment (GTK_MISC (w), 0.0f, 0.0f); - - hig_workarea_add_section_divider (t, &row); - return t; + hig_workarea_add_section_divider (t, &row); + return t; } /**** @@ -1035,125 +1149,125 @@ info_page_new (struct DetailsImpl * di) enum { - WEBSEED_COL_KEY, - WEBSEED_COL_WAS_UPDATED, - WEBSEED_COL_URL, - WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, - WEBSEED_COL_DOWNLOAD_RATE_STRING, - N_WEBSEED_COLS + WEBSEED_COL_KEY, + WEBSEED_COL_WAS_UPDATED, + WEBSEED_COL_URL, + WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, + WEBSEED_COL_DOWNLOAD_RATE_STRING, + N_WEBSEED_COLS }; static const char* getWebseedColumnNames (int column) { - switch (column) + switch (column) { - case WEBSEED_COL_URL: return _("Web Seeds"); - case WEBSEED_COL_DOWNLOAD_RATE_DOUBLE: - case WEBSEED_COL_DOWNLOAD_RATE_STRING: return _("Down"); - default: return ""; + case WEBSEED_COL_URL: return _("Web Seeds"); + case WEBSEED_COL_DOWNLOAD_RATE_DOUBLE: + case WEBSEED_COL_DOWNLOAD_RATE_STRING: return _("Down"); + default: return ""; } } static GtkListStore* webseed_model_new (void) { - return gtk_list_store_new (N_WEBSEED_COLS, - G_TYPE_STRING, /* key */ - G_TYPE_BOOLEAN, /* was-updated */ - G_TYPE_STRING, /* url */ - G_TYPE_DOUBLE, /* download rate double */ - G_TYPE_STRING); /* download rate string */ + return gtk_list_store_new (N_WEBSEED_COLS, + G_TYPE_STRING, /* key */ + G_TYPE_BOOLEAN, /* was-updated */ + G_TYPE_STRING, /* url */ + G_TYPE_DOUBLE, /* download rate double */ + G_TYPE_STRING); /* download rate string */ } enum { - PEER_COL_KEY, - PEER_COL_WAS_UPDATED, - PEER_COL_ADDRESS, - PEER_COL_ADDRESS_COLLATED, - PEER_COL_DOWNLOAD_RATE_DOUBLE, - PEER_COL_DOWNLOAD_RATE_STRING, - PEER_COL_UPLOAD_RATE_DOUBLE, - PEER_COL_UPLOAD_RATE_STRING, - PEER_COL_CLIENT, - PEER_COL_PROGRESS, - PEER_COL_UPLOAD_REQUEST_COUNT_INT, - PEER_COL_UPLOAD_REQUEST_COUNT_STRING, - PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, - PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, - PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, - PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, - PEER_COL_BLOCKS_UPLOADED_COUNT_INT, - PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, - PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, - PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, - PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, - PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, - PEER_COL_ENCRYPTION_STOCK_ID, - PEER_COL_FLAGS, - PEER_COL_TORRENT_NAME, - N_PEER_COLS + PEER_COL_KEY, + PEER_COL_WAS_UPDATED, + PEER_COL_ADDRESS, + PEER_COL_ADDRESS_COLLATED, + PEER_COL_DOWNLOAD_RATE_DOUBLE, + PEER_COL_DOWNLOAD_RATE_STRING, + PEER_COL_UPLOAD_RATE_DOUBLE, + PEER_COL_UPLOAD_RATE_STRING, + PEER_COL_CLIENT, + PEER_COL_PROGRESS, + PEER_COL_UPLOAD_REQUEST_COUNT_INT, + PEER_COL_UPLOAD_REQUEST_COUNT_STRING, + PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, + PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, + PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, + PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, + PEER_COL_BLOCKS_UPLOADED_COUNT_INT, + PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, + PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, + PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, + PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, + PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, + PEER_COL_ENCRYPTION_STOCK_ID, + PEER_COL_FLAGS, + PEER_COL_TORRENT_NAME, + N_PEER_COLS }; static const char* getPeerColumnName (int column) { - switch (column) + switch (column) { - case PEER_COL_ADDRESS: return _("Address"); - case PEER_COL_DOWNLOAD_RATE_STRING: - case PEER_COL_DOWNLOAD_RATE_DOUBLE: return _("Down"); - case PEER_COL_UPLOAD_RATE_STRING: - case PEER_COL_UPLOAD_RATE_DOUBLE: return _("Up"); - case PEER_COL_CLIENT: return _("Client"); - case PEER_COL_PROGRESS: return _("%"); - case PEER_COL_UPLOAD_REQUEST_COUNT_INT: - case PEER_COL_UPLOAD_REQUEST_COUNT_STRING: return _("Up Reqs"); - case PEER_COL_DOWNLOAD_REQUEST_COUNT_INT: - case PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING: return _("Dn Reqs"); - case PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT: - case PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING: return _("Dn Blocks"); - case PEER_COL_BLOCKS_UPLOADED_COUNT_INT: - case PEER_COL_BLOCKS_UPLOADED_COUNT_STRING: return _("Up Blocks"); - case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT: - case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING: return _("We Cancelled"); - case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT: - case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING: return _("They Cancelled"); - case PEER_COL_FLAGS: return _("Flags"); - default: return ""; + case PEER_COL_ADDRESS: return _("Address"); + case PEER_COL_DOWNLOAD_RATE_STRING: + case PEER_COL_DOWNLOAD_RATE_DOUBLE: return _("Down"); + case PEER_COL_UPLOAD_RATE_STRING: + case PEER_COL_UPLOAD_RATE_DOUBLE: return _("Up"); + case PEER_COL_CLIENT: return _("Client"); + case PEER_COL_PROGRESS: return _("%"); + case PEER_COL_UPLOAD_REQUEST_COUNT_INT: + case PEER_COL_UPLOAD_REQUEST_COUNT_STRING: return _("Up Reqs"); + case PEER_COL_DOWNLOAD_REQUEST_COUNT_INT: + case PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING: return _("Dn Reqs"); + case PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT: + case PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING: return _("Dn Blocks"); + case PEER_COL_BLOCKS_UPLOADED_COUNT_INT: + case PEER_COL_BLOCKS_UPLOADED_COUNT_STRING: return _("Up Blocks"); + case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT: + case PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING: return _("We Cancelled"); + case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT: + case PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING: return _("They Cancelled"); + case PEER_COL_FLAGS: return _("Flags"); + default: return ""; } } static GtkListStore* peer_store_new (void) { - return gtk_list_store_new (N_PEER_COLS, - G_TYPE_STRING, /* key */ - G_TYPE_BOOLEAN, /* was-updated */ - G_TYPE_STRING, /* address */ - G_TYPE_STRING, /* collated address */ - G_TYPE_DOUBLE, /* download speed int */ - G_TYPE_STRING, /* download speed string */ - G_TYPE_DOUBLE, /* upload speed int */ - G_TYPE_STRING, /* upload speed string */ - G_TYPE_STRING, /* client */ - G_TYPE_INT, /* progress [0..100] */ - G_TYPE_INT, /* upload request count int */ - G_TYPE_STRING, /* upload request count string */ - G_TYPE_INT, /* download request count int */ - G_TYPE_STRING, /* download request count string */ - G_TYPE_INT, /* # blocks downloaded int */ - G_TYPE_STRING, /* # blocks downloaded string */ - G_TYPE_INT, /* # blocks uploaded int */ - G_TYPE_STRING, /* # blocks uploaded string */ - G_TYPE_INT, /* # blocks cancelled by client int */ - G_TYPE_STRING, /* # blocks cancelled by client string */ - G_TYPE_INT, /* # blocks cancelled by peer int */ - G_TYPE_STRING, /* # blocks cancelled by peer string */ - G_TYPE_STRING, /* encryption stock id */ - G_TYPE_STRING, /* flagString */ - G_TYPE_STRING); /* torrent name */ + return gtk_list_store_new (N_PEER_COLS, + G_TYPE_STRING, /* key */ + G_TYPE_BOOLEAN, /* was-updated */ + G_TYPE_STRING, /* address */ + G_TYPE_STRING, /* collated address */ + G_TYPE_DOUBLE, /* download speed int */ + G_TYPE_STRING, /* download speed string */ + G_TYPE_DOUBLE, /* upload speed int */ + G_TYPE_STRING, /* upload speed string */ + G_TYPE_STRING, /* client */ + G_TYPE_INT, /* progress [0..100] */ + G_TYPE_INT, /* upload request count int */ + G_TYPE_STRING, /* upload request count string */ + G_TYPE_INT, /* download request count int */ + G_TYPE_STRING, /* download request count string */ + G_TYPE_INT, /* # blocks downloaded int */ + G_TYPE_STRING, /* # blocks downloaded string */ + G_TYPE_INT, /* # blocks uploaded int */ + G_TYPE_STRING, /* # blocks uploaded string */ + G_TYPE_INT, /* # blocks cancelled by client int */ + G_TYPE_STRING, /* # blocks cancelled by client string */ + G_TYPE_INT, /* # blocks cancelled by peer int */ + G_TYPE_STRING, /* # blocks cancelled by peer string */ + G_TYPE_STRING, /* encryption stock id */ + G_TYPE_STRING, /* flagString */ + G_TYPE_STRING); /* torrent name */ } static void @@ -1163,27 +1277,27 @@ initPeerRow (GtkListStore * store, const char * torrentName, const tr_peer_stat * peer) { - int q[4]; - char collated_name[128]; - const char * client = peer->client; + int q[4]; + char collated_name[128]; + const char * client = peer->client; - if (!client || !strcmp (client, "Unknown Client")) - client = ""; + if (!client || !strcmp (client, "Unknown Client")) + client = ""; - if (sscanf (peer->addr, "%d.%d.%d.%d", q, q+1, q+2, q+3) != 4) - g_strlcpy (collated_name, peer->addr, sizeof (collated_name)); - else - g_snprintf (collated_name, sizeof (collated_name), - "%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3]); + if (sscanf (peer->addr, "%d.%d.%d.%d", q, q+1, q+2, q+3) != 4) + g_strlcpy (collated_name, peer->addr, sizeof (collated_name)); + else + g_snprintf (collated_name, sizeof (collated_name), + "%03d.%03d.%03d.%03d", q[0], q[1], q[2], q[3]); - gtk_list_store_set (store, iter, - PEER_COL_ADDRESS, peer->addr, - PEER_COL_ADDRESS_COLLATED, collated_name, - PEER_COL_CLIENT, client, - PEER_COL_ENCRYPTION_STOCK_ID, peer->isEncrypted ? "transmission-lock" : NULL, - PEER_COL_KEY, key, - PEER_COL_TORRENT_NAME, torrentName, - -1); + gtk_list_store_set (store, iter, + PEER_COL_ADDRESS, peer->addr, + PEER_COL_ADDRESS_COLLATED, collated_name, + PEER_COL_CLIENT, client, + PEER_COL_ENCRYPTION_STOCK_ID, peer->isEncrypted ? "transmission-lock" : NULL, + PEER_COL_KEY, key, + PEER_COL_TORRENT_NAME, torrentName, + -1); } static void @@ -1191,250 +1305,276 @@ refreshPeerRow (GtkListStore * store, GtkTreeIter * iter, const tr_peer_stat * peer) { - char up_speed[64] = { '\0' }; - char down_speed[64] = { '\0' }; - char up_count[64] = { '\0' }; - char down_count[64] = { '\0' }; - char blocks_to_peer[64] = { '\0' }; - char blocks_to_client[64] = { '\0' }; - char cancelled_by_peer[64] = { '\0' }; - char cancelled_by_client[64] = { '\0' }; + char up_speed[64] = { '\0' }; + char down_speed[64] = { '\0' }; + char up_count[64] = { '\0' }; + char down_count[64] = { '\0' }; + char blocks_to_peer[64] = { '\0' }; + char blocks_to_client[64] = { '\0' }; + char cancelled_by_peer[64] = { '\0' }; + char cancelled_by_client[64] = { '\0' }; - if (peer->rateToPeer_KBps > 0.01) - tr_formatter_speed_KBps (up_speed, peer->rateToPeer_KBps, sizeof (up_speed)); + if (peer->rateToPeer_KBps > 0.01) + tr_formatter_speed_KBps (up_speed, peer->rateToPeer_KBps, sizeof (up_speed)); - if (peer->rateToClient_KBps > 0) - tr_formatter_speed_KBps (down_speed, peer->rateToClient_KBps, sizeof (down_speed)); + if (peer->rateToClient_KBps > 0) + tr_formatter_speed_KBps (down_speed, peer->rateToClient_KBps, sizeof (down_speed)); - if (peer->pendingReqsToPeer > 0) - g_snprintf (down_count, sizeof (down_count), "%d", peer->pendingReqsToPeer); + if (peer->pendingReqsToPeer > 0) + g_snprintf (down_count, sizeof (down_count), "%d", peer->pendingReqsToPeer); - if (peer->pendingReqsToClient > 0) - g_snprintf (up_count, sizeof (down_count), "%d", peer->pendingReqsToClient); + if (peer->pendingReqsToClient > 0) + g_snprintf (up_count, sizeof (down_count), "%d", peer->pendingReqsToClient); - if (peer->blocksToPeer > 0) - g_snprintf (blocks_to_peer, sizeof (blocks_to_peer), "%"PRIu32, peer->blocksToPeer); + if (peer->blocksToPeer > 0) + g_snprintf (blocks_to_peer, sizeof (blocks_to_peer), "%"PRIu32, peer->blocksToPeer); - if (peer->blocksToClient > 0) - g_snprintf (blocks_to_client, sizeof (blocks_to_client), "%"PRIu32, peer->blocksToClient); + if (peer->blocksToClient > 0) + g_snprintf (blocks_to_client, sizeof (blocks_to_client), "%"PRIu32, peer->blocksToClient); - if (peer->cancelsToPeer > 0) - g_snprintf (cancelled_by_client, sizeof (cancelled_by_client), "%"PRIu32, peer->cancelsToPeer); + if (peer->cancelsToPeer > 0) + g_snprintf (cancelled_by_client, sizeof (cancelled_by_client), "%"PRIu32, peer->cancelsToPeer); - if (peer->cancelsToClient > 0) - g_snprintf (cancelled_by_peer, sizeof (cancelled_by_peer), "%"PRIu32, peer->cancelsToClient); + if (peer->cancelsToClient > 0) + g_snprintf (cancelled_by_peer, sizeof (cancelled_by_peer), "%"PRIu32, peer->cancelsToClient); - gtk_list_store_set (store, iter, - PEER_COL_PROGRESS, (int)(100.0 * peer->progress), - PEER_COL_UPLOAD_REQUEST_COUNT_INT, peer->pendingReqsToClient, - PEER_COL_UPLOAD_REQUEST_COUNT_STRING, up_count, - PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, peer->pendingReqsToPeer, - PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, down_count, - PEER_COL_DOWNLOAD_RATE_DOUBLE, peer->rateToClient_KBps, - PEER_COL_DOWNLOAD_RATE_STRING, down_speed, - PEER_COL_UPLOAD_RATE_DOUBLE, peer->rateToPeer_KBps, - PEER_COL_UPLOAD_RATE_STRING, up_speed, - PEER_COL_FLAGS, peer->flagStr, - PEER_COL_WAS_UPDATED, TRUE, - PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, (int)peer->blocksToClient, - PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, blocks_to_client, - PEER_COL_BLOCKS_UPLOADED_COUNT_INT, (int)peer->blocksToPeer, - PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, blocks_to_peer, - PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, (int)peer->cancelsToPeer, - PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, cancelled_by_client, - PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, (int)peer->cancelsToClient, - PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, cancelled_by_peer, - -1); + gtk_list_store_set (store, iter, + PEER_COL_PROGRESS, (int)(100.0 * peer->progress), + PEER_COL_UPLOAD_REQUEST_COUNT_INT, peer->pendingReqsToClient, + PEER_COL_UPLOAD_REQUEST_COUNT_STRING, up_count, + PEER_COL_DOWNLOAD_REQUEST_COUNT_INT, peer->pendingReqsToPeer, + PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING, down_count, + PEER_COL_DOWNLOAD_RATE_DOUBLE, peer->rateToClient_KBps, + PEER_COL_DOWNLOAD_RATE_STRING, down_speed, + PEER_COL_UPLOAD_RATE_DOUBLE, peer->rateToPeer_KBps, + PEER_COL_UPLOAD_RATE_STRING, up_speed, + PEER_COL_FLAGS, peer->flagStr, + PEER_COL_WAS_UPDATED, TRUE, + PEER_COL_BLOCKS_DOWNLOADED_COUNT_INT, (int)peer->blocksToClient, + PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING, blocks_to_client, + PEER_COL_BLOCKS_UPLOADED_COUNT_INT, (int)peer->blocksToPeer, + PEER_COL_BLOCKS_UPLOADED_COUNT_STRING, blocks_to_peer, + PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_INT, (int)peer->cancelsToPeer, + PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING, cancelled_by_client, + PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_INT, (int)peer->cancelsToClient, + PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING, cancelled_by_peer, + -1); } static void refreshPeerList (struct DetailsImpl * di, tr_torrent ** torrents, int n) { - int i; - int * peerCount; - GtkTreeIter iter; - GtkTreeModel * model; - GHashTable * hash = di->peer_hash; - GtkListStore * store = di->peer_store; - struct tr_peer_stat ** peers; + int i; + int * peerCount; + GtkTreeIter iter; + GtkTreeModel * model; + GHashTable * hash = di->peer_hash; + GtkListStore * store = di->peer_store; + struct tr_peer_stat ** peers; - /* step 1: get all the peers */ - peers = g_new (struct tr_peer_stat*, n); - peerCount = g_new (int, n); - for (i=0; iaddr); - if (g_hash_table_lookup (hash, key) == NULL) { - GtkTreePath * p; - gtk_list_store_append (store, &iter); - initPeerRow (store, &iter, key, tr_torrentName (tor), s); - p = gtk_tree_model_get_path (model, &iter); - g_hash_table_insert (hash, g_strdup (key), - gtk_tree_row_reference_new (model, p)); - gtk_tree_path_free (p); + /* step 3: add any new peers */ + for (i=0; iaddr); + if (g_hash_table_lookup (hash, key) == NULL) + { + GtkTreePath * p; + gtk_list_store_append (store, &iter); + initPeerRow (store, &iter, key, tr_torrentName (tor), s); + p = gtk_tree_model_get_path (model, &iter); + g_hash_table_insert (hash, g_strdup (key), gtk_tree_row_reference_new (model, p)); + gtk_tree_path_free (p); } } } - /* step 4: update the peers */ - for (i=0; iaddr); - ref = g_hash_table_lookup (hash, key); - p = gtk_tree_row_reference_get_path (ref); - gtk_tree_model_get_iter (model, &iter, p); - refreshPeerRow (store, &iter, s); - gtk_tree_path_free (p); + /* step 4: update the peers */ + for (i=0; iaddr); + ref = g_hash_table_lookup (hash, key); + p = gtk_tree_row_reference_get_path (ref); + gtk_tree_model_get_iter (model, &iter, p); + refreshPeerRow (store, &iter, s); + gtk_tree_path_free (p); } } - /* step 5: remove peers that have disappeared */ - model = GTK_TREE_MODEL (store); - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { - gboolean more = TRUE; - while (more) { - gboolean b; - gtk_tree_model_get (model, &iter, PEER_COL_WAS_UPDATED, &b, -1); - if (b) - more = gtk_tree_model_iter_next (model, &iter); - else { - char * key; - gtk_tree_model_get (model, &iter, PEER_COL_KEY, &key, -1); - g_hash_table_remove (hash, key); - more = gtk_list_store_remove (store, &iter); - g_free (key); + /* step 5: remove peers that have disappeared */ + model = GTK_TREE_MODEL (store); + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) + { + gboolean more = TRUE; + + while (more) + { + gboolean b; + gtk_tree_model_get (model, &iter, PEER_COL_WAS_UPDATED, &b, -1); + if (b) + { + more = gtk_tree_model_iter_next (model, &iter); + } + else + { + char * key; + gtk_tree_model_get (model, &iter, PEER_COL_KEY, &key, -1); + g_hash_table_remove (hash, key); + more = gtk_list_store_remove (store, &iter); + g_free (key); } } } - /* step 6: cleanup */ - for (i=0; iwebseed_hash; - GtkListStore * store = di->webseed_store; - GtkTreeModel * model = GTK_TREE_MODEL (store); + int i; + int total = 0; + GtkTreeIter iter; + GHashTable * hash = di->webseed_hash; + GtkListStore * store = di->webseed_store; + GtkTreeModel * model = GTK_TREE_MODEL (store); - /* step 1: mark all webseeds as not-updated */ - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do - gtk_list_store_set (store, &iter, WEBSEED_COL_WAS_UPDATED, FALSE, -1); - while (gtk_tree_model_iter_next (model, &iter)); + /* step 1: mark all webseeds as not-updated */ + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) do + gtk_list_store_set (store, &iter, WEBSEED_COL_WAS_UPDATED, FALSE, -1); + while (gtk_tree_model_iter_next (model, &iter)); - /* step 2: add any new webseeds */ - for (i=0; iwebseedCount; - for (j=0; jwebseedCount; ++j) { - char key[256]; - const char * url = inf->webseeds[j]; - g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); - if (g_hash_table_lookup (hash, key) == NULL) { - GtkTreePath * p; - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, WEBSEED_COL_URL, url, - WEBSEED_COL_KEY, key, - -1); - p = gtk_tree_model_get_path (model, &iter); - g_hash_table_insert (hash, g_strdup (key), - gtk_tree_row_reference_new (model, p)); - gtk_tree_path_free (p); + /* step 2: add any new webseeds */ + for (i=0; iwebseedCount; + + for (j=0; jwebseedCount; ++j) + { + char key[256]; + const char * url = inf->webseeds[j]; + g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); + if (g_hash_table_lookup (hash, key) == NULL) + { + GtkTreePath * p; + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, WEBSEED_COL_URL, url, + WEBSEED_COL_KEY, key, + -1); + p = gtk_tree_model_get_path (model, &iter); + g_hash_table_insert (hash, g_strdup (key), gtk_tree_row_reference_new (model, p)); + gtk_tree_path_free (p); } } } - /* step 3: update the webseeds */ - for (i=0; iwebseedCount; ++j) { - char buf[128]; - char key[256]; - const char * url = inf->webseeds[j]; - GtkTreePath * p; - GtkTreeRowReference * ref; - g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); - ref = g_hash_table_lookup (hash, key); - p = gtk_tree_row_reference_get_path (ref); - gtk_tree_model_get_iter (model, &iter, p); - if (speeds_KBps[j] > 0) - tr_formatter_speed_KBps (buf, speeds_KBps[j], sizeof (buf)); - else - *buf = '\0'; - gtk_list_store_set (store, &iter, - WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, speeds_KBps[j], - WEBSEED_COL_DOWNLOAD_RATE_STRING, buf, - WEBSEED_COL_WAS_UPDATED, TRUE, - -1); - gtk_tree_path_free (p); + /* step 3: update the webseeds */ + for (i=0; iwebseedCount; ++j) + { + char buf[128]; + char key[256]; + GtkTreePath * p; + GtkTreeRowReference * ref; + const char * url = inf->webseeds[j]; + + g_snprintf (key, sizeof (key), "%d.%s", tr_torrentId (tor), url); + ref = g_hash_table_lookup (hash, key); + p = gtk_tree_row_reference_get_path (ref); + gtk_tree_model_get_iter (model, &iter, p); + if (speeds_KBps[j] > 0) + tr_formatter_speed_KBps (buf, speeds_KBps[j], sizeof (buf)); + else + *buf = '\0'; + gtk_list_store_set (store, &iter, + WEBSEED_COL_DOWNLOAD_RATE_DOUBLE, speeds_KBps[j], + WEBSEED_COL_DOWNLOAD_RATE_STRING, buf, + WEBSEED_COL_WAS_UPDATED, TRUE, + -1); + + gtk_tree_path_free (p); } - tr_free (speeds_KBps); + + tr_free (speeds_KBps); } - /* step 4: remove webseeds that have disappeared */ - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { - gboolean more = TRUE; - while (more) { - gboolean b; - gtk_tree_model_get (model, &iter, WEBSEED_COL_WAS_UPDATED, &b, -1); - if (b) - more = gtk_tree_model_iter_next (model, &iter); - else { - char * key; - gtk_tree_model_get (model, &iter, WEBSEED_COL_KEY, &key, -1); - if (key != NULL) - g_hash_table_remove (hash, key); - more = gtk_list_store_remove (store, &iter); - g_free (key); + /* step 4: remove webseeds that have disappeared */ + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) + { + gboolean more = TRUE; + while (more) + { + gboolean b; + gtk_tree_model_get (model, &iter, WEBSEED_COL_WAS_UPDATED, &b, -1); + if (b) + { + more = gtk_tree_model_iter_next (model, &iter); + } + else + { + char * key; + gtk_tree_model_get (model, &iter, WEBSEED_COL_KEY, &key, -1); + if (key != NULL) + g_hash_table_remove (hash, key); + more = gtk_list_store_remove (store, &iter); + g_free (key); } } } - /* most of the time there are no webseeds... - don't waste space showing an empty list */ - if (total > 0) - gtk_widget_show (di->webseed_view); - else - gtk_widget_hide (di->webseed_view); + /* most of the time there are no webseeds... + don't waste space showing an empty list */ + gtk_widget_set_visible (di->webseed_view, total > 0); } static void refreshPeers (struct DetailsImpl * di, tr_torrent ** torrents, int n) { - refreshPeerList (di, torrents, n); - refreshWebseedList (di, torrents, n); + refreshPeerList (di, torrents, n); + refreshWebseedList (di, torrents, n); } static gboolean @@ -1445,313 +1585,322 @@ onPeerViewQueryTooltip (GtkWidget * widget, GtkTooltip * tooltip, gpointer gdi) { - gboolean show_tip = FALSE; - GtkTreeModel * model; - GtkTreeIter iter; + GtkTreeIter iter; + GtkTreeModel * model; + gboolean show_tip = FALSE; - if (gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (widget), - &x, &y, keyboard_tip, - &model, NULL, &iter)) + if (gtk_tree_view_get_tooltip_context (GTK_TREE_VIEW (widget), + &x, &y, keyboard_tip, + &model, NULL, &iter)) { - struct DetailsImpl * di = gdi; - const char * pch; - char * name = NULL; - char * addr = NULL; - char * markup = NULL; - char * flagstr = NULL; - GString * gstr = di->gstr; - gtk_tree_model_get (model, &iter, PEER_COL_TORRENT_NAME, &name, - PEER_COL_ADDRESS, &addr, - PEER_COL_FLAGS, &flagstr, - -1); + const char * pch; + char * name = NULL; + char * addr = NULL; + char * markup = NULL; + char * flagstr = NULL; + struct DetailsImpl * di = gdi; + GString * gstr = di->gstr; - g_string_truncate (gstr, 0); - markup = g_markup_escape_text (name, -1); - g_string_append_printf (gstr, "%s\n%s\n \n", markup, addr); - g_free (markup); + gtk_tree_model_get (model, &iter, PEER_COL_TORRENT_NAME, &name, + PEER_COL_ADDRESS, &addr, + PEER_COL_FLAGS, &flagstr, + -1); - for (pch = flagstr; pch && *pch; ++pch) + g_string_truncate (gstr, 0); + markup = g_markup_escape_text (name, -1); + g_string_append_printf (gstr, "%s\n%s\n \n", markup, addr); + g_free (markup); + + for (pch=flagstr; pch && *pch; ++pch) { - const char * s = NULL; - switch (*pch) + const char * s = NULL; + + switch (*pch) { - case 'O': s = _("Optimistic unchoke"); break; - case 'D': s = _("Downloading from this peer"); break; - case 'd': s = _("We would download from this peer if they would let us"); break; - case 'U': s = _("Uploading to peer"); break; - case 'u': s = _("We would upload to this peer if they asked"); break; - case 'K': s = _("Peer has unchoked us, but we're not interested"); break; - case '?': s = _("We unchoked this peer, but they're not interested"); break; - case 'E': s = _("Encrypted connection"); break; - case 'X': s = _("Peer was found through Peer Exchange (PEX)"); break; - case 'H': s = _("Peer was found through DHT"); break; - case 'I': s = _("Peer is an incoming connection"); break; - case 'T': s = _("Peer is connected over µTP"); break; + case 'O': s = _("Optimistic unchoke"); break; + case 'D': s = _("Downloading from this peer"); break; + case 'd': s = _("We would download from this peer if they would let us"); break; + case 'U': s = _("Uploading to peer"); break; + case 'u': s = _("We would upload to this peer if they asked"); break; + case 'K': s = _("Peer has unchoked us, but we're not interested"); break; + case '?': s = _("We unchoked this peer, but they're not interested"); break; + case 'E': s = _("Encrypted connection"); break; + case 'X': s = _("Peer was found through Peer Exchange (PEX)"); break; + case 'H': s = _("Peer was found through DHT"); break; + case 'I': s = _("Peer is an incoming connection"); break; + case 'T': s = _("Peer is connected over µTP"); break; } - if (s) - g_string_append_printf (gstr, "%c: %s\n", *pch, s); + + if (s) + g_string_append_printf (gstr, "%c: %s\n", *pch, s); } - if (gstr->len) /* remove the last linefeed */ - g_string_set_size (gstr, gstr->len - 1); - gtk_tooltip_set_markup (tooltip, gstr->str); + if (gstr->len) /* remove the last linefeed */ + g_string_set_size (gstr, gstr->len - 1); - g_free (flagstr); - g_free (addr); - g_free (name); - show_tip = TRUE; + gtk_tooltip_set_markup (tooltip, gstr->str); + + g_free (flagstr); + g_free (addr); + g_free (name); + show_tip = TRUE; } - return show_tip; + return show_tip; } static void setPeerViewColumns (GtkTreeView * peer_view) { - int i; - int n = 0; - const bool more = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); - int view_columns[32]; - GtkTreeViewColumn * c; - GtkCellRenderer * r; + int i; + int n; + int view_columns[32]; + GtkCellRenderer * r; + GtkTreeViewColumn * c; + const bool more = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); - view_columns[n++] = PEER_COL_ENCRYPTION_STOCK_ID; - view_columns[n++] = PEER_COL_UPLOAD_RATE_STRING; - if (more) view_columns[n++] = PEER_COL_UPLOAD_REQUEST_COUNT_STRING; - view_columns[n++] = PEER_COL_DOWNLOAD_RATE_STRING; - if (more) view_columns[n++] = PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING; - if (more) view_columns[n++] = PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING; - if (more) view_columns[n++] = PEER_COL_BLOCKS_UPLOADED_COUNT_STRING; - if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING; - if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING; - view_columns[n++] = PEER_COL_PROGRESS; - view_columns[n++] = PEER_COL_FLAGS; - view_columns[n++] = PEER_COL_ADDRESS; - view_columns[n++] = PEER_COL_CLIENT; + n = 0; + view_columns[n++] = PEER_COL_ENCRYPTION_STOCK_ID; + view_columns[n++] = PEER_COL_UPLOAD_RATE_STRING; + if (more) view_columns[n++] = PEER_COL_UPLOAD_REQUEST_COUNT_STRING; + view_columns[n++] = PEER_COL_DOWNLOAD_RATE_STRING; + if (more) view_columns[n++] = PEER_COL_DOWNLOAD_REQUEST_COUNT_STRING; + if (more) view_columns[n++] = PEER_COL_BLOCKS_DOWNLOADED_COUNT_STRING; + if (more) view_columns[n++] = PEER_COL_BLOCKS_UPLOADED_COUNT_STRING; + if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_CLIENT_COUNT_STRING; + if (more) view_columns[n++] = PEER_COL_REQS_CANCELLED_BY_PEER_COUNT_STRING; + view_columns[n++] = PEER_COL_PROGRESS; + view_columns[n++] = PEER_COL_FLAGS; + view_columns[n++] = PEER_COL_ADDRESS; + view_columns[n++] = PEER_COL_CLIENT; - /* remove any existing columns */ - while ((c = gtk_tree_view_get_column (peer_view, 0))) - gtk_tree_view_remove_column (peer_view, c); + /* remove any existing columns */ + while ((c = gtk_tree_view_get_column (peer_view, 0))) + gtk_tree_view_remove_column (peer_view, c); - for (i=0; icore, key, value); - setPeerViewColumns (GTK_TREE_VIEW (di->peer_view)); + const tr_quark key = TR_KEY_show_extra_peer_details; + const gboolean value = gtk_toggle_button_get_active (button); + gtr_core_set_pref_bool (di->core, key, value); + setPeerViewColumns (GTK_TREE_VIEW (di->peer_view)); } static GtkWidget* peer_page_new (struct DetailsImpl * di) { - gboolean b; - const char * str; - GtkListStore *store; - GtkWidget *v, *w, *ret, *sw, *vbox; - GtkWidget *webtree = NULL; - GtkTreeModel * m; - GtkTreeViewColumn * c; - GtkCellRenderer * r; + gboolean b; + const char * str; + GtkListStore *store; + GtkWidget *v, *w, *ret, *sw, *vbox; + GtkWidget *webtree = NULL; + GtkTreeModel * m; + GtkTreeViewColumn * c; + GtkCellRenderer * r; - /* webseeds */ + /* webseeds */ - store = di->webseed_store = webseed_model_new (); - v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); - g_object_unref (store); + store = di->webseed_store = webseed_model_new (); + v = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); + g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); + g_object_unref (store); - str = getWebseedColumnNames (WEBSEED_COL_URL); - r = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, NULL); - c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_URL, NULL); - g_object_set (G_OBJECT (c), "expand", TRUE, NULL); - gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_URL); - gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); + str = getWebseedColumnNames (WEBSEED_COL_URL); + r = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, NULL); + c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_URL, NULL); + g_object_set (G_OBJECT (c), "expand", TRUE, NULL); + gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_URL); + gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); - str = getWebseedColumnNames (WEBSEED_COL_DOWNLOAD_RATE_STRING); - r = gtk_cell_renderer_text_new (); - c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_DOWNLOAD_RATE_STRING, NULL); - gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_DOWNLOAD_RATE_DOUBLE); - gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); + str = getWebseedColumnNames (WEBSEED_COL_DOWNLOAD_RATE_STRING); + r = gtk_cell_renderer_text_new (); + c = gtk_tree_view_column_new_with_attributes (str, r, "text", WEBSEED_COL_DOWNLOAD_RATE_STRING, NULL); + gtk_tree_view_column_set_sort_column_id (c, WEBSEED_COL_DOWNLOAD_RATE_DOUBLE); + gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); - w = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), - GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (w), v); + w = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (w), v); - webtree = w; - di->webseed_view = w; + webtree = w; + di->webseed_view = w; - /* peers */ + /* peers */ - store = di->peer_store = peer_store_new (); - m = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store)); - gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (m), - PEER_COL_PROGRESS, - GTK_SORT_DESCENDING); - v = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW, - "model", m, - "rules-hint", TRUE, - "has-tooltip", TRUE, - NULL)); - di->peer_view = v; + store = di->peer_store = peer_store_new (); + m = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (store)); + gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (m), + PEER_COL_PROGRESS, + GTK_SORT_DESCENDING); + v = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW, + "model", m, + "rules-hint", TRUE, + "has-tooltip", TRUE, + NULL)); + di->peer_view = v; - g_signal_connect (v, "query-tooltip", - G_CALLBACK (onPeerViewQueryTooltip), di); - g_object_unref (store); - g_signal_connect (v, "button-release-event", - G_CALLBACK (on_tree_view_button_released), NULL); + g_signal_connect (v, "query-tooltip", + G_CALLBACK (onPeerViewQueryTooltip), di); + g_object_unref (store); + g_signal_connect (v, "button-release-event", + G_CALLBACK (on_tree_view_button_released), NULL); - setPeerViewColumns (GTK_TREE_VIEW (v)); + setPeerViewColumns (GTK_TREE_VIEW (v)); - w = sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), - GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (w), v); + w = sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (w), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (w), + GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (w), v); - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); - gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); + gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); - v = gtk_paned_new (GTK_ORIENTATION_VERTICAL); - gtk_paned_pack1 (GTK_PANED (v), webtree, FALSE, TRUE); - gtk_paned_pack2 (GTK_PANED (v), sw, TRUE, TRUE); - gtk_box_pack_start (GTK_BOX (vbox), v, TRUE, TRUE, 0); + v = gtk_paned_new (GTK_ORIENTATION_VERTICAL); + gtk_paned_pack1 (GTK_PANED (v), webtree, FALSE, TRUE); + gtk_paned_pack2 (GTK_PANED (v), sw, TRUE, TRUE); + gtk_box_pack_start (GTK_BOX (vbox), v, TRUE, TRUE, 0); - w = gtk_check_button_new_with_mnemonic (_("Show _more details")); - di->more_peer_details_check = w; - b = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); - g_signal_connect (w, "toggled", G_CALLBACK (onMorePeerInfoToggled), di); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + w = gtk_check_button_new_with_mnemonic (_("Show _more details")); + di->more_peer_details_check = w; + b = gtr_pref_flag_get (TR_KEY_show_extra_peer_details); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); + g_signal_connect (w, "toggled", G_CALLBACK (onMorePeerInfoToggled), di); + gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); - /* ip-to-GtkTreeRowReference */ - di->peer_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, + /* ip-to-GtkTreeRowReference */ + di->peer_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); - /* url-to-GtkTreeRowReference */ - di->webseed_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, + /* url-to-GtkTreeRowReference */ + di->webseed_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); - ret = vbox; - return ret; + ret = vbox; + return ret; } @@ -1766,106 +1915,113 @@ peer_page_new (struct DetailsImpl * di) static void tr_strltime_rounded (char * buf, time_t t, size_t buflen) { - if (t > 60) t -= (t % 60); - tr_strltime (buf, t, buflen); + if (t > 60) t -= (t % 60); + tr_strltime (buf, t, buflen); } static void buildTrackerSummary (GString * gstr, const char * key, const tr_tracker_stat * st, gboolean showScrape) { - char * str; - char timebuf[256]; - const time_t now = time (NULL); - const char * err_markup_begin = ""; - const char * err_markup_end = ""; - const char * timeout_markup_begin = ""; - const char * timeout_markup_end = ""; - const char * success_markup_begin = ""; - const char * success_markup_end = ""; + char * str; + char timebuf[256]; + const time_t now = time (NULL); + const char * err_markup_begin = ""; + const char * err_markup_end = ""; + const char * timeout_markup_begin = ""; + const char * timeout_markup_end = ""; + const char * success_markup_begin = ""; + const char * success_markup_end = ""; - /* hostname */ - { - g_string_append (gstr, st->isBackup ? "" : ""); - if (key) - str = g_markup_printf_escaped ("%s - %s", st->host, key); - else - str = g_markup_printf_escaped ("%s", st->host); - g_string_append (gstr, str); - g_free (str); - g_string_append (gstr, st->isBackup ? "" : ""); - } + /* hostname */ + { + g_string_append (gstr, st->isBackup ? "" : ""); + if (key) + str = g_markup_printf_escaped ("%s - %s", st->host, key); + else + str = g_markup_printf_escaped ("%s", st->host); + g_string_append (gstr, str); + g_free (str); + g_string_append (gstr, st->isBackup ? "" : ""); + } - if (!st->isBackup) + if (!st->isBackup) { - if (st->hasAnnounced && st->announceState != TR_TRACKER_INACTIVE) + if (st->hasAnnounced && st->announceState != TR_TRACKER_INACTIVE) { + g_string_append_c (gstr, '\n'); + tr_strltime_rounded (timebuf, now - st->lastAnnounceTime, sizeof (timebuf)); + if (st->lastAnnounceSucceeded) + g_string_append_printf (gstr, _("Got a list of %1$s%2$'d peers%3$s %4$s ago"), + success_markup_begin, st->lastAnnouncePeerCount, success_markup_end, + timebuf); + else if (st->lastAnnounceTimedOut) + g_string_append_printf (gstr, _("Peer list request %1$stimed out%2$s %3$s ago; will retry"), + timeout_markup_begin, timeout_markup_end, timebuf); + else + g_string_append_printf (gstr, _("Got an error %1$s\"%2$s\"%3$s %4$s ago"), + err_markup_begin, st->lastAnnounceResult, err_markup_end, timebuf); + } + + switch (st->announceState) + { + case TR_TRACKER_INACTIVE: g_string_append_c (gstr, '\n'); - tr_strltime_rounded (timebuf, now - st->lastAnnounceTime, sizeof (timebuf)); - if (st->lastAnnounceSucceeded) - g_string_append_printf (gstr, _("Got a list of %1$s%2$'d peers%3$s %4$s ago"), - success_markup_begin, st->lastAnnouncePeerCount, success_markup_end, + g_string_append (gstr, _("No updates scheduled")); + break; + + case TR_TRACKER_WAITING: + tr_strltime_rounded (timebuf, st->nextAnnounceTime - now, sizeof (timebuf)); + g_string_append_c (gstr, '\n'); + g_string_append_printf (gstr, _("Asking for more peers in %s"), timebuf); + break; + + case TR_TRACKER_QUEUED: + g_string_append_c (gstr, '\n'); + g_string_append (gstr, _("Queued to ask for more peers")); + break; + + case TR_TRACKER_ACTIVE: + tr_strltime_rounded (timebuf, now - st->lastAnnounceStartTime, sizeof (timebuf)); + g_string_append_c (gstr, '\n'); + g_string_append_printf (gstr, _("Asking for more peers now… %s"), timebuf); + break; + } + + if (showScrape) + { + if (st->hasScraped) + { + g_string_append_c (gstr, '\n'); + tr_strltime_rounded (timebuf, now - st->lastScrapeTime, sizeof (timebuf)); + if (st->lastScrapeSucceeded) + g_string_append_printf (gstr, _("Tracker had %s%'d seeders and %'d leechers%s %s ago"), + success_markup_begin, st->seederCount, st->leecherCount, success_markup_end, timebuf); - else if (st->lastAnnounceTimedOut) - g_string_append_printf (gstr, _("Peer list request %1$stimed out%2$s %3$s ago; will retry"), - timeout_markup_begin, timeout_markup_end, timebuf); - else - g_string_append_printf (gstr, _("Got an error %1$s\"%2$s\"%3$s %4$s ago"), - err_markup_begin, st->lastAnnounceResult, err_markup_end, timebuf); - } - - switch (st->announceState) - { - case TR_TRACKER_INACTIVE: - g_string_append_c (gstr, '\n'); - g_string_append (gstr, _("No updates scheduled")); - break; - case TR_TRACKER_WAITING: - tr_strltime_rounded (timebuf, st->nextAnnounceTime - now, sizeof (timebuf)); - g_string_append_c (gstr, '\n'); - g_string_append_printf (gstr, _("Asking for more peers in %s"), timebuf); - break; - case TR_TRACKER_QUEUED: - g_string_append_c (gstr, '\n'); - g_string_append (gstr, _("Queued to ask for more peers")); - break; - case TR_TRACKER_ACTIVE: - tr_strltime_rounded (timebuf, now - st->lastAnnounceStartTime, sizeof (timebuf)); - g_string_append_c (gstr, '\n'); - g_string_append_printf (gstr, _("Asking for more peers now… %s"), timebuf); - break; - } - - if (showScrape) - { - if (st->hasScraped) { - g_string_append_c (gstr, '\n'); - tr_strltime_rounded (timebuf, now - st->lastScrapeTime, sizeof (timebuf)); - if (st->lastScrapeSucceeded) - g_string_append_printf (gstr, _("Tracker had %s%'d seeders and %'d leechers%s %s ago"), - success_markup_begin, st->seederCount, st->leecherCount, success_markup_end, - timebuf); - else - g_string_append_printf (gstr, _("Got a scrape error \"%s%s%s\" %s ago"), err_markup_begin, st->lastScrapeResult, err_markup_end, timebuf); + else + g_string_append_printf (gstr, _("Got a scrape error \"%s%s%s\" %s ago"), err_markup_begin, st->lastScrapeResult, err_markup_end, timebuf); } - switch (st->scrapeState) + switch (st->scrapeState) { - case TR_TRACKER_INACTIVE: - break; - case TR_TRACKER_WAITING: - g_string_append_c (gstr, '\n'); - tr_strltime_rounded (timebuf, st->nextScrapeTime - now, sizeof (timebuf)); - g_string_append_printf (gstr, _("Asking for peer counts in %s"), timebuf); - break; - case TR_TRACKER_QUEUED: - g_string_append_c (gstr, '\n'); - g_string_append (gstr, _("Queued to ask for peer counts")); - break; - case TR_TRACKER_ACTIVE: - g_string_append_c (gstr, '\n'); - tr_strltime_rounded (timebuf, now - st->lastScrapeStartTime, sizeof (timebuf)); - g_string_append_printf (gstr, _("Asking for peer counts now… %s"), timebuf); - break; + case TR_TRACKER_INACTIVE: + break; + + case TR_TRACKER_WAITING: + g_string_append_c (gstr, '\n'); + tr_strltime_rounded (timebuf, st->nextScrapeTime - now, sizeof (timebuf)); + g_string_append_printf (gstr, _("Asking for peer counts in %s"), timebuf); + break; + + case TR_TRACKER_QUEUED: + g_string_append_c (gstr, '\n'); + g_string_append (gstr, _("Queued to ask for peer counts")); + break; + + case TR_TRACKER_ACTIVE: + g_string_append_c (gstr, '\n'); + tr_strltime_rounded (timebuf, now - st->lastScrapeStartTime, sizeof (timebuf)); + g_string_append_printf (gstr, _("Asking for peer counts now… %s"), timebuf); + break; } } } @@ -1886,190 +2042,198 @@ enum static gboolean trackerVisibleFunc (GtkTreeModel * model, GtkTreeIter * iter, gpointer data) { - gboolean isBackup; - struct DetailsImpl * di = data; + gboolean isBackup; + struct DetailsImpl * di = data; - /* show all */ - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->all_check))) - return TRUE; + /* show all */ + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->all_check))) + return TRUE; - /* don't show the backups... */ - gtk_tree_model_get (model, iter, TRACKER_COL_IS_BACKUP, &isBackup, -1); - return !isBackup; + /* don't show the backups... */ + gtk_tree_model_get (model, iter, TRACKER_COL_IS_BACKUP, &isBackup, -1); + return !isBackup; } static int tracker_list_get_current_torrent_id (struct DetailsImpl * di) { - int torrent_id = -1; + int torrent_id = -1; - /* if there's only one torrent in the dialog, always use it */ - if (torrent_id < 0) - if (g_slist_length (di->ids) == 1) - torrent_id = GPOINTER_TO_INT (di->ids->data); + /* if there's only one torrent in the dialog, always use it */ + if (torrent_id < 0) + if (g_slist_length (di->ids) == 1) + torrent_id = GPOINTER_TO_INT (di->ids->data); - /* otherwise, use the selected tracker's torrent */ - if (torrent_id < 0) { - GtkTreeIter iter; - GtkTreeModel * model; - GtkTreeSelection * sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (di->tracker_view)); - if (gtk_tree_selection_get_selected (sel, &model, &iter)) - gtk_tree_model_get (model, &iter, TRACKER_COL_TORRENT_ID, &torrent_id, -1); + /* otherwise, use the selected tracker's torrent */ + if (torrent_id < 0) + { + GtkTreeIter iter; + GtkTreeModel * model; + GtkTreeSelection * sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (di->tracker_view)); + if (gtk_tree_selection_get_selected (sel, &model, &iter)) + gtk_tree_model_get (model, &iter, TRACKER_COL_TORRENT_ID, &torrent_id, -1); } - return torrent_id; + return torrent_id; } static tr_torrent* tracker_list_get_current_torrent (struct DetailsImpl * di) { - const int torrent_id = tracker_list_get_current_torrent_id (di); - return gtr_core_find_torrent (di->core, torrent_id); + const int torrent_id = tracker_list_get_current_torrent_id (di); + return gtr_core_find_torrent (di->core, torrent_id); } static void favicon_ready_cb (gpointer pixbuf, gpointer vreference) { - GtkTreeIter iter; - GtkTreeRowReference * reference = vreference; + GtkTreeIter iter; + GtkTreeRowReference * reference = vreference; - if (pixbuf != NULL) + if (pixbuf != NULL) { - GtkTreePath * path = gtk_tree_row_reference_get_path (reference); - GtkTreeModel * model = gtk_tree_row_reference_get_model (reference); + GtkTreePath * path = gtk_tree_row_reference_get_path (reference); + GtkTreeModel * model = gtk_tree_row_reference_get_model (reference); - if (gtk_tree_model_get_iter (model, &iter, path)) - gtk_list_store_set (GTK_LIST_STORE (model), &iter, - TRACKER_COL_FAVICON, pixbuf, - -1); + if (gtk_tree_model_get_iter (model, &iter, path)) + gtk_list_store_set (GTK_LIST_STORE (model), &iter, TRACKER_COL_FAVICON, pixbuf, -1); - gtk_tree_path_free (path); - - g_object_unref (pixbuf); + gtk_tree_path_free (path); + g_object_unref (pixbuf); } - gtk_tree_row_reference_free (reference); + gtk_tree_row_reference_free (reference); } static void refreshTracker (struct DetailsImpl * di, tr_torrent ** torrents, int n) { - int i; - int * statCount; - tr_tracker_stat ** stats; - GtkTreeIter iter; - GtkTreeModel * model; - GString * gstr = di->gstr; /* buffer for temporary strings */ - GHashTable * hash = di->tracker_hash; - GtkListStore * store = di->tracker_store; - tr_session * session = gtr_core_session (di->core); - const gboolean showScrape = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->scrape_check)); + int i; + int * statCount; + tr_tracker_stat ** stats; + GtkTreeIter iter; + GtkTreeModel * model; + GString * gstr = di->gstr; /* buffer for temporary strings */ + GHashTable * hash = di->tracker_hash; + GtkListStore * store = di->tracker_store; + tr_session * session = gtr_core_session (di->core); + const gboolean showScrape = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (di->scrape_check)); - /* step 1: get all the trackers */ - statCount = g_new0 (int, n); - stats = g_new0 (tr_tracker_stat *, n); - for (i=0; itier, st->announce); - - if (g_hash_table_lookup (hash, gstr->str) == NULL) { - GtkTreePath * p; - GtkTreeIter iter; - GtkTreeRowReference * ref; - - gtk_list_store_insert_with_values (store, &iter, -1, - TRACKER_COL_TORRENT_ID, torrent_id, - TRACKER_COL_TRACKER_ID, st->id, - TRACKER_COL_KEY, gstr->str, - -1); - - p = gtk_tree_model_get_path (model, &iter); - ref = gtk_tree_row_reference_new (model, p); - g_hash_table_insert (hash, g_strdup (gstr->str), ref); - ref = gtk_tree_row_reference_new (model, p); - gtr_get_favicon_from_url (session, st->announce, favicon_ready_cb, ref); - gtk_tree_path_free (p); - } - } - } - - /* step 4: update the peers */ - for (i=0; i1 ? tr_torrentName (tor) : NULL; - for (j=0; jtier, st->announce); - ref = g_hash_table_lookup (hash, gstr->str); - p = gtk_tree_row_reference_get_path (ref); - gtk_tree_model_get_iter (model, &iter, p); + /* build the key to find the row */ + g_string_truncate (gstr, 0); + g_string_append_printf (gstr, "%d\t%d\t%s", torrent_id, st->tier, st->announce); - /* update the row */ - g_string_truncate (gstr, 0); - buildTrackerSummary (gstr, summary_name, st, showScrape); - gtk_list_store_set (store, &iter, TRACKER_COL_TEXT, gstr->str, - TRACKER_COL_IS_BACKUP, st->isBackup, - TRACKER_COL_TRACKER_ID, st->id, - TRACKER_COL_WAS_UPDATED, TRUE, - -1); + if (g_hash_table_lookup (hash, gstr->str) == NULL) + { + GtkTreePath * p; + GtkTreeIter iter; + GtkTreeRowReference * ref; - /* cleanup */ - gtk_tree_path_free (p); - } - } + gtk_list_store_insert_with_values (store, &iter, -1, + TRACKER_COL_TORRENT_ID, torrent_id, + TRACKER_COL_TRACKER_ID, st->id, + TRACKER_COL_KEY, gstr->str, + -1); - /* step 5: remove trackers that have disappeared */ - if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) { - gboolean more = TRUE; - while (more) { - gboolean b; - gtk_tree_model_get (model, &iter, TRACKER_COL_WAS_UPDATED, &b, -1); - if (b) - more = gtk_tree_model_iter_next (model, &iter); - else { - char * key; - gtk_tree_model_get (model, &iter, TRACKER_COL_KEY, &key, -1); - g_hash_table_remove (hash, key); - more = gtk_list_store_remove (store, &iter); - g_free (key); + p = gtk_tree_model_get_path (model, &iter); + ref = gtk_tree_row_reference_new (model, p); + g_hash_table_insert (hash, g_strdup (gstr->str), ref); + ref = gtk_tree_row_reference_new (model, p); + gtr_get_favicon_from_url (session, st->announce, favicon_ready_cb, ref); + gtk_tree_path_free (p); } } } - gtk_widget_set_sensitive (di->edit_trackers_button, - tracker_list_get_current_torrent_id (di) >= 0); + /* step 4: update the peers */ + for (i=0; i1 ? tr_torrentName (tor) : NULL; - /* cleanup */ - for (i=0; itier, st->announce); + ref = g_hash_table_lookup (hash, gstr->str); + p = gtk_tree_row_reference_get_path (ref); + gtk_tree_model_get_iter (model, &iter, p); + + /* update the row */ + g_string_truncate (gstr, 0); + buildTrackerSummary (gstr, summary_name, st, showScrape); + gtk_list_store_set (store, &iter, TRACKER_COL_TEXT, gstr->str, + TRACKER_COL_IS_BACKUP, st->isBackup, + TRACKER_COL_TRACKER_ID, st->id, + TRACKER_COL_WAS_UPDATED, TRUE, + -1); + + /* cleanup */ + gtk_tree_path_free (p); + } + } + + /* step 5: remove trackers that have disappeared */ + if (gtk_tree_model_iter_nth_child (model, &iter, NULL, 0)) + { + gboolean more = TRUE; + + while (more) + { + gboolean b; + gtk_tree_model_get (model, &iter, TRACKER_COL_WAS_UPDATED, &b, -1); + if (b) + { + more = gtk_tree_model_iter_next (model, &iter); + } + else + { + char * key; + gtk_tree_model_get (model, &iter, TRACKER_COL_KEY, &key, -1); + g_hash_table_remove (hash, key); + more = gtk_list_store_remove (store, &iter); + g_free (key); + } + } + } + + gtk_widget_set_sensitive (di->edit_trackers_button, + tracker_list_get_current_torrent_id (di) >= 0); + + /* cleanup */ + for (i=0; icore, torrent_id); + int i, n; + int tier; + GtkTextIter start, end; + const int torrent_id = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), TORRENT_ID_KEY)); + GtkTextBuffer * text_buffer = g_object_get_qdata (G_OBJECT (dialog), TEXT_BUFFER_KEY); + tr_torrent * tor = gtr_core_find_torrent (di->core, torrent_id); - if (tor != NULL) + if (tor != NULL) { - tr_tracker_info * trackers; - char ** tracker_strings; - char * tracker_text; + tr_tracker_info * trackers; + char ** tracker_strings; + char * tracker_text; - /* build the array of trackers */ - gtk_text_buffer_get_bounds (text_buffer, &start, &end); - tracker_text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE); - tracker_strings = g_strsplit (tracker_text, "\n", 0); - for (i=0; tracker_strings[i];) - ++i; - trackers = g_new0 (tr_tracker_info, i); - for (i=n=tier=0; tracker_strings[i]; ++i) { - const char * str = tracker_strings[i]; - if (!*str) - ++tier; - else { - trackers[n].tier = tier; - trackers[n].announce = tracker_strings[i]; - ++n; + /* build the array of trackers */ + gtk_text_buffer_get_bounds (text_buffer, &start, &end); + tracker_text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE); + tracker_strings = g_strsplit (tracker_text, "\n", 0); + for (i=0; tracker_strings[i];) + ++i; + trackers = g_new0 (tr_tracker_info, i); + for (i=n=tier=0; tracker_strings[i]; ++i) + { + const char * str = tracker_strings[i]; + if (!*str) + { + ++tier; + } + else + { + trackers[n].tier = tier; + trackers[n].announce = tracker_strings[i]; + ++n; } } - /* update the torrent */ - if (tr_torrentSetAnnounceList (tor, trackers, n)) - refresh (di); - else { - GtkWidget * w; - const char * text = _("List contains invalid URLs"); - w = gtk_message_dialog_new (GTK_WINDOW (dialog), - GTK_DIALOG_MODAL, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, "%s", text); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", _("Please correct the errors and try again.")); - gtk_dialog_run (GTK_DIALOG (w)); - gtk_widget_destroy (w); - do_destroy = FALSE; + /* update the torrent */ + if (tr_torrentSetAnnounceList (tor, trackers, n)) + { + refresh (di); + } + else + { + GtkWidget * w; + const char * text = _("List contains invalid URLs"); + w = gtk_message_dialog_new (GTK_WINDOW (dialog), + GTK_DIALOG_MODAL, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, "%s", text); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", _("Please correct the errors and try again.")); + gtk_dialog_run (GTK_DIALOG (w)); + gtk_widget_destroy (w); + do_destroy = FALSE; } - /* cleanup */ - g_free (trackers); - g_strfreev (tracker_strings); - g_free (tracker_text); + /* cleanup */ + g_free (trackers); + g_strfreev (tracker_strings); + g_free (tracker_text); } } - if (do_destroy) - gtk_widget_destroy (GTK_WIDGET (dialog)); + if (do_destroy) + gtk_widget_destroy (GTK_WIDGET (dialog)); } static void get_editable_tracker_list (GString * gstr, const tr_torrent * tor) { - unsigned int i; - int tier = 0; - const tr_info * inf = tr_torrentInfo (tor); - for (i=0; itrackerCount; ++i) { - const tr_tracker_info * t = &inf->trackers[i]; - if (tier != t->tier) { - tier = t->tier; - g_string_append_c (gstr, '\n'); + unsigned int i; + int tier = 0; + const tr_info * inf = tr_torrentInfo (tor); + + for (i=0; itrackerCount; ++i) + { + const tr_tracker_info * t = &inf->trackers[i]; + + if (tier != t->tier) + { + tier = t->tier; + g_string_append_c (gstr, '\n'); } - g_string_append_printf (gstr, "%s\n", t->announce); + + g_string_append_printf (gstr, "%s\n", t->announce); } - if (gstr->len > 0) - g_string_truncate (gstr, gstr->len-1); + + if (gstr->len > 0) + g_string_truncate (gstr, gstr->len-1); } static void on_edit_trackers (GtkButton * button, gpointer data) { - struct DetailsImpl * di = data; - tr_torrent * tor = tracker_list_get_current_torrent (di); + struct DetailsImpl * di = data; + tr_torrent * tor = tracker_list_get_current_torrent (di); - if (tor != NULL) + if (tor != NULL) { - guint row; - GtkWidget *w, *d, *fr, *t, *l, *sw; - GtkWindow * win = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))); - GString * gstr = di->gstr; /* buffer for temporary strings */ - const int torrent_id = tr_torrentId (tor); + guint row; + GtkWidget *w, *d, *fr, *t, *l, *sw; + GtkWindow * win = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (button))); + GString * gstr = di->gstr; /* buffer for temporary strings */ + const int torrent_id = tr_torrentId (tor); - g_string_truncate (gstr, 0); - g_string_append_printf (gstr, _("%s - Edit Trackers"), tr_torrentName (tor)); - d = gtk_dialog_new_with_buttons (gstr->str, win, - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, - NULL); - g_signal_connect (d, "response", G_CALLBACK (on_edit_trackers_response), data); + g_string_truncate (gstr, 0); + g_string_append_printf (gstr, _("%s - Edit Trackers"), tr_torrentName (tor)); + d = gtk_dialog_new_with_buttons (gstr->str, win, + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + g_signal_connect (d, "response", G_CALLBACK (on_edit_trackers_response), data); - row = 0; - t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Tracker Announce URLs")); + row = 0; + t = hig_workarea_create (); + hig_workarea_add_section_title (t, &row, _("Tracker Announce URLs")); - l = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" - "To add another primary URL, add it after a blank line.")); - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); - hig_workarea_add_wide_control (t, &row, l); + l = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" + "To add another primary URL, add it after a blank line.")); + gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); + hig_workarea_add_wide_control (t, &row, l); - w = gtk_text_view_new (); - g_string_truncate (gstr, 0); - get_editable_tracker_list (gstr, tor); - gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)), gstr->str, -1); - fr = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), w); - gtk_container_add (GTK_CONTAINER (fr), sw); - gtk_widget_set_size_request (fr, 500u, 166u); - hig_workarea_add_wide_tall_control (t, &row, fr); + w = gtk_text_view_new (); + g_string_truncate (gstr, 0); + get_editable_tracker_list (gstr, tor); + gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (w)), gstr->str, -1); + fr = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), w); + gtk_container_add (GTK_CONTAINER (fr), sw); + gtk_widget_set_size_request (fr, 500u, 166u); + hig_workarea_add_wide_tall_control (t, &row, fr); - gtr_dialog_set_content (GTK_DIALOG (d), t); + gtr_dialog_set_content (GTK_DIALOG (d), t); - g_object_set_qdata (G_OBJECT (d), TORRENT_ID_KEY, GINT_TO_POINTER (torrent_id)); - g_object_set_qdata (G_OBJECT (d), TEXT_BUFFER_KEY, gtk_text_view_get_buffer (GTK_TEXT_VIEW (w))); - gtk_widget_show (d); + g_object_set_qdata (G_OBJECT (d), TORRENT_ID_KEY, GINT_TO_POINTER (torrent_id)); + g_object_set_qdata (G_OBJECT (d), TEXT_BUFFER_KEY, gtk_text_view_get_buffer (GTK_TEXT_VIEW (w))); + gtk_widget_show (d); } } static void on_tracker_list_selection_changed (GtkTreeSelection * sel, gpointer gdi) { - struct DetailsImpl * di = gdi; - const int n = gtk_tree_selection_count_selected_rows (sel); - tr_torrent * tor = tracker_list_get_current_torrent (di); + struct DetailsImpl * di = gdi; + const int n = gtk_tree_selection_count_selected_rows (sel); + tr_torrent * tor = tracker_list_get_current_torrent (di); - gtk_widget_set_sensitive (di->remove_tracker_button, n>0); - gtk_widget_set_sensitive (di->add_tracker_button, tor!=NULL); - gtk_widget_set_sensitive (di->edit_trackers_button, tor!=NULL); + gtk_widget_set_sensitive (di->remove_tracker_button, n>0); + gtk_widget_set_sensitive (di->add_tracker_button, tor!=NULL); + gtk_widget_set_sensitive (di->edit_trackers_button, tor!=NULL); } static void on_add_tracker_response (GtkDialog * dialog, int response, gpointer gdi) { - gboolean destroy = TRUE; + gboolean destroy = TRUE; - if (response == GTK_RESPONSE_ACCEPT) + if (response == GTK_RESPONSE_ACCEPT) { - struct DetailsImpl * di = gdi; - GtkWidget * e = GTK_WIDGET (g_object_get_qdata (G_OBJECT (dialog), URL_ENTRY_KEY)); - const int torrent_id = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), TORRENT_ID_KEY)); - char * url = g_strdup (gtk_entry_get_text (GTK_ENTRY (e))); - g_strstrip (url); + struct DetailsImpl * di = gdi; + GtkWidget * e = GTK_WIDGET (g_object_get_qdata (G_OBJECT (dialog), URL_ENTRY_KEY)); + const int torrent_id = GPOINTER_TO_INT (g_object_get_qdata (G_OBJECT (dialog), TORRENT_ID_KEY)); + char * url = g_strdup (gtk_entry_get_text (GTK_ENTRY (e))); + g_strstrip (url); - if (url && *url) + if (url && *url) { - if (tr_urlIsValidTracker (url)) + if (tr_urlIsValidTracker (url)) { - char * json = g_strdup_printf ( - "{\n" - " \"method\": \"torrent-set\",\n" - " \"arguments\": { \"id\": %d, \"trackerAdd\": [ \"%s\" ] }\n" - "}\n", - torrent_id, url); - gtr_core_exec_json (di->core, json); - refresh (di); - g_free (json); + char * json = g_strdup_printf ( + "{\n" + " \"method\": \"torrent-set\",\n" + " \"arguments\": { \"id\": %d, \"trackerAdd\": [ \"%s\" ] }\n" + "}\n", + torrent_id, url); + gtr_core_exec_json (di->core, json); + refresh (di); + g_free (json); } - else + else { - gtr_unrecognized_url_dialog (GTK_WIDGET (dialog), url); - destroy = FALSE; + gtr_unrecognized_url_dialog (GTK_WIDGET (dialog), url); + destroy = FALSE; } } - g_free (url); + g_free (url); } - if (destroy) - gtk_widget_destroy (GTK_WIDGET (dialog)); + if (destroy) + gtk_widget_destroy (GTK_WIDGET (dialog)); } static void on_tracker_list_add_button_clicked (GtkButton * button UNUSED, gpointer gdi) { - struct DetailsImpl * di = gdi; - tr_torrent * tor = tracker_list_get_current_torrent (di); + struct DetailsImpl * di = gdi; + tr_torrent * tor = tracker_list_get_current_torrent (di); - if (tor != NULL) + if (tor != NULL) { - guint row; - GtkWidget * e; - GtkWidget * t; - GtkWidget * w; - GString * gstr = di->gstr; /* buffer for temporary strings */ + guint row; + GtkWidget * e; + GtkWidget * t; + GtkWidget * w; + GString * gstr = di->gstr; /* buffer for temporary strings */ - g_string_truncate (gstr, 0); - g_string_append_printf (gstr, _("%s - Add Tracker"), tr_torrentName (tor)); - w = gtk_dialog_new_with_buttons (gstr->str, GTK_WINDOW (di->dialog), - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, - NULL); - gtk_dialog_set_alternative_button_order (GTK_DIALOG (w), - GTK_RESPONSE_ACCEPT, - GTK_RESPONSE_CANCEL, - -1); - g_signal_connect (w, "response", G_CALLBACK (on_add_tracker_response), gdi); + g_string_truncate (gstr, 0); + g_string_append_printf (gstr, _("%s - Add Tracker"), tr_torrentName (tor)); + w = gtk_dialog_new_with_buttons (gstr->str, GTK_WINDOW (di->dialog), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (w), + GTK_RESPONSE_ACCEPT, + GTK_RESPONSE_CANCEL, + -1); + g_signal_connect (w, "response", G_CALLBACK (on_add_tracker_response), gdi); - row = 0; - t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Tracker")); - e = gtk_entry_new (); - gtk_widget_set_size_request (e, 400, -1); - gtr_paste_clipboard_url_into_entry (e); - g_object_set_qdata (G_OBJECT (w), URL_ENTRY_KEY, e); - g_object_set_qdata (G_OBJECT (w), TORRENT_ID_KEY, GINT_TO_POINTER (tr_torrentId (tor))); - hig_workarea_add_row (t, &row, _("_Announce URL:"), e, NULL); - gtr_dialog_set_content (GTK_DIALOG (w), t); - gtk_widget_show_all (w); + row = 0; + t = hig_workarea_create (); + hig_workarea_add_section_title (t, &row, _("Tracker")); + e = gtk_entry_new (); + gtk_widget_set_size_request (e, 400, -1); + gtr_paste_clipboard_url_into_entry (e); + g_object_set_qdata (G_OBJECT (w), URL_ENTRY_KEY, e); + g_object_set_qdata (G_OBJECT (w), TORRENT_ID_KEY, GINT_TO_POINTER (tr_torrentId (tor))); + hig_workarea_add_row (t, &row, _("_Announce URL:"), e, NULL); + gtr_dialog_set_content (GTK_DIALOG (w), t); + gtk_widget_show_all (w); } } static void on_tracker_list_remove_button_clicked (GtkButton * button UNUSED, gpointer gdi) { - GtkTreeIter iter; - GtkTreeModel * model; - struct DetailsImpl * di = gdi; - GtkTreeView * v = GTK_TREE_VIEW (di->tracker_view); - GtkTreeSelection * sel = gtk_tree_view_get_selection (v); + GtkTreeIter iter; + GtkTreeModel * model; + struct DetailsImpl * di = gdi; + GtkTreeView * v = GTK_TREE_VIEW (di->tracker_view); + GtkTreeSelection * sel = gtk_tree_view_get_selection (v); - if (gtk_tree_selection_get_selected (sel, &model, &iter)) + if (gtk_tree_selection_get_selected (sel, &model, &iter)) { - char * json; - int torrent_id; - int tracker_id; - gtk_tree_model_get (model, &iter, TRACKER_COL_TRACKER_ID, &tracker_id, - TRACKER_COL_TORRENT_ID, &torrent_id, - -1); - json = g_strdup_printf ("{\n" - " \"method\": \"torrent-set\",\n" - " \"arguments\": { \"id\": %d, \"trackerRemove\": [ %d ] }\n" - "}\n", - torrent_id, tracker_id); - gtr_core_exec_json (di->core, json); - refresh (di); - g_free (json); + char * json; + int torrent_id; + int tracker_id; + gtk_tree_model_get (model, &iter, TRACKER_COL_TRACKER_ID, &tracker_id, + TRACKER_COL_TORRENT_ID, &torrent_id, + -1); + json = g_strdup_printf ("{\n" + " \"method\": \"torrent-set\",\n" + " \"arguments\": { \"id\": %d, \"trackerRemove\": [ %d ] }\n" + "}\n", + torrent_id, tracker_id); + gtr_core_exec_json (di->core, json); + refresh (di); + g_free (json); } } static GtkWidget* tracker_page_new (struct DetailsImpl * di) { - gboolean b; - GtkCellRenderer * r; - GtkTreeViewColumn * c; - GtkTreeSelection * sel; - GtkWidget *vbox, *sw, *w, *v, *hbox; - const int pad = (GUI_PAD + GUI_PAD_BIG) / 2; + gboolean b; + GtkCellRenderer * r; + GtkTreeViewColumn * c; + GtkTreeSelection * sel; + GtkWidget *vbox, *sw, *w, *v, *hbox; + const int pad = (GUI_PAD + GUI_PAD_BIG) / 2; - vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); - gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); + vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); + gtk_container_set_border_width (GTK_CONTAINER (vbox), GUI_PAD_BIG); - di->tracker_store = gtk_list_store_new (TRACKER_N_COLS, G_TYPE_INT, - G_TYPE_STRING, - G_TYPE_BOOLEAN, - G_TYPE_INT, - GDK_TYPE_PIXBUF, - G_TYPE_BOOLEAN, - G_TYPE_STRING); - di->tracker_hash = g_hash_table_new_full (g_str_hash, - g_str_equal, + di->tracker_store = gtk_list_store_new (TRACKER_N_COLS, + G_TYPE_INT, + G_TYPE_STRING, + G_TYPE_BOOLEAN, + G_TYPE_INT, + GDK_TYPE_PIXBUF, + G_TYPE_BOOLEAN, + G_TYPE_STRING); + + di->tracker_hash = g_hash_table_new_full (g_str_hash, + g_str_equal, (GDestroyNotify)g_free, (GDestroyNotify)gtk_tree_row_reference_free); - di->trackers_filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (di->tracker_store), NULL); - gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (di->trackers_filtered), - trackerVisibleFunc, di, NULL); - hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); + di->trackers_filtered = gtk_tree_model_filter_new (GTK_TREE_MODEL (di->tracker_store), NULL); + gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (di->trackers_filtered), + trackerVisibleFunc, di, NULL); - v = di->tracker_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (di->trackers_filtered)); - g_object_unref (di->trackers_filtered); - gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (v), FALSE); - g_signal_connect (v, "button-press-event", G_CALLBACK (on_tree_view_button_pressed), NULL); - g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); - gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); + hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, GUI_PAD_BIG); - sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (v)); - g_signal_connect (sel, "changed", G_CALLBACK (on_tracker_list_selection_changed), di); + v = di->tracker_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL (di->trackers_filtered)); + g_object_unref (di->trackers_filtered); + gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (v), FALSE); + g_signal_connect (v, "button-press-event", G_CALLBACK (on_tree_view_button_pressed), NULL); + g_signal_connect (v, "button-release-event", G_CALLBACK (on_tree_view_button_released), NULL); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (v), TRUE); - c = gtk_tree_view_column_new (); - gtk_tree_view_column_set_title (c, _("Trackers")); - gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); + sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (v)); + g_signal_connect (sel, "changed", G_CALLBACK (on_tracker_list_selection_changed), di); - r = gtk_cell_renderer_pixbuf_new (); - g_object_set (r, "width", 20 + (GUI_PAD_SMALL*2), "xpad", GUI_PAD_SMALL, "ypad", pad, "yalign", 0.0f, NULL); - gtk_tree_view_column_pack_start (c, r, FALSE); - gtk_tree_view_column_add_attribute (c, r, "pixbuf", TRACKER_COL_FAVICON); + c = gtk_tree_view_column_new (); + gtk_tree_view_column_set_title (c, _("Trackers")); + gtk_tree_view_append_column (GTK_TREE_VIEW (v), c); - r = gtk_cell_renderer_text_new (); - g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, "xpad", GUI_PAD_SMALL, "ypad", pad, NULL); - gtk_tree_view_column_pack_start (c, r, TRUE); - gtk_tree_view_column_add_attribute (c, r, "markup", TRACKER_COL_TEXT); + r = gtk_cell_renderer_pixbuf_new (); + g_object_set (r, "width", 20 + (GUI_PAD_SMALL*2), "xpad", GUI_PAD_SMALL, "ypad", pad, "yalign", 0.0f, NULL); + gtk_tree_view_column_pack_start (c, r, FALSE); + gtk_tree_view_column_add_attribute (c, r, "pixbuf", TRACKER_COL_FAVICON); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), v); - w = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (w), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (w), sw); + r = gtk_cell_renderer_text_new (); + g_object_set (G_OBJECT (r), "ellipsize", PANGO_ELLIPSIZE_END, "xpad", GUI_PAD_SMALL, "ypad", pad, NULL); + gtk_tree_view_column_pack_start (c, r, TRUE); + gtk_tree_view_column_add_attribute (c, r, "markup", TRACKER_COL_TEXT); - gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), v); + w = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (w), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (w), sw); - v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); + gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0); - w = gtk_button_new_with_mnemonic (_("_Add")); - di->add_tracker_button = w; - g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_add_button_clicked), di); - gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); + v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); - w = gtk_button_new_with_mnemonic (_("_Edit")); - gtk_button_set_image (GTK_BUTTON (w), gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON)); - g_signal_connect (w, "clicked", G_CALLBACK (on_edit_trackers), di); - di->edit_trackers_button = w; - gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); + w = gtk_button_new_with_mnemonic (_("_Add")); + di->add_tracker_button = w; + g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_add_button_clicked), di); + gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); - w = gtk_button_new_with_mnemonic (_("_Remove")); - di->remove_tracker_button = w; - g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_remove_button_clicked), di); - gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); + w = gtk_button_new_with_mnemonic (_("_Edit")); + gtk_button_set_image (GTK_BUTTON (w), gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_BUTTON)); + g_signal_connect (w, "clicked", G_CALLBACK (on_edit_trackers), di); + di->edit_trackers_button = w; + gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (hbox), v, FALSE, FALSE, 0); + w = gtk_button_new_with_mnemonic (_("_Remove")); + di->remove_tracker_button = w; + g_signal_connect (w, "clicked", G_CALLBACK (on_tracker_list_remove_button_clicked), di); + gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), v, FALSE, FALSE, 0); - w = gtk_check_button_new_with_mnemonic (_("Show _more details")); - di->scrape_check = w; - b = gtr_pref_flag_get (TR_KEY_show_tracker_scrapes); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); - g_signal_connect (w, "toggled", G_CALLBACK (onScrapeToggled), di); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0); - w = gtk_check_button_new_with_mnemonic (_("Show _backup trackers")); - di->all_check = w; - b = gtr_pref_flag_get (TR_KEY_show_backup_trackers); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); - g_signal_connect (w, "toggled", G_CALLBACK (onBackupToggled), di); - gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + w = gtk_check_button_new_with_mnemonic (_("Show _more details")); + di->scrape_check = w; + b = gtr_pref_flag_get (TR_KEY_show_tracker_scrapes); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); + g_signal_connect (w, "toggled", G_CALLBACK (onScrapeToggled), di); + gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); - return vbox; + w = gtk_check_button_new_with_mnemonic (_("Show _backup trackers")); + di->all_check = w; + b = gtr_pref_flag_get (TR_KEY_show_backup_trackers); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (w), b); + g_signal_connect (w, "toggled", G_CALLBACK (onBackupToggled), di); + gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0); + + return vbox; } @@ -2463,134 +2643,134 @@ tracker_page_new (struct DetailsImpl * di) static void refresh (struct DetailsImpl * di) { - int n; - tr_torrent ** torrents = getTorrents (di, &n); + int n; + tr_torrent ** torrents = getTorrents (di, &n); - refreshInfo (di, torrents, n); - refreshPeers (di, torrents, n); - refreshTracker (di, torrents, n); - refreshOptions (di, torrents, n); + refreshInfo (di, torrents, n); + refreshPeers (di, torrents, n); + refreshTracker (di, torrents, n); + refreshOptions (di, torrents, n); - if (n == 0) - gtk_dialog_response (GTK_DIALOG (di->dialog), GTK_RESPONSE_CLOSE); + if (n == 0) + gtk_dialog_response (GTK_DIALOG (di->dialog), GTK_RESPONSE_CLOSE); - g_free (torrents); + g_free (torrents); } static gboolean periodic_refresh (gpointer data) { - refresh (data); + refresh (data); - return G_SOURCE_CONTINUE; + return G_SOURCE_CONTINUE; } static void details_free (gpointer gdata) { - struct DetailsImpl * data = gdata; - g_source_remove (data->periodic_refresh_tag); - g_hash_table_destroy (data->tracker_hash); - g_hash_table_destroy (data->webseed_hash); - g_hash_table_destroy (data->peer_hash); - g_string_free (data->gstr, TRUE); - g_slist_free (data->ids); - g_free (data); + struct DetailsImpl * data = gdata; + g_source_remove (data->periodic_refresh_tag); + g_hash_table_destroy (data->tracker_hash); + g_hash_table_destroy (data->webseed_hash); + g_hash_table_destroy (data->peer_hash); + g_string_free (data->gstr, TRUE); + g_slist_free (data->ids); + g_free (data); } GtkWidget* gtr_torrent_details_dialog_new (GtkWindow * parent, TrCore * core) { - GtkWidget *d, *n, *v, *w, *l; - struct DetailsImpl * di = g_new0 (struct DetailsImpl, 1); + GtkWidget *d, *n, *v, *w, *l; + struct DetailsImpl * di = g_new0 (struct DetailsImpl, 1); - /* one-time setup */ - if (ARG_KEY == 0) + /* one-time setup */ + if (ARG_KEY == 0) { - ARG_KEY = g_quark_from_static_string ("tr-arg-key"); - DETAILS_KEY = g_quark_from_static_string ("tr-details-data-key"); - TORRENT_ID_KEY = g_quark_from_static_string ("tr-torrent-id-key"); - TEXT_BUFFER_KEY = g_quark_from_static_string ("tr-text-buffer-key"); - URL_ENTRY_KEY = g_quark_from_static_string ("tr-url-entry-key"); + ARG_KEY = g_quark_from_static_string ("tr-arg-key"); + DETAILS_KEY = g_quark_from_static_string ("tr-details-data-key"); + TORRENT_ID_KEY = g_quark_from_static_string ("tr-torrent-id-key"); + TEXT_BUFFER_KEY = g_quark_from_static_string ("tr-text-buffer-key"); + URL_ENTRY_KEY = g_quark_from_static_string ("tr-url-entry-key"); } - /* create the dialog */ - di->core = core; - di->gstr = g_string_new (NULL); - d = gtk_dialog_new_with_buttons (NULL, parent, 0, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - di->dialog = d; - gtk_window_set_role (GTK_WINDOW (d), "tr-info"); - g_signal_connect_swapped (d, "response", - G_CALLBACK (gtk_widget_destroy), d); - gtk_container_set_border_width (GTK_CONTAINER (d), GUI_PAD); - g_object_set_qdata_full (G_OBJECT (d), DETAILS_KEY, di, details_free); + /* create the dialog */ + di->core = core; + di->gstr = g_string_new (NULL); + d = gtk_dialog_new_with_buttons (NULL, parent, 0, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + di->dialog = d; + gtk_window_set_role (GTK_WINDOW (d), "tr-info"); + g_signal_connect_swapped (d, "response", + G_CALLBACK (gtk_widget_destroy), d); + gtk_container_set_border_width (GTK_CONTAINER (d), GUI_PAD); + g_object_set_qdata_full (G_OBJECT (d), DETAILS_KEY, di, details_free); - n = gtk_notebook_new (); - gtk_container_set_border_width (GTK_CONTAINER (n), GUI_PAD); + n = gtk_notebook_new (); + gtk_container_set_border_width (GTK_CONTAINER (n), GUI_PAD); - w = info_page_new (di); - l = gtk_label_new (_("Information")); - gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); + w = info_page_new (di); + l = gtk_label_new (_("Information")); + gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); - w = peer_page_new (di); - l = gtk_label_new (_("Peers")); - gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); + w = peer_page_new (di); + l = gtk_label_new (_("Peers")); + gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); - w = tracker_page_new (di); - l = gtk_label_new (_("Trackers")); - gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); + w = tracker_page_new (di); + l = gtk_label_new (_("Trackers")); + gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); - v = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); - di->file_list = gtr_file_list_new (core, 0); - di->file_label = gtk_label_new (_("File listing not available for combined torrent properties")); - gtk_box_pack_start (GTK_BOX (v), di->file_list, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (v), di->file_label, TRUE, TRUE, 0); - gtk_container_set_border_width (GTK_CONTAINER (v), GUI_PAD_BIG); - l = gtk_label_new (_("Files")); - gtk_notebook_append_page (GTK_NOTEBOOK (n), v, l); + v = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); + di->file_list = gtr_file_list_new (core, 0); + di->file_label = gtk_label_new (_("File listing not available for combined torrent properties")); + gtk_box_pack_start (GTK_BOX (v), di->file_list, TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (v), di->file_label, TRUE, TRUE, 0); + gtk_container_set_border_width (GTK_CONTAINER (v), GUI_PAD_BIG); + l = gtk_label_new (_("Files")); + gtk_notebook_append_page (GTK_NOTEBOOK (n), v, l); - w = options_page_new (di); - l = gtk_label_new (_("Options")); - gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); + w = options_page_new (di); + l = gtk_label_new (_("Options")); + gtk_notebook_append_page (GTK_NOTEBOOK (n), w, l); - gtr_dialog_set_content (GTK_DIALOG (d), n); - di->periodic_refresh_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, - periodic_refresh, di); - return d; + gtr_dialog_set_content (GTK_DIALOG (d), n); + di->periodic_refresh_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, + periodic_refresh, di); + return d; } void gtr_torrent_details_dialog_set_torrents (GtkWidget * w, GSList * ids) { - char title[256]; - const int len = g_slist_length (ids); - struct DetailsImpl * di = g_object_get_qdata (G_OBJECT (w), DETAILS_KEY); + char title[256]; + const int len = g_slist_length (ids); + struct DetailsImpl * di = g_object_get_qdata (G_OBJECT (w), DETAILS_KEY); - g_slist_free (di->ids); - di->ids = g_slist_copy (ids); + g_slist_free (di->ids); + di->ids = g_slist_copy (ids); - if (len == 1) + if (len == 1) { - const int id = GPOINTER_TO_INT (ids->data); - tr_torrent * tor = gtr_core_find_torrent (di->core, id); - const tr_info * inf = tr_torrentInfo (tor); - g_snprintf (title, sizeof (title), _("%s Properties"), inf->name); + const int id = GPOINTER_TO_INT (ids->data); + tr_torrent * tor = gtr_core_find_torrent (di->core, id); + const tr_info * inf = tr_torrentInfo (tor); + g_snprintf (title, sizeof (title), _("%s Properties"), inf->name); - gtr_file_list_set_torrent (di->file_list, id); - gtk_widget_show (di->file_list); - gtk_widget_hide (di->file_label); + gtr_file_list_set_torrent (di->file_list, id); + gtk_widget_show (di->file_list); + gtk_widget_hide (di->file_label); } - else - { - gtr_file_list_clear (di->file_list); - gtk_widget_hide (di->file_list); - gtk_widget_show (di->file_label); - g_snprintf (title, sizeof (title), _("%'d Torrent Properties"), len); + else + { + gtr_file_list_clear (di->file_list); + gtk_widget_hide (di->file_list); + gtk_widget_show (di->file_label); + g_snprintf (title, sizeof (title), _("%'d Torrent Properties"), len); } - gtk_window_set_title (GTK_WINDOW (w), title); + gtk_window_set_title (GTK_WINDOW (w), title); - refresh (di); + refresh (di); } diff --git a/gtk/makemeta-ui.c b/gtk/makemeta-ui.c index aefd882d9..3a6c95be9 100644 --- a/gtk/makemeta-ui.c +++ b/gtk/makemeta-ui.c @@ -27,245 +27,254 @@ typedef struct { - char * target; - guint progress_tag; - GtkWidget * file_radio; - GtkWidget * file_chooser; - GtkWidget * folder_radio; - GtkWidget * folder_chooser; - GtkWidget * pieces_lb; - GtkWidget * destination_chooser; - GtkWidget * comment_check; - GtkWidget * comment_entry; - GtkWidget * private_check; - GtkWidget * progress_label; - GtkWidget * progress_bar; - GtkWidget * progress_dialog; - GtkWidget * dialog; - GtkTextBuffer * announce_text_buffer; - TrCore * core; - tr_metainfo_builder * builder; + char * target; + guint progress_tag; + GtkWidget * file_radio; + GtkWidget * file_chooser; + GtkWidget * folder_radio; + GtkWidget * folder_chooser; + GtkWidget * pieces_lb; + GtkWidget * destination_chooser; + GtkWidget * comment_check; + GtkWidget * comment_entry; + GtkWidget * private_check; + GtkWidget * progress_label; + GtkWidget * progress_bar; + GtkWidget * progress_dialog; + GtkWidget * dialog; + GtkTextBuffer * announce_text_buffer; + TrCore * core; + tr_metainfo_builder * builder; } MakeMetaUI; static void freeMetaUI (gpointer p) { - MakeMetaUI * ui = p; + MakeMetaUI * ui = p; - tr_metaInfoBuilderFree (ui->builder); - g_free (ui->target); - memset (ui, ~0, sizeof (MakeMetaUI)); - g_free (ui); + tr_metaInfoBuilderFree (ui->builder); + g_free (ui->target); + memset (ui, ~0, sizeof (MakeMetaUI)); + g_free (ui); } static gboolean onProgressDialogRefresh (gpointer data) { - char * str = NULL; - MakeMetaUI * ui = data; - const tr_metainfo_builder * b = ui->builder; - GtkDialog * d = GTK_DIALOG (ui->progress_dialog); - GtkProgressBar * p = GTK_PROGRESS_BAR (ui->progress_bar); - const double fraction = b->pieceCount ? ((double)b->pieceIndex / b->pieceCount) : 0; - char * base = g_path_get_basename (b->top); + char * str = NULL; + MakeMetaUI * ui = data; + const tr_metainfo_builder * b = ui->builder; + GtkDialog * d = GTK_DIALOG (ui->progress_dialog); + GtkProgressBar * p = GTK_PROGRESS_BAR (ui->progress_bar); + const double fraction = b->pieceCount ? ((double)b->pieceIndex / b->pieceCount) : 0; + char * base = g_path_get_basename (b->top); - /* progress label */ - if (!b->isDone) - str = g_strdup_printf (_("Creating \"%s\""), base); - else if (b->result == TR_MAKEMETA_OK) - str = g_strdup_printf (_("Created \"%s\"!"), base); - else if (b->result == TR_MAKEMETA_URL) - str = g_strdup_printf (_("Error: invalid announce URL \"%s\""), b->errfile); - else if (b->result == TR_MAKEMETA_CANCELLED) - str = g_strdup_printf (_("Cancelled")); - else if (b->result == TR_MAKEMETA_IO_READ) - str = g_strdup_printf (_("Error reading \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); - else if (b->result == TR_MAKEMETA_IO_WRITE) - str = g_strdup_printf (_("Error writing \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); - else - g_assert_not_reached (); + /* progress label */ + if (!b->isDone) + str = g_strdup_printf (_("Creating \"%s\""), base); + else if (b->result == TR_MAKEMETA_OK) + str = g_strdup_printf (_("Created \"%s\"!"), base); + else if (b->result == TR_MAKEMETA_URL) + str = g_strdup_printf (_("Error: invalid announce URL \"%s\""), b->errfile); + else if (b->result == TR_MAKEMETA_CANCELLED) + str = g_strdup_printf (_("Cancelled")); + else if (b->result == TR_MAKEMETA_IO_READ) + str = g_strdup_printf (_("Error reading \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); + else if (b->result == TR_MAKEMETA_IO_WRITE) + str = g_strdup_printf (_("Error writing \"%s\": %s"), b->errfile, g_strerror (b->my_errno)); + else + g_assert_not_reached (); - if (str != NULL) { - gtr_label_set_text (GTK_LABEL (ui->progress_label), str); - g_free (str); + if (str != NULL) + { + gtr_label_set_text (GTK_LABEL (ui->progress_label), str); + g_free (str); } - /* progress bar */ - if (!b->pieceIndex) - str = g_strdup (""); - else { - char sizebuf[128]; - tr_strlsize (sizebuf, (uint64_t)b->pieceIndex * + /* progress bar */ + if (!b->pieceIndex) + { + str = g_strdup (""); + } + else + { + char sizebuf[128]; + tr_strlsize (sizebuf, (uint64_t)b->pieceIndex * (uint64_t)b->pieceSize, sizeof (sizebuf)); - /* how much data we've scanned through to generate checksums */ - str = g_strdup_printf (_("Scanned %s"), sizebuf); + /* how much data we've scanned through to generate checksums */ + str = g_strdup_printf (_("Scanned %s"), sizebuf); } - gtk_progress_bar_set_fraction (p, fraction); - gtk_progress_bar_set_text (p, str); - g_free (str); + gtk_progress_bar_set_fraction (p, fraction); + gtk_progress_bar_set_text (p, str); + g_free (str); - /* buttons */ - gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CANCEL, !b->isDone); - gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CLOSE, b->isDone); - gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_ACCEPT, b->isDone && !b->result); + /* buttons */ + gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CANCEL, !b->isDone); + gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_CLOSE, b->isDone); + gtk_dialog_set_response_sensitive (d, GTK_RESPONSE_ACCEPT, b->isDone && !b->result); - g_free (base); - - return G_SOURCE_CONTINUE; + g_free (base); + return G_SOURCE_CONTINUE; } static void onProgressDialogDestroyed (gpointer data, GObject * dead UNUSED) { - MakeMetaUI * ui = data; - g_source_remove (ui->progress_tag); + MakeMetaUI * ui = data; + g_source_remove (ui->progress_tag); } static void addTorrent (MakeMetaUI * ui) { - char * path; - const tr_metainfo_builder * b = ui->builder; - tr_ctor * ctor = tr_ctorNew (gtr_core_session (ui->core)); + char * path; + const tr_metainfo_builder * b = ui->builder; + tr_ctor * ctor = tr_ctorNew (gtr_core_session (ui->core)); - tr_ctorSetMetainfoFromFile (ctor, ui->target); + tr_ctorSetMetainfoFromFile (ctor, ui->target); - path = g_path_get_dirname (b->top); - tr_ctorSetDownloadDir (ctor, TR_FORCE, path); - g_free (path); + path = g_path_get_dirname (b->top); + tr_ctorSetDownloadDir (ctor, TR_FORCE, path); + g_free (path); - gtr_core_add_ctor (ui->core, ctor); + gtr_core_add_ctor (ui->core, ctor); } static void onProgressDialogResponse (GtkDialog * d, int response, gpointer data) { - MakeMetaUI * ui = data; + MakeMetaUI * ui = data; - switch (response) + switch (response) { - case GTK_RESPONSE_CANCEL: - ui->builder->abortFlag = TRUE; - gtk_widget_destroy (GTK_WIDGET (d)); - break; - case GTK_RESPONSE_ACCEPT: - addTorrent (ui); - /* fall-through */ - case GTK_RESPONSE_CLOSE: - gtk_widget_destroy (ui->builder->result ? GTK_WIDGET (d) : ui->dialog); - break; - default: - g_assert (0 && "unhandled response"); + case GTK_RESPONSE_CANCEL: + ui->builder->abortFlag = TRUE; + gtk_widget_destroy (GTK_WIDGET (d)); + break; + + case GTK_RESPONSE_ACCEPT: + addTorrent (ui); + /* fall-through */ + + case GTK_RESPONSE_CLOSE: + gtk_widget_destroy (ui->builder->result ? GTK_WIDGET (d) : ui->dialog); + break; + + default: + g_assert (0 && "unhandled response"); } } static void makeProgressDialog (GtkWidget * parent, MakeMetaUI * ui) { - GtkWidget *d, *l, *w, *v, *fr; + GtkWidget *d, *l, *w, *v, *fr; - d = gtk_dialog_new_with_buttons (_("New Torrent"), - GTK_WINDOW (parent), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, - NULL); - ui->progress_dialog = d; - g_signal_connect (d, "response", G_CALLBACK (onProgressDialogResponse), ui); + d = gtk_dialog_new_with_buttons (_("New Torrent"), + GTK_WINDOW (parent), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + GTK_STOCK_ADD, GTK_RESPONSE_ACCEPT, + NULL); + ui->progress_dialog = d; + g_signal_connect (d, "response", G_CALLBACK (onProgressDialogResponse), ui); - fr = gtk_frame_new (NULL); - gtk_container_set_border_width (GTK_CONTAINER (fr), GUI_PAD_BIG); - gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_NONE); - v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); - gtk_container_add (GTK_CONTAINER (fr), v); + fr = gtk_frame_new (NULL); + gtk_container_set_border_width (GTK_CONTAINER (fr), GUI_PAD_BIG); + gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_NONE); + v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD); + gtk_container_add (GTK_CONTAINER (fr), v); - l = gtk_label_new (_("Creating torrent…")); - gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - ui->progress_label = l; - gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); + l = gtk_label_new (_("Creating torrent…")); + gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); + gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); + ui->progress_label = l; + gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); - w = gtk_progress_bar_new (); - ui->progress_bar = w; - gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); + w = gtk_progress_bar_new (); + ui->progress_bar = w; + gtk_box_pack_start (GTK_BOX (v), w, FALSE, FALSE, 0); - ui->progress_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, onProgressDialogRefresh, ui); - g_object_weak_ref (G_OBJECT (d), onProgressDialogDestroyed, ui); - onProgressDialogRefresh (ui); + ui->progress_tag = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, onProgressDialogRefresh, ui); + g_object_weak_ref (G_OBJECT (d), onProgressDialogDestroyed, ui); + onProgressDialogRefresh (ui); - gtr_dialog_set_content (GTK_DIALOG (d), fr); - gtk_widget_show (d); + gtr_dialog_set_content (GTK_DIALOG (d), fr); + gtk_widget_show (d); } static void onResponse (GtkDialog* d, int response, gpointer user_data) { - MakeMetaUI * ui = user_data; + MakeMetaUI * ui = user_data; - if (response == GTK_RESPONSE_ACCEPT) + if (response == GTK_RESPONSE_ACCEPT) { - if (ui->builder != NULL) + if (ui->builder != NULL) { - int i; - int n; - int tier; - GtkTextIter start, end; - char * dir; - char * base; - char * tracker_text; - char ** tracker_strings; - GtkEntry * c_entry = GTK_ENTRY (ui->comment_entry); - GtkToggleButton * p_check = GTK_TOGGLE_BUTTON (ui->private_check); - GtkToggleButton * c_check = GTK_TOGGLE_BUTTON (ui->comment_check); - const char * comment = gtk_entry_get_text (c_entry); - const gboolean isPrivate = gtk_toggle_button_get_active (p_check); - const gboolean useComment = gtk_toggle_button_get_active (c_check); - tr_tracker_info * trackers; + int i; + int n; + int tier; + GtkTextIter start, end; + char * dir; + char * base; + char * tracker_text; + char ** tracker_strings; + GtkEntry * c_entry = GTK_ENTRY (ui->comment_entry); + GtkToggleButton * p_check = GTK_TOGGLE_BUTTON (ui->private_check); + GtkToggleButton * c_check = GTK_TOGGLE_BUTTON (ui->comment_check); + const char * comment = gtk_entry_get_text (c_entry); + const gboolean isPrivate = gtk_toggle_button_get_active (p_check); + const gboolean useComment = gtk_toggle_button_get_active (c_check); + tr_tracker_info * trackers; - /* destination file */ - dir = gtk_file_chooser_get_filename ( - GTK_FILE_CHOOSER (ui->destination_chooser)); - base = g_path_get_basename (ui->builder->top); - g_free (ui->target); - ui->target = g_strdup_printf ("%s/%s.torrent", dir, base); + /* destination file */ + dir = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (ui->destination_chooser)); + base = g_path_get_basename (ui->builder->top); + g_free (ui->target); + ui->target = g_strdup_printf ("%s/%s.torrent", dir, base); - /* build the array of trackers */ - gtk_text_buffer_get_bounds (ui->announce_text_buffer, &start, &end); - tracker_text = gtk_text_buffer_get_text (ui->announce_text_buffer, + /* build the array of trackers */ + gtk_text_buffer_get_bounds (ui->announce_text_buffer, &start, &end); + tracker_text = gtk_text_buffer_get_text (ui->announce_text_buffer, &start, &end, FALSE); - tracker_strings = g_strsplit (tracker_text, "\n", 0); - for (i=0; tracker_strings[i];) - ++i; - trackers = g_new0 (tr_tracker_info, i); - for (i=n=tier=0; tracker_strings[i]; ++i) { - const char * str = tracker_strings[i]; - if (!*str) - ++tier; - else { - trackers[n].tier = tier; - trackers[n].announce = tracker_strings[i]; - ++n; + tracker_strings = g_strsplit (tracker_text, "\n", 0); + for (i=0; tracker_strings[i];) + ++i; + trackers = g_new0 (tr_tracker_info, i); + for (i=n=tier=0; tracker_strings[i]; ++i) + { + const char * str = tracker_strings[i]; + if (!*str) + { + ++tier; + } + else + { + trackers[n].tier = tier; + trackers[n].announce = tracker_strings[i]; + ++n; } } - /* build the .torrent */ - makeProgressDialog (GTK_WIDGET (d), ui); - tr_makeMetaInfo (ui->builder, ui->target, trackers, n, - useComment ? comment : NULL, isPrivate); + /* build the .torrent */ + makeProgressDialog (GTK_WIDGET (d), ui); + tr_makeMetaInfo (ui->builder, ui->target, trackers, n, + useComment ? comment : NULL, isPrivate); - /* cleanup */ - g_free (trackers); - g_strfreev (tracker_strings); - g_free (tracker_text); - g_free (base); - g_free (dir); + /* cleanup */ + g_free (trackers); + g_strfreev (tracker_strings); + g_free (tracker_text); + g_free (base); + g_free (dir); } } - else if (response == GTK_RESPONSE_CLOSE) + else if (response == GTK_RESPONSE_CLOSE) { - gtk_widget_destroy (GTK_WIDGET (d)); + gtk_widget_destroy (GTK_WIDGET (d)); } } @@ -276,99 +285,97 @@ onResponse (GtkDialog* d, int response, gpointer user_data) static void onSourceToggled (GtkToggleButton * tb, gpointer user_data) { - gtk_widget_set_sensitive (GTK_WIDGET (user_data), - gtk_toggle_button_get_active (tb)); + gtk_widget_set_sensitive (GTK_WIDGET (user_data), + gtk_toggle_button_get_active (tb)); } static void updatePiecesLabel (MakeMetaUI * ui) { - const tr_metainfo_builder * builder = ui->builder; - const char * filename = builder ? builder->top : NULL; - GString * gstr = g_string_new (NULL); + const tr_metainfo_builder * builder = ui->builder; + const char * filename = builder ? builder->top : NULL; + GString * gstr = g_string_new (NULL); - g_string_append (gstr, ""); - if (!filename) + g_string_append (gstr, ""); + if (!filename) { - g_string_append (gstr, _("No source selected")); + g_string_append (gstr, _("No source selected")); } - else + else { - char buf[128]; - tr_strlsize (buf, builder->totalSize, sizeof (buf)); - g_string_append_printf (gstr, ngettext ("%1$s; %2$'d File", - "%1$s; %2$'d Files", - builder->fileCount), - buf, builder->fileCount); - g_string_append (gstr, "; "); + char buf[128]; + tr_strlsize (buf, builder->totalSize, sizeof (buf)); + g_string_append_printf (gstr, ngettext ("%1$s; %2$'d File", + "%1$s; %2$'d Files", + builder->fileCount), + buf, builder->fileCount); + g_string_append (gstr, "; "); - tr_formatter_mem_B (buf, builder->pieceSize, sizeof (buf)); - g_string_append_printf (gstr, ngettext ("%1$'d Piece @ %2$s", - "%1$'d Pieces @ %2$s", - builder->pieceCount), - builder->pieceCount, buf); + tr_formatter_mem_B (buf, builder->pieceSize, sizeof (buf)); + g_string_append_printf (gstr, ngettext ("%1$'d Piece @ %2$s", + "%1$'d Pieces @ %2$s", + builder->pieceCount), + builder->pieceCount, buf); } - g_string_append (gstr, ""); - gtk_label_set_markup (GTK_LABEL (ui->pieces_lb), gstr->str); - g_string_free (gstr, TRUE); + + g_string_append (gstr, ""); + gtk_label_set_markup (GTK_LABEL (ui->pieces_lb), gstr->str); + g_string_free (gstr, TRUE); } static void setFilename (MakeMetaUI * ui, const char * filename) { - if (ui->builder) { - tr_metaInfoBuilderFree (ui->builder); - ui->builder = NULL; - } + g_clear_pointer (&ui->builder, (GDestroyNotify)tr_metaInfoBuilderFree); - if (filename) - ui->builder = tr_metaInfoBuilderCreate (filename); + if (filename) + ui->builder = tr_metaInfoBuilderCreate (filename); - updatePiecesLabel (ui); + updatePiecesLabel (ui); } static void onChooserChosen (GtkFileChooser * chooser, gpointer user_data) { - char * filename; - MakeMetaUI * ui = user_data; + char * filename; + MakeMetaUI * ui = user_data; - g_object_set_data (G_OBJECT (chooser), FILE_CHOSEN_KEY, - GINT_TO_POINTER (TRUE)); + g_object_set_data (G_OBJECT (chooser), FILE_CHOSEN_KEY, + GINT_TO_POINTER (TRUE)); - filename = gtk_file_chooser_get_filename (chooser); - setFilename (ui, filename); - g_free (filename); + filename = gtk_file_chooser_get_filename (chooser); + setFilename (ui, filename); + g_free (filename); } static void onSourceToggled2 (GtkToggleButton * tb, GtkWidget * chooser, MakeMetaUI * ui) { - if (gtk_toggle_button_get_active (tb)) + if (gtk_toggle_button_get_active (tb)) { - if (g_object_get_data (G_OBJECT (chooser), FILE_CHOSEN_KEY) != NULL) - onChooserChosen (GTK_FILE_CHOOSER (chooser), ui); - else - setFilename (ui, NULL); + if (g_object_get_data (G_OBJECT (chooser), FILE_CHOSEN_KEY) != NULL) + onChooserChosen (GTK_FILE_CHOOSER (chooser), ui); + else + setFilename (ui, NULL); } } static void onFolderToggled (GtkToggleButton * tb, gpointer data) { - MakeMetaUI * ui = data; - onSourceToggled2 (tb, ui->folder_chooser, ui); + MakeMetaUI * ui = data; + onSourceToggled2 (tb, ui->folder_chooser, ui); } static void onFileToggled (GtkToggleButton * tb, gpointer data) { - MakeMetaUI * ui = data; - onSourceToggled2 (tb, ui->file_chooser, ui); + MakeMetaUI * ui = data; + onSourceToggled2 (tb, ui->file_chooser, ui); } static const char * getDefaultSavePath (void) { - return g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); + return g_get_user_special_dir (G_USER_DIRECTORY_DESKTOP); } static void @@ -381,137 +388,137 @@ on_drag_data_received (GtkWidget * widget UNUSED, guint time_, gpointer user_data) { - gboolean success = FALSE; - MakeMetaUI * ui = user_data; - char ** uris = gtk_selection_data_get_uris (selection_data); + gboolean success = FALSE; + MakeMetaUI * ui = user_data; + char ** uris = gtk_selection_data_get_uris (selection_data); - if (uris && uris[0]) + if (uris && uris[0]) { - const char * uri = uris[ 0 ]; - gchar * filename = g_filename_from_uri (uri, NULL, NULL); + const char * uri = uris[ 0 ]; + gchar * filename = g_filename_from_uri (uri, NULL, NULL); - if (g_file_test (filename, G_FILE_TEST_IS_DIR)) + if (g_file_test (filename, G_FILE_TEST_IS_DIR)) { - /* a directory was dragged onto the dialog... */ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->folder_radio), TRUE); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (ui->folder_chooser), filename); - success = TRUE; + /* a directory was dragged onto the dialog... */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->folder_radio), TRUE); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (ui->folder_chooser), filename); + success = TRUE; } - else if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) + else if (g_file_test (filename, G_FILE_TEST_IS_REGULAR)) { - /* a file was dragged on to the dialog... */ - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->file_radio), TRUE); - gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ui->file_chooser), filename); - success = TRUE; + /* a file was dragged on to the dialog... */ + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (ui->file_radio), TRUE); + gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (ui->file_chooser), filename); + success = TRUE; } - g_free (filename); + g_free (filename); } - g_strfreev (uris); - gtk_drag_finish (drag_context, success, FALSE, time_); + g_strfreev (uris); + gtk_drag_finish (drag_context, success, FALSE, time_); } GtkWidget* gtr_torrent_creation_dialog_new (GtkWindow * parent, TrCore * core) { - const char * str; - GtkWidget * d, *t, *w, *l, *fr, *sw, *v; - GSList * slist; - guint row = 0; - MakeMetaUI * ui = g_new0 (MakeMetaUI, 1); + const char * str; + GtkWidget * d, *t, *w, *l, *fr, *sw, *v; + GSList * slist; + guint row = 0; + MakeMetaUI * ui = g_new0 (MakeMetaUI, 1); - ui->core = core; + ui->core = core; - d = gtk_dialog_new_with_buttons (_("New Torrent"), - parent, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - GTK_STOCK_NEW, GTK_RESPONSE_ACCEPT, - NULL); - ui->dialog = d; - g_signal_connect (d, "response", G_CALLBACK (onResponse), ui); - g_object_set_data_full (G_OBJECT (d), "ui", ui, freeMetaUI); + d = gtk_dialog_new_with_buttons (_("New Torrent"), + parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + GTK_STOCK_NEW, GTK_RESPONSE_ACCEPT, + NULL); + ui->dialog = d; + g_signal_connect (d, "response", G_CALLBACK (onResponse), ui); + g_object_set_data_full (G_OBJECT (d), "ui", ui, freeMetaUI); - t = hig_workarea_create (); + t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Files")); + hig_workarea_add_section_title (t, &row, _("Files")); - str = _("Sa_ve to:"); - w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), getDefaultSavePath ()); - ui->destination_chooser = w; - hig_workarea_add_row (t, &row, str, w, NULL); + str = _("Sa_ve to:"); + w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), getDefaultSavePath ()); + ui->destination_chooser = w; + hig_workarea_add_row (t, &row, str, w, NULL); - l = gtk_radio_button_new_with_mnemonic (NULL, _("Source F_older:")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); - w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); - g_signal_connect (l, "toggled", G_CALLBACK (onFolderToggled), ui); - g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); - g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); - ui->folder_radio = l; - ui->folder_chooser = w; - gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); - hig_workarea_add_row_w (t, &row, l, w, NULL); + l = gtk_radio_button_new_with_mnemonic (NULL, _("Source F_older:")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); + w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + g_signal_connect (l, "toggled", G_CALLBACK (onFolderToggled), ui); + g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); + g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); + ui->folder_radio = l; + ui->folder_chooser = w; + gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); + hig_workarea_add_row_w (t, &row, l, w, NULL); - slist = gtk_radio_button_get_group (GTK_RADIO_BUTTON (l)), - l = gtk_radio_button_new_with_mnemonic (slist, _("Source _File:")); - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), TRUE); - w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_OPEN); - g_signal_connect (l, "toggled", G_CALLBACK (onFileToggled), ui); - g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); - g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); - ui->file_radio = l; - ui->file_chooser = w; - hig_workarea_add_row_w (t, &row, l, w, NULL); + slist = gtk_radio_button_get_group (GTK_RADIO_BUTTON (l)), + l = gtk_radio_button_new_with_mnemonic (slist, _("Source _File:")); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), TRUE); + w = gtk_file_chooser_button_new (NULL, GTK_FILE_CHOOSER_ACTION_OPEN); + g_signal_connect (l, "toggled", G_CALLBACK (onFileToggled), ui); + g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); + g_signal_connect (w, "selection-changed", G_CALLBACK (onChooserChosen), ui); + ui->file_radio = l; + ui->file_chooser = w; + hig_workarea_add_row_w (t, &row, l, w, NULL); - w = gtk_label_new (NULL); - ui->pieces_lb = w; - gtk_label_set_markup (GTK_LABEL (w), _("No source selected")); - hig_workarea_add_row (t, &row, NULL, w, NULL); + w = gtk_label_new (NULL); + ui->pieces_lb = w; + gtk_label_set_markup (GTK_LABEL (w), _("No source selected")); + hig_workarea_add_row (t, &row, NULL, w, NULL); - hig_workarea_add_section_divider (t, &row); - hig_workarea_add_section_title (t, &row, _("Properties")); + hig_workarea_add_section_divider (t, &row); + hig_workarea_add_section_title (t, &row, _("Properties")); - str = _("_Trackers:"); - v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD_SMALL); - ui->announce_text_buffer = gtk_text_buffer_new (NULL); - w = gtk_text_view_new_with_buffer (ui->announce_text_buffer); - gtk_widget_set_size_request (w, -1, 80); - sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), - GTK_POLICY_AUTOMATIC, - GTK_POLICY_AUTOMATIC); - gtk_container_add (GTK_CONTAINER (sw), w); - fr = gtk_frame_new (NULL); - gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); - gtk_container_add (GTK_CONTAINER (fr), sw); - gtk_box_pack_start (GTK_BOX (v), fr, TRUE, TRUE, 0); - l = gtk_label_new (NULL); - gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" - "To add another primary URL, add it after a blank line.")); - gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); - gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); - gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); - hig_workarea_add_tall_row (t, &row, str, v, NULL); + str = _("_Trackers:"); + v = gtk_box_new (GTK_ORIENTATION_VERTICAL, GUI_PAD_SMALL); + ui->announce_text_buffer = gtk_text_buffer_new (NULL); + w = gtk_text_view_new_with_buffer (ui->announce_text_buffer); + gtk_widget_set_size_request (w, -1, 80); + sw = gtk_scrolled_window_new (NULL, NULL); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), + GTK_POLICY_AUTOMATIC, + GTK_POLICY_AUTOMATIC); + gtk_container_add (GTK_CONTAINER (sw), w); + fr = gtk_frame_new (NULL); + gtk_frame_set_shadow_type (GTK_FRAME (fr), GTK_SHADOW_IN); + gtk_container_add (GTK_CONTAINER (fr), sw); + gtk_box_pack_start (GTK_BOX (v), fr, TRUE, TRUE, 0); + l = gtk_label_new (NULL); + gtk_label_set_markup (GTK_LABEL (l), _("To add a backup URL, add it on the line after the primary URL.\n" + "To add another primary URL, add it after a blank line.")); + gtk_label_set_justify (GTK_LABEL (l), GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (l), 0.0, 0.5); + gtk_box_pack_start (GTK_BOX (v), l, FALSE, FALSE, 0); + hig_workarea_add_tall_row (t, &row, str, v, NULL); - l = gtk_check_button_new_with_mnemonic (_("Co_mment:")); - ui->comment_check = l; - gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); - w = gtk_entry_new (); - ui->comment_entry = w; - gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); - g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); - hig_workarea_add_row_w (t, &row, l, w, NULL); + l = gtk_check_button_new_with_mnemonic (_("Co_mment:")); + ui->comment_check = l; + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (l), FALSE); + w = gtk_entry_new (); + ui->comment_entry = w; + gtk_widget_set_sensitive (GTK_WIDGET (w), FALSE); + g_signal_connect (l, "toggled", G_CALLBACK (onSourceToggled), w); + hig_workarea_add_row_w (t, &row, l, w, NULL); - w = hig_workarea_add_wide_checkbutton (t, &row, _("_Private torrent"), FALSE); - ui->private_check = w; + w = hig_workarea_add_wide_checkbutton (t, &row, _("_Private torrent"), FALSE); + ui->private_check = w; - gtr_dialog_set_content (GTK_DIALOG (d), t); + gtr_dialog_set_content (GTK_DIALOG (d), t); - gtk_drag_dest_set (d, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); - gtk_drag_dest_add_uri_targets (d); - g_signal_connect (d, "drag-data-received", G_CALLBACK (on_drag_data_received), ui); + gtk_drag_dest_set (d, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_COPY); + gtk_drag_dest_add_uri_targets (d); + g_signal_connect (d, "drag-data-received", G_CALLBACK (on_drag_data_received), ui); - return d; + return d; } diff --git a/gtk/msgwin.c b/gtk/msgwin.c index 050ad4ea4..d39e83f3e 100644 --- a/gtk/msgwin.c +++ b/gtk/msgwin.c @@ -28,23 +28,23 @@ enum { - COL_SEQUENCE, - COL_NAME, - COL_MESSAGE, - COL_TR_MSG, - N_COLUMNS + COL_SEQUENCE, + COL_NAME, + COL_MESSAGE, + COL_TR_MSG, + N_COLUMNS }; struct MsgData { - TrCore * core; - GtkTreeView * view; - GtkListStore * store; - GtkTreeModel * filter; - GtkTreeModel * sort; - tr_msg_level maxLevel; - gboolean isPaused; - guint refresh_tag; + TrCore * core; + GtkTreeView * view; + GtkListStore * store; + GtkTreeModel * filter; + GtkTreeModel * sort; + tr_msg_level maxLevel; + gboolean isPaused; + guint refresh_tag; }; static struct tr_msg_list * myTail = NULL; @@ -64,7 +64,7 @@ is_pinned_to_new (struct MsgData * data) { pinned_to_new = TRUE; } - else + else { GtkTreePath * last_visible; if (gtk_tree_view_get_visible_range (data->view, NULL, &last_visible)) diff --git a/gtk/relocate.c b/gtk/relocate.c index 5edc4b996..b6d928473 100644 --- a/gtk/relocate.c +++ b/gtk/relocate.c @@ -26,20 +26,20 @@ static char * previousLocation = NULL; struct relocate_dialog_data { - int done; - bool do_move; - TrCore * core; - GSList * torrent_ids; - GtkWidget * message_dialog; - GtkWidget * chooser_dialog; + int done; + bool do_move; + TrCore * core; + GSList * torrent_ids; + GtkWidget * message_dialog; + GtkWidget * chooser_dialog; }; static void data_free (gpointer gdata) { - struct relocate_dialog_data * data = gdata; - g_slist_free (data->torrent_ids); - g_free (data); + struct relocate_dialog_data * data = gdata; + g_slist_free (data->torrent_ids); + g_free (data); } /*** @@ -49,19 +49,19 @@ data_free (gpointer gdata) static void startMovingNextTorrent (struct relocate_dialog_data * data) { - char * str; - const int id = GPOINTER_TO_INT (data->torrent_ids->data); + char * str; + const int id = GPOINTER_TO_INT (data->torrent_ids->data); - tr_torrent * tor = gtr_core_find_torrent (data->core, id); - if (tor != NULL) - tr_torrentSetLocation (tor, previousLocation, data->do_move, NULL, &data->done); + tr_torrent * tor = gtr_core_find_torrent (data->core, id); + if (tor != NULL) + tr_torrentSetLocation (tor, previousLocation, data->do_move, NULL, &data->done); - data->torrent_ids = g_slist_delete_link (data->torrent_ids, - data->torrent_ids); + data->torrent_ids = g_slist_delete_link (data->torrent_ids, + data->torrent_ids); - str = g_strdup_printf (_("Moving \"%s\""), tr_torrentName (tor)); - gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (data->message_dialog), str); - g_free (str); + str = g_strdup_printf (_("Moving \"%s\""), tr_torrentName (tor)); + gtk_message_dialog_set_markup (GTK_MESSAGE_DIALOG (data->message_dialog), str); + g_free (str); } /* every once in awhile, check to see if the move is done. @@ -69,76 +69,70 @@ startMovingNextTorrent (struct relocate_dialog_data * data) static gboolean onTimer (gpointer gdata) { - struct relocate_dialog_data * data = gdata; - const int done = data->done; + struct relocate_dialog_data * data = gdata; + const int done = data->done; - if (done == TR_LOC_ERROR) + if (done == TR_LOC_ERROR) { - const int flags = GTK_DIALOG_MODAL - | GTK_DIALOG_DESTROY_WITH_PARENT; - GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (data->message_dialog), - flags, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", - _("Couldn't move torrent")); - gtk_dialog_run (GTK_DIALOG (w)); - gtk_widget_destroy (GTK_WIDGET (data->message_dialog)); - return FALSE; + const int flags = GTK_DIALOG_MODAL + | GTK_DIALOG_DESTROY_WITH_PARENT; + GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (data->message_dialog), + flags, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", + _("Couldn't move torrent")); + gtk_dialog_run (GTK_DIALOG (w)); + gtk_widget_destroy (GTK_WIDGET (data->message_dialog)); } else if (done == TR_LOC_DONE) { - if (data->torrent_ids != NULL) - { - startMovingNextTorrent (data); - } - else - { - gtk_widget_destroy (GTK_WIDGET (data->chooser_dialog)); - return FALSE; - } + if (data->torrent_ids != NULL) + startMovingNextTorrent (data); + else + gtk_widget_destroy (GTK_WIDGET (data->chooser_dialog)); } - return G_SOURCE_CONTINUE; + return G_SOURCE_CONTINUE; } static void onResponse (GtkDialog * dialog, int response, gpointer unused UNUSED) { - if (response == GTK_RESPONSE_APPLY) + if (response == GTK_RESPONSE_APPLY) { - GtkWidget * w; - GObject * d = G_OBJECT (dialog); - struct relocate_dialog_data * data = g_object_get_data (d, DATA_KEY); - GtkFileChooser * chooser = g_object_get_data (d, "chooser"); - GtkToggleButton * move_tb = g_object_get_data (d, "move_rb"); - char * location = gtk_file_chooser_get_filename (chooser); + GtkWidget * w; + GObject * d = G_OBJECT (dialog); + struct relocate_dialog_data * data = g_object_get_data (d, DATA_KEY); + GtkFileChooser * chooser = g_object_get_data (d, "chooser"); + GtkToggleButton * move_tb = g_object_get_data (d, "move_rb"); + char * location = gtk_file_chooser_get_filename (chooser); - data->do_move = gtk_toggle_button_get_active (move_tb); + data->do_move = gtk_toggle_button_get_active (move_tb); - /* pop up a dialog saying that the work is in progress */ - w = gtk_message_dialog_new (GTK_WINDOW (dialog), - GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, - GTK_MESSAGE_INFO, - GTK_BUTTONS_CLOSE, - NULL); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), _("This may take a moment…")); - gtk_dialog_set_response_sensitive (GTK_DIALOG (w), GTK_RESPONSE_CLOSE, FALSE); - gtk_widget_show (w); + /* pop up a dialog saying that the work is in progress */ + w = gtk_message_dialog_new (GTK_WINDOW (dialog), + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, + GTK_MESSAGE_INFO, + GTK_BUTTONS_CLOSE, + NULL); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), _("This may take a moment…")); + gtk_dialog_set_response_sensitive (GTK_DIALOG (w), GTK_RESPONSE_CLOSE, FALSE); + gtk_widget_show (w); - /* remember this location so that it can be the default next time */ - g_free (previousLocation); - previousLocation = location; + /* remember this location so that it can be the default next time */ + g_free (previousLocation); + previousLocation = location; - /* start the move and periodically check its status */ - data->message_dialog = w; - data->done = TR_LOC_DONE; - onTimer (data); - gdk_threads_add_timeout_seconds (1, onTimer, data); + /* start the move and periodically check its status */ + data->message_dialog = w; + data->done = TR_LOC_DONE; + onTimer (data); + gdk_threads_add_timeout_seconds (1, onTimer, data); } - else + else { - gtk_widget_destroy (GTK_WIDGET (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); } } @@ -147,48 +141,48 @@ gtr_relocate_dialog_new (GtkWindow * parent, TrCore * core, GSList * torrent_ids) { - guint row; - GtkWidget * w; - GtkWidget * d; - GtkWidget * t; - struct relocate_dialog_data * data; + guint row; + GtkWidget * w; + GtkWidget * d; + GtkWidget * t; + struct relocate_dialog_data * data; - d = gtk_dialog_new_with_buttons (_("Set Torrent Location"), parent, - GTK_DIALOG_DESTROY_WITH_PARENT | - GTK_DIALOG_MODAL, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (d), - GTK_RESPONSE_CANCEL); - gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), - GTK_RESPONSE_APPLY, - GTK_RESPONSE_CANCEL, - -1); - g_signal_connect (d, "response", G_CALLBACK (onResponse), NULL); + d = gtk_dialog_new_with_buttons (_("Set Torrent Location"), parent, + GTK_DIALOG_DESTROY_WITH_PARENT | + GTK_DIALOG_MODAL, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (d), + GTK_RESPONSE_CANCEL); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), + GTK_RESPONSE_APPLY, + GTK_RESPONSE_CANCEL, + -1); + g_signal_connect (d, "response", G_CALLBACK (onResponse), NULL); - row = 0; - t = hig_workarea_create (); - hig_workarea_add_section_title (t, &row, _("Location")); + row = 0; + t = hig_workarea_create (); + hig_workarea_add_section_title (t, &row, _("Location")); - if (previousLocation == NULL) - previousLocation = g_strdup (gtr_pref_string_get (TR_KEY_download_dir)); - w = gtk_file_chooser_button_new (_("Set Torrent Location"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), previousLocation); - g_object_set_data (G_OBJECT (d), "chooser", w); - hig_workarea_add_row (t, &row, _("Torrent _location:"), w, NULL); - w = gtk_radio_button_new_with_mnemonic (NULL, _("_Move from the current folder")); - g_object_set_data (G_OBJECT (d), "move_rb", w); - hig_workarea_add_wide_control (t, &row, w); - w = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (w), _("Local data is _already there")); - hig_workarea_add_wide_control (t, &row, w); - gtr_dialog_set_content (GTK_DIALOG (d), t); + if (previousLocation == NULL) + previousLocation = g_strdup (gtr_pref_string_get (TR_KEY_download_dir)); + w = gtk_file_chooser_button_new (_("Set Torrent Location"), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (w), previousLocation); + g_object_set_data (G_OBJECT (d), "chooser", w); + hig_workarea_add_row (t, &row, _("Torrent _location:"), w, NULL); + w = gtk_radio_button_new_with_mnemonic (NULL, _("_Move from the current folder")); + g_object_set_data (G_OBJECT (d), "move_rb", w); + hig_workarea_add_wide_control (t, &row, w); + w = gtk_radio_button_new_with_mnemonic_from_widget (GTK_RADIO_BUTTON (w), _("Local data is _already there")); + hig_workarea_add_wide_control (t, &row, w); + gtr_dialog_set_content (GTK_DIALOG (d), t); - data = g_new0 (struct relocate_dialog_data, 1); - data->core = core; - data->torrent_ids = torrent_ids; - data->chooser_dialog = d; - g_object_set_data_full (G_OBJECT (d), DATA_KEY, data, data_free); + data = g_new0 (struct relocate_dialog_data, 1); + data->core = core; + data->torrent_ids = torrent_ids; + data->chooser_dialog = d; + g_object_set_data_full (G_OBJECT (d), DATA_KEY, data, data_free); - return d; + return d; } diff --git a/gtk/stats.c b/gtk/stats.c index 7024ce55a..5170ac629 100644 --- a/gtk/stats.c +++ b/gtk/stats.c @@ -49,151 +49,150 @@ setLabel (GtkLabel * l, const char * str) static void setLabelFromRatio (GtkLabel * l, double d) { - char buf[128]; + char buf[128]; - tr_strlratio (buf, d, sizeof (buf)); - setLabel (l, buf); + tr_strlratio (buf, d, sizeof (buf)); + setLabel (l, buf); } static gboolean updateStats (gpointer gdata) { - char buf[128]; - const char * fmt; - tr_session_stats one, all; - const size_t buflen = sizeof (buf); - struct stat_ui * ui = gdata; + char buf[128]; + const char * fmt; + tr_session_stats one, all; + const size_t buflen = sizeof (buf); + struct stat_ui * ui = gdata; - tr_sessionGetStats (gtr_core_session (ui->core), &one); - tr_sessionGetCumulativeStats (gtr_core_session (ui->core), &all); + tr_sessionGetStats (gtr_core_session (ui->core), &one); + tr_sessionGetCumulativeStats (gtr_core_session (ui->core), &all); - setLabel (ui->one_up_lb, tr_strlsize (buf, one.uploadedBytes, buflen)); - setLabel (ui->one_down_lb, tr_strlsize (buf, one.downloadedBytes, buflen)); - setLabel (ui->one_time_lb, tr_strltime (buf, one.secondsActive, buflen)); - setLabelFromRatio (ui->one_ratio_lb, one.ratio); + setLabel (ui->one_up_lb, tr_strlsize (buf, one.uploadedBytes, buflen)); + setLabel (ui->one_down_lb, tr_strlsize (buf, one.downloadedBytes, buflen)); + setLabel (ui->one_time_lb, tr_strltime (buf, one.secondsActive, buflen)); + setLabelFromRatio (ui->one_ratio_lb, one.ratio); - fmt = ngettext ("Started %'d time", "Started %'d times", - (int)all.sessionCount); - g_snprintf (buf, buflen, fmt, (int)all.sessionCount); - setLabel (ui->all_sessions_lb, buf); - setLabel (ui->all_up_lb, tr_strlsize (buf, all.uploadedBytes, buflen)); - setLabel (ui->all_down_lb, tr_strlsize (buf, all.downloadedBytes, buflen)); - setLabel (ui->all_time_lb, tr_strltime (buf, all.secondsActive, buflen)); - setLabelFromRatio (ui->all_ratio_lb, all.ratio); + fmt = ngettext ("Started %'d time", "Started %'d times", (int)all.sessionCount); + g_snprintf (buf, buflen, fmt, (int)all.sessionCount); + setLabel (ui->all_sessions_lb, buf); + setLabel (ui->all_up_lb, tr_strlsize (buf, all.uploadedBytes, buflen)); + setLabel (ui->all_down_lb, tr_strlsize (buf, all.downloadedBytes, buflen)); + setLabel (ui->all_time_lb, tr_strltime (buf, all.secondsActive, buflen)); + setLabelFromRatio (ui->all_ratio_lb, all.ratio); - return G_SOURCE_CONTINUE; + return G_SOURCE_CONTINUE; } static void dialogDestroyed (gpointer p, GObject * dialog UNUSED) { - g_source_remove (GPOINTER_TO_UINT (p)); + g_source_remove (GPOINTER_TO_UINT (p)); } static void dialogResponse (GtkDialog * dialog, gint response, gpointer gdata) { - struct stat_ui * ui = gdata; + struct stat_ui * ui = gdata; - if (response == TR_RESPONSE_RESET) + if (response == TR_RESPONSE_RESET) { - const char * primary = _("Reset your statistics?"); - const char * secondary = _("These statistics are for your information only. " - "Resetting them doesn't affect the statistics logged by your BitTorrent trackers."); - const int flags = GTK_DIALOG_DESTROY_WITH_PARENT - | GTK_DIALOG_MODAL; - GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (dialog), - flags, - GTK_MESSAGE_QUESTION, - GTK_BUTTONS_NONE, - "%s", primary); - gtk_dialog_add_buttons (GTK_DIALOG (w), - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - _("_Reset"), TR_RESPONSE_RESET, - NULL); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", secondary); - if (gtk_dialog_run (GTK_DIALOG (w)) == TR_RESPONSE_RESET) + const char * primary = _("Reset your statistics?"); + const char * secondary = _("These statistics are for your information only. " + "Resetting them doesn't affect the statistics logged by your BitTorrent trackers."); + const int flags = GTK_DIALOG_DESTROY_WITH_PARENT + | GTK_DIALOG_MODAL; + GtkWidget * w = gtk_message_dialog_new (GTK_WINDOW (dialog), + flags, + GTK_MESSAGE_QUESTION, + GTK_BUTTONS_NONE, + "%s", primary); + gtk_dialog_add_buttons (GTK_DIALOG (w), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + _("_Reset"), TR_RESPONSE_RESET, + NULL); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", secondary); + if (gtk_dialog_run (GTK_DIALOG (w)) == TR_RESPONSE_RESET) { - tr_sessionClearStats (gtr_core_session (ui->core)); - updateStats (ui); + tr_sessionClearStats (gtr_core_session (ui->core)); + updateStats (ui); } - gtk_widget_destroy (w); + gtk_widget_destroy (w); } - if (response == GTK_RESPONSE_CLOSE) - gtk_widget_destroy (GTK_WIDGET (dialog)); + if (response == GTK_RESPONSE_CLOSE) + gtk_widget_destroy (GTK_WIDGET (dialog)); } GtkWidget* gtr_stats_dialog_new (GtkWindow * parent, TrCore * core) { - guint i; - GtkWidget * d; - GtkWidget * t; - GtkWidget * l; - guint row = 0; - struct stat_ui * ui = g_new0 (struct stat_ui, 1); + guint i; + GtkWidget * d; + GtkWidget * t; + GtkWidget * l; + guint row = 0; + struct stat_ui * ui = g_new0 (struct stat_ui, 1); - d = gtk_dialog_new_with_buttons (_("Statistics"), - parent, - GTK_DIALOG_DESTROY_WITH_PARENT, - _("_Reset"), TR_RESPONSE_RESET, - GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, - NULL); - gtk_dialog_set_default_response (GTK_DIALOG (d), - GTK_RESPONSE_CLOSE); - gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), - GTK_RESPONSE_CLOSE, - TR_RESPONSE_RESET, - -1); - t = hig_workarea_create (); - ui->core = core; + d = gtk_dialog_new_with_buttons (_("Statistics"), + parent, + GTK_DIALOG_DESTROY_WITH_PARENT, + _("_Reset"), TR_RESPONSE_RESET, + GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, + NULL); + gtk_dialog_set_default_response (GTK_DIALOG (d), + GTK_RESPONSE_CLOSE); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (d), + GTK_RESPONSE_CLOSE, + TR_RESPONSE_RESET, + -1); + t = hig_workarea_create (); + ui->core = core; - hig_workarea_add_section_title (t, &row, _("Current Session")); - l = gtk_label_new (NULL); - ui->one_up_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->one_up_lb, TRUE); - hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); - l = gtk_label_new (NULL); - ui->one_down_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->one_down_lb, TRUE); - hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); - l = gtk_label_new (NULL); - ui->one_ratio_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->one_ratio_lb, TRUE); - hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); - l = gtk_label_new (NULL); - ui->one_time_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->one_time_lb, TRUE); - hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); - hig_workarea_add_section_divider (t, &row); - hig_workarea_add_section_title (t, &row, _("Total")); - l = gtk_label_new (_("Started %'d time")); - ui->all_sessions_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->all_sessions_lb, TRUE); - hig_workarea_add_label_w (t, row++, l); - l = gtk_label_new (NULL); - ui->all_up_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->all_up_lb, TRUE); - hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); - l = gtk_label_new (NULL); - ui->all_down_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->all_down_lb, TRUE); - hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); - l = gtk_label_new (NULL); - ui->all_ratio_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->all_ratio_lb, TRUE); - hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); - l = gtk_label_new (NULL); - ui->all_time_lb = GTK_LABEL (l); - gtk_label_set_single_line_mode (ui->all_time_lb, TRUE); - hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); - gtr_dialog_set_content (GTK_DIALOG (d), t); + hig_workarea_add_section_title (t, &row, _("Current Session")); + l = gtk_label_new (NULL); + ui->one_up_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->one_up_lb, TRUE); + hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); + l = gtk_label_new (NULL); + ui->one_down_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->one_down_lb, TRUE); + hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); + l = gtk_label_new (NULL); + ui->one_ratio_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->one_ratio_lb, TRUE); + hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); + l = gtk_label_new (NULL); + ui->one_time_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->one_time_lb, TRUE); + hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); + hig_workarea_add_section_divider (t, &row); + hig_workarea_add_section_title (t, &row, _("Total")); + l = gtk_label_new (_("Started %'d time")); + ui->all_sessions_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->all_sessions_lb, TRUE); + hig_workarea_add_label_w (t, row++, l); + l = gtk_label_new (NULL); + ui->all_up_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->all_up_lb, TRUE); + hig_workarea_add_row (t, &row, _("Uploaded:"), l, NULL); + l = gtk_label_new (NULL); + ui->all_down_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->all_down_lb, TRUE); + hig_workarea_add_row (t, &row, _("Downloaded:"), l, NULL); + l = gtk_label_new (NULL); + ui->all_ratio_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->all_ratio_lb, TRUE); + hig_workarea_add_row (t, &row, _("Ratio:"), l, NULL); + l = gtk_label_new (NULL); + ui->all_time_lb = GTK_LABEL (l); + gtk_label_set_single_line_mode (ui->all_time_lb, TRUE); + hig_workarea_add_row (t, &row, _("Duration:"), l, NULL); + gtr_dialog_set_content (GTK_DIALOG (d), t); - updateStats (ui); - g_object_set_data_full (G_OBJECT (d), "data", ui, g_free); - g_signal_connect (d, "response", G_CALLBACK (dialogResponse), ui); - i = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, updateStats, ui); - g_object_weak_ref (G_OBJECT (d), dialogDestroyed, GUINT_TO_POINTER (i)); - return d; + updateStats (ui); + g_object_set_data_full (G_OBJECT (d), "data", ui, g_free); + g_signal_connect (d, "response", G_CALLBACK (dialogResponse), ui); + i = gdk_threads_add_timeout_seconds (SECONDARY_WINDOW_REFRESH_INTERVAL_SECONDS, updateStats, ui); + g_object_weak_ref (G_OBJECT (d), dialogDestroyed, GUINT_TO_POINTER (i)); + return d; } diff --git a/gtk/tr-icon.c b/gtk/tr-icon.c index 78314cc46..d826ab3ed 100644 --- a/gtk/tr-icon.c +++ b/gtk/tr-icon.c @@ -24,9 +24,12 @@ static GQuark get_core_quark (void) { - static GQuark quark = 0; - if (!quark) quark = g_quark_from_static_string ("tr-core"); - return quark; + static GQuark quark = 0; + + if (!quark) + quark = g_quark_from_static_string ("tr-core"); + + return quark; } #define ICON_NAME "transmission" @@ -40,118 +43,121 @@ gtr_icon_refresh (gpointer vindicator UNUSED) static void activated (GtkStatusIcon * self UNUSED, gpointer user_data UNUSED) { - gtr_action_activate ("toggle-main-window"); + gtr_action_activate ("toggle-main-window"); } static void -popup (GtkStatusIcon * self, - guint button, - guint when, - gpointer data UNUSED) +popup (GtkStatusIcon * self, + guint button, + guint when, + gpointer data UNUSED) { - GtkWidget * w = gtr_action_get_widget ("/icon-popup"); + GtkWidget * w = gtr_action_get_widget ("/icon-popup"); - gtk_menu_popup (GTK_MENU (w), NULL, NULL, - gtk_status_icon_position_menu, - self, button, when); + gtk_menu_popup (GTK_MENU (w), NULL, NULL, + gtk_status_icon_position_menu, + self, button, when); } void gtr_icon_refresh (gpointer vicon) { - double KBps; - double limit; - char up[64]; - char upLimit[64]; - char down[64]; - char downLimit[64]; - char tip[1024]; - const char * idle = _("Idle"); - GtkStatusIcon * icon = GTK_STATUS_ICON (vicon); - tr_session * session = gtr_core_session (g_object_get_qdata (G_OBJECT (icon), get_core_quark ())); + double KBps; + double limit; + char up[64]; + char upLimit[64]; + char down[64]; + char downLimit[64]; + char tip[1024]; + const char * idle = _("Idle"); + GtkStatusIcon * icon = GTK_STATUS_ICON (vicon); + tr_session * session = gtr_core_session (g_object_get_qdata (G_OBJECT (icon), get_core_quark ())); - /* up */ - KBps = tr_sessionGetRawSpeed_KBps (session, TR_UP); - if (KBps < 0.001) - g_strlcpy (up, idle, sizeof (up)); - else - tr_formatter_speed_KBps (up, KBps, sizeof (up)); + /* up */ + KBps = tr_sessionGetRawSpeed_KBps (session, TR_UP); + if (KBps < 0.001) + g_strlcpy (up, idle, sizeof (up)); + else + tr_formatter_speed_KBps (up, KBps, sizeof (up)); - /* up limit */ - if (!tr_sessionGetActiveSpeedLimit_KBps (session, TR_UP, &limit)) - *upLimit = '\0'; - else { - char buf[64]; - tr_formatter_speed_KBps (buf, limit, sizeof (buf)); - g_snprintf (upLimit, sizeof (upLimit), _(" (Limit: %s)"), buf); + /* up limit */ + *upLimit = '\0'; + if (tr_sessionGetActiveSpeedLimit_KBps (session, TR_UP, &limit)) + { + char buf[64]; + tr_formatter_speed_KBps (buf, limit, sizeof (buf)); + g_snprintf (upLimit, sizeof (upLimit), _(" (Limit: %s)"), buf); } - /* down */ - KBps = tr_sessionGetRawSpeed_KBps (session, TR_DOWN); - if (KBps < 0.001) - g_strlcpy (down, idle, sizeof (down)); - else - tr_formatter_speed_KBps (down, KBps, sizeof (down)); + /* down */ + KBps = tr_sessionGetRawSpeed_KBps (session, TR_DOWN); + if (KBps < 0.001) + g_strlcpy (down, idle, sizeof (down)); + else + tr_formatter_speed_KBps (down, KBps, sizeof (down)); - /* down limit */ - if (!tr_sessionGetActiveSpeedLimit_KBps (session, TR_DOWN, &limit)) - *downLimit = '\0'; - else { - char buf[64]; - tr_formatter_speed_KBps (buf, limit, sizeof (buf)); - g_snprintf (downLimit, sizeof (downLimit), _(" (Limit: %s)"), buf); + /* down limit */ + *downLimit = '\0'; + if (tr_sessionGetActiveSpeedLimit_KBps (session, TR_DOWN, &limit)) + { + char buf[64]; + tr_formatter_speed_KBps (buf, limit, sizeof (buf)); + g_snprintf (downLimit, sizeof (downLimit), _(" (Limit: %s)"), buf); } - /* %1$s: current upload speed - * %2$s: current upload limit, if any - * %3$s: current download speed - * %4$s: current download limit, if any */ - g_snprintf (tip, sizeof (tip), _("Transmission\nUp: %1$s %2$s\nDown: %3$s %4$s"), up, upLimit, down, downLimit); + /* %1$s: current upload speed + * %2$s: current upload limit, if any + * %3$s: current download speed + * %4$s: current download limit, if any */ + g_snprintf (tip, sizeof (tip), _("Transmission\nUp: %1$s %2$s\nDown: %3$s %4$s"), up, upLimit, down, downLimit); - gtk_status_icon_set_tooltip_text (GTK_STATUS_ICON (icon), tip); + gtk_status_icon_set_tooltip_text (GTK_STATUS_ICON (icon), tip); } #endif static const char * getIconName (void) { - const char * icon_name; + const char * icon_name; - GtkIconTheme * theme = gtk_icon_theme_get_default (); + GtkIconTheme * theme = gtk_icon_theme_get_default (); - /* if the tray's icon is a 48x48 file, use it; - * otherwise, use the fallback builtin icon */ - if (!gtk_icon_theme_has_icon (theme, TRAY_ICON)) - icon_name = ICON_NAME; - else { - GtkIconInfo * icon_info = gtk_icon_theme_lookup_icon (theme, TRAY_ICON, 48, GTK_ICON_LOOKUP_USE_BUILTIN); - const gboolean icon_is_builtin = gtk_icon_info_get_filename (icon_info) == NULL; - gtk_icon_info_free (icon_info); - icon_name = icon_is_builtin ? ICON_NAME : TRAY_ICON; + /* if the tray's icon is a 48x48 file, use it; + * otherwise, use the fallback builtin icon */ + if (!gtk_icon_theme_has_icon (theme, TRAY_ICON)) + { + icon_name = ICON_NAME; + } + else + { + GtkIconInfo * icon_info = gtk_icon_theme_lookup_icon (theme, TRAY_ICON, 48, GTK_ICON_LOOKUP_USE_BUILTIN); + const gboolean icon_is_builtin = gtk_icon_info_get_filename (icon_info) == NULL; + gtk_icon_info_free (icon_info); + icon_name = icon_is_builtin ? ICON_NAME : TRAY_ICON; } - return icon_name; + return icon_name; } gpointer gtr_icon_new (TrCore * core) { #ifdef HAVE_LIBAPPINDICATOR - GtkWidget * w; - const char * icon_name = getIconName (); - AppIndicator * indicator = app_indicator_new (ICON_NAME, icon_name, APP_INDICATOR_CATEGORY_SYSTEM_SERVICES); - app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE); - w = gtr_action_get_widget ("/icon-popup"); - app_indicator_set_menu (indicator, GTK_MENU (w)); - app_indicator_set_title (indicator, g_get_application_name ()); - g_object_set_qdata (G_OBJECT (indicator), get_core_quark (), core); - return indicator; + GtkWidget * w; + const char * icon_name = getIconName (); + AppIndicator * indicator = app_indicator_new (ICON_NAME, icon_name, APP_INDICATOR_CATEGORY_SYSTEM_SERVICES); + app_indicator_set_status (indicator, APP_INDICATOR_STATUS_ACTIVE); + w = gtr_action_get_widget ("/icon-popup"); + app_indicator_set_menu (indicator, GTK_MENU (w)); + app_indicator_set_title (indicator, g_get_application_name ()); + g_object_set_qdata (G_OBJECT (indicator), get_core_quark (), core); + return indicator; #else - const char * icon_name = getIconName (); - GtkStatusIcon * icon = gtk_status_icon_new_from_icon_name (icon_name); - g_signal_connect (icon, "activate", G_CALLBACK (activated), NULL); - g_signal_connect (icon, "popup-menu", G_CALLBACK (popup), NULL); - g_object_set_qdata (G_OBJECT (icon), get_core_quark (), core); - return icon; + const char * icon_name = getIconName (); + GtkStatusIcon * icon = gtk_status_icon_new_from_icon_name (icon_name); + g_signal_connect (icon, "activate", G_CALLBACK (activated), NULL); + g_signal_connect (icon, "popup-menu", G_CALLBACK (popup), NULL); + g_object_set_qdata (G_OBJECT (icon), get_core_quark (), core); + return icon; #endif } diff --git a/gtk/util.c b/gtk/util.c index 2208416f8..c4d42221e 100644 --- a/gtk/util.c +++ b/gtk/util.c @@ -59,184 +59,191 @@ const char * speed_T_str = N_("TB/s"); const char* gtr_get_unicode_string (int i) { - switch (i) { - case GTR_UNICODE_UP: return "\xE2\x86\x91"; - case GTR_UNICODE_DOWN: return "\xE2\x86\x93"; - case GTR_UNICODE_INF: return "\xE2\x88\x9E"; - case GTR_UNICODE_BULLET: return "\xE2\x88\x99"; - default: return "err"; + switch (i) + { + case GTR_UNICODE_UP: return "\xE2\x86\x91"; + case GTR_UNICODE_DOWN: return "\xE2\x86\x93"; + case GTR_UNICODE_INF: return "\xE2\x88\x9E"; + case GTR_UNICODE_BULLET: return "\xE2\x88\x99"; + default: return "err"; } } char* tr_strlratio (char * buf, double ratio, size_t buflen) { - return tr_strratio (buf, buflen, ratio, gtr_get_unicode_string (GTR_UNICODE_INF)); + return tr_strratio (buf, buflen, ratio, gtr_get_unicode_string (GTR_UNICODE_INF)); } char* tr_strlpercent (char * buf, double x, size_t buflen) { - return tr_strpercent (buf, x, buflen); + return tr_strpercent (buf, x, buflen); } char* tr_strlsize (char * buf, guint64 bytes, size_t buflen) { - if (!bytes) - g_strlcpy (buf, Q_("None"), buflen); - else - tr_formatter_size_B (buf, bytes, buflen); + if (!bytes) + g_strlcpy (buf, Q_("None"), buflen); + else + tr_formatter_size_B (buf, bytes, buflen); - return buf; + return buf; } char* tr_strltime (char * buf, int seconds, size_t buflen) { - int days, hours, minutes; - char d[128], h[128], m[128], s[128]; + int days, hours, minutes; + char d[128], h[128], m[128], s[128]; - if (seconds < 0) - seconds = 0; + if (seconds < 0) + seconds = 0; - days = seconds / 86400; - hours = (seconds % 86400) / 3600; - minutes = (seconds % 3600) / 60; - seconds = (seconds % 3600) % 60; + days = seconds / 86400; + hours = (seconds % 86400) / 3600; + minutes = (seconds % 3600) / 60; + seconds = (seconds % 3600) % 60; - g_snprintf (d, sizeof (d), ngettext ("%'d day", "%'d days", days), days); - g_snprintf (h, sizeof (h), ngettext ("%'d hour", "%'d hours", hours), hours); - g_snprintf (m, sizeof (m), ngettext ("%'d minute", "%'d minutes", minutes), minutes); - g_snprintf (s, sizeof (s), ngettext ("%'d second", "%'d seconds", seconds), seconds); + g_snprintf (d, sizeof (d), ngettext ("%'d day", "%'d days", days), days); + g_snprintf (h, sizeof (h), ngettext ("%'d hour", "%'d hours", hours), hours); + g_snprintf (m, sizeof (m), ngettext ("%'d minute", "%'d minutes", minutes), minutes); + g_snprintf (s, sizeof (s), ngettext ("%'d second", "%'d seconds", seconds), seconds); - if (days) + if (days) { - if (days >= 4 || !hours) - g_strlcpy (buf, d, buflen); - else - g_snprintf (buf, buflen, "%s, %s", d, h); + if (days >= 4 || !hours) + g_strlcpy (buf, d, buflen); + else + g_snprintf (buf, buflen, "%s, %s", d, h); } - else if (hours) + else if (hours) { - if (hours >= 4 || !minutes) - g_strlcpy (buf, h, buflen); - else - g_snprintf (buf, buflen, "%s, %s", h, m); + if (hours >= 4 || !minutes) + g_strlcpy (buf, h, buflen); + else + g_snprintf (buf, buflen, "%s, %s", h, m); } - else if (minutes) + else if (minutes) { - if (minutes >= 4 || !seconds) - g_strlcpy (buf, m, buflen); - else - g_snprintf (buf, buflen, "%s, %s", m, s); + if (minutes >= 4 || !seconds) + g_strlcpy (buf, m, buflen); + else + g_snprintf (buf, buflen, "%s, %s", m, s); } - else + else { - g_strlcpy (buf, s, buflen); + g_strlcpy (buf, s, buflen); } - return buf; + return buf; } /* pattern-matching text; ie, legaltorrents.com */ void gtr_get_host_from_url (char * buf, size_t buflen, const char * url) { - char host[1024]; - const char * pch; + char host[1024]; + const char * pch; - if ((pch = strstr (url, "://"))) { - const size_t hostlen = strcspn (pch+3, ":/"); - const size_t copylen = MIN (hostlen, sizeof (host)-1); - memcpy (host, pch+3, copylen); - host[copylen] = '\0'; - } else { - *host = '\0'; + if ((pch = strstr (url, "://"))) + { + const size_t hostlen = strcspn (pch+3, ":/"); + const size_t copylen = MIN (hostlen, sizeof (host)-1); + memcpy (host, pch+3, copylen); + host[copylen] = '\0'; + } + else + { + *host = '\0'; } - if (tr_addressIsIP (host)) - g_strlcpy (buf, url, buflen); - else { - const char * first_dot = strchr (host, '.'); - const char * last_dot = strrchr (host, '.'); - if ((first_dot) && (last_dot) && (first_dot != last_dot)) - g_strlcpy (buf, first_dot + 1, buflen); - else - g_strlcpy (buf, host, buflen); + if (tr_addressIsIP (host)) + { + g_strlcpy (buf, url, buflen); + } + else + { + const char * first_dot = strchr (host, '.'); + const char * last_dot = strrchr (host, '.'); + if ((first_dot) && (last_dot) && (first_dot != last_dot)) + g_strlcpy (buf, first_dot + 1, buflen); + else + g_strlcpy (buf, host, buflen); } } static gboolean gtr_is_supported_url (const char * str) { - return ((str != NULL) && + return ((str != NULL) && (g_str_has_prefix (str, "ftp://") || - g_str_has_prefix (str, "http://") || - g_str_has_prefix (str, "https://"))); + g_str_has_prefix (str, "http://") || + g_str_has_prefix (str, "https://"))); } gboolean gtr_is_magnet_link (const char * str) { - return (str != NULL) && - (g_str_has_prefix (str, "magnet:?")); + return (str != NULL) && (g_str_has_prefix (str, "magnet:?")); } gboolean gtr_is_hex_hashcode (const char * str) { - int i; + int i; - if (!str || (strlen (str) != 40)) - return FALSE; + if (!str || (strlen (str) != 40)) + return FALSE; - for (i=0; i<40; ++i) - if (!isxdigit (str[i])) - return FALSE; + for (i=0; i<40; ++i) + if (!isxdigit (str[i])) + return FALSE; - return TRUE; + return TRUE; } static GtkWindow * getWindow (GtkWidget * w) { - if (w == NULL) - return NULL; + if (w == NULL) + return NULL; - if (GTK_IS_WINDOW (w)) - return GTK_WINDOW (w); + if (GTK_IS_WINDOW (w)) + return GTK_WINDOW (w); - return GTK_WINDOW (gtk_widget_get_ancestor (w, GTK_TYPE_WINDOW)); + return GTK_WINDOW (gtk_widget_get_ancestor (w, GTK_TYPE_WINDOW)); } void gtr_add_torrent_error_dialog (GtkWidget * child, int err, const char * file) { - char * secondary; - const char * fmt; - GtkWidget * w; - GtkWindow * win = getWindow (child); + char * secondary; + const char * fmt; + GtkWidget * w; + GtkWindow * win = getWindow (child); - switch (err) + switch (err) { - case TR_PARSE_ERR: fmt = _("The torrent file \"%s\" contains invalid data."); break; - case TR_PARSE_DUPLICATE: fmt = _("The torrent file \"%s\" is already in use."); break; - default: fmt = _("The torrent file \"%s\" encountered an unknown error."); break; + case TR_PARSE_ERR: fmt = _("The torrent file \"%s\" contains invalid data."); break; + case TR_PARSE_DUPLICATE: fmt = _("The torrent file \"%s\" is already in use."); break; + default: fmt = _("The torrent file \"%s\" encountered an unknown error."); break; } - secondary = g_strdup_printf (fmt, file); - w = gtk_message_dialog_new (win, - GTK_DIALOG_DESTROY_WITH_PARENT, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", _("Error opening torrent")); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), - "%s", secondary); - g_signal_connect_swapped (w, "response", - G_CALLBACK (gtk_widget_destroy), w); - gtk_widget_show_all (w); - g_free (secondary); + secondary = g_strdup_printf (fmt, file); + + w = gtk_message_dialog_new (win, + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", _("Error opening torrent")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), + "%s", secondary); + g_signal_connect_swapped (w, "response", + G_CALLBACK (gtk_widget_destroy), w); + gtk_widget_show_all (w); + g_free (secondary); } typedef void (PopupFunc)(GtkWidget*, GdkEventButton*); @@ -249,32 +256,33 @@ on_tree_view_button_pressed (GtkWidget * view, GdkEventButton * event, gpointer func) { - GtkTreeView * tv = GTK_TREE_VIEW (view); + GtkTreeView * tv = GTK_TREE_VIEW (view); - if (event->type == GDK_BUTTON_PRESS && event->button == 3) + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { - GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); - GtkTreePath * path; - if (gtk_tree_view_get_path_at_pos (tv, - (gint) event->x, - (gint) event->y, - &path, NULL, NULL, NULL)) + GtkTreePath * path; + GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); + + if (gtk_tree_view_get_path_at_pos (tv, + (gint) event->x, + (gint) event->y, + &path, NULL, NULL, NULL)) { - if (!gtk_tree_selection_path_is_selected (selection, path)) + if (!gtk_tree_selection_path_is_selected (selection, path)) { - gtk_tree_selection_unselect_all (selection); - gtk_tree_selection_select_path (selection, path); + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_path (selection, path); } - gtk_tree_path_free (path); + gtk_tree_path_free (path); } - if (func != NULL) - ((PopupFunc*)func)(view, event); + if (func != NULL) + ((PopupFunc*)func)(view, event); - return TRUE; + return TRUE; } - return FALSE; + return FALSE; } /* if the user clicked in an empty area of the list, @@ -284,18 +292,18 @@ on_tree_view_button_released (GtkWidget * view, GdkEventButton * event, gpointer unused UNUSED) { - GtkTreeView * tv = GTK_TREE_VIEW (view); + GtkTreeView * tv = GTK_TREE_VIEW (view); - if (!gtk_tree_view_get_path_at_pos (tv, - (gint) event->x, - (gint) event->y, - NULL, NULL, NULL, NULL)) + if (!gtk_tree_view_get_path_at_pos (tv, + (gint) event->x, + (gint) event->y, + NULL, NULL, NULL, NULL)) { - GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); - gtk_tree_selection_unselect_all (selection); + GtkTreeSelection * selection = gtk_tree_view_get_selection (tv); + gtk_tree_selection_unselect_all (selection); } - return FALSE; + return FALSE; } int @@ -337,60 +345,60 @@ gtr_file_trash_or_remove (const char * filename) const char* gtr_get_help_uri (void) { - static char * uri = NULL; + static char * uri = NULL; - if (!uri) + if (!uri) { - int major, minor; - const char * fmt = "http://www.transmissionbt.com/help/gtk/%d.%dx"; - sscanf (SHORT_VERSION_STRING, "%d.%d", &major, &minor); - uri = g_strdup_printf (fmt, major, minor / 10); + int major, minor; + const char * fmt = "http://www.transmissionbt.com/help/gtk/%d.%dx"; + sscanf (SHORT_VERSION_STRING, "%d.%d", &major, &minor); + uri = g_strdup_printf (fmt, major, minor / 10); } - return uri; + return uri; } void gtr_open_file (const char * path) { - char * uri; + char * uri; - GFile * file = g_file_new_for_path (path); - g_object_unref (G_OBJECT (file)); - - if (g_path_is_absolute (path)) - uri = g_strdup_printf ("file://%s", path); - else { - char * cwd = g_get_current_dir (); - uri = g_strdup_printf ("file://%s/%s", cwd, path); - g_free (cwd); + if (g_path_is_absolute (path)) + { + uri = g_strdup_printf ("file://%s", path); + } + else + { + char * cwd = g_get_current_dir (); + uri = g_strdup_printf ("file://%s/%s", cwd, path); + g_free (cwd); } - gtr_open_uri (uri); - g_free (uri); + gtr_open_uri (uri); + g_free (uri); } void gtr_open_uri (const char * uri) { - if (uri) + if (uri) { - gboolean opened = FALSE; + gboolean opened = FALSE; - if (!opened) - opened = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, NULL); + if (!opened) + opened = gtk_show_uri (NULL, uri, GDK_CURRENT_TIME, NULL); - if (!opened) - opened = g_app_info_launch_default_for_uri (uri, NULL, NULL); + if (!opened) + opened = g_app_info_launch_default_for_uri (uri, NULL, NULL); - if (!opened) { - char * argv[] = { (char*)"xdg-open", (char*)uri, NULL }; - opened = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, - NULL, NULL, NULL, NULL); + if (!opened) + { + char * argv[] = { (char*)"xdg-open", (char*)uri, NULL }; + opened = g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); } - if (!opened) - g_message ("Unable to open \"%s\"", uri); + if (!opened) + g_message ("Unable to open \"%s\"", uri); } } @@ -401,26 +409,29 @@ gtr_open_uri (const char * uri) void gtr_combo_box_set_active_enum (GtkComboBox * combo_box, int value) { - int i; - int currentValue; - const int column = 0; - GtkTreeIter iter; - GtkTreeModel * model = gtk_combo_box_get_model (combo_box); + int i; + int currentValue; + const int column = 0; + GtkTreeIter iter; + GtkTreeModel * model = gtk_combo_box_get_model (combo_box); - /* do the value and current value match? */ - if (gtk_combo_box_get_active_iter (combo_box, &iter)) { - gtk_tree_model_get (model, &iter, column, ¤tValue, -1); - if (currentValue == value) - return; + /* do the value and current value match? */ + if (gtk_combo_box_get_active_iter (combo_box, &iter)) + { + gtk_tree_model_get (model, &iter, column, ¤tValue, -1); + if (currentValue == value) + return; } - /* find the one to select */ - i = 0; - while ((gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))) { - gtk_tree_model_get (model, &iter, column, ¤tValue, -1); - if (currentValue == value) { - gtk_combo_box_set_active_iter (combo_box, &iter); - return; + /* find the one to select */ + i = 0; + while ((gtk_tree_model_iter_nth_child (model, &iter, NULL, i++))) + { + gtk_tree_model_get (model, &iter, column, ¤tValue, -1); + if (currentValue == value) + { + gtk_combo_box_set_active_iter (combo_box, &iter); + return; } } } @@ -429,53 +440,53 @@ gtr_combo_box_set_active_enum (GtkComboBox * combo_box, int value) GtkWidget * gtr_combo_box_new_enum (const char * text_1, ...) { - GtkWidget * w; - GtkCellRenderer * r; - GtkListStore * store; - va_list vl; - const char * text; - va_start (vl, text_1); + GtkWidget * w; + GtkCellRenderer * r; + GtkListStore * store; + va_list vl; + const char * text; + va_start (vl, text_1); - store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); + store = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING); - text = text_1; - if (text != NULL) do + text = text_1; + if (text != NULL) do { - const int val = va_arg (vl, int); - gtk_list_store_insert_with_values (store, NULL, INT_MAX, 0, val, 1, text, -1); - text = va_arg (vl, const char *); + const int val = va_arg (vl, int); + gtk_list_store_insert_with_values (store, NULL, INT_MAX, 0, val, 1, text, -1); + text = va_arg (vl, const char *); } - while (text != NULL); + while (text != NULL); - w = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); - r = gtk_cell_renderer_text_new (); - gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), r, TRUE); - gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), r, "text", 1, NULL); + w = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); + r = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (w), r, TRUE); + gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (w), r, "text", 1, NULL); - /* cleanup */ - g_object_unref (store); - return w; + /* cleanup */ + g_object_unref (store); + return w; } int gtr_combo_box_get_active_enum (GtkComboBox * combo_box) { - int value = 0; - GtkTreeIter iter; + int value = 0; + GtkTreeIter iter; - if (gtk_combo_box_get_active_iter (combo_box, &iter)) - gtk_tree_model_get (gtk_combo_box_get_model (combo_box), &iter, 0, &value, -1); + if (gtk_combo_box_get_active_iter (combo_box, &iter)) + gtk_tree_model_get (gtk_combo_box_get_model (combo_box), &iter, 0, &value, -1); - return value; + return value; } GtkWidget * gtr_priority_combo_new (void) { - return gtr_combo_box_new_enum (_("High"), TR_PRI_HIGH, - _("Normal"), TR_PRI_NORMAL, - _("Low"), TR_PRI_LOW, - NULL); + return gtr_combo_box_new_enum (_("High"), TR_PRI_HIGH, + _("Normal"), TR_PRI_NORMAL, + _("Low"), TR_PRI_LOW, + NULL); } /*** @@ -487,46 +498,46 @@ gtr_priority_combo_new (void) void gtr_widget_set_visible (GtkWidget * w, gboolean b) { - /* toggle the transient children, too */ - if (GTK_IS_WINDOW (w)) + /* toggle the transient children, too */ + if (GTK_IS_WINDOW (w)) { - GList * l; - GList * windows = gtk_window_list_toplevels (); - GtkWindow * window = GTK_WINDOW (w); + GList * l; + GList * windows = gtk_window_list_toplevels (); + GtkWindow * window = GTK_WINDOW (w); - for (l=windows; l!=NULL; l=l->next) + for (l=windows; l!=NULL; l=l->next) { - if (!GTK_IS_WINDOW (l->data)) - continue; - if (gtk_window_get_transient_for (GTK_WINDOW (l->data)) != window) - continue; - if (gtk_widget_get_visible (GTK_WIDGET (l->data)) == b) - continue; + if (!GTK_IS_WINDOW (l->data)) + continue; + if (gtk_window_get_transient_for (GTK_WINDOW (l->data)) != window) + continue; + if (gtk_widget_get_visible (GTK_WIDGET (l->data)) == b) + continue; - if (b && g_object_get_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN) != NULL) + if (b && g_object_get_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN) != NULL) { - g_object_steal_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN); - gtr_widget_set_visible (GTK_WIDGET (l->data), TRUE); + g_object_steal_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN); + gtr_widget_set_visible (GTK_WIDGET (l->data), TRUE); } - else if (!b) + else if (!b) { - g_object_set_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN, GINT_TO_POINTER (1)); - gtr_widget_set_visible (GTK_WIDGET (l->data), FALSE); + g_object_set_data (G_OBJECT (l->data), GTR_CHILD_HIDDEN, GINT_TO_POINTER (1)); + gtr_widget_set_visible (GTK_WIDGET (l->data), FALSE); } } - g_list_free (windows); + g_list_free (windows); } - gtk_widget_set_visible (w, b); + gtk_widget_set_visible (w, b); } void gtr_dialog_set_content (GtkDialog * dialog, GtkWidget * content) { - GtkWidget * vbox = gtk_dialog_get_content_area (dialog); - gtk_box_pack_start (GTK_BOX (vbox), content, TRUE, TRUE, 0); - gtk_widget_show_all (content); + GtkWidget * vbox = gtk_dialog_get_content_area (dialog); + gtk_box_pack_start (GTK_BOX (vbox), content, TRUE, TRUE, 0); + gtk_widget_show_all (content); } /*** @@ -536,48 +547,48 @@ gtr_dialog_set_content (GtkDialog * dialog, GtkWidget * content) void gtr_http_failure_dialog (GtkWidget * parent, const char * url, long response_code) { - GtkWindow * window = getWindow (parent); + GtkWindow * window = getWindow (parent); - GtkWidget * w = gtk_message_dialog_new (window, 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("Error opening \"%s\""), url); + GtkWidget * w = gtk_message_dialog_new (window, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Error opening \"%s\""), url); - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), - _("Server returned \"%1$ld %2$s\""), - response_code, - tr_webGetResponseStr (response_code)); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), + _("Server returned \"%1$ld %2$s\""), + response_code, + tr_webGetResponseStr (response_code)); - g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); - gtk_widget_show (w); + g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); + gtk_widget_show (w); } void gtr_unrecognized_url_dialog (GtkWidget * parent, const char * url) { - const char * xt = "xt=urn:btih"; + const char * xt = "xt=urn:btih"; - GtkWindow * window = getWindow (parent); + GtkWindow * window = getWindow (parent); - GString * gstr = g_string_new (NULL); + GString * gstr = g_string_new (NULL); - GtkWidget * w = gtk_message_dialog_new (window, 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - "%s", _("Unrecognized URL")); + GtkWidget * w = gtk_message_dialog_new (window, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + "%s", _("Unrecognized URL")); - g_string_append_printf (gstr, _("Transmission doesn't know how to use \"%s\""), url); + g_string_append_printf (gstr, _("Transmission doesn't know how to use \"%s\""), url); - if (gtr_is_magnet_link (url) && (strstr (url, xt) == NULL)) + if (gtr_is_magnet_link (url) && (strstr (url, xt) == NULL)) { - g_string_append_printf (gstr, "\n \n"); - g_string_append_printf (gstr, _("This magnet link appears to be intended for something other than BitTorrent. BitTorrent magnet links have a section containing \"%s\"."), xt); + g_string_append_printf (gstr, "\n \n"); + g_string_append_printf (gstr, _("This magnet link appears to be intended for something other than BitTorrent. BitTorrent magnet links have a section containing \"%s\"."), xt); } - gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", gstr->str); - g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); - gtk_widget_show (w); - g_string_free (gstr, TRUE); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (w), "%s", gstr->str); + g_signal_connect_swapped (w, "response", G_CALLBACK (gtk_widget_destroy), w); + gtk_widget_show (w); + g_string_free (gstr, TRUE); } /*** @@ -589,19 +600,21 @@ gtr_paste_clipboard_url_into_entry (GtkWidget * e) { size_t i; - char * text[] = { - g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY))), - g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD))) - }; + char * text[] = + { + g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_PRIMARY))), + g_strstrip (gtk_clipboard_wait_for_text (gtk_clipboard_get (GDK_SELECTION_CLIPBOARD))) + }; - for (i=0; i