gfio: add and colorize graphs on main page, too

The main UI tab had broken support for trim, fix that up. While
doing that, also ensure that we color code the text fields like
it was done for the per-job tabs.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/gclient.c b/gclient.c
index 6095863..b8c681a 100644
--- a/gclient.c
+++ b/gclient.c
@@ -448,7 +448,7 @@
 	char eta_str[128];
 	char output[256];
 	double perc = 0.0;
-	int i2p = 0;
+	int i, i2p = 0;
 
 	gdk_threads_enter();
 
@@ -483,8 +483,8 @@
 	entry_set_int_value(ui->eta.jobs, je->nr_running);
 
 	if (je->eta_sec != INT_MAX && je->nr_running) {
-		char *iops_str[2];
-		char *rate_str[2];
+		char *iops_str[3];
+		char *rate_str[3];
 
 		if ((!je->eta_sec && !eta_good) || je->nr_ramp == je->nr_running)
 			strcpy(output, "-.-% done");
@@ -496,24 +496,30 @@
 
 		rate_str[0] = num2str(je->rate[0], 5, 10, i2p);
 		rate_str[1] = num2str(je->rate[1], 5, 10, i2p);
+		rate_str[2] = num2str(je->rate[2], 5, 10, i2p);
 
 		iops_str[0] = num2str(je->iops[0], 4, 1, 0);
 		iops_str[1] = num2str(je->iops[1], 4, 1, 0);
+		iops_str[2] = num2str(je->iops[2], 4, 1, 0);
 
 		gtk_entry_set_text(GTK_ENTRY(ui->eta.read_bw), rate_str[0]);
 		gtk_entry_set_text(GTK_ENTRY(ui->eta.read_iops), iops_str[0]);
 		gtk_entry_set_text(GTK_ENTRY(ui->eta.write_bw), rate_str[1]);
 		gtk_entry_set_text(GTK_ENTRY(ui->eta.write_iops), iops_str[1]);
+		gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_bw), rate_str[2]);
+		gtk_entry_set_text(GTK_ENTRY(ui->eta.trim_iops), iops_str[2]);
 
 		graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.read_iops, je->elapsed_sec, je->iops[0], iops_str[0]);
 		graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.write_iops, je->elapsed_sec, je->iops[1], iops_str[1]);
+		graph_add_xy_data(ui->graphs.iops_graph, ui->graphs.trim_iops, je->elapsed_sec, je->iops[2], iops_str[2]);
 		graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.read_bw, je->elapsed_sec, je->rate[0], rate_str[0]);
 		graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.write_bw, je->elapsed_sec, je->rate[1], rate_str[1]);
+		graph_add_xy_data(ui->graphs.bandwidth_graph, ui->graphs.trim_bw, je->elapsed_sec, je->rate[2], rate_str[2]);
 
-		free(rate_str[0]);
-		free(rate_str[1]);
-		free(iops_str[0]);
-		free(iops_str[1]);
+		for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+			free(rate_str[i]);
+			free(iops_str[i]);
+		}
 	}
 
 	if (eta_str[0]) {
@@ -1170,7 +1176,7 @@
 				  struct group_run_stats *rs,
 				  struct thread_stat *ts, int ddir)
 {
-	const char *ddir_label[2] = { "Read", "Write" };
+	const char *ddir_label[3] = { "Read", "Write", "Trim" };
 	GtkWidget *frame, *label, *box, *vbox, *main_vbox;
 	unsigned long min[3], max[3], runt;
 	unsigned long long bw, iops;
@@ -1289,6 +1295,7 @@
 				       struct group_run_stats *rs)
 {
 	GtkWidget *box, *vbox, *entry, *scroll;
+	int i;
 
 	scroll = gtk_scrolled_window_new(NULL, NULL);
 	gtk_container_set_border_width(GTK_CONTAINER(scroll), 5);
@@ -1318,10 +1325,10 @@
 	entry = new_info_entry_in_frame(box, "PID");
 	entry_set_int_value(entry, ts->pid);
 
-	if (ts->io_bytes[DDIR_READ])
-		gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_READ);
-	if (ts->io_bytes[DDIR_WRITE])
-		gfio_show_ddir_status(gc, vbox, rs, ts, DDIR_WRITE);
+	for (i = 0; i < DDIR_RWDIR_CNT; i++) {
+		if (ts->io_bytes[i])
+			gfio_show_ddir_status(gc, vbox, rs, ts, i);
+	}
 
 	gfio_show_latency_buckets(gc, vbox, ts);
 	gfio_show_cpu_usage(vbox, ts);
diff --git a/gclient.h b/gclient.h
index 56136be..4038365 100644
--- a/gclient.h
+++ b/gclient.h
@@ -11,8 +11,8 @@
 #define GFIO_WRITE_R	1.00
 #define GFIO_WRITE_G	0.00
 #define GFIO_WRITE_B	0.00
-#define GFIO_IOPS_R	0.24
-#define GFIO_IOPS_G	0.18
-#define GFIO_IOPS_B	0.52
+#define GFIO_TRIM_R	0.24
+#define GFIO_TRIM_G	0.18
+#define GFIO_TRIM_B	0.52
 
 #endif
diff --git a/gfio.c b/gfio.c
index e44a599..9522832 100644
--- a/gfio.c
+++ b/gfio.c
@@ -88,7 +88,7 @@
 	gg->trim_iops = graph_add_label(g, "Trim IOPS");
 	graph_set_color(g, gg->read_iops, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
 	graph_set_color(g, gg->write_iops, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
-	graph_set_color(g, gg->trim_iops, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
+	graph_set_color(g, gg->trim_iops, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
 	line_graph_set_data_count_limit(g, gfio_graph_limit);
 	graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0);
 	graph_set_graph_all_zeroes(g, 0);
@@ -107,7 +107,7 @@
 	gg->trim_bw = graph_add_label(g, "Trim Bandwidth");
 	graph_set_color(g, gg->read_bw, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
 	graph_set_color(g, gg->write_bw, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
-	graph_set_color(g, gg->trim_bw, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
+	graph_set_color(g, gg->trim_bw, GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
 	graph_set_base_offset(g, 1);
 	line_graph_set_data_count_limit(g, 100);
 	graph_add_extra_space(g, 0.0, 0.0, 0.0, 0.0);
@@ -1346,24 +1346,10 @@
 	multitext_free(&ge->eta.iodepth);
 }
 
-static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b)
-{
-	gint R, G, B;
-	gchar tmp[8];
-
-	memset(c, 0, sizeof(*c));
-	R = r * 255;
-	G = g * 255;
-	B = b * 255;
-	snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B);
-	gdk_color_parse(tmp, c);
-}
-
 static GtkWidget *new_client_page(struct gui_entry *ge)
 {
 	GtkWidget *main_vbox, *probe, *probe_frame, *probe_box;
 	GtkWidget *scrolled_window, *bottom_align, *top_align, *top_vbox;
-	GdkColor color;
 
 	main_vbox = gtk_vbox_new(FALSE, 3);
 
@@ -1399,24 +1385,12 @@
 
 	probe_box = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3);
-	ge->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW");
-	ge->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS");
-	ge->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW");
-	ge->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS");
-	ge->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
-	ge->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS");
-
-	fill_color_from_rgb(&color, GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
-	gtk_widget_modify_text(ge->eta.read_bw, GTK_STATE_NORMAL, &color);
-	gtk_widget_modify_text(ge->eta.read_iops, GTK_STATE_NORMAL, &color);
-
-	fill_color_from_rgb(&color, GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
-	gtk_widget_modify_text(ge->eta.write_bw, GTK_STATE_NORMAL, &color);
-	gtk_widget_modify_text(ge->eta.write_iops, GTK_STATE_NORMAL, &color);
-
-	fill_color_from_rgb(&color, GFIO_IOPS_R, GFIO_IOPS_G, GFIO_IOPS_B);
-	gtk_widget_modify_text(ge->eta.trim_bw, GTK_STATE_NORMAL, &color);
-	gtk_widget_modify_text(ge->eta.trim_iops, GTK_STATE_NORMAL, &color);
+	ge->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+	ge->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+	ge->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+	ge->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+	ge->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
+	ge->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
 
 	/*
 	 * Only add this if we have a commit rate
@@ -1499,13 +1473,12 @@
 	probe_box = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(probe_frame), probe_box, FALSE, FALSE, 3);
 	ui->eta.jobs = new_info_entry_in_frame(probe_box, "Running");
-	ui->eta.read_bw = new_info_entry_in_frame(probe_box, "Read BW");
-	ui->eta.read_iops = new_info_entry_in_frame(probe_box, "IOPS");
-	ui->eta.write_bw = new_info_entry_in_frame(probe_box, "Write BW");
-	ui->eta.write_iops = new_info_entry_in_frame(probe_box, "IOPS");
-	ui->eta.trim_bw = new_info_entry_in_frame(probe_box, "Trim BW");
-	ui->eta.trim_iops = new_info_entry_in_frame(probe_box, "IOPS");
-
+	ui->eta.read_bw = new_info_entry_in_frame_rgb(probe_box, "Read BW", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+	ui->eta.read_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_READ_R, GFIO_READ_G, GFIO_READ_B);
+	ui->eta.write_bw = new_info_entry_in_frame_rgb(probe_box, "Write BW", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+	ui->eta.write_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_WRITE_R, GFIO_WRITE_G, GFIO_WRITE_B);
+	ui->eta.trim_bw = new_info_entry_in_frame_rgb(probe_box, "Trim BW", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
+	ui->eta.trim_iops = new_info_entry_in_frame_rgb(probe_box, "IOPS", GFIO_TRIM_R, GFIO_TRIM_G, GFIO_TRIM_B);
 
 	/*
 	 * Only add this if we have a commit rate
diff --git a/ghelpers.c b/ghelpers.c
index d9380a2..7acf588 100644
--- a/ghelpers.c
+++ b/ghelpers.c
@@ -30,6 +30,31 @@
 	return entry;
 }
 
+static void fill_color_from_rgb(GdkColor *c, gfloat r, gfloat g, gfloat b)
+{
+	gint R, G, B;
+	gchar tmp[8];
+
+	memset(c, 0, sizeof(*c));
+	R = r * 255;
+	G = g * 255;
+	B = b * 255;
+	snprintf(tmp, sizeof(tmp), "#%02x%02x%02x", R, G, B);
+	gdk_color_parse(tmp, c);
+}
+
+GtkWidget *new_info_entry_in_frame_rgb(GtkWidget *box, const char *label,
+					gfloat r, gfloat g, gfloat b)
+{
+	GtkWidget *entry;
+	GdkColor c;
+
+	entry = new_info_entry_in_frame(box, label);
+	fill_color_from_rgb(&c, r, g, b);
+	gtk_widget_modify_text(entry, GTK_STATE_NORMAL, &c);
+	return entry;
+}
+
 GtkWidget *new_info_label_in_frame(GtkWidget *box, const char *label)
 {
 	GtkWidget *label_widget;
diff --git a/ghelpers.h b/ghelpers.h
index f5aabec..39a994b 100644
--- a/ghelpers.h
+++ b/ghelpers.h
@@ -4,6 +4,8 @@
 GtkWidget *new_combo_entry_in_frame(GtkWidget *box, const char *label);
 GtkWidget *new_info_entry_in_frame(GtkWidget *box, const char *label);
 GtkWidget *new_info_label_in_frame(GtkWidget *box, const char *label);
+GtkWidget *new_info_entry_in_frame_rgb(GtkWidget *box, const char *label,
+					gfloat r, gfloat g, gfloat b);
 GtkWidget *create_spinbutton(GtkWidget *hbox, double min, double max, double defval);
 void label_set_int_value(GtkWidget *entry, unsigned int val);
 void entry_set_int_value(GtkWidget *entry, unsigned int val);