[virt-tools-list] [PATCH virt-viewer v3 3/3] Monitor config at sometimes leaves additional monitors enabled
Christophe Fergeau
cfergeau at redhat.com
Mon Mar 23 15:31:18 UTC 2015
On Mon, Mar 23, 2015 at 10:20:34AM -0500, Jonathon Jongsma wrote:
> When using the configuration file to specify which remote monitors should be
> enabled when using the --full-screen option, it sometimes left additional
> displays enabled, or didn't place the displays on the right monitor, or didn't
> fullscreen them.
>
> This was especially true when not enabling the first display on the remote
> host. For example:
>
> monitor-mapping=2:2;3:3
>
> (note that configuration file uses 1-based indexes, rather than 0-based
> indexes, so the numbers used below will be 1 less than those above)
>
> Previously, when performing fullscreen auto-conf, we were configuring displays
> starting at #0 and ending at ndisplays. So for the previous configuration, we
> looped from i = 0 to i < 2 (i.e. display #0 and #1) even though we should have
> configured display #1 and #2. After this fix, we configure the exact displays
> that were specified in the monitor-mapping configuration.
>
> Resolves: rhbz#1200750
> ---
> src/virt-viewer-app.c | 26 ++++++++++++++++----------
> src/virt-viewer-app.h | 2 +-
> src/virt-viewer-session-spice.c | 13 ++++++++-----
> 3 files changed, 25 insertions(+), 16 deletions(-)
>
> diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
> index c2a8284..86c0248 100644
> --- a/src/virt-viewer-app.c
> +++ b/src/virt-viewer-app.c
> @@ -301,12 +301,19 @@ virt_viewer_app_quit(VirtViewerApp *self)
> gtk_main_quit();
> }
>
> -gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self)
> +GList* virt_viewer_app_get_initial_displays(VirtViewerApp* self)
> {
> - if (self->priv->initial_display_map)
> - return g_hash_table_size(self->priv->initial_display_map);
> + if (!self->priv->initial_display_map) {
> + GList *l = NULL;
> + gint i;
> + gint n = gdk_screen_get_n_monitors(gdk_screen_get_default());
>
> - return gdk_screen_get_n_monitors(gdk_screen_get_default());
> + for (i = 0; i < n; i++) {
> + l = g_list_append(l, GINT_TO_POINTER(i));
> + }
> + return l;
> + }
> + return g_hash_table_get_keys(self->priv->initial_display_map);
> }
>
> static gint virt_viewer_app_get_first_monitor(VirtViewerApp *self)
> @@ -1727,14 +1734,16 @@ title_maybe_changed(VirtViewerApp *self, GParamSpec* pspec G_GNUC_UNUSED, gpoint
> }
>
> static void
> -virt_viewer_app_init (VirtViewerApp *self)
> +virt_viewer_app_init(VirtViewerApp *self)
> {
> GError *error = NULL;
> + self->priv = GET_PRIVATE(self);
>
> gtk_window_set_default_icon_name("virt-viewer");
> virt_viewer_app_set_debug(opt_debug);
> + virt_viewer_app_set_fullscreen(self, opt_fullscreen);
> + virt_viewer_app_set_hotkeys(self, opt_hotkeys);
>
> - self->priv = GET_PRIVATE(self);
> self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref);
> self->priv->config = g_key_file_new();
> self->priv->config_file = g_build_filename(g_get_user_config_dir(),
> @@ -1823,6 +1832,7 @@ virt_viewer_app_constructed(GObject *object)
> virt_viewer_app_get_first_monitor(self));
> self->priv->main_notebook = GTK_WIDGET(virt_viewer_window_get_notebook(self->priv->main_window));
>
> + virt_viewer_app_set_kiosk(self, opt_kiosk);
Is it really worth moving this one as there are no other
virt_viewer_app_* call anyway?
Christophe
> virt_viewer_window_set_zoom_level(self->priv->main_window, opt_zoom);
>
> virt_viewer_set_insert_smartcard_accel(self, GDK_F8, GDK_SHIFT_MASK);
> @@ -1833,10 +1843,6 @@ virt_viewer_app_constructed(GObject *object)
> gtk_accel_map_add_entry("<virt-viewer>/view/zoom-out", GDK_minus, GDK_CONTROL_MASK);
> gtk_accel_map_add_entry("<virt-viewer>/view/zoom-in", GDK_plus, GDK_CONTROL_MASK);
> gtk_accel_map_add_entry("<virt-viewer>/send/secure-attention", GDK_End, GDK_CONTROL_MASK | GDK_MOD1_MASK);
> -
> - virt_viewer_app_set_fullscreen(self, opt_fullscreen);
> - virt_viewer_app_set_hotkeys(self, opt_hotkeys);
> - virt_viewer_app_set_kiosk(self, opt_kiosk);
> }
>
> static void
> diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h
> index d214279..c6449be 100644
> --- a/src/virt-viewer-app.h
> +++ b/src/virt-viewer-app.h
> @@ -97,7 +97,7 @@ VirtViewerSession* virt_viewer_app_get_session(VirtViewerApp *self);
> gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *app);
> GOptionGroup* virt_viewer_app_get_option_group(void);
> void virt_viewer_app_clear_hotkeys(VirtViewerApp *app);
> -gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self);
> +GList* virt_viewer_app_get_initial_displays(VirtViewerApp* self);
> gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display);
> void virt_viewer_app_set_enable_accel(VirtViewerApp *app, gboolean enable);
> void virt_viewer_app_show_preferences(VirtViewerApp *app, GtkWidget *parent);
> diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c
> index 5eb7234..4fdab2b 100644
> --- a/src/virt-viewer-session-spice.c
> +++ b/src/virt-viewer-session-spice.c
> @@ -824,7 +824,8 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
> GdkRectangle *displays;
> gboolean agent_connected;
> gint i;
> - gsize ndisplays = 0;
> + GList *initial_displays, *l;
> + guint ndisplays;
>
> /* only do auto-conf once at startup. Avoid repeating auto-conf later due to
> * agent disconnection/re-connection, etc */
> @@ -854,18 +855,20 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self)
>
> spice_main_set_display_enabled(cmain, -1, FALSE);
>
> - ndisplays = virt_viewer_app_get_n_initial_displays(app);
> - g_debug("Performing full screen auto-conf, %" G_GSIZE_FORMAT " host monitors", ndisplays);
> + initial_displays = virt_viewer_app_get_initial_displays(app);
> + ndisplays = g_list_length(initial_displays);
> + g_debug("Performing full screen auto-conf, %u host monitors", ndisplays);
> displays = g_new0(GdkRectangle, ndisplays);
>
> - for (i = 0; i < ndisplays; i++) {
> + for (i = 0, l = initial_displays; l != NULL; l = l->next, i++) {
> GdkRectangle* rect = &displays[i];
> - gint j = virt_viewer_app_get_initial_monitor_for_display(app, i);
> + gint j = virt_viewer_app_get_initial_monitor_for_display(app, GPOINTER_TO_INT(l->data));
> if (j == -1)
> continue;
>
> gdk_screen_get_monitor_geometry(screen, j, rect);
> }
> + g_list_free(initial_displays);
>
> virt_viewer_shift_monitors_to_origin(displays, ndisplays);
>
> --
> 2.1.0
>
> _______________________________________________
> virt-tools-list mailing list
> virt-tools-list at redhat.com
> https://www.redhat.com/mailman/listinfo/virt-tools-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/virt-tools-list/attachments/20150323/bdb176fd/attachment.sig>
More information about the virt-tools-list
mailing list