diff options
author | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2016-04-15 22:46:51 +0300 |
---|---|---|
committer | Alberts Muktupāvels <alberts.muktupavels@gmail.com> | 2016-04-15 23:54:34 +0300 |
commit | 38f7e082cc9cf5ef5b56948e4b39457299a7aef0 (patch) | |
tree | 9232211a44b0b794e838af00849bed12658bde9b | |
parent | d90689d88c8a354ca264960f507cfcad08f77cb9 (diff) | |
download | metacity-38f7e082cc9cf5ef5b56948e4b39457299a7aef0.tar.gz |
compositor: add client_region
-rw-r--r-- | src/compositor/compositor-xrender.c | 73 |
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; |