diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2012-11-14 08:54:32 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2012-11-14 08:54:32 +0100 |
commit | 34889bb7ab5674df21fdba3d5f913c99707f1a42 (patch) | |
tree | d59f85ee5afc46c306b7b06d00bbec66da8649ff | |
parent | b584913d9eadfc42644b8b740775d389b03efcc3 (diff) | |
download | vconsole-34889bb7ab5674df21fdba3d5f913c99707f1a42.tar.gz |
tweak error handling
-rw-r--r-- | connect.c | 11 | ||||
-rw-r--r-- | vconsole.c | 47 | ||||
-rw-r--r-- | vconsole.h | 8 |
3 files changed, 46 insertions, 20 deletions
@@ -18,6 +18,7 @@ static void connect_error(void *opaque, virErrorPtr err) { struct vconsole_connect *conn = opaque; GtkMessageType type; + GtkWidget **dialog; switch (err->domain) { case VIR_FROM_STREAMS: /* get one on guest shutdown, ignore */ @@ -29,17 +30,19 @@ static void connect_error(void *opaque, virErrorPtr err) switch (err->level) { case VIR_ERR_WARNING: type = GTK_MESSAGE_WARNING; + dialog = &conn->warn; break; case VIR_ERR_ERROR: type = GTK_MESSAGE_ERROR; + dialog = &conn->err; break; default: type = GTK_MESSAGE_INFO; + dialog = &conn->info; break; } - gtk_message(conn->win->toplevel, type, - "%s\n\n" - "[code %d, domain %d]", + gtk_message(conn->win->toplevel, dialog, type, + "%s [ %d / %d]\n", err->message, err->code, err->domain); } @@ -121,7 +124,7 @@ struct vconsole_connect *connect_init(struct vconsole_window *win, conn = g_new0(struct vconsole_connect, 1); conn->ptr = virConnectOpen(uri); if (conn->ptr == NULL) { - gtk_message(win->toplevel, GTK_MESSAGE_ERROR, + gtk_message(win->toplevel, NULL, GTK_MESSAGE_ERROR, "Failed to open connection to %s\n", uri); g_free(conn); return NULL; @@ -51,30 +51,49 @@ static char *gtk_msg_type_name[] = { [ GTK_MESSAGE_ERROR ] = "ERROR", }; -int gtk_message(GtkWidget *window, GtkMessageType type, char *fmt, ...) +void gtk_message(GtkWidget *parent, GtkWidget **dialog, GtkMessageType type, + char *fmt, ...) { + GtkWidget *d = NULL; va_list args; - GtkWidget *dialog; char msgbuf[1024]; int rc; va_start(args, fmt); rc = vsnprintf(msgbuf, sizeof(msgbuf), fmt, args); va_end(args); - if (debug) fprintf(stderr, "%s: %s", gtk_msg_type_name[type], msgbuf); - dialog = gtk_message_dialog_new(GTK_WINDOW(window), - GTK_DIALOG_DESTROY_WITH_PARENT, - type, GTK_BUTTONS_CLOSE, - "%s", gtk_msg_type_name[type]); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), - "%s", msgbuf); - g_signal_connect_swapped(dialog, "response", - G_CALLBACK (gtk_widget_destroy), - dialog); - gtk_widget_show_all(dialog); - return rc; + + if (dialog == NULL) { + dialog = &d; + } + if (*dialog == NULL) { + *dialog = gtk_message_dialog_new(GTK_WINDOW(parent), + GTK_DIALOG_DESTROY_WITH_PARENT, + type, GTK_BUTTONS_CLOSE, + "%s", gtk_msg_type_name[type]); + if (dialog != NULL) { + g_signal_connect_swapped(*dialog, "response", + G_CALLBACK (gtk_widget_hide_on_delete), + *dialog); + } else { + g_signal_connect_swapped(*dialog, "response", + G_CALLBACK (gtk_widget_destroy), + *dialog); + } + } + + if (gtk_widget_get_visible(*dialog)) { + char *text; + g_object_get(G_OBJECT(*dialog), "secondary-text", &text, NULL); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(*dialog), + "%s%s", text, msgbuf); + } else { + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(*dialog), + "%s", msgbuf); + gtk_widget_show_all(*dialog); + } } static int gtk_getstring(GtkWidget *window, char *title, char *message, @@ -73,8 +73,9 @@ struct vconsole_window { extern int debug; extern GKeyFile *config; -int gtk_message(GtkWidget *window, GtkMessageType type, char *fmt, ...) - __attribute__ ((format (printf, 3, 0))); +void gtk_message(GtkWidget *parent, GtkWidget **dialog, GtkMessageType type, + char *fmt, ...) + __attribute__ ((format (printf, 4, 0))); void config_write(void); @@ -83,6 +84,9 @@ void config_write(void); struct vconsole_connect { struct vconsole_window *win; virConnectPtr ptr; + GtkWidget *warn; + GtkWidget *err; + GtkWidget *info; }; struct vconsole_connect *connect_init(struct vconsole_window *win, |