With this patch, one can set explicitly an authorization file for "nested" video driver in xorg.conf section "Device". It also removes member displayName from NestedPrivate struct, replacing it with DISPLAY environment variable wherever it's needed.
Example: Section "Device" Identifier "Nested virtual video device" Driver "nested" Option "Display" ":0" Option "Xauthority" "/var/run/Xauthority/:0" EndSection If no such an option is defined in xorg.conf, the value defined in environment variable XAUTHORITY will be used, as before. Signed-off-by: Laércio de Sousa <laercioso...@sme-mogidascruzes.sp.gov.br> --- src/client.h | 3 +-- src/driver.c | 39 +++++++++++++++++++++++---------------- src/xlibclient.c | 7 +++---- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/src/client.h b/src/client.h index a066ea8..7f46844 100644 --- a/src/client.h +++ b/src/client.h @@ -39,12 +39,11 @@ struct NestedClientPrivate; typedef struct NestedClientPrivate *NestedClientPrivatePtr; -Bool NestedClientCheckDisplay(const char *displayName); +Bool NestedClientCheckDisplay(); Bool NestedClientValidDepth(int depth); NestedClientPrivatePtr NestedClientCreateScreen(int scrnIndex, - const char *displayName, int width, int height, int originX, diff --git a/src/driver.c b/src/driver.c index 2cedee0..0c2f26a 100644 --- a/src/driver.c +++ b/src/driver.c @@ -96,6 +96,7 @@ void NestedPrintMode(ScrnInfoPtr p, DisplayModePtr m); typedef enum { OPTION_DISPLAY, + OPTION_XAUTHORITY, OPTION_ORIGIN } NestedOpts; @@ -112,9 +113,10 @@ static SymTabRec NestedChipsets[] = { * port NestedClient to something that's not Xlib/Xcb we might need to add some * custom options */ static OptionInfoRec NestedOptions[] = { - { OPTION_DISPLAY, "Display", OPTV_STRING, {0}, FALSE }, - { OPTION_ORIGIN, "Origin", OPTV_STRING, {0}, FALSE }, - { -1, NULL, OPTV_NONE, {0}, FALSE } + { OPTION_DISPLAY, "Display", OPTV_STRING, {0}, FALSE }, + { OPTION_XAUTHORITY, "Xauthority", OPTV_STRING, {0}, FALSE }, + { OPTION_ORIGIN, "Origin", OPTV_STRING, {0}, FALSE }, + { -1, NULL, OPTV_NONE, {0}, FALSE } }; _X_EXPORT DriverRec NESTED = { @@ -163,7 +165,6 @@ _X_EXPORT XF86ModuleData nestedModuleData = { /* These stuff should be valid to all server generations */ typedef struct NestedPrivate { - const char *displayName; int originX; int originY; NestedClientPrivatePtr clientData; @@ -304,6 +305,7 @@ static void NestedFreePrivate(ScrnInfoPtr pScrn) { /* Data from here is valid to all server generations */ static Bool NestedPreInit(ScrnInfoPtr pScrn, int flags) { NestedPrivatePtr pNested; + const char *displayName = getenv("DISPLAY"); const char *originString = NULL; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "NestedPreInit\n"); @@ -317,6 +319,8 @@ static Bool NestedPreInit(ScrnInfoPtr pScrn, int flags) { } pNested = PNESTED(pScrn); + pNested->originX = 0; + pNested->originY = 0; if (!xf86SetDepthBpp(pScrn, 0, 0, 0, Support24bppFb | Support32bppFb)) return FALSE; @@ -339,34 +343,38 @@ static Bool NestedPreInit(ScrnInfoPtr pScrn, int flags) { xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, NestedOptions); if (xf86IsOptionSet(NestedOptions, OPTION_DISPLAY)) { - pNested->displayName = xf86GetOptValString(NestedOptions, - OPTION_DISPLAY); + displayName = xf86GetOptValString(NestedOptions, + OPTION_DISPLAY); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using display \"%s\"\n", - pNested->displayName); - } else { - pNested->displayName = NULL; + displayName); + setenv("DISPLAY", displayName, 1); + } + + if (xf86IsOptionSet(NestedOptions, OPTION_XAUTHORITY)) { + setenv("XAUTHORITY", + xf86GetOptValString(NestedOptions, + OPTION_XAUTHORITY), 1); } if (xf86IsOptionSet(NestedOptions, OPTION_ORIGIN)) { originString = xf86GetOptValString(NestedOptions, OPTION_ORIGIN); + if (sscanf(originString, "%d %d", &pNested->originX, - &pNested->originY) != 2) { + &pNested->originY) != 2) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Invalid value for option \"Origin\"\n"); return FALSE; } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using origin x:%d y:%d\n", pNested->originX, pNested->originY); - } else { - pNested->originX = 0; - pNested->originY = 0; } xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); - if (!NestedClientCheckDisplay(pNested->displayName)) { + if (!NestedClientCheckDisplay()) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Can't open display: %s\n", - pNested->displayName); + displayName); return FALSE; } @@ -562,7 +570,6 @@ static Bool NestedScreenInit(SCREEN_INIT_ARGS_DECL) //Load_Nested_Mouse(); pNested->clientData = NestedClientCreateScreen(pScrn->scrnIndex, - pNested->displayName, pScrn->virtualX, pScrn->virtualY, pNested->originX, diff --git a/src/xlibclient.c b/src/xlibclient.c index a1fa39a..c5aaf96 100644 --- a/src/xlibclient.c +++ b/src/xlibclient.c @@ -79,10 +79,10 @@ struct NestedClientPrivate { /* Checks if a display is open */ Bool -NestedClientCheckDisplay(const char *displayName) { +NestedClientCheckDisplay() { Display *d; - d = XOpenDisplay(displayName); + d = XOpenDisplay(NULL); if (!d) { return FALSE; } else { @@ -160,7 +160,6 @@ NestedClientTryXShm(NestedClientPrivatePtr pPriv, int scrnIndex, int width, int NestedClientPrivatePtr NestedClientCreateScreen(int scrnIndex, - const char *displayName, int width, int height, int originX, @@ -178,7 +177,7 @@ NestedClientCreateScreen(int scrnIndex, pPriv = malloc(sizeof(struct NestedClientPrivate)); pPriv->scrnIndex = scrnIndex; - pPriv->display = XOpenDisplay(displayName); + pPriv->display = XOpenDisplay(NULL); if (!pPriv->display) return NULL; -- 2.1.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel