Xnest: screen: record visuals and cmaps in separate table

Record the associations between host's and our visuals as well their
corresponding cmaps in a global table, which's used later for lookups.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-08-15 17:48:50 +02:00
parent 822b82d831
commit 6977718454
4 changed files with 38 additions and 0 deletions

View File

@ -180,6 +180,9 @@ xnestCloseDisplay(void)
If xnestDoFullGeneration all x resources will be destroyed upon closing If xnestDoFullGeneration all x resources will be destroyed upon closing
the display connection. There is no need to generate extra protocol. the display connection. There is no need to generate extra protocol.
*/ */
free(xnestVisualMap);
xnestVisualMap = NULL;
xnestNumVisualMap = 0;
free(xnestDefaultColormaps); free(xnestDefaultColormaps);
XFree(xnestVisuals); XFree(xnestVisuals);

View File

@ -203,6 +203,11 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
return FALSE; return FALSE;
} }
if (!xnestVisualMap)
xnestVisualMap = calloc(1, sizeof(xnest_visual_t));
else
xnestVisualMap = reallocarray(xnestVisualMap, xnestNumVisualMap+1, sizeof(xnest_visual_t));
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));
@ -244,6 +249,20 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
.vid = FakeClientID(0), .vid = FakeClientID(0),
}; };
xnestVisualMap[xnestNumVisualMap] = (xnest_visual_t) {
.ourXID = visuals[numVisuals].vid,
.ourVisual = &visuals[numVisuals],
.upstreamDepth = depth_iter.data,
.upstreamVisual = &vts[x],
.upstreamCMap = xcb_generate_id(xnestUpstreamInfo.conn),
};
xcb_create_colormap(xnestUpstreamInfo.conn,
XCB_COLORMAP_ALLOC_NONE,
xnestVisualMap[xnestNumVisualMap].upstreamCMap,
xnestUpstreamInfo.screenInfo->root,
xnestVisualMap[xnestNumVisualMap].upstreamVisual->visual_id);
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 (xnestUserDefaultClass || xnestUserDefaultDepth) {
@ -266,11 +285,14 @@ xnestOpenScreen(ScreenPtr pScreen, int argc, char *argv[])
} }
numVisuals++; numVisuals++;
xnestNumVisualMap++;
visuals = reallocarray(visuals, numVisuals+1, sizeof(VisualRec)); visuals = reallocarray(visuals, numVisuals+1, sizeof(VisualRec));
xnestVisualMap = reallocarray(xnestVisualMap, xnestNumVisualMap+1, sizeof(xnest_visual_t));
} }
} }
breakout: breakout:
visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec)); visuals = reallocarray(visuals, numVisuals, sizeof(VisualRec));
xnestVisualMap = reallocarray(xnestVisualMap, xnestNumVisualMap, sizeof(xnest_visual_t));
if (!found_default_visual) { if (!found_default_visual) {
ErrorF("Xnest: can't find matching visual for user specified depth %d\n", xnestDefaultDepth); ErrorF("Xnest: can't find matching visual for user specified depth %d\n", xnestDefaultDepth);

View File

@ -24,6 +24,8 @@
#include "Display.h" #include "Display.h"
struct xnest_upstream_info xnestUpstreamInfo = { 0 }; struct xnest_upstream_info xnestUpstreamInfo = { 0 };
xnest_visual_t *xnestVisualMap;
int xnestNumVisualMap;
void xnest_upstream_setup(void) { void xnest_upstream_setup(void) {
xnestUpstreamInfo.screenId = DefaultScreen(xnestDisplay); xnestUpstreamInfo.screenId = DefaultScreen(xnestDisplay);

View File

@ -22,6 +22,17 @@ void xnest_upstream_setup(void);
/* retrieve upstream GC XID for our xserver GC */ /* retrieve upstream GC XID for our xserver GC */
uint32_t xnest_upstream_gc(GCPtr pGC); uint32_t xnest_upstream_gc(GCPtr pGC);
typedef struct {
xcb_visualtype_t *upstreamVisual;
xcb_depth_t *upstreamDepth;
xcb_colormap_t upstreamCMap;
uint32_t ourXID;
VisualPtr ourVisual;
} xnest_visual_t;
extern xnest_visual_t *xnestVisualMap;
extern int xnestNumVisualMap;
void xnest_wm_colormap_windows(xcb_connection_t *conn, xcb_window_t w, void xnest_wm_colormap_windows(xcb_connection_t *conn, xcb_window_t w,
xcb_window_t *windows, int count); xcb_window_t *windows, int count);