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:
parent
c6ca7b64f2
commit
23d541fbba
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue