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.
This commit is contained in:
committed by
Kristian Høgsberg
parent
a4eda73607
commit
76d8fc8216
@@ -745,15 +745,15 @@ weston_wm_window_draw_decoration(void *data)
|
|||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
|
|
||||||
if (window->surface) {
|
if (window->surface) {
|
||||||
pixman_region32_fini(&window->surface->opaque);
|
pixman_region32_fini(&window->surface->pending.opaque);
|
||||||
pixman_region32_init_rect(&window->surface->opaque, 0, 0,
|
pixman_region32_init_rect(&window->surface->pending.opaque, 0, 0,
|
||||||
width, height);
|
width, height);
|
||||||
|
|
||||||
/* We leave an extra pixel around the X window area to
|
/* We leave an extra pixel around the X window area to
|
||||||
* make sure we don't sample from the undefined alpha
|
* make sure we don't sample from the undefined alpha
|
||||||
* channel when filtering. */
|
* channel when filtering. */
|
||||||
pixman_region32_intersect_rect(&window->surface->opaque,
|
pixman_region32_intersect_rect(&window->surface->pending.opaque,
|
||||||
&window->surface->opaque,
|
&window->surface->pending.opaque,
|
||||||
x - 1, y - 1,
|
x - 1, y - 1,
|
||||||
window->width + 2,
|
window->width + 2,
|
||||||
window->height + 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->frame_id == XCB_WINDOW_NONE) {
|
||||||
if (window->surface != NULL) {
|
if (window->surface != NULL) {
|
||||||
weston_wm_window_get_frame_size(window, &width, &height);
|
weston_wm_window_get_frame_size(window, &width, &height);
|
||||||
pixman_region32_fini(&window->surface->opaque);
|
pixman_region32_fini(&window->surface->pending.opaque);
|
||||||
pixman_region32_init_rect(&window->surface->opaque, 0, 0,
|
pixman_region32_init_rect(&window->surface->pending.opaque, 0, 0,
|
||||||
width, height);
|
width, height);
|
||||||
window->surface->geometry.dirty = 1;
|
window->surface->geometry.dirty = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user