X-Git-Url: https://git.kernel.dk/?a=blobdiff_plain;f=gfio.c;h=bbeb229996272aa079c11d26856fda7f78600588;hb=f0602d785d18498ff7c432c6d2c45fbcda329c84;hp=ffc66054208c2ce97472ec86be16d1ca5633e6bf;hpb=bf64138bff75e2a1434d7c4eabcc6ced6d0fb537;p=fio.git diff --git a/gfio.c b/gfio.c index ffc66054..bbeb2299 100644 --- a/gfio.c +++ b/gfio.c @@ -52,16 +52,16 @@ static void send_clicked(GtkWidget *widget, gpointer data); static struct button_spec { const char *buttontext; clickfunction f; - const char *tooltiptext; - const int start_insensitive; + const char *tooltiptext[2]; + const int start_sensitive; } buttonspeclist[] = { #define CONNECT_BUTTON 0 #define SEND_BUTTON 1 #define START_JOB_BUTTON 2 - { "Connect", connect_clicked, "Connect to host", 0 }, - { "Send", send_clicked, "Send job description to host", 1 }, + { "Connect", connect_clicked, { "Disconnect from host", "Connect to host" }, 1 }, + { "Send", send_clicked, { "Send job description to host", NULL }, 0 }, { "Start Job", start_job_clicked, - "Start the current job on the server", 1 }, + { "Start the current job on the server", NULL }, 0 }, }; struct probe_widget { @@ -189,7 +189,6 @@ struct gfio_client { struct gui_entry *ge; struct fio_client *client; GtkWidget *err_entry; - unsigned int job_added; struct thread_options o; struct end_results *results; @@ -433,6 +432,39 @@ static void set_view_results_visible(struct gui *ui, int visible) set_menu_entry_visible(ui, "/MainMenu/ViewMenu/Results", visible); } +static const char *get_button_tooltip(struct button_spec *s, int sensitive) +{ + if (s->tooltiptext[sensitive]) + return s->tooltiptext[sensitive]; + + return s->tooltiptext[0]; +} + +static GtkWidget *add_button(GtkWidget *buttonbox, + struct button_spec *buttonspec, gpointer data) +{ + GtkWidget *button = gtk_button_new_with_label(buttonspec->buttontext); + gboolean sens = buttonspec->start_sensitive; + + g_signal_connect(button, "clicked", G_CALLBACK(buttonspec->f), data); + gtk_box_pack_start(GTK_BOX(buttonbox), button, FALSE, FALSE, 3); + + sens = buttonspec->start_sensitive; + gtk_widget_set_tooltip_text(button, get_button_tooltip(buttonspec, sens)); + gtk_widget_set_sensitive(button, sens); + + return button; +} + +static void add_buttons(struct gui_entry *ge, struct button_spec *buttonlist, + int nbuttons) +{ + int i; + + for (i = 0; i < nbuttons; i++) + ge->button[i] = add_button(ge->buttonbox, &buttonlist[i], ge); +} + /* * Update sensitivity of job buttons and job menu items, based on the * state of the client. @@ -499,6 +531,7 @@ static void update_button_states(struct gui *ui, struct gui_entry *ge) gtk_widget_set_sensitive(ge->button[SEND_BUTTON], send_state); gtk_widget_set_sensitive(ge->button[START_JOB_BUTTON], start_state); gtk_button_set_label(GTK_BUTTON(ge->button[CONNECT_BUTTON]), connect_str); + gtk_widget_set_tooltip_text(ge->button[CONNECT_BUTTON], get_button_tooltip(&buttonspeclist[CONNECT_BUTTON], connect_state)); set_menu_entry_visible(ui, "/MainMenu/JobMenu/Connect", connect_state); set_menu_entry_text(ui, "/MainMenu/JobMenu/Connect", connect_str); @@ -1256,25 +1289,51 @@ static void disk_util_destroy(GtkWidget *w, gpointer data) gtk_widget_destroy(w); } +static GtkWidget *get_scrolled_window(gint border_width) +{ + GtkWidget *scroll; + + scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_container_set_border_width(GTK_CONTAINER(scroll), border_width); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + + return scroll; +} + +static GtkWidget *gfio_disk_util_get_vbox(struct gui_entry *ge) +{ + GtkWidget *vbox, *box, *scroll, *res_notebook; + + if (ge->disk_util_vbox) + return ge->disk_util_vbox; + + scroll = get_scrolled_window(5); + vbox = gtk_vbox_new(FALSE, 3); + box = gtk_hbox_new(FALSE, 0); + gtk_box_pack_start(GTK_BOX(vbox), box, TRUE, FALSE, 5); + + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), vbox); + res_notebook = get_results_window(ge); + + gtk_notebook_append_page(GTK_NOTEBOOK(res_notebook), scroll, gtk_label_new("Disk utilization")); + ge->disk_util_vbox = box; + g_signal_connect(vbox, "destroy", G_CALLBACK(disk_util_destroy), ge); + + return ge->disk_util_vbox; +} + static int __gfio_disk_util_show(GtkWidget *res_notebook, struct gfio_client *gc, struct cmd_du_pdu *p) { - GtkWidget *box, *frame, *entry, *vbox; + GtkWidget *box, *frame, *entry, *vbox, *util_vbox; struct gui_entry *ge = gc->ge; double util; char tmp[16]; - res_notebook = get_results_window(ge); - - if (!ge->disk_util_vbox) { - vbox = gtk_vbox_new(FALSE, 3); - gtk_notebook_append_page(GTK_NOTEBOOK(res_notebook), vbox, gtk_label_new("Disk utilization")); - ge->disk_util_vbox = vbox; - g_signal_connect(vbox, "destroy", G_CALLBACK(disk_util_destroy), ge); - } + util_vbox = gfio_disk_util_get_vbox(ge); vbox = gtk_vbox_new(FALSE, 3); - gtk_container_add(GTK_CONTAINER(ge->disk_util_vbox), vbox); + gtk_container_add(GTK_CONTAINER(util_vbox), vbox); frame = gtk_frame_new((char *) p->dus.name); gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 2); @@ -1429,11 +1488,15 @@ static void gfio_display_ts(struct fio_client *client, struct thread_stat *ts, struct group_run_stats *rs) { struct gfio_client *gc = client->client_data; + struct gui_entry *ge = gc->ge; gfio_add_end_results(gc, ts, rs); gdk_threads_enter(); - gfio_display_end_results(gc); + if (ge->results_window) + __gfio_display_end_results(ge->results_notebook, gc, ts, rs); + else + gfio_display_end_results(gc); gdk_threads_leave(); } @@ -1469,6 +1532,7 @@ static void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd { struct cmd_du_pdu *p = (struct cmd_du_pdu *) cmd->payload; struct gfio_client *gc = client->client_data; + struct gui_entry *ge = gc->ge; unsigned int nr = gc->nr_du; gc->du = realloc(gc->du, (nr + 1) * sizeof(struct cmd_du_pdu)); @@ -1476,7 +1540,10 @@ static void gfio_disk_util_op(struct fio_client *client, struct fio_net_cmd *cmd gc->nr_du++; gdk_threads_enter(); - gfio_disk_util_show(gc); + if (ge->results_window) + __gfio_disk_util_show(ge->results_notebook, gc, p); + else + gfio_disk_util_show(gc); gdk_threads_leave(); } @@ -1849,8 +1916,6 @@ static void gfio_add_job_op(struct fio_client *client, struct fio_net_cmd *cmd) multitext_set_entry(&ge->eta.ioengine, 0); multitext_set_entry(&ge->eta.iodepth, 0); - gc->job_added++; - gfio_set_state(ge, GE_STATE_JOB_SENT); gdk_threads_leave(); @@ -2057,6 +2122,8 @@ static void connect_clicked(GtkWidget *widget, gpointer data) if (!ge->nr_job_files) return; + gc = ge->client; + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ge->thread_status_pb), "No jobs running"); gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ge->thread_status_pb), 0.0); ret = fio_client_connect(gc->client); @@ -2093,28 +2160,6 @@ static void send_clicked(GtkWidget *widget, gpointer data) } } -static GtkWidget *add_button(GtkWidget *buttonbox, - struct button_spec *buttonspec, gpointer data) -{ - GtkWidget *button = gtk_button_new_with_label(buttonspec->buttontext); - - g_signal_connect(button, "clicked", G_CALLBACK(buttonspec->f), data); - gtk_box_pack_start(GTK_BOX(buttonbox), button, FALSE, FALSE, 3); - gtk_widget_set_tooltip_text(button, buttonspec->tooltiptext); - gtk_widget_set_sensitive(button, !buttonspec->start_insensitive); - - return button; -} - -static void add_buttons(struct gui_entry *ge, struct button_spec *buttonlist, - int nbuttons) -{ - int i; - - for (i = 0; i < nbuttons; i++) - ge->button[i] = add_button(ge->buttonbox, &buttonlist[i], ge); -} - static void on_info_bar_response(GtkWidget *widget, gint response, gpointer data) {