summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-04-15 22:46:51 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-04-15 23:54:34 +0300
commit38f7e082cc9cf5ef5b56948e4b39457299a7aef0 (patch)
tree9232211a44b0b794e838af00849bed12658bde9b
parentd90689d88c8a354ca264960f507cfcad08f77cb9 (diff)
downloadmetacity-38f7e082cc9cf5ef5b56948e4b39457299a7aef0.tar.gz
compositor: add client_region
-rw-r--r--src/compositor/compositor-xrender.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index 27f02898..923f63df 100644
--- a/src/compositor/compositor-xrender.c
+++ b/src/compositor/compositor-xrender.c
@@ -174,6 +174,7 @@ typedef struct _MetaCompWindow
Picture shadow_pict;
XserverRegion window_region;
+ XserverRegion client_region;
XserverRegion window_size;
XserverRegion extents;
@@ -1135,6 +1136,62 @@ get_window_region (MetaCompWindow *cw)
}
static XserverRegion
+get_client_region (MetaCompWindow *cw)
+{
+ MetaDisplay *display;
+ Display *xdisplay;
+ XserverRegion region;
+ MetaFrame *frame;
+
+ display = meta_screen_get_display (cw->screen);
+ xdisplay = meta_display_get_xdisplay (display);
+
+ if (cw->window_region != None)
+ {
+ region = XFixesCreateRegion (xdisplay, NULL, 0);
+ XFixesCopyRegion (xdisplay, region, cw->window_region);
+ }
+ else
+ {
+ region = get_window_region (cw);
+ if (region == None)
+ return None;
+ }
+
+ frame = cw->window ? meta_window_get_frame (cw->window) : NULL;
+
+ if (frame != NULL)
+ {
+ MetaFrameBorders borders;
+ int x;
+ int y;
+ int width;
+ int height;
+ XRectangle rect;
+ XserverRegion client;
+
+ meta_frame_calc_borders (frame, &borders);
+
+ x = cw->attrs.x;
+ y = cw->attrs.y;
+ width = cw->attrs.width + cw->attrs.border_width * 2;
+ height = cw->attrs.height + cw->attrs.border_width * 2;
+
+ rect.x = x + borders.total.left;
+ rect.y = y + borders.total.top;
+ rect.width = width - borders.total.left - borders.total.right;
+ rect.height = height - borders.total.top - borders.total.bottom;
+
+ client = XFixesCreateRegion (xdisplay, &rect, 1);
+
+ XFixesIntersectRegion (xdisplay, region, region, client);
+ XFixesDestroyRegion (xdisplay, client);
+ }
+
+ return region;
+}
+
+static XserverRegion
window_size (MetaCompWindow *cw)
{
MetaScreen *screen = cw->screen;
@@ -1344,6 +1401,12 @@ paint_windows (MetaScreen *screen,
cw->window_region = None;
}
+ if (cw->client_region)
+ {
+ XFixesDestroyRegion (xdisplay, cw->client_region);
+ cw->client_region = None;
+ }
+
if (cw->window_size)
{
XFixesDestroyRegion (xdisplay, cw->window_size);
@@ -1362,6 +1425,9 @@ paint_windows (MetaScreen *screen,
if (cw->window_region == None)
cw->window_region = get_window_region (cw);
+ if (cw->client_region == None)
+ cw->client_region = get_client_region (cw);
+
if (cw->window_size == None)
cw->window_size = window_size (cw);
@@ -1710,6 +1776,12 @@ free_win (MetaCompWindow *cw,
cw->window_region = None;
}
+ if (cw->client_region)
+ {
+ XFixesDestroyRegion (xdisplay, cw->client_region);
+ cw->client_region = None;
+ }
+
if (cw->window_size)
{
XFixesDestroyRegion (xdisplay, cw->window_size);
@@ -1985,6 +2057,7 @@ add_win (MetaScreen *screen,
cw->shadow_pict = None;
cw->window_region = None;
+ cw->client_region = None;
cw->window_size = None;
cw->extents = None;