[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