Tracking the remaining time for a copy as well

This commit is contained in:
Pierre Pronchery 2012-06-02 11:17:18 +00:00
parent a79365ea70
commit 2dfea32754

View File

@ -27,6 +27,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <time.h>
#include <libgen.h> #include <libgen.h>
#include <errno.h> #include <errno.h>
#include <locale.h> #include <locale.h>
@ -84,6 +85,7 @@ typedef struct _Copy
GtkWidget * progress; GtkWidget * progress;
GtkWidget * flabel; GtkWidget * flabel;
GtkWidget * fspeed; GtkWidget * fspeed;
GtkWidget * fremaining;
GtkWidget * fprogress; GtkWidget * fprogress;
int fpulse; /* tells when to pulse */ int fpulse; /* tells when to pulse */
} Copy; } Copy;
@ -175,6 +177,18 @@ static int _copy(Prefs * prefs, unsigned int filec, char * filev[])
gtk_size_group_add_widget(right, copy.fspeed); gtk_size_group_add_widget(right, copy.fspeed);
gtk_box_pack_start(GTK_BOX(hbox), copy.fspeed, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox), copy.fspeed, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
/* file copy remaining */
hbox = gtk_hbox_new(FALSE, 4);
widget = gtk_label_new(_("Remaining: "));
gtk_widget_modify_font(widget, bold);
gtk_misc_set_alignment(GTK_MISC(widget), 0, 0);
gtk_size_group_add_widget(left, widget);
gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, TRUE, 0);
copy.fremaining = gtk_label_new("");
gtk_misc_set_alignment(GTK_MISC(copy.fremaining), 0, 0);
gtk_size_group_add_widget(right, copy.fremaining);
gtk_box_pack_start(GTK_BOX(hbox), copy.fremaining, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
/* file progress bar */ /* file progress bar */
copy.fprogress = gtk_progress_bar_new(); copy.fprogress = gtk_progress_bar_new();
gtk_progress_bar_set_text(GTK_PROGRESS_BAR(copy.fprogress), " "); gtk_progress_bar_set_text(GTK_PROGRESS_BAR(copy.fprogress), " ");
@ -270,6 +284,7 @@ static int _single_fifo(Copy * copy, char const * dst);
static int _single_symlink(Copy * copy, char const * src, char const * dst); static int _single_symlink(Copy * copy, char const * src, char const * dst);
static int _single_regular(Copy * copy, char const * src, char const * dst); static int _single_regular(Copy * copy, char const * src, char const * dst);
static int _single_p(Copy * copy, char const * dst, struct stat const * st); static int _single_p(Copy * copy, char const * dst, struct stat const * st);
static void _single_remaining(Copy * copy, guint64 rate);
static gboolean _single_timeout(gpointer data); static gboolean _single_timeout(gpointer data);
static void _single_unit(guint64 size, double * fraction, char const ** unit, static void _single_unit(guint64 size, double * fraction, char const ** unit,
double * current); double * current);
@ -587,11 +602,39 @@ static int _single_p(Copy * copy, char const * dst, struct stat const * st)
return 0; return 0;
} }
static void _single_remaining(Copy * copy, guint64 rate)
{
char buf[32];
guint64 remaining;
struct tm tm;
if(rate == 0)
return;
remaining = (copy->size - copy->cnt) / rate;
memset(&tm, 0, sizeof(tm));
tm.tm_sec = remaining;
/* minutes */
if(tm.tm_sec > 60)
{
tm.tm_min = tm.tm_sec / 60;
tm.tm_sec = tm.tm_sec - (tm.tm_min * 60);
}
/* hours */
if(tm.tm_min > 60)
{
tm.tm_hour = tm.tm_min / 60;
tm.tm_min = tm.tm_min - (tm.tm_hour * 60);
}
strftime(buf, sizeof(buf), "%H:%M:%S", &tm);
gtk_label_set_text(GTK_LABEL(copy->fremaining), buf);
}
static gboolean _single_timeout(gpointer data) static gboolean _single_timeout(gpointer data)
{ {
Copy * copy = data; Copy * copy = data;
struct timeval tv; struct timeval tv;
char buf[32]; char buf[32];
guint64 rate;
double rate_fraction; double rate_fraction;
char const * rate_unit; char const * rate_unit;
double total_fraction; double total_fraction;
@ -617,9 +660,8 @@ static gboolean _single_timeout(gpointer data)
tv.tv_sec--; tv.tv_sec--;
tv.tv_usec += 1000000; tv.tv_usec += 1000000;
} }
_single_unit((copy->cnt * 1024) rate = (copy->cnt * 1024) / ((tv.tv_sec * 1000) + (tv.tv_usec / 1000));
/ ((tv.tv_sec * 1000) + (tv.tv_usec / 1000)), _single_unit(rate, &rate_fraction, &rate_unit, NULL);
&rate_fraction, &rate_unit, NULL);
current_fraction = copy->cnt; current_fraction = copy->cnt;
_single_unit(copy->size, &total_fraction, &total_unit, _single_unit(copy->size, &total_fraction, &total_unit,
&current_fraction); &current_fraction);
@ -627,6 +669,7 @@ static gboolean _single_timeout(gpointer data)
current_fraction, total_fraction, total_unit, current_fraction, total_fraction, total_unit,
rate_fraction, rate_unit); rate_fraction, rate_unit);
gtk_label_set_text(GTK_LABEL(copy->fspeed), buf); gtk_label_set_text(GTK_LABEL(copy->fspeed), buf);
_single_remaining(copy, rate);
return TRUE; return TRUE;
} }