* Main window widgets and data
*/
struct gui {
+ GtkUIManager *uimanager;
+ GtkWidget *menu;
GtkWidget *window;
GtkWidget *vbox;
GtkWidget *topvbox;
{
if (index >= mt->max_text)
return;
- if (!mt->text[index])
+ if (!mt->text || !mt->text[index])
return;
mt->cur_text = index;
static void multitext_update_entry(struct multitext_widget *mt,
unsigned int index, const char *text)
{
+ if (!mt->text)
+ return;
+
if (mt->text[index])
free(mt->text[index]);
gtk_entry_set_text(GTK_ENTRY(entry), tmp);
}
+static void show_info_dialog(struct gui *ui, const char *title,
+ const char *message)
+{
+ GtkWidget *dialog, *content, *label;
+
+ dialog = gtk_dialog_new_with_buttons(title, GTK_WINDOW(ui->window),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
+
+ content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
+ label = gtk_label_new(message);
+ gtk_container_add(GTK_CONTAINER(content), label);
+ gtk_widget_show_all(dialog);
+ gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+ gtk_dialog_run(GTK_DIALOG(dialog));
+ gtk_widget_destroy(dialog);
+}
+
#define ALIGN_LEFT 1
#define ALIGN_RIGHT 2
#define INVISIBLE 4
static void gfio_client_timed_out(struct fio_client *client)
{
struct gfio_client *gc = client->client_data;
- GtkWidget *dialog, *label, *content;
char buf[256];
gdk_threads_enter();
clear_ge_ui_info(gc->ge);
sprintf(buf, "Client %s: timeout talking to server.\n", client->hostname);
-
- dialog = gtk_dialog_new_with_buttons("Timed out!",
- GTK_WINDOW(main_ui.window),
- GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
-
- /* gtk_dialog_get_content_area() is 2.14 and newer */
- content = GTK_DIALOG(dialog)->vbox;
-
- label = gtk_label_new((const gchar *) buf);
- gtk_container_add(GTK_CONTAINER(content), label);
- gtk_widget_show_all(dialog);
- gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
-
- gtk_dialog_run(GTK_DIALOG(dialog));
- gtk_widget_destroy(dialog);
+ show_info_dialog(gc->ge->ui, "Network timeout", buf);
gdk_threads_leave();
}
struct gui_entry *ge = data;
struct gfio_client *gc = ge->client;
- if (gc->client)
+ if (gc && gc->client) {
+ if (ge->connected)
+ fio_client_terminate(gc->client);
+
fio_put_client(gc->client);
+ }
flist_del(&ge->list);
free(ge);
static void file_new(GtkWidget *w, gpointer data)
{
- get_new_ge_with_tab("Untitled");
+ struct gui *ui = (struct gui *) data;
+ struct gui_entry *ge;
+
+ ge = get_new_ge_with_tab("Untitled");
+ gtk_notebook_set_current_page(GTK_NOTEBOOK(ui->notebook), ge->page_num);
}
/*
return NULL;
}
+static void file_close(GtkWidget *w, gpointer data)
+{
+ struct gui *ui = (struct gui *) data;
+ gint cur_page;
+
+ /*
+ * Can't close the main tab
+ */
+ cur_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(ui->notebook));
+ if (cur_page) {
+ struct gui_entry *ge = get_ge_from_page(cur_page);
+
+ gtk_widget_destroy(ge->vbox);
+ return;
+ }
+
+ show_info_dialog(ui, "Error", "The main page view cannot be closed\n");
+}
+
static void file_open(GtkWidget *w, gpointer data)
{
struct gui *ui = data;
gtk_widget_show_all(win);
}
+static void edit_options(GtkWidget *w, gpointer data)
+{
+}
+
static void __update_graph_limits(struct gfio_graphs *g)
{
line_graph_set_data_count_limit(g->iops_graph, gfio_graph_limit);
static GtkActionEntry menu_items[] = {
{ "FileMenuAction", GTK_STOCK_FILE, "File", NULL, NULL, NULL},
{ "ViewMenuAction", GTK_STOCK_FILE, "View", NULL, NULL, NULL},
+ { "JobMenuAction", GTK_STOCK_FILE, "Job", NULL, NULL, NULL},
{ "HelpMenuAction", GTK_STOCK_HELP, "Help", NULL, NULL, NULL},
{ "NewFile", GTK_STOCK_NEW, "New", "<Control>N", NULL, G_CALLBACK(file_new) },
+ { "CloseFile", GTK_STOCK_CLOSE, "Close", "<Control>W", NULL, G_CALLBACK(file_close) },
{ "OpenFile", GTK_STOCK_OPEN, NULL, "<Control>O", NULL, G_CALLBACK(file_open) },
{ "SaveFile", GTK_STOCK_SAVE, NULL, "<Control>S", NULL, G_CALLBACK(file_save) },
{ "Preferences", GTK_STOCK_PREFERENCES, NULL, "<Control>p", NULL, G_CALLBACK(preferences) },
{ "ViewLog", NULL, "Log", "<Control>l", NULL, G_CALLBACK(view_log) },
+ { "EditOptions", NULL, "Edit Options", "<Control>E", NULL, G_CALLBACK(edit_options) },
{ "Quit", GTK_STOCK_QUIT, NULL, "<Control>Q", NULL, G_CALLBACK(quit_clicked) },
{ "About", GTK_STOCK_ABOUT, NULL, NULL, NULL, G_CALLBACK(about_dialog) },
};
<menubar name=\"MainMenu\"> \
<menu name=\"FileMenu\" action=\"FileMenuAction\"> \
<menuitem name=\"New\" action=\"NewFile\" /> \
+ <menuitem name=\"Close\" action=\"CloseFile\" /> \
<separator name=\"Separator1\"/> \
<menuitem name=\"Open\" action=\"OpenFile\" /> \
<menuitem name=\"Save\" action=\"SaveFile\" /> \
<separator name=\"Separator3\"/> \
<menuitem name=\"Quit\" action=\"Quit\" /> \
</menu> \
+ <menu name=\"JobMenu\" action=\"JobMenuAction\"> \
+ <menuitem name=\"Edit Options\" action=\"EditOptions\" /> \
+ </menu>\
<menu name=\"ViewMenu\" action=\"ViewMenuAction\"> \
<menuitem name=\"Log\" action=\"ViewLog\" /> \
</menu>\
</ui> \
";
+static void set_job_menu_visible(struct gui *ui, int visible)
+{
+ GtkWidget *job;
+
+ job = gtk_ui_manager_get_widget(ui->uimanager, "/MainMenu/JobMenu");
+ gtk_widget_set_sensitive(job, visible);
+}
+
static GtkWidget *get_menubar_menu(GtkWidget *window, GtkUIManager *ui_manager,
struct gui *ui)
{
gtk_ui_manager_add_ui_from_string(GTK_UI_MANAGER(ui_manager), ui_string, -1, &error);
gtk_window_add_accel_group(GTK_WINDOW(window), gtk_ui_manager_get_accel_group(ui_manager));
+
return gtk_ui_manager_get_widget(ui_manager, "/MainMenu");
}
guint page, gpointer data)
{
+ struct gui *ui = (struct gui *) data;
+
+ set_job_menu_visible(ui, page);
return TRUE;
}
static void init_ui(int *argc, char **argv[], struct gui *ui)
{
GtkSettings *settings;
- GtkUIManager *uimanager;
- GtkWidget *menu, *vbox;
+ GtkWidget *vbox;
/* Magical g*thread incantation, you just need this thread stuff.
* Without it, the update that happens in gfio_update_thread_status
ui->vbox = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(ui->window), ui->vbox);
- uimanager = gtk_ui_manager_new();
- menu = get_menubar_menu(ui->window, uimanager, ui);
- gfio_ui_setup(settings, menu, ui->vbox, uimanager);
+ ui->uimanager = gtk_ui_manager_new();
+ ui->menu = get_menubar_menu(ui->window, ui->uimanager, ui);
+ gfio_ui_setup(settings, ui->menu, ui->vbox, ui->uimanager);
ui->notebook = gtk_notebook_new();
g_signal_connect(ui->notebook, "switch-page", G_CALLBACK(notebook_switch_page), ui);