(gtk) copyediting: update several files to be closer to the gtk+ indentation style.

This commit is contained in:
Jordan Lee 2013-01-04 19:45:39 +00:00
parent 2a52ebab20
commit 10b96f0f12
7 changed files with 2942 additions and 2743 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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, "<i>");
if (!filename)
g_string_append (gstr, "<i>");
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, "</i>");
gtk_label_set_markup (GTK_LABEL (ui->pieces_lb), gstr->str);
g_string_free (gstr, TRUE);
g_string_append (gstr, "</i>");
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), _("<i>No source selected</i>"));
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), _("<i>No source selected</i>"));
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;
}

View File

@ -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))

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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
}

View File

@ -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, &currentValue, -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, &currentValue, -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, &currentValue, -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, &currentValue, -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<G_N_ELEMENTS (text); ++i) {
for (i=0; i<G_N_ELEMENTS (text); ++i)
{
char * s = text[i];
if (s && (gtr_is_supported_url (s) || gtr_is_magnet_link (s)
|| gtr_is_hex_hashcode (s))) {
if (s && (gtr_is_supported_url (s) || gtr_is_magnet_link (s) || gtr_is_hex_hashcode (s)))
{
gtk_entry_set_text (GTK_ENTRY (e), s);
break;
}
}
}
}
for (i=0; i<G_N_ELEMENTS (text); ++i)
g_free (text[i]);
@ -614,8 +627,8 @@ gtr_paste_clipboard_url_into_entry (GtkWidget * e)
void
gtr_label_set_text (GtkLabel * lb, const char * newstr)
{
const char * oldstr = gtk_label_get_text (lb);
const char * oldstr = gtk_label_get_text (lb);
if (tr_strcmp0 (oldstr, newstr))
gtk_label_set_text (lb, newstr);
if (tr_strcmp0 (oldstr, newstr))
gtk_label_set_text (lb, newstr);
}