xwm: Fix xwm opaque region
authorScott Moreau <oreaus@gmail.com>
Thu, 22 Nov 2012 22:35:13 +0000 (15:35 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 27 Nov 2012 22:27:58 +0000 (17:27 -0500)
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.

src/xwayland/window-manager.c

index 57b4e3c..1b2c0da 100644 (file)
@@ -745,15 +745,15 @@ weston_wm_window_draw_decoration(void *data)
        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 @@ weston_wm_window_schedule_repaint(struct weston_wm_window *window)
        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;
                }