From c2eb85c712ba4267202468d8d226d181f0d6bb30 Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Fri, 12 Dec 2014 16:45:42 -0600 Subject: [PATCH] Remove 'map' handler for VirtViewerDisplay In order to solve several problems with sizing and resizing displays, a 'map' handler was added to VirtViewerDisplay. The first time the map handler runs, its queues a resize to attempt to ensure that the window gets created at its desired size. Subsequent map events generate a call to _make_resizable(), which was an attempt to ensure that the window was always 'shrinkable' on the Microsoft Windows platform. Recent testing suggests that this _make_resizable() is not actually necessary on Windows anymore, since it is possible to shrink the display even when this call is removed. In addition, the call to _queue_resize() is a bit of an indirect solution to the problem of ensuring the proper size at startup. What we really want is to guarantee that the very first size request negotiation returns the desired size rather than the minimum size. In order to do this, we've added a flag to determine whether we've ever received a size request, and if not, we return our desired size, even if 'dirty' is not set. --- src/virt-viewer-display.c | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-) diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c index e6bc108..66429f1 100644 --- a/src/virt-viewer-display.c +++ b/src/virt-viewer-display.c @@ -38,7 +38,7 @@ struct _VirtViewerDisplayPrivate { #if !GTK_CHECK_VERSION(3, 0, 0) gboolean dirty; - gboolean mapped_once; + gboolean size_request_once; #endif guint desktopWidth; guint desktopHeight; @@ -54,7 +54,6 @@ struct _VirtViewerDisplayPrivate #if !GTK_CHECK_VERSION(3, 0, 0) static void virt_viewer_display_size_request(GtkWidget *widget, GtkRequisition *requisition); -static void virt_viewer_display_map(GtkWidget *widget); #else static void virt_viewer_display_get_preferred_width(GtkWidget *widget, int *minwidth, @@ -106,7 +105,6 @@ virt_viewer_display_class_init(VirtViewerDisplayClass *class) widget_class->get_preferred_height = virt_viewer_display_get_preferred_height; #else widget_class->size_request = virt_viewer_display_size_request; - widget_class->map = virt_viewer_display_map; #endif widget_class->size_allocate = virt_viewer_display_size_allocate; widget_class->grab_focus = virt_viewer_display_grab_focus; @@ -282,6 +280,7 @@ virt_viewer_display_init(VirtViewerDisplay *display) display->priv->zoom = TRUE; #if !GTK_CHECK_VERSION(3, 0, 0) display->priv->dirty = TRUE; + display->priv->size_request_once = FALSE; #endif } @@ -423,13 +422,14 @@ virt_viewer_display_size_request(GtkWidget *widget, VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(widget); VirtViewerDisplayPrivate *priv = display->priv; - if (priv->dirty) { + if (priv->dirty || !priv->size_request_once) { virt_viewer_display_get_preferred_size(display, requisition); } else { requisition->width = 50; requisition->height = 50; } + priv->size_request_once = TRUE; g_debug("Display size request %dx%d (desktop %dx%d)", requisition->width, requisition->height, priv->desktopWidth, priv->desktopHeight); @@ -450,21 +450,6 @@ virt_viewer_display_make_resizable(VirtViewerDisplay *self) } } -static void -virt_viewer_display_map(GtkWidget *widget) -{ - VirtViewerDisplay* self = VIRT_VIEWER_DISPLAY(widget); - - GTK_WIDGET_CLASS(virt_viewer_display_parent_class)->map(widget); - - if (!self->priv->mapped_once) - virt_viewer_display_queue_resize(self); - else - virt_viewer_display_make_resizable(self); - - self->priv->mapped_once = TRUE; -} - #else static void virt_viewer_display_get_preferred_width(GtkWidget *widget,