summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-06-28 21:19:20 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2017-06-28 21:20:27 +0300
commitf8a2894721b478699a416892cf99510d1f001a39 (patch)
tree682960ce36c32f2a793a428c2eb57850dd71d979
parentca837759e35d66ba5bb13dcdc41ba47e3dc1c974 (diff)
downloadmetacity-f8a2894721b478699a416892cf99510d1f001a39.tar.gz
xrender: include shape region in damage area
-rw-r--r--src/compositor/meta-compositor-xrender.c46
1 files changed, 33 insertions, 13 deletions
diff --git a/src/compositor/meta-compositor-xrender.c b/src/compositor/meta-compositor-xrender.c
index 2123dc9e..e2daec47 100644
--- a/src/compositor/meta-compositor-xrender.c
+++ b/src/compositor/meta-compositor-xrender.c
@@ -2479,6 +2479,12 @@ meta_compositor_xrender_add_window (MetaCompositor *compositor,
cw->shape_region = cairo_region_to_xserver_region (xrender->xdisplay,
window->shape_region);
+ if (cw->shape_region != None)
+ {
+ XFixesTranslateRegion (xrender->xdisplay, cw->shape_region,
+ cw->rect.x, cw->rect.y);
+ }
+
xwindow = get_toplevel_xwindow (window);
cw->damage = XDamageCreate (xrender->xdisplay, xwindow, XDamageReportNonEmpty);
@@ -2649,9 +2655,6 @@ meta_compositor_xrender_window_shape_region_changed (MetaCompositor *compositor,
if (cw->shape_region != None)
{
- XFixesTranslateRegion (xrender->xdisplay, cw->shape_region,
- cw->rect.x, cw->rect.y);
-
dump_xserver_region (xrender, "shape_changed", cw->shape_region);
add_damage (xrender, cw->shape_region);
@@ -2660,6 +2663,12 @@ meta_compositor_xrender_window_shape_region_changed (MetaCompositor *compositor,
cw->shape_region = cairo_region_to_xserver_region (xrender->xdisplay,
window->shape_region);
+
+ if (cw->shape_region != None)
+ {
+ XFixesTranslateRegion (xrender->xdisplay, cw->shape_region,
+ cw->rect.x, cw->rect.y);
+ }
}
static void
@@ -2910,7 +2919,7 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
{
MetaCompositorXRender *xrender;
MetaCompWindow *cw;
- MetaRectangle rect;
+ MetaRectangle old_rect;
XserverRegion damage;
xrender = META_COMPOSITOR_XRENDER (compositor);
@@ -2921,7 +2930,8 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
meta_error_trap_push (window->display);
- meta_window_get_input_rect (window, &rect);
+ old_rect = cw->rect;
+ meta_window_get_input_rect (window, &cw->rect);
if (xrender->debug)
{
@@ -2929,7 +2939,7 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
cw->shape_region != None, cw->needs_shadow);
dump_xserver_region (xrender, "\textents", cw->extents);
fprintf (stderr, "\txy (%d %d), wh (%d %d)\n",
- rect.x, rect.y, rect.width, rect.height);
+ cw->rect.x, cw->rect.y, cw->rect.width, cw->rect.height);
}
if (cw->extents)
@@ -2944,7 +2954,7 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
fprintf (stderr, "no extents to damage !\n");
}
- if (cw->rect.width != rect.width || cw->rect.height != rect.height)
+ if (cw->rect.width != old_rect.width || cw->rect.height != old_rect.height)
{
if (cw->shaded.back_pixmap != None)
{
@@ -3000,10 +3010,10 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
if (meta_window_is_shaded (cw->window))
{
- cw->shaded.x = cw->rect.x;
- cw->shaded.y = cw->rect.y;
- cw->shaded.width = cw->rect.width;
- cw->shaded.height = cw->rect.height;
+ cw->shaded.x = old_rect.x;
+ cw->shaded.y = old_rect.y;
+ cw->shaded.width = old_rect.width;
+ cw->shaded.height = old_rect.height;
if (cw->client_region != None)
{
@@ -3034,8 +3044,6 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
}
}
- cw->rect = rect;
-
if (cw->extents)
XFixesDestroyRegion (xrender->xdisplay, cw->extents);
@@ -3054,6 +3062,18 @@ meta_compositor_xrender_sync_window_geometry (MetaCompositor *compositor,
XFixesCopyRegion (xrender->xdisplay, damage, cw->extents);
}
+ if (cw->shape_region != None)
+ {
+ gint dx;
+ gint dy;
+
+ dx = cw->rect.x - old_rect.x;
+ dy = cw->rect.y - old_rect.y;
+
+ XFixesUnionRegion (xrender->xdisplay, damage, damage, cw->shape_region);
+ XFixesTranslateRegion (xrender->xdisplay, cw->shape_region, dx, dy);
+ }
+
dump_xserver_region (xrender, "sync_window_geometry", damage);
add_damage (xrender, damage);