(!1654) 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:
		
							parent
							
								
									a38fc83799
								
							
						
					
					
						commit
						47e352dbe8
					
				| 
						 | 
					@ -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 = xallocarray(xnestNumDefaultColormaps,
 | 
					    xnestDefaultColormaps = xallocarray(xnestNumDefaultColormaps,
 | 
				
			||||||
                                        sizeof(Colormap));
 | 
					                                        sizeof(Colormap));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,10 +169,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;
 | 
				
			||||||
| 
						 | 
					@ -198,48 +194,57 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
 | 
				
			||||||
                                     PRIVATE_CURSOR, 0))
 | 
					                                     PRIVATE_CURSOR, 0))
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    visuals = xallocarray(xnestNumVisuals, sizeof(VisualRec));
 | 
					    int numVisuals = 0;
 | 
				
			||||||
    numVisuals = 0;
 | 
					    VisualPtr visuals = calloc(1, sizeof(VisualRec));
 | 
				
			||||||
 | 
					    int numDepths = 1;
 | 
				
			||||||
 | 
					    DepthPtr depths = calloc(MAXDEPTH, sizeof(DepthRec));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!visuals || !depths) {
 | 
				
			||||||
 | 
					        free(visuals);
 | 
				
			||||||
 | 
					        free(depths);
 | 
				
			||||||
 | 
					        return FALSE;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    depths = (DepthPtr) malloc(MAXDEPTH * sizeof(DepthRec));
 | 
					 | 
				
			||||||
    depths[0].depth = 1;
 | 
					    depths[0].depth = 1;
 | 
				
			||||||
    depths[0].numVids = 0;
 | 
					    depths[0].numVids = 0;
 | 
				
			||||||
    depths[0].vids = (VisualID *) malloc(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 &&
 | 
				
			||||||
        /* Check for and remove duplicates. */
 | 
					                    depth_iter.data->depth == visuals[j].nplanes &&
 | 
				
			||||||
        for (j = 0; j < numVisuals; j++) {
 | 
					                    vts[x].red_mask == visuals[j].redMask &&
 | 
				
			||||||
            if (visuals[numVisuals].class == visuals[j].class &&
 | 
					                    vts[x].green_mask == visuals[j].greenMask &&
 | 
				
			||||||
                visuals[numVisuals].bitsPerRGBValue ==
 | 
					                    vts[x].blue_mask == visuals[j].blueMask &&
 | 
				
			||||||
                visuals[j].bitsPerRGBValue &&
 | 
					                    offset(vts[x].red_mask) == visuals[j].offsetRed &&
 | 
				
			||||||
                visuals[numVisuals].ColormapEntries ==
 | 
					                    offset(vts[x].green_mask) == visuals[j].offsetGreen &&
 | 
				
			||||||
                visuals[j].ColormapEntries &&
 | 
					                    offset(vts[x].blue_mask) == visuals[j].offsetBlue)
 | 
				
			||||||
                visuals[numVisuals].nplanes == visuals[j].nplanes &&
 | 
					                        goto breakout;
 | 
				
			||||||
                visuals[numVisuals].redMask == visuals[j].redMask &&
 | 
					 | 
				
			||||||
                visuals[numVisuals].greenMask == visuals[j].greenMask &&
 | 
					 | 
				
			||||||
                visuals[numVisuals].blueMask == visuals[j].blueMask &&
 | 
					 | 
				
			||||||
                visuals[numVisuals].offsetRed == visuals[j].offsetRed &&
 | 
					 | 
				
			||||||
                visuals[numVisuals].offsetGreen == visuals[j].offsetGreen &&
 | 
					 | 
				
			||||||
                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 = add_depth_visual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid);
 | 
					            numDepths = add_depth_visual(depths, numDepths, visuals[numVisuals].nplanes, visuals[numVisuals].vid);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -255,18 +260,25 @@ 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));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue