From 38f7e082cc9cf5ef5b56948e4b39457299a7aef0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Fri, 15 Apr 2016 22:46:51 +0300 Subject: compositor: add client_region --- src/compositor/compositor-xrender.c | 73 +++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) 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; @@ -1134,6 +1135,62 @@ get_window_region (MetaCompWindow *cw) return region; } +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) { @@ -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; -- cgit v1.2.1