[virt-tools-list] [virt-viewer RFC] Hide 'un-ready' displays after a short timeout
Marc-André Lureau
mlureau at redhat.com
Thu Nov 21 09:05:43 UTC 2013
Hi,
Tbh, I think the current behaviour is better than hiding and showing window with arbitrary timings.
I understand that #868970 is a bug, and there is no simple solution to it.
However, I wonder how useful and common is a "sparse" monitor configuration, and thus I'd minor #868970 severity and keep current behaviour.
----- Original Message -----
> When a user disables a display using the display configuration tools in the
> guest, the window simply turns black and displays a "Waiting for display
> N..."
> message. If the user then resizes one of the windows, it will re-enable this
> disabled window (rhbz#868970).
>
> There is not a good way to determine for certain whether the display is
> 'permanently' disabled or whether it's a transient situation (e.g. during
> display reconfigure, restarting the guest). This patch adds a workaround that
> sets up a timeout to hide and formally disable the display after a short
> timeout
> (currently 5 seconds).
>
> In practice, this does significantly reduce the impact of rhbz#868970 (though
> it's not a proper solution -- that would require significantly more invasive
> changes, including a new agent capability). Unfortunately, this patch has a
> slightly negative impact on the user experience of rebooting a guest. For
> Windows guests, the impact is minor; for linux guests it's slightly larger:
>
> When rebooting a linux guest with 2 displays, the non-primary display will
> become 'un-ready' during shutdown, and the window will be hidden after 5
> seconds. From the guest's point-of-view, this is like disconnecting the
> physical
> monitor, so upon restart there will only be a single display.
>
> When rebooting a Windows guest with 2 displays, the non-primary display will
> also be hidden during shutdown. But multiple monitors work differently in
> windows guests than linux guests (e.g. multiple QXL devices vs multiple
> displays
> per QXL device). Because of this, from the guest's point-of-view, there are
> still 2 physical monitors attached. So after reboot, the second display will
> be
> re-enabled and virt-viewer will show the second display.
> ---
>
> There are some drawbacks to this workaround, so I'd appreciate some comments
> on
> the general approach in addition to reviewing the code itself.
>
> src/virt-viewer-window.c | 27 +++++++++++++++++++++++++++
> 1 file changed, 27 insertions(+)
>
> diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
> index af4d0bc..0ad6766 100644
> --- a/src/virt-viewer-window.c
> +++ b/src/virt-viewer-window.c
> @@ -104,6 +104,7 @@ struct _VirtViewerWindowPrivate {
> gboolean auto_resize;
> gboolean fullscreen;
> gchar *subtitle;
> + guint source_delayed_hide;
> };
>
> static void
> @@ -1205,6 +1206,17 @@
> virt_viewer_window_set_usb_options_sensitive(VirtViewerWindow *self,
> gboolean se
> gtk_widget_set_visible(priv->toolbar_usb_device_selection, sensitive);
> }
>
> +static gboolean
> +delayed_hide_window(gpointer user_data)
> +{
> + VirtViewerWindow *self = VIRT_VIEWER_WINDOW(user_data);
> +
> + virt_viewer_window_hide(self);
> + self->priv->source_delayed_hide = 0;
> +
> + return FALSE;
> +}
> +
> static void
> display_show_hint(VirtViewerDisplay *display,
> GParamSpec *pspec G_GNUC_UNUSED,
> @@ -1219,6 +1231,21 @@ display_show_hint(VirtViewerDisplay *display,
> gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder,
> "menu-send")), hint);
> gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder,
> "menu-file-screenshot")), hint);
> gtk_widget_set_sensitive(self->priv->toolbar_send_key, hint);
> +
> + /* schedule the window to be hidden after a short timeout when it become
> + * 'un-ready', e.g. when a display is disabled via the guest's display
> + * configuration tools */
> + if (!hint) {
> + if (!self->priv->source_delayed_hide) {
> + self->priv->source_delayed_hide = g_timeout_add_seconds(5,
> delayed_hide_window, self);
> + }
> + } else {
> + if (self->priv->source_delayed_hide) {
> + g_source_remove(self->priv->source_delayed_hide);
> + self->priv->source_delayed_hide = 0;
> + }
> + }
> +
> }
> static gboolean
> window_key_pressed (GtkWidget *widget G_GNUC_UNUSED,
> --
> 1.8.3.1
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
>
More information about the virt-tools-list
mailing list