On Mon, 2015-05-04 at 17:20 +0200, Pavel Grunt wrote: > When running in fullscreen it is possible to end up in a situation > where we have more displays enabled than monitors. This can happen > if displays that were enabled in the previous connection to the guest > doesn't match displays requested when entering the fullscreen mode. > > This commit solves the problem by disabling displays that should not > enabled in the fullscreen mode. > > Resolves: rhbz#1212802 > --- > v1: https://www.redhat.com/archives/virt-tools-list/2015-April/msg00184.html > v2: - nth is not used to determine which display should be enabled, > but the list of fullscreen displays is used > - the extra display is disabled instead of being ignored > v3: - added missing check for self->priv->did_auto_conf to fix hidden display > when --reconnect > v4: - due to PATCH 2/3 it is possible to use virt_viewer_app_get_initial_displays() > to get fullscreen mode displays > --- > src/virt-viewer-session-spice.c | 24 ++++++++++++++++++++++++ > 1 file changed, 24 insertions(+) > > diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c > index c1333dd..fa1fd1f 100644 > --- a/src/virt-viewer-session-spice.c > +++ b/src/virt-viewer-session-spice.c > @@ -693,6 +693,16 @@ destroy_display(gpointer data) > g_object_unref(display); > } > > +static gboolean > +display_is_in_fullscreen_mode(VirtViewerSessionSpice *self, > + VirtViewerDisplay *display) > +{ > + gconstpointer nth = GINT_TO_POINTER(virt_viewer_display_get_nth(display)); > + VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)); > + > + return g_list_index(virt_viewer_app_get_initial_displays(app), nth) != -1; > +} > + virt_ivewer_app_get_initial_displays() returns a newly-allocated list, which will be leaked here. Perhaps you could simply call get_initial_montor_for_display() and check whether it's != -1. > static void > virt_viewer_session_spice_display_monitors(SpiceChannel *channel, > GParamSpec *pspec G_GNUC_UNUSED, > @@ -702,6 +712,8 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, > GPtrArray *displays = NULL; > GtkWidget *display; > guint i, monitors_max; > + gboolean fullscreen_mode = > + virt_viewer_app_get_fullscreen(virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self))); > > g_object_get(channel, > "monitors", &monitors, > @@ -739,6 +751,18 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, > if (monitor->width == 0 || monitor->height == 0) > continue; > > + if (fullscreen_mode && > + self->priv->did_auto_conf && > + !display_is_in_fullscreen_mode(self, VIRT_VIEWER_DISPLAY(display))) { > + g_debug("display %d should not be enabled, disabling", > + virt_viewer_display_get_nth(VIRT_VIEWER_DISPLAY(display))); > + spice_main_set_display_enabled(virt_viewer_session_spice_get_main_channel(self), > + virt_viewer_display_get_nth(VIRT_VIEWER_DISPLAY(display)), > + FALSE); > + virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), FALSE); > + continue; > + } > + > virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), TRUE); > virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display), > monitor->x, monitor->y, _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list