From 362e92da7e285b61990221db179f5aca4c8d10e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Thu, 14 Apr 2016 20:18:16 +0300 Subject: compositor: use window mask --- src/compositor/compositor-xrender.c | 56 +++++++++++++++++++++++++++---------- src/ui/frames.c | 2 +- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c index 8f325146..18954371 100644 --- a/src/compositor/compositor-xrender.c +++ b/src/compositor/compositor-xrender.c @@ -1534,17 +1534,24 @@ paint_windows (MetaScreen *screen, if (cw->mode == WINDOW_SOLID) { int x, y, wid, hei; + MetaFrame *frame; + MetaFrameBorders borders; x = cw->attrs.x; y = cw->attrs.y; wid = cw->attrs.width + cw->attrs.border_width * 2; hei = cw->attrs.height + cw->attrs.border_width * 2; + frame = cw->window ? meta_window_get_frame (cw->window) : NULL; + meta_frame_calc_borders (frame, &borders); + XFixesSetPictureClipRegion (xdisplay, root_buffer, 0, 0, paint_region); - XRenderComposite (xdisplay, PictOpSrc, cw->picture, - None, root_buffer, 0, 0, 0, 0, - x, y, wid, hei); + XRenderComposite (xdisplay, PictOpSrc, cw->picture, None, root_buffer, + borders.total.left, borders.total.top, 0, 0, + x + borders.total.left, y + borders.total.top, + wid - borders.total.left - borders.total.right, + hei - borders.total.top - borders.total.bottom); if (cw->type == META_COMP_WINDOW_DESKTOP) { @@ -1552,8 +1559,16 @@ paint_windows (MetaScreen *screen, XFixesCopyRegion (xdisplay, desktop_region, paint_region); } - XFixesSubtractRegion (xdisplay, paint_region, - paint_region, cw->frame_region); + if (frame == NULL) + { + XFixesSubtractRegion (xdisplay, paint_region, + paint_region, cw->frame_region); + } + else + { + XFixesSubtractRegion (xdisplay, paint_region, + paint_region, cw->client_region); + } } if (!cw->border_clip) @@ -1580,6 +1595,13 @@ paint_windows (MetaScreen *screen, if (cw->picture) { + int x, y, wid, hei; + + x = cw->attrs.x; + y = cw->attrs.y; + wid = cw->attrs.width + cw->attrs.border_width * 2; + hei = cw->attrs.height + cw->attrs.border_width * 2; + if (cw->shadow && cw->type != META_COMP_WINDOW_DOCK) { XserverRegion shadow_clip; @@ -1591,11 +1613,10 @@ paint_windows (MetaScreen *screen, shadow_clip); XRenderComposite (xdisplay, PictOpOver, info->black_picture, - cw->shadow, root_buffer, - 0, 0, 0, 0, - cw->attrs.x + cw->shadow_dx, - cw->attrs.y + cw->shadow_dy, + cw->shadow, root_buffer, 0, 0, 0, 0, + x + cw->shadow_dx, y + cw->shadow_dy, cw->shadow_width, cw->shadow_height); + if (shadow_clip) XFixesDestroyRegion (xdisplay, shadow_clip); } @@ -1611,15 +1632,20 @@ paint_windows (MetaScreen *screen, cw->frame_region); XFixesSetPictureClipRegion (xdisplay, root_buffer, 0, 0, cw->border_clip); - if (cw->mode == WINDOW_ARGB) + + if (cw->mask != None) { - int x, y, wid, hei; + XRenderComposite (xdisplay, PictOpOver, cw->mask, + cw->alpha_pict, root_buffer, 0, 0, 0, 0, + x, y, wid, hei); - x = cw->attrs.x; - y = cw->attrs.y; - wid = cw->attrs.width + cw->attrs.border_width * 2; - hei = cw->attrs.height + cw->attrs.border_width * 2; + XRenderComposite (xdisplay, PictOpAdd, cw->picture, + None, root_buffer, 0, 0, 0, 0, + x, y, wid, hei); + } + if (cw->mode == WINDOW_ARGB) + { XRenderComposite (xdisplay, PictOpOver, cw->picture, cw->alpha_pict, root_buffer, 0, 0, 0, 0, x, y, wid, hei); diff --git a/src/ui/frames.c b/src/ui/frames.c index 4bc4def0..b5ab0f0a 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -2248,7 +2248,7 @@ generate_pixmap (MetaFrames *frames, return NULL; result = gdk_window_create_similar_surface (frame->window, - CAIRO_CONTENT_COLOR_ALPHA, + CAIRO_CONTENT_COLOR, rect->width, rect->height); cr = cairo_create (result); -- cgit v1.2.1