diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2016-03-21 18:50:36 +0100 |
---|---|---|
committer | Marc-André Lureau <marcandre.lureau@gmail.com> | 2016-03-24 16:55:58 +0100 |
commit | c075c54729bf168efd916fdcbca55a77458209e1 (patch) | |
tree | e90019bdf7afea0aed37daa8f14c2d3d6f3066bb | |
parent | ec6bfc00f81afddbdcc0fac86d7039385d89c6b6 (diff) |
widget: modify update-area to not require primary surface
If egl display is enabled, use GL scanout geometry to check intersection
with the monitor area. This solves displaying GL display without
software canvas (currently d->area is empty and gl drawing fails)
Signed-off-by: Marc-André Lureau <marcandre.lureau@gmail.com>
Acked-by: Pavel Grunt <pgrunt@redhat.com>
-rw-r--r-- | src/spice-widget.c | 41 |
1 files changed, 28 insertions, 13 deletions
diff --git a/src/spice-widget.c b/src/spice-widget.c index fdac085..21b1c14 100644 --- a/src/spice-widget.c +++ b/src/spice-widget.c @@ -2188,32 +2188,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); |