Add my copyright to gfio.c
[fio.git] / gfio.c
diff --git a/gfio.c b/gfio.c
index 457a13af4f91bbb6087f00afd258d49a72229de4..5b598552c4af77affd266bb7af25f1b944a01910 100644 (file)
--- a/gfio.c
+++ b/gfio.c
@@ -2,6 +2,7 @@
  * gfio - gui front end for fio - the flexible io tester
  *
  * Copyright (C) 2012 Stephen M. Cameron <stephenmcameron@gmail.com> 
+ * Copyright (C) 2012 Jens Axboe <axboe@kernel.dk>
  *
  * The license below covers all files distributed with fio unless otherwise
  * noted in the file itself.
@@ -92,6 +93,7 @@ struct gui {
        GtkWidget *results_window;
        GtkListStore *log_model;
        GtkWidget *log_tree;
+       GtkWidget *log_view;
        GtkTextBuffer *text;
        struct probe_widget probe;
        struct eta_widget eta;
@@ -175,6 +177,7 @@ static void gfio_set_connected(struct gui *ui, int connected)
                gtk_widget_set_sensitive(ui->button[START_JOB_BUTTON], 1);
                ui->connected = 1;
                gtk_button_set_label(GTK_BUTTON(ui->button[CONNECT_BUTTON]), "Disconnect");
+               gtk_widget_set_sensitive(ui->button[CONNECT_BUTTON], 1);
        } else {
                ui->connected = 0;
                gtk_button_set_label(GTK_BUTTON(ui->button[CONNECT_BUTTON]), "Connect");
@@ -256,11 +259,13 @@ static void gfio_ui_setup_log(struct gui *ui)
 
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
        gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
+       g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
+               "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
 
        tree_view_column(tree_view, 0, "Time", ALIGN_RIGHT | UNSORTABLE);
        tree_view_column(tree_view, 1, "Host", ALIGN_RIGHT | UNSORTABLE);
        tree_view_column(tree_view, 2, "Level", ALIGN_RIGHT | UNSORTABLE);
-       tree_view_column(tree_view, 3, "Text", ALIGN_RIGHT | UNSORTABLE);
+       tree_view_column(tree_view, 3, "Text", ALIGN_LEFT | UNSORTABLE);
 
        ui->log_model = model;
        ui->log_tree = tree_view;
@@ -287,6 +292,9 @@ static GtkWidget *gfio_output_clat_percentiles(unsigned int *ovals,
        tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
        gtk_widget_set_can_focus(tree_view, FALSE);
 
+       g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
+               "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
+
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
        gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
 
@@ -541,6 +549,9 @@ static GtkWidget *gfio_output_lat_buckets(double *lat, unsigned int num,
        tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
        gtk_widget_set_can_focus(tree_view, FALSE);
 
+       g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
+               "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
+
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
        gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
 
@@ -723,6 +734,9 @@ static void gfio_show_io_depths(GtkWidget *vbox, struct thread_stat *ts)
        tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(model));
        gtk_widget_set_can_focus(tree_view, FALSE);
 
+       g_object_set(G_OBJECT(tree_view), "headers-visible", TRUE,
+               "enable-grid-lines", GTK_TREE_VIEW_GRID_LINES_BOTH, NULL);
+
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree_view));
        gtk_tree_selection_set_mode(GTK_TREE_SELECTION(selection), GTK_SELECTION_BROWSE);
 
@@ -1028,6 +1042,8 @@ static void gfio_update_eta(struct jobs_eta *je)
 static void gfio_probe_op(struct fio_client *client, struct fio_net_cmd *cmd)
 {
        struct cmd_probe_pdu *probe = (struct cmd_probe_pdu *) cmd->payload;
+       struct gfio_client *gc = client->client_data;
+       struct gui *ui = gc->ui;
        const char *os, *arch;
        char buf[64];
 
@@ -1044,11 +1060,13 @@ static void gfio_probe_op(struct fio_client *client, struct fio_net_cmd *cmd)
 
        gdk_threads_enter();
 
-       gtk_label_set_text(GTK_LABEL(ui.probe.hostname), (char *) probe->hostname);
-       gtk_label_set_text(GTK_LABEL(ui.probe.os), os);
-       gtk_label_set_text(GTK_LABEL(ui.probe.arch), arch);
+       gtk_label_set_text(GTK_LABEL(ui->probe.hostname), (char *) probe->hostname);
+       gtk_label_set_text(GTK_LABEL(ui->probe.os), os);
+       gtk_label_set_text(GTK_LABEL(ui->probe.arch), arch);
        sprintf(buf, "%u.%u.%u", probe->fio_major, probe->fio_minor, probe->fio_patch);
-       gtk_label_set_text(GTK_LABEL(ui.probe.fio_ver), buf);
+       gtk_label_set_text(GTK_LABEL(ui->probe.fio_ver), buf);
+
+       gfio_set_connected(ui, 1);
 
        gdk_threads_leave();
 }
@@ -1210,9 +1228,10 @@ static void connect_clicked(GtkWidget *widget, gpointer data)
                if (!ui->nr_job_files)
                        file_open(widget, data);
                gtk_progress_bar_set_text(GTK_PROGRESS_BAR(ui->thread_status_pb), "No jobs running");
-               fio_clients_connect();
-               pthread_create(&ui->t, NULL, job_thread, NULL);
-               gfio_set_connected(ui, 1);
+               if (!fio_clients_connect()) {
+                       pthread_create(&ui->t, NULL, job_thread, NULL);
+                       gtk_widget_set_sensitive(ui->button[CONNECT_BUTTON], 0);
+               }
        } else {
                fio_clients_terminate();
                gfio_set_connected(ui, 0);
@@ -1315,10 +1334,10 @@ static int get_connection_details(char **host, int *port, int *type,
        hbox = gtk_hbox_new(TRUE, 4);
        gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
 
-       combo = gtk_combo_box_text_new();
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), "IPv4");
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), "IPv6");
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(combo), "local socket");
+       combo = gtk_combo_box_new_text();
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "IPv4");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "IPv6");
+       gtk_combo_box_append_text(GTK_COMBO_BOX(combo), "local socket");
        gtk_combo_box_set_active(GTK_COMBO_BOX(combo), 0);
 
        gtk_container_add(GTK_CONTAINER(hbox), combo);
@@ -1346,7 +1365,7 @@ static int get_connection_details(char **host, int *port, int *type,
        *host = strdup(gtk_entry_get_text(GTK_ENTRY(hentry)));
        *port = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pentry));
 
-       typeentry = gtk_combo_box_text_get_active_text(GTK_COMBO_BOX_TEXT(combo));
+       typeentry = gtk_combo_box_get_active_text(GTK_COMBO_BOX(combo));
        if (!typeentry || !strncmp(typeentry, "IPv4", 4))
                *type = Fio_client_ipv4;
        else if (!strncmp(typeentry, "IPv6", 4))
@@ -1465,21 +1484,36 @@ static void view_log_destroy(GtkWidget *w, gpointer data)
        gtk_widget_ref(ui->log_tree);
        gtk_container_remove(GTK_CONTAINER(w), ui->log_tree);
        gtk_widget_destroy(w);
+       ui->log_view = NULL;
 }
 
 static void view_log(GtkWidget *w, gpointer data)
 {
-       GtkWidget *win, *box;
+       GtkWidget *win, *scroll, *vbox, *box;
+       struct gui *ui = (struct gui *) data;
 
-       win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+       if (ui->log_view)
+               return;
+
+       ui->log_view = win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title(GTK_WINDOW(win), "Log");
+       gtk_window_set_default_size(GTK_WINDOW(win), 700, 500);
 
-       box = gtk_hbox_new(FALSE, 3);
-       gtk_container_add(GTK_CONTAINER(win), box);
+       scroll = gtk_scrolled_window_new(NULL, NULL);
+
+       gtk_container_set_border_width(GTK_CONTAINER(scroll), 5);
+
+       gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+       box = gtk_hbox_new(TRUE, 0);
+       gtk_box_pack_start_defaults(GTK_BOX(box), ui->log_tree);
+       g_signal_connect(box, "destroy", G_CALLBACK(view_log_destroy), ui);
+       gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scroll), box);
+
+       vbox = gtk_vbox_new(TRUE, 5);
+       gtk_box_pack_start_defaults(GTK_BOX(vbox), scroll);
 
-       g_signal_connect(box, "delete-event", G_CALLBACK(view_log_destroy), (gpointer) &ui);
-       g_signal_connect(box, "destroy", G_CALLBACK(view_log_destroy), (gpointer) &ui);
-       gtk_container_add(GTK_CONTAINER(box), ui.log_tree);
+       gtk_container_add(GTK_CONTAINER(win), vbox);
        gtk_widget_show_all(win);
 }
 
@@ -1574,13 +1608,14 @@ static const gchar *ui_string = " \
        </ui> \
 ";
 
-static GtkWidget *get_menubar_menu(GtkWidget *window, GtkUIManager *ui_manager)
+static GtkWidget *get_menubar_menu(GtkWidget *window, GtkUIManager *ui_manager,
+                                  struct gui *ui)
 {
        GtkActionGroup *action_group = gtk_action_group_new("Menu");
        GError *error = 0;
 
        action_group = gtk_action_group_new("Menu");
-       gtk_action_group_add_actions(action_group, menu_items, nmenu_items, 0);
+       gtk_action_group_add_actions(action_group, menu_items, nmenu_items, ui);
 
        gtk_ui_manager_insert_action_group(ui_manager, action_group, 0);
        gtk_ui_manager_add_ui_from_string(GTK_UI_MANAGER(ui_manager), ui_string, -1, &error);
@@ -1627,7 +1662,7 @@ static void init_ui(int *argc, char **argv[], struct gui *ui)
        gtk_container_add(GTK_CONTAINER (ui->window), ui->vbox);
 
        uimanager = gtk_ui_manager_new();
-       menu = get_menubar_menu(ui->window, uimanager);
+       menu = get_menubar_menu(ui->window, uimanager, ui);
        gfio_ui_setup(settings, menu, ui->vbox, uimanager);
 
        /*