diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2012-10-09 10:19:49 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2012-10-09 10:19:49 +0200 |
commit | 99aca14f3aa05f8012e039413f9f6388087b6ecc (patch) | |
tree | 8ea4e9eb70f53f6aea2417e5e413b21dbf39f4f2 | |
parent | 9afddca3c27aa8aa2519ebc610d1dd59316a79ef (diff) | |
download | vconsole-99aca14f3aa05f8012e039413f9f6388087b6ecc.tar.gz |
error reporting
-rw-r--r-- | GNUmakefile | 3 | ||||
-rw-r--r-- | connect.c | 23 | ||||
-rw-r--r-- | domain.c | 6 | ||||
-rw-r--r-- | vconsole.c | 33 | ||||
-rw-r--r-- | vconsole.h | 4 |
5 files changed, 66 insertions, 3 deletions
diff --git a/GNUmakefile b/GNUmakefile index 06fa9dc..2996ee9 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -35,6 +35,9 @@ CFLAGS += -Wno-deprecated-declarations wanted := $(HAVE_GLIB)-$(HAVE_GTHREAD)-$(HAVE_GTK3)-$(HAVE_VTE3)-$(HAVE_LIBVIRT) pkglst := glib-2.0 gthread-2.0 gtk+-3.0 vte-2.90 libvirt else +CFLAGS += -DGTK_DISABLE_SINGLE_INCLUDES +CFLAGS += -DGTK_DISABLE_DEPRECATED +CFLAGS += -DGSEAL_ENABLE wanted := $(HAVE_GLIB)-$(HAVE_GTHREAD)-$(HAVE_GTK2)-$(HAVE_VTE2)-$(HAVE_LIBVIRT) pkglst := glib-2.0 gthread-2.0 gtk+-2.0 vte libvirt endif @@ -14,6 +14,25 @@ static int connect_domain_event(virConnectPtr c, virDomainPtr d, return 0; } +static void connect_error(void *opaque, virErrorPtr err) +{ + struct vconsole_connect *conn = opaque; + GtkMessageType type; + + switch (err->level) { + case VIR_ERR_WARNING: + type = GTK_MESSAGE_WARNING; + break; + case VIR_ERR_ERROR: + type = GTK_MESSAGE_ERROR; + break; + default: + type = GTK_MESSAGE_INFO; + break; + } + gtk_message(conn->win->toplevel, type, "%s", err->message); +} + void connect_close(virConnectPtr c, int reason, void *opaque) { struct vconsole_connect *conn = opaque; @@ -91,7 +110,8 @@ struct vconsole_connect *connect_init(struct vconsole_window *win, conn = g_new0(struct vconsole_connect, 1); conn->ptr = virConnectOpen(uri); if (conn->ptr == NULL) { - fprintf(stderr, "Failed to open connection to %s\n", uri); + gtk_message(win->toplevel, GTK_MESSAGE_ERROR, + "Failed to open connection to %s\n", uri); g_free(conn); return NULL; } @@ -99,6 +119,7 @@ struct vconsole_connect *connect_init(struct vconsole_window *win, name = virConnectGetHostname(conn->ptr); virConnectDomainEventRegister(conn->ptr, connect_domain_event, conn, NULL); + virConnSetErrorFunc(conn->ptr, conn, connect_error); #if LIBVIR_VERSION_NUMBER >= 10000 /* 0.10.0 */ virConnectRegisterCloseCallback(conn->ptr, connect_close, conn, NULL); @@ -647,10 +647,12 @@ void domain_activate(struct vconsole_domain *dom) gtk_widget_show_all(dom->vbox); gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), page); domain_configure_vte(dom); - domain_update_status(dom); + + domain_update_info(dom, d); + if (dom->info.state == VIR_DOMAIN_RUNNING) + domain_connect(dom, d); } - domain_connect(dom, d); virDomainFree(d); } @@ -44,6 +44,37 @@ void config_write(void) /* ------------------------------------------------------------------ */ +static char *gtk_msg_type_name[] = { + [ GTK_MESSAGE_INFO ] = "INFO", + [ GTK_MESSAGE_WARNING ] = "WARNING", + [ GTK_MESSAGE_QUESTION ] = "QUESTION", + [ GTK_MESSAGE_ERROR ] = "ERROR", +}; + +int gtk_message(GtkWidget *window, GtkMessageType type, char *fmt, ...) +{ + 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", msgbuf); + g_signal_connect_swapped(dialog, "response", + G_CALLBACK (gtk_widget_destroy), + dialog); + gtk_widget_show_all(dialog); + return rc; +} + static int gtk_getstring(GtkWidget *window, char *title, char *message, char *dest, int dlen) { @@ -90,6 +121,8 @@ static int gtk_getstring(GtkWidget *window, char *title, char *message, return retval; } +/* ------------------------------------------------------------------ */ + static void menu_cb_connect_ask(GtkAction *action, gpointer userdata) { struct vconsole_window *win = userdata; @@ -14,6 +14,7 @@ #include <vte/vte.h> #include <libvirt/libvirt.h> +#include <libvirt/virterror.h> /* ------------------------------------------------------------------ */ @@ -72,6 +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 config_write(void); /* ------------------------------------------------------------------ */ |