This commit is contained in:
Enrico Weigelt, metux IT consult 2024-06-29 14:25:54 +02:00
parent 29fc049907
commit 68f1039aab
4 changed files with 86 additions and 59 deletions

View File

@ -69,6 +69,9 @@ xnestOpenDisplay(int argc, char *argv[])
long mask;
int i, j;
/* fill out the first screen and later copy it to all others */
XnestScreenPtr xnscr = XnestScreenByIdx(0);
if (!xnestDoFullGeneration)
return;
@ -76,16 +79,16 @@ xnestOpenDisplay(int argc, char *argv[])
xnestCloseDisplay();
xnestDisplay = XOpenDisplay(xnestDisplayName);
if (xnestDisplay == NULL)
xnscr->upstreamDisplay = XOpenDisplay(xnestDisplayName);
if (xnscr->upstreamDisplay == NULL)
FatalError("Unable to open display \"%s\".\n",
XDisplayName(xnestDisplayName));
if (xnestSynchronize)
XSynchronize(xnestDisplay, True);
XSynchronize(xnscr->upstreamDisplay, True);
mask = VisualScreenMask;
vi.screen = DefaultScreen(xnestDisplay);
vi.screen = DefaultScreen(xnscr->upstreamDisplay);
xnestVisuals = XGetVisualInfo(xnestDisplay, mask, &vi, &xnestNumVisuals);
if (xnestNumVisuals == 0 || xnestVisuals == NULL)
FatalError("Unable to find any visuals.\n");
@ -124,14 +127,14 @@ xnestOpenDisplay(int argc, char *argv[])
xnestVisuals[i].visual,
AllocNone);
xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnestDisplay),
xnestDepths = XListDepths(xnestDisplay, DefaultScreen(xnscr->upstreamDisplay),
&xnestNumDepths);
xnestPixmapFormats = XListPixmapFormats(xnestDisplay,
xnestPixmapFormats = XListPixmapFormats(xnscr->upstreamDisplay,
&xnestNumPixmapFormats);
xnestBlackPixel = BlackPixel(xnestDisplay, DefaultScreen(xnestDisplay));
xnestWhitePixel = WhitePixel(xnestDisplay, DefaultScreen(xnestDisplay));
xnestBlackPixel = BlackPixel(xnscr->upstreamDisplay, DefaultScreen(xnscr->upstreamDisplay));
xnestWhitePixel = WhitePixel(xnscr->upstreamDisplay, DefaultScreen(xnscr->upstreamDisplay));
if (xnestParentWindow != (Window) 0)
xnestEventMask = StructureNotifyMask;
@ -146,11 +149,11 @@ xnestOpenDisplay(int argc, char *argv[])
if (xnestPixmapFormats[i].depth == 1 ||
xnestPixmapFormats[i].depth == xnestDepths[j]) {
xnestDefaultDrawables[xnestPixmapFormats[i].depth] =
XCreatePixmap(xnestDisplay, DefaultRootWindow(xnestDisplay),
XCreatePixmap(xnscr->upstreamDisplay, DefaultRootWindow(xnscr->upstreamDisplay),
1, 1, xnestPixmapFormats[i].depth);
}
xnestBitmapGC = XCreateGC(xnestDisplay, xnestDefaultDrawables[1], 0L, NULL);
xnestBitmapGC = XCreateGC(xnscr->upstreamDisplay, xnestDefaultDrawables[1], 0L, NULL);
if (!(xnestUserGeometry & XValue))
xnestX = 0;
@ -160,38 +163,47 @@ xnestOpenDisplay(int argc, char *argv[])
if (xnestParentWindow == 0) {
if (!(xnestUserGeometry & WidthValue))
xnestWidth = 3 * DisplayWidth(xnestDisplay,
DefaultScreen(xnestDisplay)) / 4;
xnestWidth = 3 * DisplayWidth(xnscr->upstreamDisplay,
DefaultScreen(xnscr->upstreamDisplay)) / 4;
if (!(xnestUserGeometry & HeightValue))
xnestHeight = 3 * DisplayHeight(xnestDisplay,
DefaultScreen(xnestDisplay)) / 4;
xnestHeight = 3 * DisplayHeight(xnscr->upstreamDisplay,
DefaultScreen(xnscr->upstreamDisplay)) / 4;
}
if (!xnestUserBorderWidth)
xnestBorderWidth = 1;
xnestIconBitmap =
XCreateBitmapFromData(xnestDisplay,
DefaultRootWindow(xnestDisplay),
XCreateBitmapFromData(xnscr->upstreamDisplay,
DefaultRootWindow(xnscr->upstreamDisplay),
(char *) icon_bits, icon_width, icon_height);
xnestScreenSaverPixmap =
XCreatePixmapFromBitmapData(xnestDisplay,
DefaultRootWindow(xnestDisplay),
XCreatePixmapFromBitmapData(xnscr->upstreamDisplay,
DefaultRootWindow(xnscr->upstreamDisplay),
(char *) screensaver_bits,
screensaver_width,
screensaver_height,
xnestWhitePixel,
xnestBlackPixel,
DefaultDepth(xnestDisplay,
DefaultScreen(xnestDisplay)));
DefaultDepth(xndscr->display,
DefaultScreen(xnscr->upstreamDisplay)));
/* now copy over the remaining screens */
for (i=1; i<xnestNumScreens; i++) {
XnestScreenPtr s2 = XnestScreenByIdx(i);
s2->display = xnscr->upstreamDisplay;
s2->clonedFrom = 0;
}
}
void
xnestCloseDisplay(void)
{
if (!xnestDoFullGeneration || !xnestDisplay)
XnestScreenPtr xnscr = xnestScreenByIdx(0);
if (!xnestDoFullGeneration || !xnscr->upstreamDisplay)
return;
/*
@ -203,5 +215,5 @@ xnestCloseDisplay(void)
XFree(xnestVisuals);
XFree(xnestDepths);
XFree(xnestPixmapFormats);
XCloseDisplay(xnestDisplay);
XCloseDisplay(xnscr->upstreamDisplay);
}

View File

@ -75,26 +75,27 @@ xnestSaveScreen(ScreenPtr pScreen, int what)
if (xnestSoftwareScreenSaver)
return False;
else {
Window saverWin = xnestScreenPriv(pScreen)->screenSaverWindow;
XnestScreenPtr xnscr = xnestScreenPriv(pScreen);
Window saverWin = xnscr->screenSaverWindow;
switch (what) {
case SCREEN_SAVER_ON:
XMapRaised(xnestDisplay, saverWin);
XMapRaised(xnscr->upstreamDisplay, saverWin);
xnestSetScreenSaverColormapWindow(pScreen);
break;
case SCREEN_SAVER_OFF:
XUnmapWindow(xnestDisplay, saverWin);
XUnmapWindow(xnscr->upstreamDisplay, saverWin);
xnestSetInstalledColormapWindows(pScreen);
break;
case SCREEN_SAVER_FORCER:
lastEventTime = GetTimeInMillis();
XUnmapWindow(xnestDisplay, saverWin);
XUnmapWindow(xnscr->upstreamDisplay, saverWin);
xnestSetInstalledColormapWindows(pScreen);
break;
case SCREEN_SAVER_CYCLE:
XUnmapWindow(xnestDisplay, saverWin);
XUnmapWindow(xnscr->upstreamDisplay, saverWin);
xnestSetInstalledColormapWindows(pScreen);
break;
}
@ -142,6 +143,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
VisualID defaultVisual;
int rootDepth;
miPointerScreenPtr PointPriv;
XnestScreenPtr xnscr = xnestScreenPriv(pScreen);
if (!dixRegisterPrivateKey
(&xnestWindowPrivateKeyRec, PRIVATE_WINDOW, sizeof(xnestPrivWin)))
@ -235,7 +237,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
rootDepth = visuals[xnestDefaultVisualIndex].nplanes;
if (xnestParentWindow != 0) {
XGetWindowAttributes(xnestDisplay, xnestParentWindow, &gattributes);
XGetWindowAttributes(xnscr->upstreamDisplay, xnestParentWindow, &gattributes);
xnestWidth = gattributes.width;
xnestHeight = gattributes.height;
}
@ -321,13 +323,13 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
&xnestCursorFuncs);
PointPriv->spriteFuncs = &xnestPointerSpriteFuncs;
pScreen->mmWidth = xnestWidth * DisplayWidthMM(xnestDisplay,
DefaultScreen(xnestDisplay))
/ DisplayWidth(xnestDisplay, DefaultScreen(xnestDisplay));
pScreen->mmWidth = xnestWidth * DisplayWidthMM(xnscr->upstreamDisplay,
DefaultScreen(xnscr->upstreamDisplay))
/ DisplayWidth(xnestDisplay, DefaultScreen(xnscr->upstreamDisplay));
pScreen->mmHeight =
xnestHeight * DisplayHeightMM(xnestDisplay,
DefaultScreen(xnestDisplay)) /
DisplayHeight(xnestDisplay, DefaultScreen(xnestDisplay));
xnestHeight * DisplayHeightMM(xnscr->upstreamDisplay,
DefaultScreen(xnscr->upstreamDisplay)) /
DisplayHeight(xnscr->upstreamDisplay, DefaultScreen(xnscr->upstreamDisplay));
/* overwrite miCloseScreen with our own */
pScreen->CloseScreen = xnestCloseScreen;
@ -350,12 +352,12 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
if (xnestParentWindow != 0) {
xnscr->rootWindow = xnestParentWindow;
XSelectInput(xnestDisplay, xnestParentWindow, xnestEventMask);
XSelectInput(xnscr->upstreamDisplay, xnestParentWindow, xnestEventMask);
}
else
xnscr->rootWindow =
XCreateWindow(xnestDisplay,
DefaultRootWindow(xnestDisplay),
XCreateWindow(xnscr->upstreamDisplay,
DefaultRootWindow(xnscr->upstreamDisplay),
xnestX + POSITION_OFFSET,
xnestY + POSITION_OFFSET,
xnestWidth, xnestHeight,
@ -377,27 +379,27 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
sizeHints.flags |= USPosition;
if (xnestUserGeometry & WidthValue || xnestUserGeometry & HeightValue)
sizeHints.flags |= USSize;
XSetStandardProperties(xnestDisplay,
XSetStandardProperties(xnscr->upstreamDisplay,
xnscr->rootWindow,
xnestWindowName,
xnestWindowName,
xnestIconBitmap, argv, argc, &sizeHints);
XMapWindow(xnestDisplay, xnscr->rootWindow);
XMapWindow(xnscr->upstreamDisplay, xnscr->rootWindow);
valuemask = CWBackPixmap | CWColormap;
attributes.background_pixmap = xnestScreenSaverPixmap;
attributes.colormap =
DefaultColormap(xnestDisplay, DefaultScreen(xnestDisplay));
DefaultColormap(xnscr->upstreamDisplay, DefaultScreen(xnscr->upstreamDisplay));
xnscr->screenSaverWindow =
XCreateWindow(xnestDisplay,
XCreateWindow(xnscr->upstreamDisplay,
xnscr->rootWindow,
0, 0, xnestWidth, xnestHeight, 0,
DefaultDepth(xnestDisplay,
DefaultScreen(xnestDisplay)),
InputOutput, DefaultVisual(xnestDisplay,
DefaultDepth(xnscr->upstreamDisplay,
DefaultScreen(xnscr->upstreamDisplay)),
InputOutput, DefaultVisual(xnscr->upstreamDisplay,
DefaultScreen
(xnestDisplay)), valuemask,
(xnscr->upstreamDisplay)), valuemask,
&attributes);
}

View File

@ -78,6 +78,7 @@ xnestCreateWindow(WindowPtr pWin)
XSetWindowAttributes attributes;
Visual *visual;
ColormapPtr pCmap;
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
if (pWin->drawable.class == InputOnly) {
mask = 0L;
@ -115,7 +116,7 @@ xnestCreateWindow(WindowPtr pWin)
}
}
xnestWindowPriv(pWin)->window = XCreateWindow(xnestDisplay,
xnestWindowPriv(pWin)->window = XCreateWindow(xnscr->upstreamDisplay,
xnestWindowParent(pWin),
pWin->origin.x -
wBorderWidth(pWin),
@ -148,12 +149,14 @@ xnestCreateWindow(WindowPtr pWin)
Bool
xnestDestroyWindow(WindowPtr pWin)
{
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
if (pWin->nextSib)
xnestWindowPriv(pWin->nextSib)->sibling_above =
xnestWindowPriv(pWin)->sibling_above;
RegionDestroy(xnestWindowPriv(pWin)->bounding_shape);
RegionDestroy(xnestWindowPriv(pWin)->clip_shape);
XDestroyWindow(xnestDisplay, xnestWindow(pWin));
XDestroyWindow(xnscr->upstreamDisplay, xnestWindow(pWin));
xnestWindowPriv(pWin)->window = None;
if (pWin->optional && pWin->optional->colormap && pWin->parent)
@ -177,10 +180,11 @@ xnestConfigureWindow(WindowPtr pWin, unsigned int mask)
{
unsigned int valuemask;
XWindowChanges values;
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
if (mask & CWParent &&
xnestWindowPriv(pWin)->parent != xnestWindowParent(pWin)) {
XReparentWindow(xnestDisplay, xnestWindow(pWin),
XReparentWindow(xnscr->upstreamDisplay, xnestWindow(pWin),
xnestWindowParent(pWin),
pWin->origin.x - wBorderWidth(pWin),
pWin->origin.y - wBorderWidth(pWin));
@ -227,7 +231,7 @@ xnestConfigureWindow(WindowPtr pWin, unsigned int mask)
}
if (valuemask)
XConfigureWindow(xnestDisplay, xnestWindow(pWin), valuemask, &values);
XConfigureWindow(xnscr->upstreamDisplay, xnestWindow(pWin), valuemask, &values);
if (mask & CWStackingOrder &&
xnestWindowPriv(pWin)->sibling_above != xnestWindowSiblingAbove(pWin)) {
@ -239,7 +243,7 @@ xnestConfigureWindow(WindowPtr pWin, unsigned int mask)
/* the top sibling */
valuemask = CWStackMode;
values.stack_mode = Above;
XConfigureWindow(xnestDisplay, xnestWindow(pSib), valuemask, &values);
XConfigureWindow(xnscr->upstreamDisplay, xnestWindow(pSib), valuemask, &values);
xnestWindowPriv(pSib)->sibling_above = None;
/* the rest of siblings */
@ -247,7 +251,7 @@ xnestConfigureWindow(WindowPtr pWin, unsigned int mask)
valuemask = CWSibling | CWStackMode;
values.sibling = xnestWindowSiblingAbove(pSib);
values.stack_mode = Below;
XConfigureWindow(xnestDisplay, xnestWindow(pSib), valuemask,
XConfigureWindow(xnscr->upstreamDisplay, xnestWindow(pSib), valuemask,
&values);
xnestWindowPriv(pSib)->sibling_above =
xnestWindowSiblingAbove(pSib);
@ -259,6 +263,7 @@ Bool
xnestChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
{
XSetWindowAttributes attributes;
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
if (mask & CWBackPixmap)
switch (pWin->backgroundState) {
@ -342,7 +347,7 @@ xnestChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
mask &= ~CWCursor;
if (mask)
XChangeWindowAttributes(xnestDisplay, xnestWindow(pWin),
XChangeWindowAttributes(xnscr->upstreamDisplay, xnestWindow(pWin),
mask, &attributes);
return True;
@ -351,9 +356,11 @@ xnestChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
Bool
xnestRealizeWindow(WindowPtr pWin)
{
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
xnestConfigureWindow(pWin, CWStackingOrder);
xnestShapeWindow(pWin);
XMapWindow(xnestDisplay, xnestWindow(pWin));
XMapWindow(xnscr->upstreamDisplay, xnestWindow(pWin));
return True;
}
@ -361,7 +368,9 @@ xnestRealizeWindow(WindowPtr pWin)
Bool
xnestUnrealizeWindow(WindowPtr pWin)
{
XUnmapWindow(xnestDisplay, xnestWindow(pWin));
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
XUnmapWindow(xnscr->upstreamDisplay, xnestWindow(pWin));
return True;
}
@ -390,6 +399,7 @@ xnestWindowExposures(WindowPtr pWin, RegionPtr pRgn)
XEvent event;
Window window;
BoxRec Box;
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
XSync(xnestDisplay, False);
@ -406,7 +416,7 @@ xnestWindowExposures(WindowPtr pWin, RegionPtr pRgn)
event.xexpose.type = ProcessedExpose;
if (RegionContainsRect(pRgn, &Box) != rgnIN)
XPutBackEvent(xnestDisplay, &event);
XPutBackEvent(xnscr->upstreamDisplay, &event);
}
miWindowExposures(pWin, pRgn);
@ -456,6 +466,7 @@ xnestShapeWindow(WindowPtr pWin)
BoxPtr pBox;
XRectangle rect;
int i;
XnestScreenPtr xnscr = xnestScreenPriv(pWin->drawable.pScreen);
if (!xnestRegionEqual(xnestWindowPriv(pWin)->bounding_shape,
wBoundingShape(pWin))) {
@ -475,14 +486,14 @@ xnestShapeWindow(WindowPtr pWin)
rect.height = pBox[i].y2 - pBox[i].y1;
XUnionRectWithRegion(&rect, reg, reg);
}
XShapeCombineRegion(xnestDisplay, xnestWindow(pWin),
XShapeCombineRegion(xnscr->upstreamDisplay, xnestWindow(pWin),
ShapeBounding, 0, 0, reg, ShapeSet);
XDestroyRegion(reg);
}
else {
RegionEmpty(xnestWindowPriv(pWin)->bounding_shape);
XShapeCombineMask(xnestDisplay, xnestWindow(pWin),
XShapeCombineMask(xnscr->upstreamDisplay, xnestWindow(pWin),
ShapeBounding, 0, 0, None, ShapeSet);
}
}
@ -502,14 +513,14 @@ xnestShapeWindow(WindowPtr pWin)
rect.height = pBox[i].y2 - pBox[i].y1;
XUnionRectWithRegion(&rect, reg, reg);
}
XShapeCombineRegion(xnestDisplay, xnestWindow(pWin),
XShapeCombineRegion(xnscr->upstreamDisplay, xnestWindow(pWin),
ShapeClip, 0, 0, reg, ShapeSet);
XDestroyRegion(reg);
}
else {
RegionEmpty(xnestWindowPriv(pWin)->clip_shape);
XShapeCombineMask(xnestDisplay, xnestWindow(pWin),
XShapeCombineMask(xnscr->upstreamDisplay, xnestWindow(pWin),
ShapeClip, 0, 0, None, ShapeSet);
}
}

View File

@ -12,6 +12,8 @@
#include "screenint.h"
typedef struct xnest_screen {
int clonedFrom;
Display *upstreamDisplay;
Window rootWindow;
Window screenSaverWindow;
ScreenPtr pScreen;