[metacity/wip/test-3-18: 4/8] compositor: add client_region



commit 58661cce8459fc405c1dd37d2563e9c4ef0a0bac
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Thu Apr 14 14:39:01 2016 +0300

    compositor: add client_region

 src/compositor/compositor-xrender.c |   79 +++++++++++++++++++++++++++++++++++
 1 files changed, 79 insertions(+), 0 deletions(-)
---
diff --git a/src/compositor/compositor-xrender.c b/src/compositor/compositor-xrender.c
index 0a7ead4..0783bb3 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]