When using the fullscreen display mapping configuration file, extra monitors could end up enabled by mistake. This was because virt_viewer_app_get_initial_monitor_for_display would end up returning Nmonitor = Ndisplay when the display map hash lookup failed. In reality, when a display map is specified, but the hash lookup fails, the display should not be enabled. This function now returns -1 to distinguish this case, and the display is not enabled when this value is returned. --- The implementation was apparently incomplete. This patch attempts to fix an issue that was found during testing: see https://bugzilla.redhat.com/show_bug.cgi?id=1129477#c9 src/virt-viewer-app.c | 22 ++++++++++++---------- src/virt-viewer-session-spice.c | 3 +++ 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c index a890bf6..12d01eb 100644 --- a/src/virt-viewer-app.c +++ b/src/virt-viewer-app.c @@ -314,8 +314,11 @@ gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint d if (self->priv->initial_display_map) { gpointer value = NULL; - if (g_hash_table_lookup_extended(self->priv->initial_display_map, GINT_TO_POINTER(display), NULL, &value)) + if (g_hash_table_lookup_extended(self->priv->initial_display_map, GINT_TO_POINTER(display), NULL, &value)) { monitor = GPOINTER_TO_INT(value); + } else { + monitor = -1; + } } return monitor; @@ -326,13 +329,14 @@ app_window_try_fullscreen(VirtViewerApp *self G_GNUC_UNUSED, VirtViewerWindow *win, gint nth) { GdkScreen *screen = gdk_screen_get_default(); - - if (nth >= gdk_screen_get_n_monitors(screen)) { - g_debug("skipping display %d", nth); + gint monitor = virt_viewer_app_get_initial_monitor_for_display(self, nth); + if (monitor == -1 || monitor >= gdk_screen_get_n_monitors(screen)) { + g_debug("skipping fullscreen for display %d", nth); + virt_viewer_window_hide(win); return; } - virt_viewer_window_enter_fullscreen(win, nth); + virt_viewer_window_enter_fullscreen(win, monitor); } @@ -449,8 +453,7 @@ void virt_viewer_app_set_uuid_string(VirtViewerApp *self, const gchar *uuid_stri g_hash_table_iter_init(&iter, self->priv->windows); while (g_hash_table_iter_next(&iter, NULL, &value)) { - gint monitor = virt_viewer_app_get_initial_monitor_for_display(self, i); - app_window_try_fullscreen(self, VIRT_VIEWER_WINDOW(value), monitor); + app_window_try_fullscreen(self, VIRT_VIEWER_WINDOW(value), i); i++; } } @@ -880,8 +883,7 @@ virt_viewer_app_window_new(VirtViewerApp *self, gint nth) virt_viewer_window_set_zoom_level(window, virt_viewer_window_get_zoom_level(self->priv->main_window)); virt_viewer_app_set_nth_window(self, nth, window); if (self->priv->fullscreen) - app_window_try_fullscreen(self, window, - virt_viewer_app_get_initial_monitor_for_display(self, nth)); + app_window_try_fullscreen(self, window, nth); w = virt_viewer_window_get_window(window); g_signal_connect(w, "hide", G_CALLBACK(viewer_window_visible_cb), self); @@ -2104,7 +2106,7 @@ static void fullscreen_cb(gpointer key, gpointer user_data) { FullscreenOptions *options = (FullscreenOptions *)user_data; - gint nth = virt_viewer_app_get_initial_monitor_for_display(options->app, *(gint*)key); + gint nth = *(gint*)key; VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(value); g_debug("fullscreen display %d: %d", nth, options->fullscreen); diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c index 2323832..b856e78 100644 --- a/src/virt-viewer-session-spice.c +++ b/src/virt-viewer-session-spice.c @@ -807,6 +807,9 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) for (i = 0; i < ndisplays; i++) { gint j = virt_viewer_app_get_initial_monitor_for_display(app, i); + if (j == -1) + continue; + gdk_screen_get_monitor_geometry(screen, j, &dest); g_debug("Set SPICE display %d to (%d,%d)-(%dx%d)", i, dest.x, dest.y, dest.width, dest.height); -- 1.9.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list