File virtview-git-spice-resize-window.patch of Package virt-viewer

Subject: spice: only autoresize once with screen size in fullscreen
From: Marc-André Lureau marcandre.lureau@gmail.com Thu Oct 18 00:44:36 2012 +0200
Date: Thu Oct 18 00:44:36 2012 +0200:
Git: 3bb6f5ec805ecfe78eba6d4d98e3ffcab195273a

It's currently not possible to configure guest with higher resolution
than native, as it will switch back to native, since the gtk widget
allocation will always end up being the size of the screen. We
special-case fullscreen mode, and only resize when entering
fullscreen. Furthermore, it avoids sending extra unnecessary resize
events to the guest whenever gtk+ call size allocate in various
stages, with different values.

https://bugzilla.redhat.com/show_bug.cgi?id=864929

Index: virt-viewer-0.5.4/src/virt-viewer-app.c
===================================================================
--- virt-viewer-0.5.4.orig/src/virt-viewer-app.c
+++ virt-viewer-0.5.4/src/virt-viewer-app.c
@@ -1576,6 +1576,14 @@ static void fullscreen_cb(gpointer key,
         virt_viewer_window_leave_fullscreen(vwin);
 }
 
+gboolean
+virt_viewer_app_get_fullscreen(VirtViewerApp *self)
+{
+    g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE);
+
+    return self->priv->fullscreen;
+}
+
 static void
 virt_viewer_app_set_fullscreen(VirtViewerApp *self, gboolean fullscreen)
 {
Index: virt-viewer-0.5.4/src/virt-viewer-app.h
===================================================================
--- virt-viewer-0.5.4.orig/src/virt-viewer-app.h
+++ virt-viewer-0.5.4/src/virt-viewer-app.h
@@ -93,6 +93,7 @@ void virt_viewer_app_show_display(VirtVi
 GHashTable* virt_viewer_app_get_windows(VirtViewerApp *self);
 gboolean virt_viewer_app_get_enable_accel(VirtViewerApp *self);
 VirtViewerSession* virt_viewer_app_get_session(VirtViewerApp *self);
+gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *app);
 
 G_END_DECLS
 
Index: virt-viewer-0.5.4/src/virt-viewer-display-spice.c
===================================================================
--- virt-viewer-0.5.4.orig/src/virt-viewer-display-spice.c
+++ virt-viewer-0.5.4/src/virt-viewer-display-spice.c
@@ -38,6 +38,13 @@ G_DEFINE_TYPE (VirtViewerDisplaySpice, v
 struct _VirtViewerDisplaySpicePrivate {
     SpiceChannel *channel; /* weak reference */
     SpiceDisplay *display;
+    int auto_resize;
+};
+
+enum {
+    AUTO_RESIZE_ALWAYS,
+    AUTO_RESIZE_FULLSCREEN,
+    AUTO_RESIZE_NEVER,
 };
 
 #define VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_DISPLAY_SPICE, VirtViewerDisplaySpicePrivate))
@@ -189,6 +196,12 @@ virt_viewer_display_spice_size_allocate(
     if (virt_viewer_display_get_show_hint(VIRT_VIEWER_DISPLAY(self)) & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED)
         return;
 
+    if (self->priv->auto_resize == AUTO_RESIZE_FULLSCREEN) {
+        GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(self));
+        dw = gdk_screen_get_width(screen);
+        dh = gdk_screen_get_height(screen);
+    }
+
     if (virt_viewer_display_get_zoom(VIRT_VIEWER_DISPLAY(self))) {
         zoom = virt_viewer_display_get_zoom_level(VIRT_VIEWER_DISPLAY(self));
 
@@ -198,8 +211,11 @@ virt_viewer_display_spice_size_allocate(
 
     g_object_get(self, "nth-display", &nth, NULL);
 
-    spice_main_set_display(get_main(VIRT_VIEWER_DISPLAY(self)),
-                           nth, 0, 0, dw, dh);
+    if (self->priv->auto_resize != AUTO_RESIZE_NEVER)
+        spice_main_set_display(get_main(VIRT_VIEWER_DISPLAY(self)),
+                               nth, 0, 0, dw, dh);
+    if (self->priv->auto_resize == AUTO_RESIZE_FULLSCREEN)
+        self->priv->auto_resize = AUTO_RESIZE_NEVER;
 }
 
 static void
@@ -216,6 +232,15 @@ enable_accel_changed(VirtViewerApp *app,
     }
 }
 
+static void
+fullscreen_changed(VirtViewerApp *app,
+                   GParamSpec *pspec G_GNUC_UNUSED,
+                   VirtViewerDisplaySpice *self)
+{
+    self->priv->auto_resize = virt_viewer_app_get_fullscreen(app) ?
+        AUTO_RESIZE_FULLSCREEN : AUTO_RESIZE_ALWAYS;
+}
+
 GtkWidget *
 virt_viewer_display_spice_new(VirtViewerSessionSpice *session,
                               SpiceChannel *channel,
@@ -268,6 +293,8 @@ virt_viewer_display_spice_new(VirtViewer
     app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(session));
     virt_viewer_signal_connect_object(app, "notify::enable-accel",
                                       G_CALLBACK(enable_accel_changed), self, 0);
+    virt_viewer_signal_connect_object(app, "notify::fullscreen",
+                                      G_CALLBACK(fullscreen_changed), self, 0);
     enable_accel_changed(app, NULL, self);
 
     return GTK_WIDGET(self);
openSUSE Build Service is sponsored by