spice: only autoresize once with screen size in fullscreen

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
This commit is contained in:
Marc-André Lureau 2012-10-18 00:44:36 +02:00
parent 435a542de2
commit 3bb6f5ec80
3 changed files with 38 additions and 2 deletions

View File

@ -1591,6 +1591,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)
{

View File

@ -95,6 +95,7 @@ void virt_viewer_app_show_display(VirtViewerApp *self);
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

View File

@ -38,6 +38,13 @@ G_DEFINE_TYPE (VirtViewerDisplaySpice, virt_viewer_display_spice, VIRT_VIEWER_TY
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(VirtViewerDisplaySpice *self,
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(VirtViewerDisplaySpice *self,
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(VirtViewerSessionSpice *session,
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);