gfio: include name of iolog in gdio_client_iolog()
[fio.git] / gfio.c
diff --git a/gfio.c b/gfio.c
index 5a0b6d3b636194ae29597ce51517b6343a1d0eb2..a67accf4b885189f493a12c1a769cbf0a14304b5 100644 (file)
--- a/gfio.c
+++ b/gfio.c
@@ -158,6 +158,9 @@ struct gui_entry {
        GtkWidget *error_label;
        GtkWidget *results_notebook;
        GtkWidget *results_window;
+       GtkUIManager *results_uimanager;
+       GtkWidget *results_vbox;
+       GtkWidget *results_menu;
        GtkListStore *log_model;
        GtkWidget *log_tree;
        GtkWidget *log_view;
@@ -451,10 +454,6 @@ static void update_button_states(struct gui *ui, struct gui_entry *ge)
        gtk_widget_set_sensitive(ge->button[START_JOB_BUTTON], start_state);
        gtk_button_set_label(GTK_BUTTON(ge->button[CONNECT_BUTTON]), connect_str);
 
-       /*
-        * So the below doesn't work at all, how to set those menu items
-        * invisibible...
-        */
        w = gtk_ui_manager_get_widget(ui->uimanager, "/MainMenu/JobMenu/Connect");
        gtk_widget_set_sensitive(w, connect_state);
        gtk_menu_item_set_label(GTK_MENU_ITEM(w), connect_str);
@@ -1034,9 +1033,55 @@ static gboolean results_window_delete(GtkWidget *w, gpointer data)
        return TRUE;
 }
 
+static void results_close(GtkWidget *w, gpointer *data)
+{
+       struct gui_entry *ge = (struct gui_entry *) data;
+
+       gtk_widget_destroy(ge->results_window);
+}
+
+static GtkActionEntry results_menu_items[] = {
+       { "FileMenuAction", GTK_STOCK_FILE, "File", NULL, NULL, NULL},
+       { "GraphMenuAction", GTK_STOCK_FILE, "Graph", NULL, NULL, NULL},
+       { "CloseFile", GTK_STOCK_CLOSE, "Close", "<Control>W", NULL, G_CALLBACK(results_close) },
+};
+static gint results_nmenu_items = sizeof(results_menu_items) / sizeof(results_menu_items[0]);
+
+static const gchar *results_ui_string = " \
+       <ui> \
+               <menubar name=\"MainMenu\"> \
+                       <menu name=\"FileMenu\" action=\"FileMenuAction\"> \
+                               <menuitem name=\"Close\" action=\"CloseFile\" /> \
+                       </menu> \
+                       <menu name=\"GraphMenu\" action=\"GraphMenuAction\"> \
+                       </menu>\
+               </menubar> \
+       </ui> \
+";
+
+static GtkWidget *get_results_menubar(GtkWidget *window, struct gui_entry *ge)
+{
+       GtkActionGroup *action_group;
+       GtkWidget *widget;
+       GError *error = 0;
+
+       ge->results_uimanager = gtk_ui_manager_new();
+
+       action_group = gtk_action_group_new("ResultsMenu");
+       gtk_action_group_add_actions(action_group, results_menu_items, results_nmenu_items, ge);
+
+       gtk_ui_manager_insert_action_group(ge->results_uimanager, action_group, 0);
+       gtk_ui_manager_add_ui_from_string(GTK_UI_MANAGER(ge->results_uimanager), results_ui_string, -1, &error);
+
+       gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(ge->results_uimanager));
+
+       widget = gtk_ui_manager_get_widget(ge->results_uimanager, "/MainMenu");
+       return widget;
+}
+
 static GtkWidget *get_results_window(struct gui_entry *ge)
 {
-       GtkWidget *win, *notebook;
+       GtkWidget *win, *notebook, *vbox;
 
        if (ge->results_window)
                return ge->results_notebook;
@@ -1047,10 +1092,16 @@ static GtkWidget *get_results_window(struct gui_entry *ge)
        g_signal_connect(win, "delete-event", G_CALLBACK(results_window_delete), ge);
        g_signal_connect(win, "destroy", G_CALLBACK(results_window_delete), ge);
 
+       vbox = gtk_vbox_new(FALSE, 0);
+       gtk_container_add(GTK_CONTAINER(win), vbox);
+
+       ge->results_menu = get_results_menubar(win, ge);
+       gtk_box_pack_start(GTK_BOX(vbox), ge->results_menu, FALSE, FALSE, 0);
+
        notebook = gtk_notebook_new();
        gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), 1);
        gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
-       gtk_container_add(GTK_CONTAINER(win), notebook);
+       gtk_container_add(GTK_CONTAINER(vbox), notebook);
 
        ge->results_window = win;
        ge->results_notebook = notebook;
@@ -1638,6 +1689,7 @@ static void gfio_client_job_start(struct fio_client *client, struct fio_net_cmd
 
 static void gfio_client_iolog(struct fio_client *client, struct cmd_iolog_pdu *pdu)
 {
+       printf("got iolog: name=%s, type=%u, entries=%u\n", pdu->name, pdu->log_type, pdu->nr_samples);
        free(pdu);
 }
 
@@ -1681,13 +1733,6 @@ static void ge_destroy(struct gui_entry *ge)
 
 static void ge_widget_destroy(GtkWidget *w, gpointer data)
 {
-       struct gui_entry *ge = data;
-
-       /*
-        * Why are we getting NULL data here sometimes?
-        */
-       if (ge)
-               ge_destroy(ge);
 }
 
 static void gfio_quit(struct gui *ui)