Xnest: fetch visuals from XCB setup data instead of Xlib

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-08-15 10:58:18 +02:00
parent 6b5a8e001c
commit 822b82d831
3 changed files with 70 additions and 84 deletions

View File

@ -41,7 +41,6 @@ is" without express or implied warranty.
Display *xnestDisplay = NULL; Display *xnestDisplay = NULL;
XVisualInfo *xnestVisuals; XVisualInfo *xnestVisuals;
int xnestNumVisuals; int xnestNumVisuals;
int xnestDefaultVisualIndex;
Colormap *xnestDefaultColormaps; Colormap *xnestDefaultColormaps;
static uint16_t xnestNumDefaultColormaps; static uint16_t xnestNumDefaultColormaps;
int xnestNumPixmapFormats; int xnestNumPixmapFormats;
@ -90,29 +89,6 @@ xnestOpenDisplay(int argc, char *argv[])
if (xnestNumVisuals == 0 || xnestVisuals == NULL) if (xnestNumVisuals == 0 || xnestVisuals == NULL)
FatalError("Unable to find any visuals.\n"); FatalError("Unable to find any visuals.\n");
if (xnestUserDefaultClass || xnestUserDefaultDepth) {
xnestDefaultVisualIndex = UNDEFINED;
for (i = 0; i < xnestNumVisuals; i++)
if ((!xnestUserDefaultClass ||
xnestVisuals[i].class == xnestDefaultClass)
&&
(!xnestUserDefaultDepth ||
xnestVisuals[i].depth == xnestDefaultDepth)) {
xnestDefaultVisualIndex = i;
break;
}
if (xnestDefaultVisualIndex == UNDEFINED)
FatalError("Unable to find desired default visual.\n");
}
else {
vi.visualid = XVisualIDFromVisual(DefaultVisual(xnestDisplay,
xnestUpstreamInfo.screenId));
xnestDefaultVisualIndex = 0;
for (i = 0; i < xnestNumVisuals; i++)
if (vi.visualid == xnestVisuals[i].visualid)
xnestDefaultVisualIndex = i;
}
xnestNumDefaultColormaps = xnestNumVisuals; xnestNumDefaultColormaps = xnestNumVisuals;
xnestDefaultColormaps = calloc(xnestNumDefaultColormaps, xnestDefaultColormaps = calloc(xnestNumDefaultColormaps,
sizeof(Colormap)); sizeof(Colormap));

View File

@ -27,7 +27,6 @@ is" without express or implied warranty.
extern Display *xnestDisplay; extern Display *xnestDisplay;
extern XVisualInfo *xnestVisuals; extern XVisualInfo *xnestVisuals;
extern int xnestNumVisuals; extern int xnestNumVisuals;
extern int xnestDefaultVisualIndex;
extern Colormap *xnestDefaultColormaps; extern Colormap *xnestDefaultColormaps;
extern int xnestNumDefaultClormaps; extern int xnestNumDefaultClormaps;
extern int xnestNumPixmapFormats; extern int xnestNumPixmapFormats;

View File

@ -167,10 +167,6 @@ static int add_depth_visual(DepthPtr depths, int numDepths, int nplanes, VisualI
Bool Bool
xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[]) xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
{ {
VisualPtr visuals;
DepthPtr depths;
int numVisuals, numDepths;
int i, j;
unsigned long valuemask; unsigned long valuemask;
VisualID defaultVisual; VisualID defaultVisual;
int rootDepth; int rootDepth;
@ -196,76 +192,91 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
PRIVATE_CURSOR, 0)) PRIVATE_CURSOR, 0))
return FALSE; return FALSE;
if (!(visuals = calloc(xnestNumVisuals, sizeof(VisualRec)))) int numVisuals = 0;
return FALSE; VisualPtr visuals = calloc(1, sizeof(VisualRec));
numVisuals = 0; int numDepths = 1;
DepthPtr depths = calloc(MAXDEPTH, sizeof(DepthRec));
if (!visuals || !depths) {
free(visuals);
free(depths);
return FALSE;
}
depths = calloc(MAXDEPTH, sizeof(DepthRec));
depths[0].depth = 1; depths[0].depth = 1;
depths[0].numVids = 0; depths[0].numVids = 0;
depths[0].vids = calloc(MAXVISUALSPERDEPTH, sizeof(VisualID)); depths[0].vids = calloc(MAXVISUALSPERDEPTH, sizeof(VisualID));
numDepths = 1;
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); for (int j = 0; j < numVisuals; j++) {
visuals[numVisuals].offsetGreen = offset(xnestVisuals[i].green_mask); if (vts[x]._class == visuals[j].class &&
visuals[numVisuals].offsetBlue = offset(xnestVisuals[i].blue_mask); vts[x].bits_per_rgb_value == visuals[j].bitsPerRGBValue &&
vts[x].colormap_entries == visuals[j].ColormapEntries &&
depth_iter.data->depth == visuals[j].nplanes &&
vts[x].red_mask == visuals[j].redMask &&
vts[x].green_mask == visuals[j].greenMask &&
vts[x].blue_mask == visuals[j].blueMask &&
offset(vts[x].red_mask) == visuals[j].offsetRed &&
offset(vts[x].green_mask) == visuals[j].offsetGreen &&
offset(vts[x].blue_mask) == visuals[j].offsetBlue)
goto breakout;
}
/* Check for and remove duplicates. */ visuals[numVisuals] = (VisualRec) {
for (j = 0; j < numVisuals; j++) { .class = vts[x]._class,
if (visuals[numVisuals].class == visuals[j].class && .bitsPerRGBValue = vts[x].bits_per_rgb_value,
visuals[numVisuals].bitsPerRGBValue == .ColormapEntries = vts[x].colormap_entries,
visuals[j].bitsPerRGBValue && .nplanes = depth_iter.data->depth,
visuals[numVisuals].ColormapEntries == .redMask = vts[x].red_mask,
visuals[j].ColormapEntries && .greenMask = vts[x].green_mask,
visuals[numVisuals].nplanes == visuals[j].nplanes && .blueMask = vts[x].blue_mask,
visuals[numVisuals].redMask == visuals[j].redMask && .offsetRed = offset(vts[x].red_mask),
visuals[numVisuals].greenMask == visuals[j].greenMask && .offsetGreen = offset(vts[x].green_mask),
visuals[numVisuals].blueMask == visuals[j].blueMask && .offsetBlue = offset(vts[x].blue_mask),
visuals[numVisuals].offsetRed == visuals[j].offsetRed && .vid = FakeClientID(0),
visuals[numVisuals].offsetGreen == visuals[j].offsetGreen && };
visuals[numVisuals].offsetBlue == visuals[j].offsetBlue)
break;
}
if (j < numVisuals)
break;
visuals[numVisuals].vid = FakeClientID(0); numDepths = add_depth_visual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid);
numDepths = add_depth_visual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid); if (xnestUserDefaultClass || xnestUserDefaultDepth) {
if ((!xnestDefaultClass || visuals[numVisuals].class == xnestDefaultClass) &&
if (xnestUserDefaultClass || xnestUserDefaultDepth) { (!xnestDefaultDepth || visuals[numVisuals].nplanes == xnestDefaultDepth))
if ((!xnestDefaultClass || visuals[numVisuals].class == xnestDefaultClass) && {
(!xnestDefaultDepth || visuals[numVisuals].nplanes == xnestDefaultDepth)) defaultVisual = visuals[numVisuals].vid;
rootDepth = visuals[numVisuals].nplanes;
found_default_visual = 1;
}
}
else
{ {
defaultVisual = visuals[numVisuals].vid; VisualID visual_id = xnestUpstreamInfo.screenInfo->root_visual;
rootDepth = visuals[numVisuals].nplanes; if (visual_id == vts[x].visual_id) {
found_default_visual = 1; defaultVisual = visuals[numVisuals].vid;
rootDepth = visuals[numVisuals].nplanes;
found_default_visual = 1;
}
} }
numVisuals++;
visuals = reallocarray(visuals, numVisuals+1, sizeof(VisualRec));
} }
else
{
VisualID visual_id = xnestUpstreamInfo.screenInfo->root_visual;
if (visual_id == xnestVisuals[i].visualid) {
defaultVisual = visuals[numVisuals].vid;
rootDepth = visuals[numVisuals].nplanes;
found_default_visual = 1;
}
}
numVisuals++;
} }
breakout:
visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec)); visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec));
defaultVisual = visuals[xnestDefaultVisualIndex].vid; if (!found_default_visual) {
rootDepth = visuals[xnestDefaultVisualIndex].nplanes; ErrorF("Xnest: can't find matching visual for user specified depth %d\n", xnestDefaultDepth);
defaultVisual = visuals[0].vid;
rootDepth = visuals[0].nplanes;
}
if (xnestParentWindow != 0) { if (xnestParentWindow != 0) {
xRectangle r = xnest_get_geometry(xnestUpstreamInfo.conn, xnestParentWindow); xRectangle r = xnest_get_geometry(xnestUpstreamInfo.conn, xnestParentWindow);