Hello community,

here is the log from the commit of package virt-viewer for openSUSE:Factory 
checked in at 2012-05-03 11:01:26
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/virt-viewer (Old)
 and      /work/SRC/openSUSE:Factory/.virt-viewer.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "virt-viewer", Maintainer is "[email protected]"

Changes:
--------
--- /work/SRC/openSUSE:Factory/virt-viewer/virt-viewer.changes  2012-03-29 
11:42:50.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.virt-viewer.new/virt-viewer.changes     
2012-05-03 11:01:28.000000000 +0200
@@ -1,0 +2,8 @@
+Tue Apr 24 10:54:33 MDT 2012 - [email protected]
+
+- Fix failure of viewer to close when guest is terminated 
+  virtview-git-vnc-close.patch
+- Additional upstream fix
+  virtview-git-uri-crash.patch
+
+-------------------------------------------------------------------

New:
----
  virtview-git-uri-crash.patch
  virtview-git-vnc-close.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ virt-viewer.spec ++++++
--- /var/tmp/diff_new_pack.Qrjwvg/_old  2012-05-03 11:01:29.000000000 +0200
+++ /var/tmp/diff_new_pack.Qrjwvg/_new  2012-05-03 11:01:29.000000000 +0200
@@ -25,6 +25,8 @@
 Url:            http://www.virt-manager.org
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 Source0:        virt-viewer-0.5.2.tar.gz
+Patch0:         virtview-git-uri-crash.patch
+Patch1:         virtview-git-vnc-close.patch
 Patch20:        netcat.diff
 Patch21:        windows-keycombo.patch
 Patch22:        netware-keycombo.patch
@@ -64,6 +66,8 @@
 
 %prep
 %setup -q
+%patch0 -p1
+%patch1 -p1
 %patch20 -p1
 %patch21 -p1
 %patch22 -p1

++++++ virtview-git-uri-crash.patch ++++++

Subject: Do not crash so easily when given invalid uri
From: Marc-AndrĂ© Lureau [email protected] Fri Mar 16 13:17:09 2012 
+0100
Date: Fri Mar 16 17:16:57 2012 +0100:
Git: e06c822023ac2f5d2b2dae50dd813f4a0d5e908b

'remote-viewer foobar' shouldn't crash

Index: virt-viewer-0.5.2/src/remote-viewer.c
===================================================================
--- virt-viewer-0.5.2.orig/src/remote-viewer.c
+++ virt-viewer-0.5.2/src/remote-viewer.c
@@ -728,7 +728,7 @@ remote_viewer_start(VirtViewerApp *app)
         DEBUG_LOG("Opening display to %s", guri);
         g_object_set(app, "title", guri, NULL);
 
-        if (virt_viewer_util_extract_host(guri, &type, NULL, NULL, NULL, NULL) 
< 0) {
+        if (virt_viewer_util_extract_host(guri, &type, NULL, NULL, NULL, NULL) 
< 0 || type == NULL) {
             virt_viewer_app_simple_message_dialog(app, _("Cannot determine the 
connection type from URI"));
             goto cleanup;
         }
Index: virt-viewer-0.5.2/src/virt-viewer-app.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-app.c
+++ virt-viewer-0.5.2/src/virt-viewer-app.c
@@ -669,6 +669,7 @@ virt_viewer_app_create_session(VirtViewe
     g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), -1);
     VirtViewerAppPrivate *priv = self->priv;
     g_return_val_if_fail(priv->session == NULL, -1);
+    g_return_val_if_fail(type != NULL, -1);
 
 #ifdef HAVE_GTK_VNC
     if (g_ascii_strcasecmp(type, "vnc") == 0) {
Index: virt-viewer-0.5.2/src/virt-viewer-util.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-util.c
+++ virt-viewer-0.5.2/src/virt-viewer-util.c
@@ -81,7 +81,7 @@ virt_viewer_util_extract_host(const char
                               int *port)
 {
     xmlURIPtr uri;
-    char *offset;
+    char *offset = NULL;
 
     if (uristr == NULL ||
         !g_ascii_strcasecmp(uristr, "xen"))
@@ -107,16 +107,17 @@ virt_viewer_util_extract_host(const char
     if (port)
         *port = uri->port;
 
-    offset = strchr(uri->scheme, '+');
+    if (uri->scheme)
+        offset = strchr(uri->scheme, '+');
 
     if (transport) {
         if (offset)
-            *transport = g_strdup(offset+1);
+            *transport = g_strdup(offset + 1);
         else
             *transport = NULL;
     }
 
-    if (scheme) {
+    if (scheme && uri->scheme) {
         if (offset)
             *scheme = g_strndup(uri->scheme, offset - uri->scheme);
         else
++++++ virtview-git-vnc-close.patch ++++++

Subject: Fix close of VNC displays
From: Daniel P. Berrange [email protected] Tue Apr 3 17:31:39 2012 +0100
Date: Wed Apr 4 10:41:32 2012 +0100:
Git: 831ebf5dabd23d11186af9707631c29a1ecb3578

When clicking the close button on a virt-viewer window with
a VNC session open, while the VNC session terminates, the
window does not go away.

The problem is that the virt_viewer_session_vnc_disconnected
method never gets invoked. The close button triggers a call
to virt_viewer_session_clear_displays which unrefs the
VirtViewerDisplayVnc instance. This in turn triggers a call
to gtk_container_destroy, which destroys all widgets it
contains, ie the VncDisplay * object.

With the VncDisplay object in its dispose phase, no signals
will ever be emitted, thus the 'vnc-disconnected' signal
never gets seen.

The design issue is that VirtViewerDisplayVnc is assuming
it owns the VncDisplay, whereas in fact the real owner is
the VirtViewerSessionVnc object.

The solution is to introduce a new virt_viewer_display_close
method which can be used to de-parent the widget before
VirtViewerDisplay is unref'd.

The VirtViewerSessionVnc object also needs to hold a full ref
on the VncDisplay object, not merely a floating reference

* virt-viewer-display-spice.c, virt-viewer-display.c,
  virt-viewer-display.h: Add virt_viewer_display_close
* virt-viewer-display-vnc.c: Deparent VNC widget in
  virt_viewer_display_close impl
* virt-viewer-session-vnc.c: Improve logging
* virt-viewer-session.c: Call virt_viewer_display_close
  before unrefing display
* virt-viewer-window.c: Improve logging

Signed-off-by: Daniel P. Berrange <[email protected]>

Index: virt-viewer-0.5.2/src/virt-viewer-display-spice.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-display-spice.c
+++ virt-viewer-0.5.2/src/virt-viewer-display-spice.c
@@ -46,6 +46,7 @@ static void virt_viewer_display_spice_se
                                                 int nkeyvals);
 static GdkPixbuf *virt_viewer_display_spice_get_pixbuf(VirtViewerDisplay 
*display);
 static void virt_viewer_display_spice_release_cursor(VirtViewerDisplay 
*display);
+static void virt_viewer_display_spice_close(VirtViewerDisplay *display 
G_GNUC_UNUSED);
 
 static void
 virt_viewer_display_spice_finalize(GObject *obj)
@@ -69,6 +70,7 @@ virt_viewer_display_spice_class_init(Vir
     dclass->send_keys = virt_viewer_display_spice_send_keys;
     dclass->get_pixbuf = virt_viewer_display_spice_get_pixbuf;
     dclass->release_cursor = virt_viewer_display_spice_release_cursor;
+    dclass->close = virt_viewer_display_spice_close;
 
     g_type_class_add_private(klass, sizeof(VirtViewerDisplaySpicePrivate));
 }
@@ -239,6 +241,12 @@ virt_viewer_display_spice_release_cursor
 }
 
 
+static void
+virt_viewer_display_spice_close(VirtViewerDisplay *display G_GNUC_UNUSED)
+{
+}
+
+
 /*
  * Local variables:
  *  c-indent-level: 4
Index: virt-viewer-0.5.2/src/virt-viewer-display-vnc.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-display-vnc.c
+++ virt-viewer-0.5.2/src/virt-viewer-display-vnc.c
@@ -39,6 +39,7 @@ struct _VirtViewerDisplayVncPrivate {
 
 static void virt_viewer_display_vnc_send_keys(VirtViewerDisplay* display, 
const guint *keyvals, int nkeyvals);
 static GdkPixbuf *virt_viewer_display_vnc_get_pixbuf(VirtViewerDisplay* 
display);
+static void virt_viewer_display_vnc_close(VirtViewerDisplay *display);
 
 static void
 virt_viewer_display_vnc_finalize(GObject *obj)
@@ -61,6 +62,7 @@ virt_viewer_display_vnc_class_init(VirtV
 
     dclass->send_keys = virt_viewer_display_vnc_send_keys;
     dclass->get_pixbuf = virt_viewer_display_vnc_get_pixbuf;
+    dclass->close = virt_viewer_display_vnc_close;
 
     g_type_class_add_private(klass, sizeof(VirtViewerDisplayVncPrivate));
 }
@@ -153,7 +155,6 @@ virt_viewer_display_vnc_new(VncDisplay *
     display = g_object_new(VIRT_VIEWER_TYPE_DISPLAY_VNC, NULL);
 
     g_object_ref(vnc);
-    g_object_ref(vnc); /* Because gtk_container_add steals the first ref */
     display->priv->vnc = vnc;
 
     gtk_container_add(GTK_CONTAINER(display), GTK_WIDGET(display->priv->vnc));
@@ -188,6 +189,19 @@ virt_viewer_display_vnc_new(VncDisplay *
     return GTK_WIDGET(display);
 }
 
+
+static void
+virt_viewer_display_vnc_close(VirtViewerDisplay *display)
+{
+    VirtViewerDisplayVnc *vnc = VIRT_VIEWER_DISPLAY_VNC(display);
+
+    /* We're not the real owner, so we shouldn't be letting the container
+     * destroy the widget. There are still signals that need to be
+     * propagated to the VirtViewerSession
+     */
+    gtk_container_remove(GTK_CONTAINER(display), GTK_WIDGET(vnc->priv->vnc));
+}
+
 /*
  * Local variables:
  *  c-indent-level: 4
Index: virt-viewer-0.5.2/src/virt-viewer-display.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-display.c
+++ virt-viewer-0.5.2/src/virt-viewer-display.c
@@ -579,6 +579,19 @@ void virt_viewer_display_release_cursor(
     klass->release_cursor(self);
 }
 
+
+void virt_viewer_display_close(VirtViewerDisplay *self)
+{
+    VirtViewerDisplayClass *klass;
+
+    g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self));
+
+    klass = VIRT_VIEWER_DISPLAY_GET_CLASS(self);
+    g_return_if_fail(klass->close != NULL);
+
+    klass->close(self);
+}
+
 /*
  * Local variables:
  *  c-indent-level: 4
Index: virt-viewer-0.5.2/src/virt-viewer-display.h
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-display.h
+++ virt-viewer-0.5.2/src/virt-viewer-display.h
@@ -75,6 +75,8 @@ struct _VirtViewerDisplayClass {
     GdkPixbuf *(*get_pixbuf)(VirtViewerDisplay *display);
     void (*release_cursor)(VirtViewerDisplay *display);
 
+    void (*close)(VirtViewerDisplay *display);
+
     /* signals */
     void (*display_pointer_grab)(VirtViewerDisplay *display);
     void (*display_pointer_ungrab)(VirtViewerDisplay *display);
@@ -112,6 +114,8 @@ void virt_viewer_display_set_auto_resize
 gboolean virt_viewer_display_get_auto_resize(VirtViewerDisplay *display);
 void virt_viewer_display_release_cursor(VirtViewerDisplay *display);
 
+void virt_viewer_display_close(VirtViewerDisplay *display);
+
 G_END_DECLS
 
 #endif /* _VIRT_VIEWER_DISPLAY_H */
Index: virt-viewer-0.5.2/src/virt-viewer-session-vnc.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-session-vnc.c
+++ virt-viewer-0.5.2/src/virt-viewer-session-vnc.c
@@ -104,6 +104,7 @@ static void
 virt_viewer_session_vnc_disconnected(VncDisplay *vnc G_GNUC_UNUSED,
                                      VirtViewerSessionVnc *session)
 {
+    DEBUG_LOG("Disconnected");
     g_signal_emit_by_name(session, "session-disconnected");
     /* TODO perhaps? */
     /* 
virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(session->priv->vnc), */
@@ -234,6 +235,7 @@ virt_viewer_session_vnc_close(VirtViewer
 
     g_return_if_fail(self != NULL);
 
+    DEBUG_LOG("close vnc=%p", self->priv->vnc);
     if (self->priv->vnc != NULL) {
         virt_viewer_session_clear_displays(session);
         vnc_display_close(self->priv->vnc);
@@ -241,6 +243,7 @@ virt_viewer_session_vnc_close(VirtViewer
     }
 
     self->priv->vnc = VNC_DISPLAY(vnc_display_new());
+    g_object_ref_sink(self->priv->vnc);
 
     g_signal_connect(self->priv->vnc, "vnc-connected",
                      G_CALLBACK(virt_viewer_session_vnc_connected), session);
@@ -271,6 +274,7 @@ virt_viewer_session_vnc_new(GtkWindow *m
     session = g_object_new(VIRT_VIEWER_TYPE_SESSION_VNC, NULL);
 
     session->priv->vnc = VNC_DISPLAY(vnc_display_new());
+    g_object_ref_sink(session->priv->vnc);
     session->priv->main_window = g_object_ref(main_window);
 
     g_signal_connect(session->priv->vnc, "vnc-connected",
Index: virt-viewer-0.5.2/src/virt-viewer-session.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-session.c
+++ virt-viewer-0.5.2/src/virt-viewer-session.c
@@ -280,8 +280,10 @@ void virt_viewer_session_clear_displays(
     GList *tmp = session->priv->displays;
 
     while (tmp) {
-        g_signal_emit_by_name(session, "session-display-removed", tmp->data);
-        g_object_unref(tmp->data);
+        VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(tmp->data);
+        g_signal_emit_by_name(session, "session-display-removed", display);
+        virt_viewer_display_close(display);
+        g_object_unref(display);
         tmp = tmp->next;
     }
     g_list_free(session->priv->displays);
Index: virt-viewer-0.5.2/src/virt-viewer-window.c
===================================================================
--- virt-viewer-0.5.2.orig/src/virt-viewer-window.c
+++ virt-viewer-0.5.2/src/virt-viewer-window.c
@@ -670,6 +670,7 @@ virt_viewer_window_delete(GtkWidget *src
                           void *dummy G_GNUC_UNUSED,
                           VirtViewerWindow *self)
 {
+    DEBUG_LOG("Window closed");
     virt_viewer_app_window_set_visible(self->priv->app, self, FALSE);
     return TRUE;
 }
-- 
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to