dix: adds support for none root window background
It lets the driver notify the server whether it can draw a background when '-background none' option is used by the system platform. Use cases for that could be video drivers performing mode-setting in kernel time, before X is up, so a seamless transition would happen until X clients start to show up. If the driver can copy the framebuffer cleanly then it can set the flag (canDoBGNoneRoot), otherwise the server will fallback to the normal behaviour. The system must explicit indicates willingness of doing so through '-background none'. We could do this option as default; in such case, malicious users would be able to steal the framebuffer with a bit of tricks. For instance, I can see the content of my nVidia Quadro FX 580 framebuffer old X session modifying a bit nv driver: xf86DPMSInit(pScreen, xf86DPMSSet, 0); - /* Clear the screen */ - if(pNv->xaa) { - /* Use the acceleration engine */ - pNv->xaa->SetupForSolidFill(pScrn, 0, GXcopy, ~0); - pNv->xaa->SubsequentSolidFillRect(pScrn, - 0, 0, pScrn->displayWidth, pNv->offscreenHeight); - G80DmaKickoff(pNv); - } else { - /* Use a slow software clear path */ - memset(pNv->mem, 0, pitch * pNv->offscreenHeight); - } + pScreen->canDoBGNoneRoot = TRUE; The commit is originally based on discussions happened on xorg-devel: http://lists.freedesktop.org/archives/xorg-devel/2010-June/009755.html Signed-off-by: Tiago Vignatti <tiago.vignatti@nokia.com> Reviewed-by: Rami Ylimäki <rami.ylimaki@vincit.fi> Acked-by: Pauli Nieminen <ext-pauli.nieminen@nokia.com> Reviewed-by: Daniel Stone <daniel@fooishbar.org>
This commit is contained in:
parent
bfe9cdd11b
commit
8976e9766e
@ -137,6 +137,8 @@ Equipment Corporation.
|
|||||||
* ChangeWindowDeviceCursor
|
* ChangeWindowDeviceCursor
|
||||||
******/
|
******/
|
||||||
|
|
||||||
|
Bool bgNoneRoot = FALSE;
|
||||||
|
|
||||||
static unsigned char _back_lsb[4] = {0x88, 0x22, 0x44, 0x11};
|
static unsigned char _back_lsb[4] = {0x88, 0x22, 0x44, 0x11};
|
||||||
static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88};
|
static unsigned char _back_msb[4] = {0x11, 0x44, 0x22, 0x88};
|
||||||
|
|
||||||
@ -463,6 +465,10 @@ InitRootWindow(WindowPtr pWin)
|
|||||||
if (party_like_its_1989) {
|
if (party_like_its_1989) {
|
||||||
MakeRootTile(pWin);
|
MakeRootTile(pWin);
|
||||||
backFlag |= CWBackPixmap;
|
backFlag |= CWBackPixmap;
|
||||||
|
} else if (pScreen->canDoBGNoneRoot && bgNoneRoot) {
|
||||||
|
pWin->backgroundState = XaceBackgroundNoneState(pWin);
|
||||||
|
pWin->background.pixel = pScreen->whitePixel;
|
||||||
|
backFlag |= CWBackPixmap;
|
||||||
} else {
|
} else {
|
||||||
if (whiteRoot)
|
if (whiteRoot)
|
||||||
pWin->background.pixel = pScreen->whitePixel;
|
pWin->background.pixel = pScreen->whitePixel;
|
||||||
|
@ -69,6 +69,7 @@ extern _X_EXPORT Bool defeatAccessControl;
|
|||||||
extern _X_EXPORT long maxBigRequestSize;
|
extern _X_EXPORT long maxBigRequestSize;
|
||||||
extern _X_EXPORT Bool party_like_its_1989;
|
extern _X_EXPORT Bool party_like_its_1989;
|
||||||
extern _X_EXPORT Bool whiteRoot;
|
extern _X_EXPORT Bool whiteRoot;
|
||||||
|
extern _X_EXPORT Bool bgNoneRoot;
|
||||||
|
|
||||||
extern _X_EXPORT Bool CoreDump;
|
extern _X_EXPORT Bool CoreDump;
|
||||||
|
|
||||||
|
@ -601,6 +601,12 @@ typedef struct _Screen {
|
|||||||
/* Device cursor procedures */
|
/* Device cursor procedures */
|
||||||
DeviceCursorInitializeProcPtr DeviceCursorInitialize;
|
DeviceCursorInitializeProcPtr DeviceCursorInitialize;
|
||||||
DeviceCursorCleanupProcPtr DeviceCursorCleanup;
|
DeviceCursorCleanupProcPtr DeviceCursorCleanup;
|
||||||
|
|
||||||
|
/* set it in driver side if X server can copy the framebuffer content.
|
||||||
|
* Meant to be used together with '-background none' option, avoiding
|
||||||
|
* malicious users to steal framebuffer's content if that would be the
|
||||||
|
* default */
|
||||||
|
Bool canDoBGNoneRoot;
|
||||||
} ScreenRec;
|
} ScreenRec;
|
||||||
|
|
||||||
static inline RegionPtr BitmapToRegion(ScreenPtr _pScreen, PixmapPtr pPix) {
|
static inline RegionPtr BitmapToRegion(ScreenPtr _pScreen, PixmapPtr pPix) {
|
||||||
|
@ -498,6 +498,7 @@ void UseMsg(void)
|
|||||||
ErrorF("-nolock disable the locking mechanism\n");
|
ErrorF("-nolock disable the locking mechanism\n");
|
||||||
ErrorF("-nolisten string don't listen on protocol\n");
|
ErrorF("-nolisten string don't listen on protocol\n");
|
||||||
ErrorF("-noreset don't reset after last client exists\n");
|
ErrorF("-noreset don't reset after last client exists\n");
|
||||||
|
ErrorF("-background [none] create root window with no background\n");
|
||||||
ErrorF("-reset reset after last client exists\n");
|
ErrorF("-reset reset after last client exists\n");
|
||||||
ErrorF("-p # screen-saver pattern duration (minutes)\n");
|
ErrorF("-p # screen-saver pattern duration (minutes)\n");
|
||||||
ErrorF("-pn accept failure to listen on all ports\n");
|
ErrorF("-pn accept failure to listen on all ports\n");
|
||||||
@ -828,6 +829,14 @@ ProcessCommandLine(int argc, char *argv[])
|
|||||||
defaultBackingStore = WhenMapped;
|
defaultBackingStore = WhenMapped;
|
||||||
else if ( strcmp( argv[i], "-wr") == 0)
|
else if ( strcmp( argv[i], "-wr") == 0)
|
||||||
whiteRoot = TRUE;
|
whiteRoot = TRUE;
|
||||||
|
else if ( strcmp( argv[i], "-background") == 0) {
|
||||||
|
if(++i < argc) {
|
||||||
|
if (!strcmp ( argv[i], "none"))
|
||||||
|
bgNoneRoot = TRUE;
|
||||||
|
else
|
||||||
|
UseMsg();
|
||||||
|
}
|
||||||
|
}
|
||||||
else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
|
else if ( strcmp( argv[i], "-maxbigreqsize") == 0) {
|
||||||
if(++i < argc) {
|
if(++i < argc) {
|
||||||
long reqSizeArg = atol(argv[i]);
|
long reqSizeArg = atol(argv[i]);
|
||||||
|
Loading…
Reference in New Issue
Block a user