[virt-tools-list] [PATCH v2 virt-viewer] App: keep hash table of displays

Jonathon Jongsma jjongsma at redhat.com
Thu Sep 4 20:34:46 UTC 2014


This is part of a re-factoring that will de-couple the client window
from the remote display id.
---

Changes from Fabiano's review

 src/virt-viewer-app.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index b60ce2d..a0b1d76 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -109,6 +109,7 @@ struct _VirtViewerAppPrivate {
     VirtViewerWindow *main_window;
     GtkWidget *main_notebook;
     GHashTable *windows;
+    GHashTable *displays;
     GHashTable *initial_display_map;
     gchar *clipboard;
 
@@ -934,8 +935,14 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED,
     VirtViewerAppPrivate *priv = self->priv;
     VirtViewerWindow *window;
     gint nth;
+    gpointer key = NULL;
 
     g_object_get(display, "nth-display", &nth, NULL);
+
+    key = GINT_TO_POINTER(nth);
+    g_debug("Insert display %d %p", nth, display);
+    g_hash_table_insert(self->priv->displays, key, g_object_ref(display));
+
     window = virt_viewer_app_get_nth_window(self, nth);
     if (window == NULL) {
         if (priv->kiosk) {
@@ -965,6 +972,7 @@ virt_viewer_app_display_removed(VirtViewerSession *session G_GNUC_UNUSED,
 
     gtk_widget_hide(GTK_WIDGET(display));
     g_object_get(display, "nth-display", &nth, NULL);
+    g_hash_table_remove(self->priv->displays, GINT_TO_POINTER(nth));
     win = virt_viewer_app_get_nth_window(self, nth);
     if (!win)
         return;
@@ -1636,6 +1644,15 @@ virt_viewer_app_dispose (GObject *object)
         g_hash_table_unref(tmp);
     }
 
+    if (priv->displays) {
+        GHashTable *tmp = priv->displays;
+        /* null-ify before unrefing, because we need
+         * to prevent callbacks using priv->displays
+         * while it is being disposed of. */
+        priv->displays = NULL;
+        g_hash_table_unref(tmp);
+    }
+
     g_clear_object(&priv->session);
     g_free(priv->title);
     priv->title = NULL;
@@ -1702,6 +1719,7 @@ virt_viewer_app_init (VirtViewerApp *self)
     virt_viewer_app_set_debug(opt_debug);
 
     self->priv = GET_PRIVATE(self);
+    self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref);
     self->priv->windows = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_object_unref);
     self->priv->config = g_key_file_new();
     self->priv->config_file = g_build_filename(g_get_user_config_dir(),
-- 
1.9.3




More information about the virt-tools-list mailing list