Xnest: use xcb instead of XShapeCombineRegion() and XShapeCombineMask()
Using xcb_shape_rectangles() and xcb_shape_mask() instead of Xlib's XShapeCombineRegion() and XShapeCombineMask(). Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
		
							parent
							
								
									dbf6a04f8f
								
							
						
					
					
						commit
						edd0d03e0b
					
				| 
						 | 
					@ -14,6 +14,7 @@ is" without express or implied warranty.
 | 
				
			||||||
#include <dix-config.h>
 | 
					#include <dix-config.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <xcb/xcb.h>
 | 
					#include <xcb/xcb.h>
 | 
				
			||||||
 | 
					#include <xcb/shape.h>
 | 
				
			||||||
#include <xcb/xcb_aux.h>
 | 
					#include <xcb/xcb_aux.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <X11/X.h>
 | 
					#include <X11/X.h>
 | 
				
			||||||
| 
						 | 
					@ -460,11 +461,6 @@ xnestRegionEqual(RegionPtr pReg1, RegionPtr pReg2)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
xnestShapeWindow(WindowPtr pWin)
 | 
					xnestShapeWindow(WindowPtr pWin)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    Region reg;
 | 
					 | 
				
			||||||
    BoxPtr pBox;
 | 
					 | 
				
			||||||
    XRectangle rect;
 | 
					 | 
				
			||||||
    int i;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (!xnestRegionEqual(xnestWindowPriv(pWin)->bounding_shape,
 | 
					    if (!xnestRegionEqual(xnestWindowPriv(pWin)->bounding_shape,
 | 
				
			||||||
                          wBoundingShape(pWin))) {
 | 
					                          wBoundingShape(pWin))) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -472,26 +468,27 @@ xnestShapeWindow(WindowPtr pWin)
 | 
				
			||||||
            RegionCopy(xnestWindowPriv(pWin)->bounding_shape,
 | 
					            RegionCopy(xnestWindowPriv(pWin)->bounding_shape,
 | 
				
			||||||
                       wBoundingShape(pWin));
 | 
					                       wBoundingShape(pWin));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            reg = XCreateRegion();
 | 
					            int const num_rects = RegionNumRects(xnestWindowPriv(pWin)->bounding_shape);
 | 
				
			||||||
            pBox = RegionRects(xnestWindowPriv(pWin)->bounding_shape);
 | 
					            BoxPtr const pBox = RegionRects(xnestWindowPriv(pWin)->bounding_shape);
 | 
				
			||||||
            for (i = 0;
 | 
					            xcb_rectangle_t *rects = calloc(num_rects, sizeof(xcb_rectangle_t));
 | 
				
			||||||
                 i < RegionNumRects(xnestWindowPriv(pWin)->bounding_shape);
 | 
					
 | 
				
			||||||
                 i++) {
 | 
					            for (int i = 0; i < num_rects; i++) {
 | 
				
			||||||
                rect.x = pBox[i].x1;
 | 
					                rects[i].x = pBox[i].x1;
 | 
				
			||||||
                rect.y = pBox[i].y1;
 | 
					                rects[i].y = pBox[i].y1;
 | 
				
			||||||
                rect.width = pBox[i].x2 - pBox[i].x1;
 | 
					                rects[i].width = pBox[i].x2 - pBox[i].x1;
 | 
				
			||||||
                rect.height = pBox[i].y2 - pBox[i].y1;
 | 
					                rects[i].height = pBox[i].y2 - pBox[i].y1;
 | 
				
			||||||
                XUnionRectWithRegion(&rect, reg, reg);
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            XShapeCombineRegion(xnestDisplay, xnestWindow(pWin),
 | 
					
 | 
				
			||||||
                                ShapeBounding, 0, 0, reg, ShapeSet);
 | 
					            xcb_shape_rectangles(xnestUpstreamInfo.conn, XCB_SHAPE_SO_SET,
 | 
				
			||||||
            XDestroyRegion(reg);
 | 
					                                 XCB_SHAPE_SK_BOUNDING, XCB_CLIP_ORDERING_YX_BANDED,
 | 
				
			||||||
 | 
					                                 xnestWindow(pWin), 0, 0, num_rects, rects);
 | 
				
			||||||
 | 
					            free(rects);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            RegionEmpty(xnestWindowPriv(pWin)->bounding_shape);
 | 
					            RegionEmpty(xnestWindowPriv(pWin)->bounding_shape);
 | 
				
			||||||
 | 
					            xcb_shape_mask(xnestUpstreamInfo.conn, XCB_SHAPE_SO_SET,
 | 
				
			||||||
            XShapeCombineMask(xnestDisplay, xnestWindow(pWin),
 | 
					                           XCB_SHAPE_SK_BOUNDING, xnestWindow(pWin),
 | 
				
			||||||
                              ShapeBounding, 0, 0, XCB_PIXMAP_NONE, ShapeSet);
 | 
					                           0, 0, XCB_PIXMAP_NONE);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -500,25 +497,26 @@ xnestShapeWindow(WindowPtr pWin)
 | 
				
			||||||
        if (wClipShape(pWin)) {
 | 
					        if (wClipShape(pWin)) {
 | 
				
			||||||
            RegionCopy(xnestWindowPriv(pWin)->clip_shape, wClipShape(pWin));
 | 
					            RegionCopy(xnestWindowPriv(pWin)->clip_shape, wClipShape(pWin));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            reg = XCreateRegion();
 | 
					            int const num_rects = RegionNumRects(xnestWindowPriv(pWin)->clip_shape);
 | 
				
			||||||
            pBox = RegionRects(xnestWindowPriv(pWin)->clip_shape);
 | 
					            BoxPtr const pBox = RegionRects(xnestWindowPriv(pWin)->clip_shape);
 | 
				
			||||||
            for (i = 0;
 | 
					            xcb_rectangle_t *rects = calloc(num_rects, sizeof(xcb_rectangle_t));
 | 
				
			||||||
                 i < RegionNumRects(xnestWindowPriv(pWin)->clip_shape); i++) {
 | 
					
 | 
				
			||||||
                rect.x = pBox[i].x1;
 | 
					            for (int i = 0; i < num_rects; i++) {
 | 
				
			||||||
                rect.y = pBox[i].y1;
 | 
					                rects[i].x = pBox[i].x1;
 | 
				
			||||||
                rect.width = pBox[i].x2 - pBox[i].x1;
 | 
					                rects[i].y = pBox[i].y1;
 | 
				
			||||||
                rect.height = pBox[i].y2 - pBox[i].y1;
 | 
					                rects[i].width = pBox[i].x2 - pBox[i].x1;
 | 
				
			||||||
                XUnionRectWithRegion(&rect, reg, reg);
 | 
					                rects[i].height = pBox[i].y2 - pBox[i].y1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            XShapeCombineRegion(xnestDisplay, xnestWindow(pWin),
 | 
					
 | 
				
			||||||
                                ShapeClip, 0, 0, reg, ShapeSet);
 | 
					            xcb_shape_rectangles(xnestUpstreamInfo.conn, XCB_SHAPE_SO_SET,
 | 
				
			||||||
            XDestroyRegion(reg);
 | 
					                                 XCB_SHAPE_SK_CLIP, XCB_CLIP_ORDERING_YX_BANDED,
 | 
				
			||||||
 | 
					                                 xnestWindow(pWin), 0, 0, num_rects, rects);
 | 
				
			||||||
 | 
					            free(rects);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        else {
 | 
					        else {
 | 
				
			||||||
            RegionEmpty(xnestWindowPriv(pWin)->clip_shape);
 | 
					            RegionEmpty(xnestWindowPriv(pWin)->clip_shape);
 | 
				
			||||||
 | 
					            xcb_shape_mask(xnestUpstreamInfo.conn, XCB_SHAPE_SO_SET,
 | 
				
			||||||
            XShapeCombineMask(xnestDisplay, xnestWindow(pWin),
 | 
					                           XCB_SHAPE_SK_CLIP, xnestWindow(pWin), 0, 0, XCB_PIXMAP_NONE);
 | 
				
			||||||
                              ShapeClip, 0, 0, XCB_PIXMAP_NONE, ShapeSet);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,6 @@ typedef XID KeySym64;
 | 
				
			||||||
#include <X11/Xlib.h>
 | 
					#include <X11/Xlib.h>
 | 
				
			||||||
#include <X11/Xlibint.h>
 | 
					#include <X11/Xlibint.h>
 | 
				
			||||||
#include <X11/Xutil.h>
 | 
					#include <X11/Xutil.h>
 | 
				
			||||||
#include <X11/extensions/shape.h>
 | 
					 | 
				
			||||||
#include <X11/Xlib-xcb.h>
 | 
					#include <X11/Xlib-xcb.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef _XSERVER64_tmp
 | 
					#ifdef _XSERVER64_tmp
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ srcs = [
 | 
				
			||||||
x11_xcb_dep = dependency('x11-xcb', required: true)
 | 
					x11_xcb_dep = dependency('x11-xcb', required: true)
 | 
				
			||||||
xcb_dep = dependency('xcb', required: true)
 | 
					xcb_dep = dependency('xcb', required: true)
 | 
				
			||||||
xcb_aux_dep = dependency('xcb-aux', required: true)
 | 
					xcb_aux_dep = dependency('xcb-aux', required: true)
 | 
				
			||||||
 | 
					xcb_shape_dep = dependency('xcb-shape', required: true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
executable(
 | 
					executable(
 | 
				
			||||||
    'Xnest',
 | 
					    'Xnest',
 | 
				
			||||||
| 
						 | 
					@ -33,6 +34,7 @@ executable(
 | 
				
			||||||
        xnest_dep,
 | 
					        xnest_dep,
 | 
				
			||||||
        xcb_dep,
 | 
					        xcb_dep,
 | 
				
			||||||
        xcb_aux_dep,
 | 
					        xcb_aux_dep,
 | 
				
			||||||
 | 
					        xcb_shape_dep,
 | 
				
			||||||
        x11_xcb_dep,
 | 
					        x11_xcb_dep,
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    link_with: [
 | 
					    link_with: [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue