GtkWidget *menu;
GtkWidget *window;
GtkWidget *vbox;
- GtkWidget *topvbox;
- GtkWidget *topalign;
- GtkWidget *bottomalign;
GtkWidget *thread_status_pb;
GtkWidget *buttonbox;
- GtkWidget *scrolled_window;
GtkWidget *notebook;
GtkWidget *error_info_bar;
GtkWidget *error_label;
struct gui *ui;
GtkWidget *vbox;
- GtkWidget *topvbox;
- GtkWidget *topalign;
- GtkWidget *bottomalign;
GtkWidget *job_notebook;
GtkWidget *thread_status_pb;
GtkWidget *buttonbox;
GtkWidget *button[ARRAYSIZE(buttonspeclist)];
- GtkWidget *scrolled_window;
GtkWidget *notebook;
GtkWidget *error_info_bar;
GtkWidget *error_label;
cairo_stroke(cr);
}
+static gboolean graph_tooltip(GtkWidget *w, gint x, gint y,
+ gboolean keyboard_mode, GtkTooltip *tooltip,
+ gpointer data)
+{
+ struct gfio_graphs *g = data;
+ const char *text = NULL;
+
+ if (graph_contains_xy(g->iops_graph, x, y))
+ text = graph_find_tooltip(g->iops_graph, x, y);
+ else if (graph_contains_xy(g->bandwidth_graph, x, y))
+ text = graph_find_tooltip(g->bandwidth_graph, x, y);
+
+ if (text) {
+ gtk_tooltip_set_text(tooltip, text);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static int on_expose_drawing_area(GtkWidget *w, GdkEvent *event, gpointer p)
{
struct gfio_graphs *g = p;
cairo_t *cr;
cr = gdk_cairo_create(w->window);
+
+ if (graph_has_tooltips(g->iops_graph) ||
+ graph_has_tooltips(g->bandwidth_graph)) {
+ g_object_set(w, "has-tooltip", TRUE, NULL);
+ g_signal_connect(w, "query-tooltip", G_CALLBACK(graph_tooltip), g);
+ }
+
cairo_set_source_rgb(cr, 0, 0, 0);
draw_graph(g->iops_graph, cr);
draw_graph(g->bandwidth_graph, cr);
gtk_entry_set_text(GTK_ENTRY(ge->eta.write_bw), rate_str[1]);
gtk_entry_set_text(GTK_ENTRY(ge->eta.write_iops), iops_str[1]);
- graph_add_xy_data(ge->graphs.iops_graph, "Read IOPS", je->elapsed_sec, je->iops[0]);
- graph_add_xy_data(ge->graphs.iops_graph, "Write IOPS", je->elapsed_sec, je->iops[1]);
- graph_add_xy_data(ge->graphs.bandwidth_graph, "Read Bandwidth", je->elapsed_sec, je->rate[0]);
- graph_add_xy_data(ge->graphs.bandwidth_graph, "Write Bandwidth", je->elapsed_sec, je->rate[1]);
+ graph_add_xy_data(ge->graphs.iops_graph, "Read IOPS", je->elapsed_sec, je->iops[0], iops_str[0]);
+ graph_add_xy_data(ge->graphs.iops_graph, "Write IOPS", je->elapsed_sec, je->iops[1], iops_str[1]);
+ graph_add_xy_data(ge->graphs.bandwidth_graph, "Read Bandwidth", je->elapsed_sec, je->rate[0], rate_str[0]);
+ graph_add_xy_data(ge->graphs.bandwidth_graph, "Write Bandwidth", je->elapsed_sec, je->rate[1], rate_str[1]);
free(rate_str[0]);
free(rate_str[1]);
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]);
- graph_add_xy_data(ui->graphs.iops_graph, "Read IOPS", je->elapsed_sec, je->iops[0]);
- graph_add_xy_data(ui->graphs.iops_graph, "Write IOPS", je->elapsed_sec, je->iops[1]);
- graph_add_xy_data(ui->graphs.bandwidth_graph, "Read Bandwidth", je->elapsed_sec, je->rate[0]);
- graph_add_xy_data(ui->graphs.bandwidth_graph, "Write Bandwidth", je->elapsed_sec, je->rate[1]);
+ graph_add_xy_data(ui->graphs.iops_graph, "Read IOPS", je->elapsed_sec, je->iops[0], iops_str[0]);
+ graph_add_xy_data(ui->graphs.iops_graph, "Write IOPS", je->elapsed_sec, je->iops[1], iops_str[1]);
+ graph_add_xy_data(ui->graphs.bandwidth_graph, "Read Bandwidth", je->elapsed_sec, je->rate[0], rate_str[0]);
+ graph_add_xy_data(ui->graphs.bandwidth_graph, "Write Bandwidth", je->elapsed_sec, je->rate[1], rate_str[1]);
free(rate_str[0]);
free(rate_str[1]);
i++;
}
+ ge->nr_job_files = 0;
return ret;
}
return;
}
- show_info_dialog(ui, "Error", "The main page view cannot be closed\n");
+ if (!flist_empty(&ui->list)) {
+ show_info_dialog(ui, "Error", "The main page view cannot be closed\n");
+ return;
+ }
+
+ gtk_main_quit();
}
static void file_open(GtkWidget *w, gpointer data)
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 white;
main_vbox = gtk_vbox_new(FALSE, 3);
- ge->topalign = gtk_alignment_new(0, 0, 1, 0);
- ge->topvbox = gtk_vbox_new(FALSE, 3);
- gtk_container_add(GTK_CONTAINER(ge->topalign), ge->topvbox);
- gtk_box_pack_start(GTK_BOX(main_vbox), ge->topalign, FALSE, FALSE, 0);
+ top_align = gtk_alignment_new(0, 0, 1, 0);
+ top_vbox = gtk_vbox_new(FALSE, 3);
+ gtk_container_add(GTK_CONTAINER(top_align), top_vbox);
+ gtk_box_pack_start(GTK_BOX(main_vbox), top_align, FALSE, FALSE, 0);
probe = gtk_frame_new("Job");
gtk_box_pack_start(GTK_BOX(main_vbox), probe, FALSE, FALSE, 3);
G_CALLBACK(on_expose_drawing_area), &ge->graphs);
g_signal_connect(G_OBJECT(ge->graphs.drawing_area), "configure_event",
G_CALLBACK(on_config_drawing_area), &ge->graphs);
- ge->scrolled_window = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ge->scrolled_window),
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ge->scrolled_window),
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
ge->graphs.drawing_area);
- gtk_box_pack_start(GTK_BOX(main_vbox), ge->scrolled_window,
- TRUE, TRUE, 0);
+ gtk_box_pack_start(GTK_BOX(main_vbox), scrolled_window, TRUE, TRUE, 0);
setup_graphs(&ge->graphs);
* Set up alignments for widgets at the bottom of ui,
* align bottom left, expand horizontally but not vertically
*/
- ge->bottomalign = gtk_alignment_new(0, 1, 1, 0);
+ bottom_align = gtk_alignment_new(0, 1, 1, 0);
ge->buttonbox = gtk_hbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(ge->bottomalign), ge->buttonbox);
- gtk_box_pack_start(GTK_BOX(main_vbox), ge->bottomalign,
- FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(bottom_align), ge->buttonbox);
+ gtk_box_pack_start(GTK_BOX(main_vbox), bottom_align, FALSE, FALSE, 0);
add_buttons(ge, buttonspeclist, ARRAYSIZE(buttonspeclist));
static GtkWidget *new_main_page(struct gui *ui)
{
GtkWidget *main_vbox, *probe, *probe_frame, *probe_box;
+ GtkWidget *scrolled_window, *bottom_align, *top_align, *top_vbox;
GdkColor white;
main_vbox = gtk_vbox_new(FALSE, 3);
* Set up alignments for widgets at the top of ui,
* align top left, expand horizontally but not vertically
*/
- ui->topalign = gtk_alignment_new(0, 0, 1, 0);
- ui->topvbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(ui->topalign), ui->topvbox);
- gtk_box_pack_start(GTK_BOX(main_vbox), ui->topalign, FALSE, FALSE, 0);
+ top_align = gtk_alignment_new(0, 0, 1, 0);
+ top_vbox = gtk_vbox_new(FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(top_align), top_vbox);
+ gtk_box_pack_start(GTK_BOX(main_vbox), top_align, FALSE, FALSE, 0);
probe = gtk_frame_new("Run statistics");
gtk_box_pack_start(GTK_BOX(main_vbox), probe, FALSE, FALSE, 3);
G_CALLBACK(on_expose_drawing_area), &ui->graphs);
g_signal_connect(G_OBJECT(ui->graphs.drawing_area), "configure_event",
G_CALLBACK(on_config_drawing_area), &ui->graphs);
- ui->scrolled_window = gtk_scrolled_window_new(NULL, NULL);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(ui->scrolled_window),
+ scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(ui->scrolled_window),
+ gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
ui->graphs.drawing_area);
- gtk_box_pack_start(GTK_BOX(main_vbox), ui->scrolled_window,
+ gtk_box_pack_start(GTK_BOX(main_vbox), scrolled_window,
TRUE, TRUE, 0);
setup_graphs(&ui->graphs);
* Set up alignments for widgets at the bottom of ui,
* align bottom left, expand horizontally but not vertically
*/
- ui->bottomalign = gtk_alignment_new(0, 1, 1, 0);
+ bottom_align = gtk_alignment_new(0, 1, 1, 0);
ui->buttonbox = gtk_hbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(ui->bottomalign), ui->buttonbox);
- gtk_box_pack_start(GTK_BOX(main_vbox), ui->bottomalign,
- FALSE, FALSE, 0);
+ gtk_container_add(GTK_CONTAINER(bottom_align), ui->buttonbox);
+ gtk_box_pack_start(GTK_BOX(main_vbox), bottom_align, FALSE, FALSE, 0);
/*
* Set up thread status progress bar