summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-04-14 14:39:01 +0300
committerAlberts Muktupāvels <alberts.muktupavels@gmail.com>2016-04-14 20:30:30 +0300
commit58661cce8459fc405c1dd37d2563e9c4ef0a0bac (patch)
treeb380cac6d1032c8be6d6d20327945da8a16f05d1
parent2c7088e1f3b5daf30c1f4fdf637a662ccdfddec5 (diff)
downloadmetacity-58661cce8459fc405c1dd37d2563e9c4ef0a0bac.tar.gz
compositor: add client_region
-rw-r--r--src/compositor/compositor-xrender.c79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index 0a7ead48..0783bb33 100644
--- a/src/compositor/compositor-xrender.c
+++ b/src/compositor/compositor-xrender.c
@@ -174,6 +174,7 @@ typedef struct _MetaCompWindow
Picture shadow_pict;
XserverRegion frame_region;
+ XserverRegion client_region;
XserverRegion window_size;
XserverRegion extents;
@@ -1135,6 +1136,68 @@ get_frame_region (MetaCompWindow *cw)
}
static XserverRegion
+get_client_region (MetaCompWindow *cw)
+{
+ MetaScreen *screen;
+ MetaDisplay *display;
+ Display *xdisplay;
+ XserverRegion frame_region;
+ MetaFrame *frame;
+
+ screen = cw->screen;
+ display = meta_screen_get_display (screen);
+ xdisplay = meta_display_get_xdisplay (display);
+
+ if (cw->frame_region != None)
+ {
+ frame_region = XFixesCreateRegion (xdisplay, NULL, 0);
+ XFixesCopyRegion (xdisplay, frame_region, cw->frame_region);
+ }
+ else
+ {
+ meta_error_trap_push (display);
+ frame_region = XFixesCreateRegionFromWindow (xdisplay, cw->id,
+ WindowRegionBounding);
+
+ meta_error_trap_pop (display, FALSE);
+ if (frame_region == None)
+ return None;
+
+ XFixesTranslateRegion (xdisplay, frame_region,
+ cw->attrs.x + cw->attrs.border_width,
+ cw->attrs.y + cw->attrs.border_width);
+ }
+
+ frame = cw->window ? meta_window_get_frame (cw->window) : NULL;
+
+ if (frame != NULL)
+ {
+ MetaFrameBorders borders;
+ int width;
+ int height;
+ XRectangle client_rect;
+ XserverRegion client_region;
+
+ meta_frame_calc_borders (frame, &borders);
+
+ width = cw->attrs.width + cw->attrs.border_width * 2;
+ height = cw->attrs.height + cw->attrs.border_width * 2;
+
+ client_rect.x = cw->attrs.x + borders.total.left;
+ client_rect.y = cw->attrs.y + borders.total.top;
+ client_rect.width = width - borders.total.left - borders.total.right;
+ client_rect.height = height - borders.total.top - borders.total.bottom;
+
+ client_region = XFixesCreateRegion (xdisplay, &client_rect, 1);
+
+ XFixesIntersectRegion (xdisplay, frame_region, client_region, frame_region);
+ XFixesDestroyRegion (xdisplay, client_region);
+ }
+
+ return frame_region;
+}
+
+static XserverRegion
window_size (MetaCompWindow *cw)
{
MetaScreen *screen = cw->screen;
@@ -1344,6 +1407,12 @@ paint_windows (MetaScreen *screen,
cw->frame_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 +1431,9 @@ paint_windows (MetaScreen *screen,
if (cw->frame_region == None)
cw->frame_region = get_frame_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 +1782,12 @@ free_win (MetaCompWindow *cw,
cw->frame_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 +2063,7 @@ add_win (MetaScreen *screen,
cw->shadow_pict = None;
cw->frame_region = None;
+ cw->client_region = None;
cw->window_size = None;
cw->extents = None;