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:
parent
822b82d831
commit
6977718454
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue