On Mon, Sep 03, 2012 at 04:48:41PM +0300, Pekka Paalanen wrote: > Remove weston_surface::opaque_rect completely. > > Instead, set the opaque region in xwayland. > > Before this patch, black text in xterm was transparent. Now it is not. > > However, this patch fixes only a part of the alpha problem. If you apply > full-surface alpha with super+alt+wheel, the problem reappears. This > problem is still due to bad alpha channel contents on xwayland windows.
Very nice, that's a better solution. Series applied. Kristian > Signed-off-by: Pekka Paalanen <ppaala...@gmail.com> > --- > src/compositor.c | 4 ---- > src/compositor.h | 1 - > src/xwayland/window-manager.c | 28 ++++++++++++++++------------ > 3 files changed, 16 insertions(+), 17 deletions(-) > > diff --git a/src/compositor.c b/src/compositor.c > index 9ce44d4..5e9a0c2 100644 > --- a/src/compositor.c > +++ b/src/compositor.c > @@ -243,10 +243,6 @@ weston_surface_create(struct weston_compositor > *compositor) > > surface->compositor = compositor; > surface->alpha = 1.0; > - surface->opaque_rect[0] = 0.0; > - surface->opaque_rect[1] = 0.0; > - surface->opaque_rect[2] = 0.0; > - surface->opaque_rect[3] = 0.0; > surface->pitch = 1; > > surface->num_textures = 0; > diff --git a/src/compositor.h b/src/compositor.h > index 96a0477..38c2657 100644 > --- a/src/compositor.h > +++ b/src/compositor.h > @@ -399,7 +399,6 @@ struct weston_surface { > struct wl_list layer_link; > struct weston_shader *shader; > GLfloat color[4]; > - GLfloat opaque_rect[4]; > GLfloat alpha; > struct weston_plane *plane; > > diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c > index e705fec..65eb11a 100644 > --- a/src/xwayland/window-manager.c > +++ b/src/xwayland/window-manager.c > @@ -717,17 +717,19 @@ 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, > + 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. */ > - window->surface->opaque_rect[0] = > - (double) (x - 1) / width; > - window->surface->opaque_rect[1] = > - (double) (x + window->width + 1) / width; > - window->surface->opaque_rect[2] = > - (double) (y - 1) / height; > - window->surface->opaque_rect[3] = > - (double) (y + window->height + 1) / height; > + pixman_region32_intersect_rect(&window->surface->opaque, > + &window->surface->opaque, > + x - 1, y - 1, > + window->width + 2, > + window->height + 2); > + window->surface->geometry.dirty = 1; > > pixman_region32_init_rect(&window->surface->input, > t->margin, t->margin, > @@ -740,13 +742,15 @@ static void > weston_wm_window_schedule_repaint(struct weston_wm_window *window) > { > struct weston_wm *wm = window->wm; > + int width, height; > > if (window->frame_id == XCB_WINDOW_NONE) { > if (window->surface != NULL) { > - window->surface->opaque_rect[0] = 0.0; > - window->surface->opaque_rect[1] = 1.0; > - window->surface->opaque_rect[2] = 0.0; > - window->surface->opaque_rect[3] = 1.0; > + weston_wm_window_get_frame_size(window, &width, > &height); > + pixman_region32_fini(&window->surface->opaque); > + pixman_region32_init_rect(&window->surface->opaque, 0, > 0, > + width, height); > + window->surface->geometry.dirty = 1; > } > return; > } > -- > 1.7.8.6 > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel