From 97185345fa9e3277408070227c9e02e986b5fddc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberts=20Muktup=C4=81vels?= Date: Thu, 14 Apr 2016 14:39:01 +0300 Subject: compositor: add client_region --- src/compositor/compositor-xrender.c | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c index cc0bb43d..71124341 100644 --- a/src/compositor/compositor-xrender.c +++ b/src/compositor/compositor-xrender.c @@ -175,6 +175,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) return frame_region; } +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) { @@ -1345,6 +1408,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); @@ -1363,6 +1432,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); @@ -1711,6 +1783,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); @@ -1986,6 +2064,7 @@ add_win (MetaScreen *screen, cw->shadow_pict = None; cw->frame_region = None; + cw->client_region = None; cw->window_size = None; cw->extents = None; -- cgit v1.2.1