mirror of
https://gitlab.uni-freiburg.de/opensourcevdi/virt-viewer
synced 2025-12-29 00:15:15 +00:00
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.
This commit is contained in:
parent
f05f30d7de
commit
c2eb85c712
@ -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,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user