xwm: Fix xwm opaque region
Since surface.commit was introduced, opqaue regions are stored in a pending
variable that isn't used until surface.commit. Xwayland uses the surface opaque
region as a way to tell weston what region of the surface should be opaque.
However when this pending opaque region was introduced, xwm was not updated
and so we have the 'black = transparent' problem again. This patch fixes the
problem by having xwm use the pending opaque regions.
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index 57b4e3c..1b2c0da 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -745,15 +745,15 @@
cairo_destroy(cr);
if (window->surface) {
- pixman_region32_fini(&window->surface->opaque);
- pixman_region32_init_rect(&window->surface->opaque, 0, 0,
+ pixman_region32_fini(&window->surface->pending.opaque);
+ pixman_region32_init_rect(&window->surface->pending.opaque, 0, 0,
width, height);
/* We leave an extra pixel around the X window area to
* make sure we don't sample from the undefined alpha
* channel when filtering. */
- pixman_region32_intersect_rect(&window->surface->opaque,
- &window->surface->opaque,
+ pixman_region32_intersect_rect(&window->surface->pending.opaque,
+ &window->surface->pending.opaque,
x - 1, y - 1,
window->width + 2,
window->height + 2);
@@ -775,8 +775,8 @@
if (window->frame_id == XCB_WINDOW_NONE) {
if (window->surface != NULL) {
weston_wm_window_get_frame_size(window, &width, &height);
- pixman_region32_fini(&window->surface->opaque);
- pixman_region32_init_rect(&window->surface->opaque, 0, 0,
+ pixman_region32_fini(&window->surface->pending.opaque);
+ pixman_region32_init_rect(&window->surface->pending.opaque, 0, 0,
width, height);
window->surface->geometry.dirty = 1;
}