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