141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include <locale.h>
241666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include <malloc.h>
341666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include <string.h>
441666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include <stdarg.h>
541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
641666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include <gtk/gtk.h>
741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
841666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include "gfio.h"
941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe#include "gerror.h"
1041666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
1141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboestatic void on_info_bar_response(GtkWidget *widget, gint response,
123c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe				 gpointer data)
1341666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe{
1441666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	struct gui *ui = (struct gui *) data;
1541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
1641666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	if (response == GTK_RESPONSE_OK) {
1741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		gtk_widget_destroy(widget);
1841666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		ui->error_info_bar = NULL;
1941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	}
2041666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe}
2141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
2241666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboestatic void report_error(struct gui_entry *ge, GError *error)
2341666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe{
2441666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	struct gui *ui = ge->ui;
2541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
2641666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	if (ui->error_info_bar == NULL) {
27cab2440c23426b06e7e8327c5353fbd8373dcb5aJens Axboe		GtkWidget *container;
28cab2440c23426b06e7e8327c5353fbd8373dcb5aJens Axboe
2941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		ui->error_info_bar = gtk_info_bar_new_with_buttons(GTK_STOCK_OK,
303c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe						GTK_RESPONSE_OK, NULL);
3141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		g_signal_connect(ui->error_info_bar, "response", G_CALLBACK(on_info_bar_response), ui);
3241666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		gtk_info_bar_set_message_type(GTK_INFO_BAR(ui->error_info_bar),
333c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe						GTK_MESSAGE_ERROR);
343c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe
3541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		ui->error_label = gtk_label_new(error->message);
36cab2440c23426b06e7e8327c5353fbd8373dcb5aJens Axboe		container = gtk_info_bar_get_content_area(GTK_INFO_BAR(ui->error_info_bar));
3741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		gtk_container_add(GTK_CONTAINER(container), ui->error_label);
383c3ed070502bbfec387ded2c43d5e4559ca24a63Jens Axboe
3941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		gtk_box_pack_start(GTK_BOX(ui->vbox), ui->error_info_bar, FALSE, FALSE, 0);
4041666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		gtk_widget_show_all(ui->vbox);
4141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	} else {
4241666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		char buffer[256];
4341666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe		snprintf(buffer, sizeof(buffer), "Failed to open file.");
44f762cef937f69d6a23127baf47f22e8ffaea4c11Jens Axboe		gtk_label_set_text(GTK_LABEL(ui->error_label), buffer);
4541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	}
4641666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe}
4741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
4841666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboevoid gfio_report_error(struct gui_entry *ge, const char *format, ...)
4941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe{
5041666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	va_list args;
5141666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	GError *error;
5241666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
5341666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	va_start(args, format);
5441666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	error = g_error_new_valist(g_quark_from_string("fio"), 1, format, args);
5541666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	va_end(args);
5641666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
5741666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	report_error(ge, error);
5841666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe	g_error_free(error);
5941666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe}
6041666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
611252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboevoid gfio_report_info(struct gui *ui, const char *title, const char *message)
621252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe{
631252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	GtkWidget *dialog, *content, *label;
641252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe
651252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	dialog = gtk_dialog_new_with_buttons(title, GTK_WINDOW(ui->window),
661252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe			GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
671252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe			GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
6841666588eed4ed830b1fabd0458eb2b0a93f0147Jens Axboe
691252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	content = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
701252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	label = gtk_label_new(message);
711252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	gtk_container_add(GTK_CONTAINER(content), label);
721252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	gtk_widget_show_all(dialog);
731252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
741252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	gtk_dialog_run(GTK_DIALOG(dialog));
751252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe	gtk_widget_destroy(dialog);
761252d8f2c1daeb31fdc8c1f63db3ceadf7e20892Jens Axboe}
77