Xnest: screen: use xcb setup data for retrieving upstream visuals

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-08-14 17:48:27 +02:00
parent c6ca7b64f2
commit 23d541fbba

View File

@ -171,7 +171,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
VisualPtr visuals; VisualPtr visuals;
DepthPtr depths; DepthPtr depths;
int numVisuals, numDepths; int numVisuals, numDepths;
int i, j; int j;
unsigned long valuemask; unsigned long valuemask;
VisualID defaultVisual; VisualID defaultVisual;
int rootDepth; int rootDepth;
@ -197,7 +197,7 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
PRIVATE_CURSOR, 0)) PRIVATE_CURSOR, 0))
return FALSE; return FALSE;
visuals = xallocarray(xnestNumVisuals, sizeof(VisualRec)); visuals = xallocarray(1, sizeof(VisualRec));
numVisuals = 0; numVisuals = 0;
depths = (DepthPtr) malloc(MAXDEPTH * sizeof(DepthRec)); depths = (DepthPtr) malloc(MAXDEPTH * sizeof(DepthRec));
@ -206,39 +206,43 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
depths[0].vids = (VisualID *) malloc(MAXVISUALSPERDEPTH * sizeof(VisualID)); depths[0].vids = (VisualID *) malloc(MAXVISUALSPERDEPTH * sizeof(VisualID));
numDepths = 1; numDepths = 1;
/* visuals */
int found_default_visual = 0; int found_default_visual = 0;
for (i = 0; i < xnestNumVisuals; i++) { xcb_depth_iterator_t depth_iter;
visuals[numVisuals].class = xnestVisuals[i].class; for (depth_iter = xcb_screen_allowed_depths_iterator(xnestUpstreamInfo.screenInfo);
visuals[numVisuals].bitsPerRGBValue = xnestVisuals[i].bits_per_rgb; depth_iter.rem;
visuals[numVisuals].ColormapEntries = xnestVisuals[i].colormap_size; xcb_depth_next(&depth_iter))
visuals[numVisuals].nplanes = xnestVisuals[i].depth; {
visuals[numVisuals].redMask = xnestVisuals[i].red_mask; int vlen = xcb_depth_visuals_length (depth_iter.data);
visuals[numVisuals].greenMask = xnestVisuals[i].green_mask; xcb_visualtype_t *vts = xcb_depth_visuals (depth_iter.data);
visuals[numVisuals].blueMask = xnestVisuals[i].blue_mask; for (int x=0; x<vlen; x++) {
visuals[numVisuals].offsetRed = offset(xnestVisuals[i].red_mask);
visuals[numVisuals].offsetGreen = offset(xnestVisuals[i].green_mask);
visuals[numVisuals].offsetBlue = offset(xnestVisuals[i].blue_mask);
/* Check for and remove duplicates. */
for (j = 0; j < numVisuals; j++) { for (j = 0; j < numVisuals; j++) {
if (visuals[numVisuals].class == visuals[j].class && if (vts[x]._class == visuals[j].class &&
visuals[numVisuals].bitsPerRGBValue == vts[x].bits_per_rgb_value == visuals[j].bitsPerRGBValue &&
visuals[j].bitsPerRGBValue && vts[x].colormap_entries == visuals[j].ColormapEntries &&
visuals[numVisuals].ColormapEntries == depth_iter.data->depth == visuals[j].nplanes &&
visuals[j].ColormapEntries && vts[x].red_mask == visuals[j].redMask &&
visuals[numVisuals].nplanes == visuals[j].nplanes && vts[x].green_mask == visuals[j].greenMask &&
visuals[numVisuals].redMask == visuals[j].redMask && vts[x].blue_mask == visuals[j].blueMask &&
visuals[numVisuals].greenMask == visuals[j].greenMask && offset(vts[x].red_mask) == visuals[j].offsetRed &&
visuals[numVisuals].blueMask == visuals[j].blueMask && offset(vts[x].green_mask) == visuals[j].offsetGreen &&
visuals[numVisuals].offsetRed == visuals[j].offsetRed && offset(vts[x].blue_mask) == visuals[j].offsetBlue)
visuals[numVisuals].offsetGreen == visuals[j].offsetGreen && goto breakout;
visuals[numVisuals].offsetBlue == visuals[j].offsetBlue)
break;
} }
if (j < numVisuals)
break;
visuals[numVisuals].vid = FakeClientID(0); visuals[numVisuals] = (VisualRec) {
.class = vts[x]._class,
.bitsPerRGBValue = vts[x].bits_per_rgb_value,
.ColormapEntries = vts[x].colormap_entries,
.nplanes = depth_iter.data->depth,
.redMask = vts[x].red_mask,
.greenMask = vts[x].green_mask,
.blueMask = vts[x].blue_mask,
.offsetRed = offset(vts[x].red_mask),
.offsetGreen = offset(vts[x].green_mask),
.offsetBlue = offset(vts[x].blue_mask),
.vid = FakeClientID(0),
};
numDepths = addDepthVisual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid); numDepths = addDepthVisual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid);
@ -254,14 +258,18 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
else else
{ {
VisualID visual_id = xnestUpstreamInfo.screenInfo->root_visual; VisualID visual_id = xnestUpstreamInfo.screenInfo->root_visual;
if (visual_id == xnestVisuals[i].visualid) { if (visual_id == vts[x].visual_id) {
defaultVisual = visuals[numVisuals].vid; defaultVisual = visuals[numVisuals].vid;
rootDepth = visuals[numVisuals].nplanes; rootDepth = visuals[numVisuals].nplanes;
found_default_visual = 1; found_default_visual = 1;
} }
} }
numVisuals++; numVisuals++;
visuals = reallocarray(visuals, numVisuals+1, sizeof(VisualRec));
} }
}
breakout:
visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec)); visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec));
if (!found_default_visual) { if (!found_default_visual) {