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 {
struct gui_entry *ge;
struct fio_client *client;
GtkWidget *err_entry;
- unsigned int job_added;
struct thread_options o;
struct end_results *results;
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.
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);
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);
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();
}
{
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));
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();
}
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();
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);
}
}
-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)
{