[Spice-devel] [PATCH spice-gtk v2 8/8] widget: modify update-area to not require primary surface

Pavel Grunt pgrunt at redhat.com
Wed Mar 23 19:38:59 UTC 2016


Hi,

as we discussed, I prefer this patch to go in after 9/8 to avoid some
incorrect resizes

On Tue, 2016-03-22 at 13:57 +0100, Marc-André Lureau wrote:
> If egl display is enabled, use GL scanout geometry to check
> intersection
> with the monitor area. This solves displaying GL display without
> software canvas.
What are the issues?

Pavel
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
> ---
>  src/spice-widget.c | 41 ++++++++++++++++++++++++++++-------------
>  1 file changed, 28 insertions(+), 13 deletions(-)
> 
> diff --git a/src/spice-widget.c b/src/spice-widget.c
> index e16126a..4b7e202 100644
> --- a/src/spice-widget.c
> +++ b/src/spice-widget.c
> @@ -2190,32 +2190,47 @@ static void update_area(SpiceDisplay
> *display,
>                          gint x, gint y, gint width, gint height)
>  {
>      SpiceDisplayPrivate *d = display->priv;
> -    GdkRectangle primary = {
> -        .x = 0,
> -        .y = 0,
> -        .width = d->width,
> -        .height = d->height
> -    };
> -    GdkRectangle area = {
> +    GdkRectangle primary;
> +
> +    SPICE_DEBUG("update area +%d+%d %dx%d", x, y, width, height);
> +    d->area = (GdkRectangle) {
>          .x = x,
>          .y = y,
>          .width = width,
>          .height = height
>      };
>  
> -    SPICE_DEBUG("update area, primary: %dx%d, area: +%d+%d %dx%d",
> d->width, d->height, area.x, area.y, area.width, area.height);
> +#ifndef G_OS_WIN32
> +    if (d->egl.enabled) {
> +        primary = (GdkRectangle) {
> +            .width = d->egl.scanout.width,
> +            .height = d->egl.scanout.height
> +        };
> +    } else
> +#endif
> +    {
> +        primary = (GdkRectangle) {
> +            .width = d->width,
> +            .height = d->height
> +        };
> +    }
>  
> -    if (!gdk_rectangle_intersect(&primary, &area, &area)) {
> +    SPICE_DEBUG("primary: %dx%d", primary.width, primary.height);
> +    if (!gdk_rectangle_intersect(&primary, &d->area, &d->area)) {
>          SPICE_DEBUG("The monitor area is not intersecting primary
> surface");
>          memset(&d->area, '\0', sizeof(d->area));
>          set_monitor_ready(display, false);
>          return;
>      }
>  
> -    spicex_image_destroy(display);
> -    d->area = area;
> -    if (gtk_widget_get_realized(GTK_WIDGET(display)))
> -        update_image(display);
> +#ifndef G_OS_WIN32
> +    if (!d->egl.enabled)
> +#endif
> +    {
> +        spicex_image_destroy(display);
> +        if (gtk_widget_get_realized(GTK_WIDGET(display)))
> +            update_image(display);
> +    }
>  
>      update_size_request(display);
>  


More information about the Spice-devel mailing list