summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-05-04 16:37:36 +0100
committerDaniel P. Berrange <berrange@redhat.com>2012-05-04 17:22:44 +0100
commitf34edd09cbde51e3bd8517bcdc93575b0a11a2cb (patch)
treef5a2cf6b0d55e8b0c35de77ec3fe7337852ae46b
parentd0d226ca8fddc41ca7b91ea3e18e551a06f1fc00 (diff)
Ensure windows are destroyed when display closes
When running virt-viewer with the --reconnect argument, when the session closes, the VirtViewerWindow instances were being freed, but not the GtkWindow itself. So the orphaned window stayed around doing nothing. The GtkBuilder instance was also leaked. Fix these two leaks & also add some debugging to help future troubleshooting
-rw-r--r--src/virt-viewer-app.c2
-rw-r--r--src/virt-viewer-display-spice.c2
-rw-r--r--src/virt-viewer-session-spice.c4
-rw-r--r--src/virt-viewer-window.c11
4 files changed, 18 insertions, 1 deletions
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index 46af0f8..82149dc 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -517,6 +517,7 @@ virt_viewer_app_remove_nth_window(VirtViewerApp *self, gint nth)
win = virt_viewer_app_get_nth_window(self, nth);
g_return_val_if_fail(win != NULL, FALSE);
+ DEBUG_LOG("Remove window %d %p", nth, win);
removed = g_hash_table_steal(self->priv->windows, &nth);
g_warn_if_fail(removed);
@@ -536,6 +537,7 @@ virt_viewer_app_set_nth_window(VirtViewerApp *self, gint nth, VirtViewerWindow *
g_return_if_fail(virt_viewer_app_get_nth_window(self, nth) == NULL);
key = g_malloc(sizeof(gint));
*key = nth;
+ DEBUG_LOG("Insert window %d %p", nth, win);
g_hash_table_insert(self->priv->windows, key, win);
virt_viewer_app_set_window_subtitle(self, win, nth);
diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c
index 985e116..f7bb26d 100644
--- a/src/virt-viewer-display-spice.c
+++ b/src/virt-viewer-display-spice.c
@@ -110,7 +110,7 @@ display_mark(SpiceChannel *channel G_GNUC_UNUSED,
gint mark,
VirtViewerDisplay *display)
{
- DEBUG_LOG("display mark %d", mark);
+ DEBUG_LOG("Toggle monitor visibility %p %d", channel, mark);
virt_viewer_display_set_show_hint(display, mark);
}
diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
index 361e413..d11d7a1 100644
--- a/src/virt-viewer-session-spice.c
+++ b/src/virt-viewer-session-spice.c
@@ -427,6 +427,8 @@ virt_viewer_session_spice_channel_new(SpiceSession *s,
g_object_get(channel, "channel-id", &id, NULL);
+ DEBUG_LOG("New spice channel %p %s %d", channel, g_type_name(G_OBJECT_TYPE(channel)), id);
+
if (SPICE_IS_MAIN_CHANNEL(channel)) {
if (self->priv->main_channel != NULL)
g_signal_handlers_disconnect_by_func(self->priv->main_channel,
@@ -522,6 +524,8 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s,
g_return_if_fail(self != NULL);
g_object_get(channel, "channel-id", &id, NULL);
+ DEBUG_LOG("Destroy SPICE channel %s %d", g_type_name(G_OBJECT_TYPE(channel)), id);
+
if (SPICE_IS_MAIN_CHANNEL(channel)) {
DEBUG_LOG("zap main channel");
if (channel == SPICE_CHANNEL(self->priv->main_channel))
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
index 771a8b9..ab82558 100644
--- a/src/virt-viewer-window.c
+++ b/src/virt-viewer-window.c
@@ -179,6 +179,17 @@ virt_viewer_window_dispose (GObject *object)
priv->display = NULL;
}
+ DEBUG_LOG("Disposing window %p\n", object);
+
+ if (priv->window) {
+ gtk_widget_destroy(priv->window);
+ priv->window = NULL;
+ }
+ if (priv->builder) {
+ g_object_unref(priv->builder);
+ priv->builder = NULL;
+ }
+
g_free(priv->subtitle);
priv->subtitle = NULL;
}