? randr/Makefile Index: randr/randr.c =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/randr/randr.c,v retrieving revision 1.2 diff -u -r1.2 randr.c --- randr/randr.c 23 Apr 2004 19:54:28 -0000 1.2 +++ randr/randr.c 21 Jun 2004 14:05:27 -0000 @@ -719,7 +719,7 @@ pScreen = pDraw->pScreen; - pScrPriv= rrGetScrPriv(pScreen); + pScrPriv = rrGetScrPriv(pScreen); time = ClientTimeToServerTime(stuff->timestamp); configTime = ClientTimeToServerTime(stuff->configTimestamp); @@ -900,6 +900,109 @@ return (client->noClientException); } +int +RRSetScreenConfig (ScreenPtr pScreen, + Rotation rotation, + int rate, + RRScreenSizePtr pSize) +{ + rrScrPrivPtr pScrPriv; + int i; + short oldWidth, oldHeight; + + pScrPriv = rrGetScrPriv(pScreen); + + oldWidth = pScreen->width; + oldHeight = pScreen->height; + + if (!RRGetInfo (pScreen)) + return BadAlloc; + + /* + * Validate requested rotation + */ + + /* test the rotation bits only! */ + switch (rotation & 0xf) { + case RR_Rotate_0: + case RR_Rotate_90: + case RR_Rotate_180: + case RR_Rotate_270: + break; + default: + /* + * Invalid rotation + */ + return BadValue; + } + + if ((~pScrPriv->rotations) & rotation) + { + /* + * requested rotation or reflection not supported by screen + */ + return BadMatch; + } + + /* + * Validate requested refresh + */ + if (rate) + { + for (i = 0; i < pSize->nRates; i++) + { + RRScreenRatePtr pRate = &pSize->pRates[i]; + if (pRate->referenced && pRate->rate == rate) + break; + } + if (i == pSize->nRates) + { + /* + * Invalid rate + */ + return BadValue; + } + } + + /* + * call out to ddx routine to effect the change + */ + if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate, + pSize)) + { + /* + * unknown DDX failure, report to client + */ + return BadImplementation; + } + + /* + * set current extension configuration pointers + */ + RRSetCurrentConfig (pScreen, rotation, rate, pSize); + + /* + * Deliver ScreenChangeNotify events whenever + * the configuration is updated + */ + WalkTree (pScreen, TellChanged, (pointer) pScreen); + + /* + * Deliver ConfigureNotify events when root changes + * pixel size + */ + if (oldWidth != pScreen->width || oldHeight != pScreen->height) + RRSendConfigNotify (pScreen); + RREditConnectionInfo (pScreen); + + /* + * Fix pointer bounds and location + */ + ScreenRestructured (pScreen); + + return Success; +} + static int ProcRRSelectInput (ClientPtr client) { Index: randr/randrstr.h =================================================================== RCS file: /cvs/xorg/xc/programs/Xserver/randr/randrstr.h,v retrieving revision 1.2 diff -u -r1.2 randrstr.h --- randr/randrstr.h 23 Apr 2004 19:54:28 -0000 1.2 +++ randr/randrstr.h 21 Jun 2004 14:05:27 -0000 @@ -113,7 +113,13 @@ RRScreenSizePtr pSize); Bool RRScreenInit(ScreenPtr pScreen); - + +int +RRSetScreenConfig (ScreenPtr pScreen, + Rotation rotation, + int rate, + RRScreenSizePtr pSize); + Bool miRandRInit (ScreenPtr pScreen);