xwayland: replace opaque_rect, fix an alpha problem

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.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
dev
Pekka Paalanen 12 years ago committed by Kristian Høgsberg
parent 8c9c8fcf6e
commit 4f9c07bf11
  1. 4
      src/compositor.c
  2. 1
      src/compositor.h
  3. 28
      src/xwayland/window-manager.c

@ -243,10 +243,6 @@ weston_surface_create(struct weston_compositor *compositor)
surface->compositor = compositor; surface->compositor = compositor;
surface->alpha = 1.0; 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->pitch = 1;
surface->num_textures = 0; surface->num_textures = 0;

@ -399,7 +399,6 @@ struct weston_surface {
struct wl_list layer_link; struct wl_list layer_link;
struct weston_shader *shader; struct weston_shader *shader;
GLfloat color[4]; GLfloat color[4];
GLfloat opaque_rect[4];
GLfloat alpha; GLfloat alpha;
struct weston_plane *plane; struct weston_plane *plane;

@ -717,17 +717,19 @@ 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_init_rect(&window->surface->opaque, 0, 0,
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. */
window->surface->opaque_rect[0] = pixman_region32_intersect_rect(&window->surface->opaque,
(double) (x - 1) / width; &window->surface->opaque,
window->surface->opaque_rect[1] = x - 1, y - 1,
(double) (x + window->width + 1) / width; window->width + 2,
window->surface->opaque_rect[2] = window->height + 2);
(double) (y - 1) / height; window->surface->geometry.dirty = 1;
window->surface->opaque_rect[3] =
(double) (y + window->height + 1) / height;
pixman_region32_init_rect(&window->surface->input, pixman_region32_init_rect(&window->surface->input,
t->margin, t->margin, t->margin, t->margin,
@ -740,13 +742,15 @@ static void
weston_wm_window_schedule_repaint(struct weston_wm_window *window) weston_wm_window_schedule_repaint(struct weston_wm_window *window)
{ {
struct weston_wm *wm = window->wm; struct weston_wm *wm = window->wm;
int width, height;
if (window->frame_id == XCB_WINDOW_NONE) { if (window->frame_id == XCB_WINDOW_NONE) {
if (window->surface != NULL) { if (window->surface != NULL) {
window->surface->opaque_rect[0] = 0.0; weston_wm_window_get_frame_size(window, &width, &height);
window->surface->opaque_rect[1] = 1.0; pixman_region32_fini(&window->surface->opaque);
window->surface->opaque_rect[2] = 0.0; pixman_region32_init_rect(&window->surface->opaque, 0, 0,
window->surface->opaque_rect[3] = 1.0; width, height);
window->surface->geometry.dirty = 1;
} }
return; return;
} }

Loading…
Cancel
Save