[virt-tools-list] [PATCH virt-viewer] Remove 'map' handler for VirtViewerDisplay
Jonathon Jongsma
jjongsma at redhat.com
Fri Dec 12 23:05:39 UTC 2014
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.
---
NOTE: I've tested this on Fedora 20, RHEL 6, and Windows XP (built on Fedora
20). I've been attempting to test a windows build that was built on RHEL6 as
well (to ensure that the behavior is the same when bundled with e.g. RHEL6
versions of gtk2, etc), but I've not succeeded yet. It turns out that it's not
straightforward to make a windows build of git master on RHEL6. So that's a bit
of an open question yet...
src/virt-viewer-display.c | 22 +++-------------------
1 file changed, 3 insertions(+), 19 deletions(-)
diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c
index e6bc108..9c9c796 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;
@@ -423,13 +421,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 +449,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,
--
1.9.3
More information about the virt-tools-list
mailing list