aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2012-11-14 08:54:32 +0100
committerGerd Hoffmann <kraxel@redhat.com>2012-11-14 08:54:32 +0100
commit34889bb7ab5674df21fdba3d5f913c99707f1a42 (patch)
treed59f85ee5afc46c306b7b06d00bbec66da8649ff
parentb584913d9eadfc42644b8b740775d389b03efcc3 (diff)
downloadvconsole-34889bb7ab5674df21fdba3d5f913c99707f1a42.tar.gz
tweak error handling
-rw-r--r--connect.c11
-rw-r--r--vconsole.c47
-rw-r--r--vconsole.h8
3 files changed, 46 insertions, 20 deletions
diff --git a/connect.c b/connect.c
index 43ef3be..a2eddcc 100644
--- a/connect.c
+++ b/connect.c
@@ -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;
diff --git a/vconsole.c b/vconsole.c
index 8faa1c7..bd64ccc 100644
--- a/vconsole.c
+++ b/vconsole.c
@@ -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,
diff --git a/vconsole.h b/vconsole.h
index e31c531..fe92c8e 100644
--- a/vconsole.h
+++ b/vconsole.h
@@ -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,