2135 lines
		
	
	
		
			66 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			2135 lines
		
	
	
		
			66 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
| 
 | |
| Copyright 1995  Kaleb S. KEITHLEY
 | |
| 
 | |
| Permission is hereby granted, free of charge, to any person obtaining
 | |
| a copy of this software and associated documentation files (the
 | |
| "Software"), to deal in the Software without restriction, including
 | |
| without limitation the rights to use, copy, modify, merge, publish,
 | |
| distribute, sublicense, and/or sell copies of the Software, and to
 | |
| permit persons to whom the Software is furnished to do so, subject to
 | |
| the following conditions:
 | |
| 
 | |
| The above copyright notice and this permission notice shall be
 | |
| included in all copies or substantial portions of the Software.
 | |
| 
 | |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 | |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | |
| IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES
 | |
| OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 | |
| ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 | |
| OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
| Except as contained in this notice, the name of Kaleb S. KEITHLEY
 | |
| shall not be used in advertising or otherwise to promote the sale, use
 | |
| or other dealings in this Software without prior written authorization
 | |
| from Kaleb S. KEITHLEY
 | |
| 
 | |
| */
 | |
| /* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */
 | |
| 
 | |
| #include <dix-config.h>
 | |
| 
 | |
| #ifdef XF86VIDMODE
 | |
| 
 | |
| #include <X11/X.h>
 | |
| #include <X11/Xproto.h>
 | |
| #include <X11/extensions/xf86vmproto.h>
 | |
| #include "misc.h"
 | |
| #include "dixstruct.h"
 | |
| #include "extnsionst.h"
 | |
| #include "scrnintstr.h"
 | |
| #include "servermd.h"
 | |
| #include "swaprep.h"
 | |
| #include "vidmodestr.h"
 | |
| #include "globals.h"
 | |
| #include "protocol-versions.h"
 | |
| 
 | |
| static int VidModeErrorBase;
 | |
| static int VidModeAllowNonLocal;
 | |
| 
 | |
| static DevPrivateKeyRec VidModeClientPrivateKeyRec;
 | |
| #define VidModeClientPrivateKey (&VidModeClientPrivateKeyRec)
 | |
| 
 | |
| static DevPrivateKeyRec VidModePrivateKeyRec;
 | |
| #define VidModePrivateKey (&VidModePrivateKeyRec)
 | |
| 
 | |
| /* This holds the client's version information */
 | |
| typedef struct {
 | |
|     int major;
 | |
|     int minor;
 | |
| } VidModePrivRec, *VidModePrivPtr;
 | |
| 
 | |
| #define VM_GETPRIV(c) ((VidModePrivPtr) \
 | |
|     dixLookupPrivate(&(c)->devPrivates, VidModeClientPrivateKey))
 | |
| #define VM_SETPRIV(c,p) \
 | |
|     dixSetPrivate(&(c)->devPrivates, VidModeClientPrivateKey, p)
 | |
| 
 | |
| #ifdef DEBUG
 | |
| #define DEBUG_P(x) DebugF(x"\n")
 | |
| #else
 | |
| #define DEBUG_P(x) /**/
 | |
| #endif
 | |
| 
 | |
| static DisplayModePtr
 | |
| VidModeCreateMode(void)
 | |
| {
 | |
|     DisplayModePtr mode;
 | |
| 
 | |
|     mode = malloc(sizeof(DisplayModeRec));
 | |
|     if (mode != NULL) {
 | |
|         mode->name = "";
 | |
|         mode->VScan = 1;        /* divides refresh rate. default = 1 */
 | |
|         mode->Private = NULL;
 | |
|         mode->next = mode;
 | |
|         mode->prev = mode;
 | |
|     }
 | |
|     return mode;
 | |
| }
 | |
| 
 | |
| static void
 | |
| VidModeCopyMode(DisplayModePtr modefrom, DisplayModePtr modeto)
 | |
| {
 | |
|     memcpy(modeto, modefrom, sizeof(DisplayModeRec));
 | |
| }
 | |
| 
 | |
| static int
 | |
| VidModeGetModeValue(DisplayModePtr mode, int valtyp)
 | |
| {
 | |
|     int ret = 0;
 | |
| 
 | |
|     switch (valtyp) {
 | |
|     case VIDMODE_H_DISPLAY:
 | |
|         ret = mode->HDisplay;
 | |
|         break;
 | |
|     case VIDMODE_H_SYNCSTART:
 | |
|         ret = mode->HSyncStart;
 | |
|         break;
 | |
|     case VIDMODE_H_SYNCEND:
 | |
|         ret = mode->HSyncEnd;
 | |
|         break;
 | |
|     case VIDMODE_H_TOTAL:
 | |
|         ret = mode->HTotal;
 | |
|         break;
 | |
|     case VIDMODE_H_SKEW:
 | |
|         ret = mode->HSkew;
 | |
|         break;
 | |
|     case VIDMODE_V_DISPLAY:
 | |
|         ret = mode->VDisplay;
 | |
|         break;
 | |
|     case VIDMODE_V_SYNCSTART:
 | |
|         ret = mode->VSyncStart;
 | |
|         break;
 | |
|     case VIDMODE_V_SYNCEND:
 | |
|         ret = mode->VSyncEnd;
 | |
|         break;
 | |
|     case VIDMODE_V_TOTAL:
 | |
|         ret = mode->VTotal;
 | |
|         break;
 | |
|     case VIDMODE_FLAGS:
 | |
|         ret = mode->Flags;
 | |
|         break;
 | |
|     case VIDMODE_CLOCK:
 | |
|         ret = mode->Clock;
 | |
|         break;
 | |
|     }
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| static void
 | |
| VidModeSetModeValue(DisplayModePtr mode, int valtyp, int val)
 | |
| {
 | |
|     switch (valtyp) {
 | |
|     case VIDMODE_H_DISPLAY:
 | |
|         mode->HDisplay = val;
 | |
|         break;
 | |
|     case VIDMODE_H_SYNCSTART:
 | |
|         mode->HSyncStart = val;
 | |
|         break;
 | |
|     case VIDMODE_H_SYNCEND:
 | |
|         mode->HSyncEnd = val;
 | |
|         break;
 | |
|     case VIDMODE_H_TOTAL:
 | |
|         mode->HTotal = val;
 | |
|         break;
 | |
|     case VIDMODE_H_SKEW:
 | |
|         mode->HSkew = val;
 | |
|         break;
 | |
|     case VIDMODE_V_DISPLAY:
 | |
|         mode->VDisplay = val;
 | |
|         break;
 | |
|     case VIDMODE_V_SYNCSTART:
 | |
|         mode->VSyncStart = val;
 | |
|         break;
 | |
|     case VIDMODE_V_SYNCEND:
 | |
|         mode->VSyncEnd = val;
 | |
|         break;
 | |
|     case VIDMODE_V_TOTAL:
 | |
|         mode->VTotal = val;
 | |
|         break;
 | |
|     case VIDMODE_FLAGS:
 | |
|         mode->Flags = val;
 | |
|         break;
 | |
|     case VIDMODE_CLOCK:
 | |
|         mode->Clock = val;
 | |
|         break;
 | |
|     }
 | |
|     return;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ClientMajorVersion(ClientPtr client)
 | |
| {
 | |
|     VidModePrivPtr pPriv;
 | |
| 
 | |
|     pPriv = VM_GETPRIV(client);
 | |
|     if (!pPriv)
 | |
|         return 0;
 | |
|     else
 | |
|         return pPriv->major;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeQueryVersion(ClientPtr client)
 | |
| {
 | |
|     xXF86VidModeQueryVersionReply rep = {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = 0,
 | |
|         .majorVersion = SERVER_XF86VIDMODE_MAJOR_VERSION,
 | |
|         .minorVersion = SERVER_XF86VIDMODE_MINOR_VERSION
 | |
|     };
 | |
| 
 | |
|     DEBUG_P("XF86VidModeQueryVersion");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeQueryVersionReq);
 | |
| 
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swaps(&rep.majorVersion);
 | |
|         swaps(&rep.minorVersion);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeQueryVersionReply), &rep);
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetModeLineReq);
 | |
|     xXF86VidModeGetModeLineReply rep = {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence
 | |
|     };
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetModeline");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         rep.length = bytes_to_int32(SIZEOF(xXF86OldVidModeGetModeLineReply) -
 | |
|                                     SIZEOF(xGenericReply));
 | |
|     }
 | |
|     else {
 | |
|         rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetModeLineReply) -
 | |
|                                     SIZEOF(xGenericReply));
 | |
|     }
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     rep.dotclock = dotClock;
 | |
|     rep.hdisplay = VidModeGetModeValue(mode, VIDMODE_H_DISPLAY);
 | |
|     rep.hsyncstart = VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART);
 | |
|     rep.hsyncend = VidModeGetModeValue(mode, VIDMODE_H_SYNCEND);
 | |
|     rep.htotal = VidModeGetModeValue(mode, VIDMODE_H_TOTAL);
 | |
|     rep.hskew = VidModeGetModeValue(mode, VIDMODE_H_SKEW);
 | |
|     rep.vdisplay = VidModeGetModeValue(mode, VIDMODE_V_DISPLAY);
 | |
|     rep.vsyncstart = VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART);
 | |
|     rep.vsyncend = VidModeGetModeValue(mode, VIDMODE_V_SYNCEND);
 | |
|     rep.vtotal = VidModeGetModeValue(mode, VIDMODE_V_TOTAL);
 | |
|     rep.flags = VidModeGetModeValue(mode, VIDMODE_FLAGS);
 | |
| 
 | |
|     DebugF("GetModeLine - scrn: %d clock: %ld\n",
 | |
|            stuff->screen, (unsigned long) rep.dotclock);
 | |
|     DebugF("GetModeLine - hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            rep.hdisplay, rep.hsyncstart, rep.hsyncend, rep.htotal);
 | |
|     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            rep.vdisplay, rep.vsyncstart, rep.vsyncend,
 | |
|            rep.vtotal, (unsigned long) rep.flags);
 | |
| 
 | |
|     /*
 | |
|      * Older servers sometimes had server privates that the VidMode
 | |
|      * extension made available. So to be compatible pretend that
 | |
|      * there are no server privates to pass to the client.
 | |
|      */
 | |
|     rep.privsize = 0;
 | |
| 
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.dotclock);
 | |
|         swaps(&rep.hdisplay);
 | |
|         swaps(&rep.hsyncstart);
 | |
|         swaps(&rep.hsyncend);
 | |
|         swaps(&rep.htotal);
 | |
|         swaps(&rep.hskew);
 | |
|         swaps(&rep.vdisplay);
 | |
|         swaps(&rep.vsyncstart);
 | |
|         swaps(&rep.vsyncend);
 | |
|         swaps(&rep.vtotal);
 | |
|         swapl(&rep.flags);
 | |
|         swapl(&rep.privsize);
 | |
|     }
 | |
|     if (ver < 2) {
 | |
|         xXF86OldVidModeGetModeLineReply oldrep = {
 | |
|             .type = rep.type,
 | |
|             .sequenceNumber = rep.sequenceNumber,
 | |
|             .length = rep.length,
 | |
|             .dotclock = rep.dotclock,
 | |
|             .hdisplay = rep.hdisplay,
 | |
|             .hsyncstart = rep.hsyncstart,
 | |
|             .hsyncend = rep.hsyncend,
 | |
|             .htotal = rep.htotal,
 | |
|             .vdisplay = rep.vdisplay,
 | |
|             .vsyncstart = rep.vsyncstart,
 | |
|             .vsyncend = rep.vsyncend,
 | |
|             .vtotal = rep.vtotal,
 | |
|             .flags = rep.flags,
 | |
|             .privsize = rep.privsize
 | |
|         };
 | |
|         WriteToClient(client, sizeof(xXF86OldVidModeGetModeLineReply), &oldrep);
 | |
|     }
 | |
|     else {
 | |
|         WriteToClient(client, sizeof(xXF86VidModeGetModeLineReply), &rep);
 | |
|     }
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetAllModeLines(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetAllModeLinesReq);
 | |
|     xXF86VidModeGetAllModeLinesReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int modecount, dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetAllModelines");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
|     ver = ClientMajorVersion(client);
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     modecount = pVidMode->GetNumOfModes(pScreen);
 | |
|     if (modecount < 1)
 | |
|         return VidModeErrorBase + XF86VidModeExtensionDisabled;
 | |
| 
 | |
|     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     rep = (xXF86VidModeGetAllModeLinesReply) {
 | |
|         .type = X_Reply,
 | |
|         .length = SIZEOF(xXF86VidModeGetAllModeLinesReply) -
 | |
|             SIZEOF(xGenericReply),
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .modecount = modecount
 | |
|     };
 | |
|     if (ver < 2)
 | |
|         rep.length += modecount * sizeof(xXF86OldVidModeModeInfo);
 | |
|     else
 | |
|         rep.length += modecount * sizeof(xXF86VidModeModeInfo);
 | |
|     rep.length >>= 2;
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.modecount);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetAllModeLinesReply), &rep);
 | |
| 
 | |
|     do {
 | |
|         xXF86VidModeModeInfo mdinf = {
 | |
|             .dotclock = dotClock,
 | |
|             .hdisplay = VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
 | |
|             .hsyncstart = VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
 | |
|             .hsyncend = VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
 | |
|             .htotal = VidModeGetModeValue(mode, VIDMODE_H_TOTAL),
 | |
|             .hskew = VidModeGetModeValue(mode, VIDMODE_H_SKEW),
 | |
|             .vdisplay = VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
 | |
|             .vsyncstart = VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
 | |
|             .vsyncend = VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
 | |
|             .vtotal = VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
 | |
|             .flags = VidModeGetModeValue(mode, VIDMODE_FLAGS),
 | |
|             .privsize = 0
 | |
|         };
 | |
|         if (client->swapped) {
 | |
|             swapl(&mdinf.dotclock);
 | |
|             swaps(&mdinf.hdisplay);
 | |
|             swaps(&mdinf.hsyncstart);
 | |
|             swaps(&mdinf.hsyncend);
 | |
|             swaps(&mdinf.htotal);
 | |
|             swapl(&mdinf.hskew);
 | |
|             swaps(&mdinf.vdisplay);
 | |
|             swaps(&mdinf.vsyncstart);
 | |
|             swaps(&mdinf.vsyncend);
 | |
|             swaps(&mdinf.vtotal);
 | |
|             swapl(&mdinf.flags);
 | |
|             swapl(&mdinf.privsize);
 | |
|         }
 | |
|         if (ver < 2) {
 | |
|             xXF86OldVidModeModeInfo oldmdinf = {
 | |
|                 .dotclock = mdinf.dotclock,
 | |
|                 .hdisplay = mdinf.hdisplay,
 | |
|                 .hsyncstart = mdinf.hsyncstart,
 | |
|                 .hsyncend = mdinf.hsyncend,
 | |
|                 .htotal = mdinf.htotal,
 | |
|                 .vdisplay = mdinf.vdisplay,
 | |
|                 .vsyncstart = mdinf.vsyncstart,
 | |
|                 .vsyncend = mdinf.vsyncend,
 | |
|                 .vtotal = mdinf.vtotal,
 | |
|                 .flags = mdinf.flags,
 | |
|                 .privsize = mdinf.privsize
 | |
|             };
 | |
|             WriteToClient(client, sizeof(xXF86OldVidModeModeInfo), &oldmdinf);
 | |
|         }
 | |
|         else {
 | |
|             WriteToClient(client, sizeof(xXF86VidModeModeInfo), &mdinf);
 | |
|         }
 | |
| 
 | |
|     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| #define MODEMATCH(mode,stuff)	  \
 | |
|      (VidModeGetModeValue(mode, VIDMODE_H_DISPLAY)  == stuff->hdisplay \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART)  == stuff->hsyncstart \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_H_SYNCEND)  == stuff->hsyncend \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_H_TOTAL)  == stuff->htotal \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_V_DISPLAY)  == stuff->vdisplay \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART)  == stuff->vsyncstart \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_V_SYNCEND)  == stuff->vsyncend \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_V_TOTAL)  == stuff->vtotal \
 | |
|      && VidModeGetModeValue(mode, VIDMODE_FLAGS)  == stuff->flags )
 | |
| 
 | |
| static int
 | |
| ProcVidModeAddModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeAddModeLineReq);
 | |
|     xXF86OldVidModeAddModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeAddModeLineReq *) client->requestBuffer;
 | |
|     xXF86VidModeAddModeLineReq newstuff;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int len;
 | |
|     int dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeAddModeline");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86OldVidModeAddModeLineReq));
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86VidModeAddModeLineReq));
 | |
|     }
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         /* convert from old format */
 | |
|         stuff = &newstuff;
 | |
|         stuff->length = client->req_len;
 | |
|         stuff->screen = oldstuff->screen;
 | |
|         stuff->dotclock = oldstuff->dotclock;
 | |
|         stuff->hdisplay = oldstuff->hdisplay;
 | |
|         stuff->hsyncstart = oldstuff->hsyncstart;
 | |
|         stuff->hsyncend = oldstuff->hsyncend;
 | |
|         stuff->htotal = oldstuff->htotal;
 | |
|         stuff->hskew = 0;
 | |
|         stuff->vdisplay = oldstuff->vdisplay;
 | |
|         stuff->vsyncstart = oldstuff->vsyncstart;
 | |
|         stuff->vsyncend = oldstuff->vsyncend;
 | |
|         stuff->vtotal = oldstuff->vtotal;
 | |
|         stuff->flags = oldstuff->flags;
 | |
|         stuff->privsize = oldstuff->privsize;
 | |
|         stuff->after_dotclock = oldstuff->after_dotclock;
 | |
|         stuff->after_hdisplay = oldstuff->after_hdisplay;
 | |
|         stuff->after_hsyncstart = oldstuff->after_hsyncstart;
 | |
|         stuff->after_hsyncend = oldstuff->after_hsyncend;
 | |
|         stuff->after_htotal = oldstuff->after_htotal;
 | |
|         stuff->after_hskew = 0;
 | |
|         stuff->after_vdisplay = oldstuff->after_vdisplay;
 | |
|         stuff->after_vsyncstart = oldstuff->after_vsyncstart;
 | |
|         stuff->after_vsyncend = oldstuff->after_vsyncend;
 | |
|         stuff->after_vtotal = oldstuff->after_vtotal;
 | |
|         stuff->after_flags = oldstuff->after_flags;
 | |
|     }
 | |
|     DebugF("AddModeLine - scrn: %d clock: %ld\n",
 | |
|            (int) stuff->screen, (unsigned long) stuff->dotclock);
 | |
|     DebugF("AddModeLine - hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            stuff->hdisplay, stuff->hsyncstart,
 | |
|            stuff->hsyncend, stuff->htotal);
 | |
|     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend,
 | |
|            stuff->vtotal, (unsigned long) stuff->flags);
 | |
|     DebugF("      after - scrn: %d clock: %ld\n",
 | |
|            (int) stuff->screen, (unsigned long) stuff->after_dotclock);
 | |
|     DebugF("              hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            stuff->after_hdisplay, stuff->after_hsyncstart,
 | |
|            stuff->after_hsyncend, stuff->after_htotal);
 | |
|     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->after_vdisplay, stuff->after_vsyncstart,
 | |
|            stuff->after_vsyncend, stuff->after_vtotal,
 | |
|            (unsigned long) stuff->after_flags);
 | |
| 
 | |
|     if (len != stuff->privsize)
 | |
|         return BadLength;
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     if (stuff->hsyncstart < stuff->hdisplay ||
 | |
|         stuff->hsyncend < stuff->hsyncstart ||
 | |
|         stuff->htotal < stuff->hsyncend ||
 | |
|         stuff->vsyncstart < stuff->vdisplay ||
 | |
|         stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend)
 | |
|         return BadValue;
 | |
| 
 | |
|     if (stuff->after_hsyncstart < stuff->after_hdisplay ||
 | |
|         stuff->after_hsyncend < stuff->after_hsyncstart ||
 | |
|         stuff->after_htotal < stuff->after_hsyncend ||
 | |
|         stuff->after_vsyncstart < stuff->after_vdisplay ||
 | |
|         stuff->after_vsyncend < stuff->after_vsyncstart ||
 | |
|         stuff->after_vtotal < stuff->after_vsyncend)
 | |
|         return BadValue;
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (stuff->after_htotal != 0 || stuff->after_vtotal != 0) {
 | |
|         Bool found = FALSE;
 | |
| 
 | |
|         if (pVidMode->GetFirstModeline(pScreen, &mode, &dotClock)) {
 | |
|             do {
 | |
|                 if ((pVidMode->GetDotClock(pScreen, stuff->dotclock)
 | |
|                      == dotClock) && MODEMATCH(mode, stuff)) {
 | |
|                     found = TRUE;
 | |
|                     break;
 | |
|                 }
 | |
|             } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
 | |
|         }
 | |
|         if (!found)
 | |
|             return BadValue;
 | |
|     }
 | |
| 
 | |
|     mode = VidModeCreateMode();
 | |
|     if (mode == NULL)
 | |
|         return BadValue;
 | |
| 
 | |
|     VidModeSetModeValue(mode, VIDMODE_CLOCK, stuff->dotclock);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_DISPLAY, stuff->hdisplay);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SYNCEND, stuff->hsyncend);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_TOTAL, stuff->htotal);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SKEW, stuff->hskew);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_DISPLAY, stuff->vdisplay);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_SYNCEND, stuff->vsyncend);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_TOTAL, stuff->vtotal);
 | |
|     VidModeSetModeValue(mode, VIDMODE_FLAGS, stuff->flags);
 | |
| 
 | |
|     if (stuff->privsize)
 | |
|         DebugF("AddModeLine - Privates in request have been ignored\n");
 | |
| 
 | |
|     /* Check that the mode is consistent with the monitor specs */
 | |
|     switch (pVidMode->CheckModeForMonitor(pScreen, mode)) {
 | |
|     case MODE_OK:
 | |
|         break;
 | |
|     case MODE_HSYNC:
 | |
|     case MODE_H_ILLEGAL:
 | |
|         free(mode);
 | |
|         return VidModeErrorBase + XF86VidModeBadHTimings;
 | |
|     case MODE_VSYNC:
 | |
|     case MODE_V_ILLEGAL:
 | |
|         free(mode);
 | |
|         return VidModeErrorBase + XF86VidModeBadVTimings;
 | |
|     default:
 | |
|         free(mode);
 | |
|         return VidModeErrorBase + XF86VidModeModeUnsuitable;
 | |
|     }
 | |
| 
 | |
|     /* Check that the driver is happy with the mode */
 | |
|     if (pVidMode->CheckModeForDriver(pScreen, mode) != MODE_OK) {
 | |
|         free(mode);
 | |
|         return VidModeErrorBase + XF86VidModeModeUnsuitable;
 | |
|     }
 | |
| 
 | |
|     pVidMode->SetCrtcForMode(pScreen, mode);
 | |
| 
 | |
|     pVidMode->AddModeline(pScreen, mode);
 | |
| 
 | |
|     DebugF("AddModeLine - Succeeded\n");
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeDeleteModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeDeleteModeLineReq);
 | |
|     xXF86OldVidModeDeleteModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer;
 | |
|     xXF86VidModeDeleteModeLineReq newstuff;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int len, dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeDeleteModeline");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86OldVidModeDeleteModeLineReq));
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86VidModeDeleteModeLineReq));
 | |
|     }
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         /* convert from old format */
 | |
|         stuff = &newstuff;
 | |
|         stuff->length = client->req_len;
 | |
|         stuff->screen = oldstuff->screen;
 | |
|         stuff->dotclock = oldstuff->dotclock;
 | |
|         stuff->hdisplay = oldstuff->hdisplay;
 | |
|         stuff->hsyncstart = oldstuff->hsyncstart;
 | |
|         stuff->hsyncend = oldstuff->hsyncend;
 | |
|         stuff->htotal = oldstuff->htotal;
 | |
|         stuff->hskew = 0;
 | |
|         stuff->vdisplay = oldstuff->vdisplay;
 | |
|         stuff->vsyncstart = oldstuff->vsyncstart;
 | |
|         stuff->vsyncend = oldstuff->vsyncend;
 | |
|         stuff->vtotal = oldstuff->vtotal;
 | |
|         stuff->flags = oldstuff->flags;
 | |
|         stuff->privsize = oldstuff->privsize;
 | |
|     }
 | |
|     DebugF("DeleteModeLine - scrn: %d clock: %ld\n",
 | |
|            (int) stuff->screen, (unsigned long) stuff->dotclock);
 | |
|     DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            stuff->hdisplay, stuff->hsyncstart,
 | |
|            stuff->hsyncend, stuff->htotal);
 | |
|     DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
 | |
|            (unsigned long) stuff->flags);
 | |
| 
 | |
|     if (len != stuff->privsize) {
 | |
|         DebugF("req_len = %ld, sizeof(Req) = %d, privsize = %ld, "
 | |
|                "len = %d, length = %d\n",
 | |
|                (unsigned long) client->req_len,
 | |
|                (int) sizeof(xXF86VidModeDeleteModeLineReq) >> 2,
 | |
|                (unsigned long) stuff->privsize, len, client->req_len);
 | |
|         return BadLength;
 | |
|     }
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     DebugF("Checking against clock: %d (%d)\n",
 | |
|            VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
 | |
|     DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
 | |
|            VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
 | |
|            VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
 | |
|            VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
 | |
|     DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
 | |
|            VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
 | |
|            VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
 | |
|            VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
 | |
|            VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
 | |
|            VidModeGetModeValue(mode, VIDMODE_FLAGS));
 | |
| 
 | |
|     if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
 | |
|         MODEMATCH(mode, stuff))
 | |
|         return BadValue;
 | |
| 
 | |
|     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     do {
 | |
|         DebugF("Checking against clock: %d (%d)\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
 | |
|         DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
 | |
|         DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
 | |
|                VidModeGetModeValue(mode, VIDMODE_FLAGS));
 | |
| 
 | |
|         if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
 | |
|             MODEMATCH(mode, stuff)) {
 | |
|             pVidMode->DeleteModeline(pScreen, mode);
 | |
|             DebugF("DeleteModeLine - Succeeded\n");
 | |
|             return Success;
 | |
|         }
 | |
|     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
 | |
| 
 | |
|     return BadValue;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeModModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeModModeLineReq);
 | |
|     xXF86OldVidModeModModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeModModeLineReq *) client->requestBuffer;
 | |
|     xXF86VidModeModModeLineReq newstuff;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int len, dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeModModeline");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86OldVidModeModModeLineReq));
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86VidModeModModeLineReq));
 | |
|     }
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         /* convert from old format */
 | |
|         stuff = &newstuff;
 | |
|         stuff->length = client->req_len;
 | |
|         stuff->screen = oldstuff->screen;
 | |
|         stuff->hdisplay = oldstuff->hdisplay;
 | |
|         stuff->hsyncstart = oldstuff->hsyncstart;
 | |
|         stuff->hsyncend = oldstuff->hsyncend;
 | |
|         stuff->htotal = oldstuff->htotal;
 | |
|         stuff->hskew = 0;
 | |
|         stuff->vdisplay = oldstuff->vdisplay;
 | |
|         stuff->vsyncstart = oldstuff->vsyncstart;
 | |
|         stuff->vsyncend = oldstuff->vsyncend;
 | |
|         stuff->vtotal = oldstuff->vtotal;
 | |
|         stuff->flags = oldstuff->flags;
 | |
|         stuff->privsize = oldstuff->privsize;
 | |
|     }
 | |
|     DebugF("ModModeLine - scrn: %d hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            (int) stuff->screen, stuff->hdisplay, stuff->hsyncstart,
 | |
|            stuff->hsyncend, stuff->htotal);
 | |
|     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend,
 | |
|            stuff->vtotal, (unsigned long) stuff->flags);
 | |
| 
 | |
|     if (len != stuff->privsize)
 | |
|         return BadLength;
 | |
| 
 | |
|     if (stuff->hsyncstart < stuff->hdisplay ||
 | |
|         stuff->hsyncend < stuff->hsyncstart ||
 | |
|         stuff->htotal < stuff->hsyncend ||
 | |
|         stuff->vsyncstart < stuff->vdisplay ||
 | |
|         stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend)
 | |
|         return BadValue;
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     DisplayModePtr modetmp = VidModeCreateMode();
 | |
|     if (!modetmp)
 | |
|         return BadAlloc;
 | |
| 
 | |
|     VidModeCopyMode(mode, modetmp);
 | |
| 
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_DISPLAY, stuff->hdisplay);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCEND, stuff->hsyncend);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_TOTAL, stuff->htotal);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SKEW, stuff->hskew);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_DISPLAY, stuff->vdisplay);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCEND, stuff->vsyncend);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_TOTAL, stuff->vtotal);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_FLAGS, stuff->flags);
 | |
| 
 | |
|     if (stuff->privsize)
 | |
|         DebugF("ModModeLine - Privates in request have been ignored\n");
 | |
| 
 | |
|     /* Check that the mode is consistent with the monitor specs */
 | |
|     switch (pVidMode->CheckModeForMonitor(pScreen, modetmp)) {
 | |
|     case MODE_OK:
 | |
|         break;
 | |
|     case MODE_HSYNC:
 | |
|     case MODE_H_ILLEGAL:
 | |
|         free(modetmp);
 | |
|         return VidModeErrorBase + XF86VidModeBadHTimings;
 | |
|     case MODE_VSYNC:
 | |
|     case MODE_V_ILLEGAL:
 | |
|         free(modetmp);
 | |
|         return VidModeErrorBase + XF86VidModeBadVTimings;
 | |
|     default:
 | |
|         free(modetmp);
 | |
|         return VidModeErrorBase + XF86VidModeModeUnsuitable;
 | |
|     }
 | |
| 
 | |
|     /* Check that the driver is happy with the mode */
 | |
|     if (pVidMode->CheckModeForDriver(pScreen, modetmp) != MODE_OK) {
 | |
|         free(modetmp);
 | |
|         return VidModeErrorBase + XF86VidModeModeUnsuitable;
 | |
|     }
 | |
|     free(modetmp);
 | |
| 
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_DISPLAY, stuff->hdisplay);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SYNCEND, stuff->hsyncend);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_TOTAL, stuff->htotal);
 | |
|     VidModeSetModeValue(mode, VIDMODE_H_SKEW, stuff->hskew);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_DISPLAY, stuff->vdisplay);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_SYNCEND, stuff->vsyncend);
 | |
|     VidModeSetModeValue(mode, VIDMODE_V_TOTAL, stuff->vtotal);
 | |
|     VidModeSetModeValue(mode, VIDMODE_FLAGS, stuff->flags);
 | |
| 
 | |
|     pVidMode->SetCrtcForMode(pScreen, mode);
 | |
|     pVidMode->SwitchMode(pScreen, mode);
 | |
| 
 | |
|     DebugF("ModModeLine - Succeeded\n");
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeValidateModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeValidateModeLineReq);
 | |
|     xXF86OldVidModeValidateModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer;
 | |
|     xXF86VidModeValidateModeLineReq newstuff;
 | |
|     xXF86VidModeValidateModeLineReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode, modetmp = NULL;
 | |
|     int len, status, dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeValidateModeline");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
 | |
|         len = client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86OldVidModeValidateModeLineReq));
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86VidModeValidateModeLineReq));
 | |
|     }
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         /* convert from old format */
 | |
|         stuff = &newstuff;
 | |
|         stuff->length = client->req_len;
 | |
|         stuff->screen = oldstuff->screen;
 | |
|         stuff->dotclock = oldstuff->dotclock;
 | |
|         stuff->hdisplay = oldstuff->hdisplay;
 | |
|         stuff->hsyncstart = oldstuff->hsyncstart;
 | |
|         stuff->hsyncend = oldstuff->hsyncend;
 | |
|         stuff->htotal = oldstuff->htotal;
 | |
|         stuff->hskew = 0;
 | |
|         stuff->vdisplay = oldstuff->vdisplay;
 | |
|         stuff->vsyncstart = oldstuff->vsyncstart;
 | |
|         stuff->vsyncend = oldstuff->vsyncend;
 | |
|         stuff->vtotal = oldstuff->vtotal;
 | |
|         stuff->flags = oldstuff->flags;
 | |
|         stuff->privsize = oldstuff->privsize;
 | |
|     }
 | |
| 
 | |
|     DebugF("ValidateModeLine - scrn: %d clock: %ld\n",
 | |
|            (int) stuff->screen, (unsigned long) stuff->dotclock);
 | |
|     DebugF("                   hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            stuff->hdisplay, stuff->hsyncstart,
 | |
|            stuff->hsyncend, stuff->htotal);
 | |
|     DebugF("                   vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
 | |
|            (unsigned long) stuff->flags);
 | |
| 
 | |
|     if (len != stuff->privsize)
 | |
|         return BadLength;
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     status = MODE_OK;
 | |
| 
 | |
|     if (stuff->hsyncstart < stuff->hdisplay ||
 | |
|         stuff->hsyncend < stuff->hsyncstart ||
 | |
|         stuff->htotal < stuff->hsyncend ||
 | |
|         stuff->vsyncstart < stuff->vdisplay ||
 | |
|         stuff->vsyncend < stuff->vsyncstart ||
 | |
|         stuff->vtotal < stuff->vsyncend) {
 | |
|         status = MODE_BAD;
 | |
|         goto status_reply;
 | |
|     }
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     modetmp = VidModeCreateMode();
 | |
|     if (!modetmp)
 | |
|         return BadAlloc;
 | |
| 
 | |
|     VidModeCopyMode(mode, modetmp);
 | |
| 
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_DISPLAY, stuff->hdisplay);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCEND, stuff->hsyncend);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_TOTAL, stuff->htotal);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_H_SKEW, stuff->hskew);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_DISPLAY, stuff->vdisplay);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCEND, stuff->vsyncend);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_V_TOTAL, stuff->vtotal);
 | |
|     VidModeSetModeValue(modetmp, VIDMODE_FLAGS, stuff->flags);
 | |
|     if (stuff->privsize)
 | |
|         DebugF("ValidateModeLine - Privates in request have been ignored\n");
 | |
| 
 | |
|     /* Check that the mode is consistent with the monitor specs */
 | |
|     if ((status =
 | |
|          pVidMode->CheckModeForMonitor(pScreen, modetmp)) != MODE_OK)
 | |
|         goto status_reply;
 | |
| 
 | |
|     /* Check that the driver is happy with the mode */
 | |
|     status = pVidMode->CheckModeForDriver(pScreen, modetmp);
 | |
| 
 | |
|  status_reply:
 | |
|     free(modetmp);
 | |
| 
 | |
|     rep = (xXF86VidModeValidateModeLineReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = bytes_to_int32(SIZEOF(xXF86VidModeValidateModeLineReply)
 | |
|                                  - SIZEOF(xGenericReply)),
 | |
|         .status = status
 | |
|     };
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.status);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeValidateModeLineReply), &rep);
 | |
|     DebugF("ValidateModeLine - Succeeded (status = %d)\n", status);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSwitchMode(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSwitchModeReq);
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeSwitchMode");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSwitchModeReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     pVidMode->ZoomViewport(pScreen, (short) stuff->zoom);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSwitchToMode(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSwitchToModeReq);
 | |
|     xXF86OldVidModeSwitchToModeReq *oldstuff =
 | |
|         (xXF86OldVidModeSwitchToModeReq *) client->requestBuffer;
 | |
|     xXF86VidModeSwitchToModeReq newstuff;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     DisplayModePtr mode;
 | |
|     int len, dotClock;
 | |
|     int ver;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeSwitchToMode");
 | |
| 
 | |
|     ver = ClientMajorVersion(client);
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeSwitchToModeReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86OldVidModeSwitchToModeReq));
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeSwitchToModeReq);
 | |
|         len =
 | |
|             client->req_len -
 | |
|             bytes_to_int32(sizeof(xXF86VidModeSwitchToModeReq));
 | |
|     }
 | |
| 
 | |
|     if (ver < 2) {
 | |
|         /* convert from old format */
 | |
|         stuff = &newstuff;
 | |
|         stuff->length = client->req_len;
 | |
|         stuff->screen = oldstuff->screen;
 | |
|         stuff->dotclock = oldstuff->dotclock;
 | |
|         stuff->hdisplay = oldstuff->hdisplay;
 | |
|         stuff->hsyncstart = oldstuff->hsyncstart;
 | |
|         stuff->hsyncend = oldstuff->hsyncend;
 | |
|         stuff->htotal = oldstuff->htotal;
 | |
|         stuff->hskew = 0;
 | |
|         stuff->vdisplay = oldstuff->vdisplay;
 | |
|         stuff->vsyncstart = oldstuff->vsyncstart;
 | |
|         stuff->vsyncend = oldstuff->vsyncend;
 | |
|         stuff->vtotal = oldstuff->vtotal;
 | |
|         stuff->flags = oldstuff->flags;
 | |
|         stuff->privsize = oldstuff->privsize;
 | |
|     }
 | |
| 
 | |
|     DebugF("SwitchToMode - scrn: %d clock: %ld\n",
 | |
|            (int) stuff->screen, (unsigned long) stuff->dotclock);
 | |
|     DebugF("               hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|            stuff->hdisplay, stuff->hsyncstart,
 | |
|            stuff->hsyncend, stuff->htotal);
 | |
|     DebugF("               vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
 | |
|            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
 | |
|            (unsigned long) stuff->flags);
 | |
| 
 | |
|     if (len != stuff->privsize)
 | |
|         return BadLength;
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock)
 | |
|         && MODEMATCH(mode, stuff))
 | |
|         return Success;
 | |
| 
 | |
|     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
 | |
|         return BadValue;
 | |
| 
 | |
|     do {
 | |
|         DebugF("Checking against clock: %d (%d)\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
 | |
|         DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
 | |
|                VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
 | |
|         DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
 | |
|                VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
 | |
|                VidModeGetModeValue(mode, VIDMODE_FLAGS));
 | |
| 
 | |
|         if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
 | |
|             MODEMATCH(mode, stuff)) {
 | |
| 
 | |
|             if (!pVidMode->SwitchMode(pScreen, mode))
 | |
|                 return BadValue;
 | |
| 
 | |
|             DebugF("SwitchToMode - Succeeded\n");
 | |
|             return Success;
 | |
|         }
 | |
|     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
 | |
| 
 | |
|     return BadValue;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeLockModeSwitch(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeLockModeSwitchReq);
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq);
 | |
| 
 | |
|     DEBUG_P("XF86VidModeLockModeSwitch");
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->LockZoom(pScreen, (short) stuff->lock))
 | |
|         return VidModeErrorBase + XF86VidModeZoomLocked;
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetMonitor(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetMonitorReq);
 | |
|     xXF86VidModeGetMonitorReply rep = {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence
 | |
|     };
 | |
|     CARD32 *hsyncdata, *vsyncdata;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     int i, nHsync, nVrefresh;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetMonitor");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     nHsync = pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_NHSYNC, 0).i;
 | |
|     nVrefresh = pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_NVREFRESH, 0).i;
 | |
| 
 | |
|     if ((char *) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VENDOR, 0)).ptr)
 | |
|         rep.vendorLength = strlen((char *) (pVidMode->GetMonitorValue(pScreen,
 | |
|                                                                       VIDMODE_MON_VENDOR,
 | |
|                                                                       0)).ptr);
 | |
|     else
 | |
|         rep.vendorLength = 0;
 | |
|     if ((char *) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_MODEL, 0)).ptr)
 | |
|         rep.modelLength = strlen((char *) (pVidMode->GetMonitorValue(pScreen,
 | |
|                                                                      VIDMODE_MON_MODEL,
 | |
|                                                                      0)).ptr);
 | |
|     else
 | |
|         rep.modelLength = 0;
 | |
|     rep.length =
 | |
|         bytes_to_int32(SIZEOF(xXF86VidModeGetMonitorReply) -
 | |
|                        SIZEOF(xGenericReply) + (nHsync +
 | |
|                                                 nVrefresh) * sizeof(CARD32) +
 | |
|                        pad_to_int32(rep.vendorLength) +
 | |
|                        pad_to_int32(rep.modelLength));
 | |
|     rep.nhsync = nHsync;
 | |
|     rep.nvsync = nVrefresh;
 | |
|     hsyncdata = xallocarray(nHsync, sizeof(CARD32));
 | |
|     if (!hsyncdata) {
 | |
|         return BadAlloc;
 | |
|     }
 | |
|     vsyncdata = xallocarray(nVrefresh, sizeof(CARD32));
 | |
| 
 | |
|     if (!vsyncdata) {
 | |
|         free(hsyncdata);
 | |
|         return BadAlloc;
 | |
|     }
 | |
| 
 | |
|     for (i = 0; i < nHsync; i++) {
 | |
|         hsyncdata[i] = (unsigned short) (pVidMode->GetMonitorValue(pScreen,
 | |
|                                                                    VIDMODE_MON_HSYNC_LO,
 | |
|                                                                    i)).f |
 | |
|             (unsigned
 | |
|              short) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_HSYNC_HI,
 | |
|                                                i)).f << 16;
 | |
|     }
 | |
|     for (i = 0; i < nVrefresh; i++) {
 | |
|         vsyncdata[i] = (unsigned short) (pVidMode->GetMonitorValue(pScreen,
 | |
|                                                                    VIDMODE_MON_VREFRESH_LO,
 | |
|                                                                    i)).f |
 | |
|             (unsigned
 | |
|              short) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VREFRESH_HI,
 | |
|                                                i)).f << 16;
 | |
|     }
 | |
| 
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|     }
 | |
|     WriteToClient(client, SIZEOF(xXF86VidModeGetMonitorReply), &rep);
 | |
|     client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
 | |
|     WriteSwappedDataToClient(client, nHsync * sizeof(CARD32), hsyncdata);
 | |
|     WriteSwappedDataToClient(client, nVrefresh * sizeof(CARD32), vsyncdata);
 | |
|     if (rep.vendorLength)
 | |
|         WriteToClient(client, rep.vendorLength,
 | |
|                  (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VENDOR, 0)).ptr);
 | |
|     if (rep.modelLength)
 | |
|         WriteToClient(client, rep.modelLength,
 | |
|                  (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_MODEL, 0)).ptr);
 | |
| 
 | |
|     free(hsyncdata);
 | |
|     free(vsyncdata);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetViewPort(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetViewPortReq);
 | |
|     xXF86VidModeGetViewPortReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     int x, y;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetViewPort");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     pVidMode->GetViewPort(pScreen, &x, &y);
 | |
| 
 | |
|     rep = (xXF86VidModeGetViewPortReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = 0,
 | |
|         .x = x,
 | |
|         .y = y
 | |
|     };
 | |
| 
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.x);
 | |
|         swapl(&rep.y);
 | |
|     }
 | |
|     WriteToClient(client, SIZEOF(xXF86VidModeGetViewPortReply), &rep);
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSetViewPort(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetViewPortReq);
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeSetViewPort");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetViewPortReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->SetViewPort(pScreen, stuff->x, stuff->y))
 | |
|         return BadValue;
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetDotClocks(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetDotClocksReq);
 | |
|     xXF86VidModeGetDotClocksReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     int n;
 | |
|     int numClocks;
 | |
|     CARD32 dotclock;
 | |
|     int *Clocks = NULL;
 | |
|     Bool ClockProg;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetDotClocks");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     numClocks = pVidMode->GetNumOfClocks(pScreen, &ClockProg);
 | |
| 
 | |
|     rep = (xXF86VidModeGetDotClocksReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = bytes_to_int32(SIZEOF(xXF86VidModeGetDotClocksReply)
 | |
|                                  - SIZEOF(xGenericReply) + numClocks),
 | |
|         .clocks = numClocks,
 | |
|         .maxclocks = MAXCLOCKS,
 | |
|         .flags = 0
 | |
|     };
 | |
| 
 | |
|     if (!ClockProg) {
 | |
|         Clocks = calloc(numClocks, sizeof(int));
 | |
|         if (!Clocks)
 | |
|             return BadValue;
 | |
|         if (!pVidMode->GetClocks(pScreen, Clocks)) {
 | |
|             free(Clocks);
 | |
|             return BadValue;
 | |
|         }
 | |
|     }
 | |
|     if (ClockProg) {
 | |
|         rep.flags |= CLKFLAG_PROGRAMABLE;
 | |
|     }
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.clocks);
 | |
|         swapl(&rep.maxclocks);
 | |
|         swapl(&rep.flags);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetDotClocksReply), &rep);
 | |
|     if (!ClockProg && Clocks) {
 | |
|         for (n = 0; n < numClocks; n++) {
 | |
|             dotclock = Clocks[n];
 | |
|             if (client->swapped) {
 | |
|                 WriteSwappedDataToClient(client, 4, (char *) &dotclock);
 | |
|             }
 | |
|             else {
 | |
|                 WriteToClient(client, 4, &dotclock);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     free(Clocks);
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSetGamma(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetGammaReq);
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeSetGamma");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetGammaReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->SetGamma(pScreen, ((float) stuff->red) / 10000.,
 | |
|                          ((float) stuff->green) / 10000.,
 | |
|                          ((float) stuff->blue) / 10000.))
 | |
|         return BadValue;
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetGamma(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetGammaReq);
 | |
|     xXF86VidModeGetGammaReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
|     float red, green, blue;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeGetGamma");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (!pVidMode->GetGamma(pScreen, &red, &green, &blue))
 | |
|         return BadValue;
 | |
|     rep = (xXF86VidModeGetGammaReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = 0,
 | |
|         .red = (CARD32) (red * 10000.),
 | |
|         .green = (CARD32) (green * 10000.),
 | |
|         .blue = (CARD32) (blue * 10000.)
 | |
|     };
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.red);
 | |
|         swapl(&rep.green);
 | |
|         swapl(&rep.blue);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetGammaReply), &rep);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSetGammaRamp(ClientPtr client)
 | |
| {
 | |
|     CARD16 *r, *g, *b;
 | |
|     int length;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     REQUEST(xXF86VidModeSetGammaRampReq);
 | |
|     REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (stuff->size != pVidMode->GetGammaRampSize(pScreen))
 | |
|         return BadValue;
 | |
| 
 | |
|     length = (stuff->size + 1) & ~1;
 | |
| 
 | |
|     REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length * 6);
 | |
| 
 | |
|     r = (CARD16 *) &stuff[1];
 | |
|     g = r + length;
 | |
|     b = g + length;
 | |
| 
 | |
|     if (!pVidMode->SetGammaRamp(pScreen, stuff->size, r, g, b))
 | |
|         return BadValue;
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetGammaRamp(ClientPtr client)
 | |
| {
 | |
|     CARD16 *ramp = NULL;
 | |
|     int length;
 | |
|     size_t ramplen = 0;
 | |
|     xXF86VidModeGetGammaRampReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     REQUEST(xXF86VidModeGetGammaRampReq);
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     if (stuff->size != pVidMode->GetGammaRampSize(pScreen))
 | |
|         return BadValue;
 | |
| 
 | |
|     length = (stuff->size + 1) & ~1;
 | |
| 
 | |
|     if (stuff->size) {
 | |
|         if (!(ramp = xallocarray(length, 3 * sizeof(CARD16))))
 | |
|             return BadAlloc;
 | |
|         ramplen = length * 3 * sizeof(CARD16);
 | |
| 
 | |
|         if (!pVidMode->GetGammaRamp(pScreen, stuff->size,
 | |
|                                  ramp, ramp + length, ramp + (length * 2))) {
 | |
|             free(ramp);
 | |
|             return BadValue;
 | |
|         }
 | |
|     }
 | |
|     rep = (xXF86VidModeGetGammaRampReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = (length >> 1) * 3,
 | |
|         .size = stuff->size
 | |
|     };
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swaps(&rep.size);
 | |
|         SwapShorts((short *) ramp, length * 3);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetGammaRampReply), &rep);
 | |
| 
 | |
|     if (stuff->size) {
 | |
|         WriteToClient(client, ramplen, ramp);
 | |
|         free(ramp);
 | |
|     }
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetGammaRampSize(ClientPtr client)
 | |
| {
 | |
|     xXF86VidModeGetGammaRampSizeReply rep;
 | |
|     ScreenPtr pScreen;
 | |
|     VidModePtr pVidMode;
 | |
| 
 | |
|     REQUEST(xXF86VidModeGetGammaRampSizeReq);
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
|     pScreen = screenInfo.screens[stuff->screen];
 | |
| 
 | |
|     pVidMode = VidModeGetPtr(pScreen);
 | |
|     if (pVidMode == NULL)
 | |
|         return BadImplementation;
 | |
| 
 | |
|     rep = (xXF86VidModeGetGammaRampSizeReply) {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = 0,
 | |
|         .size = pVidMode->GetGammaRampSize(pScreen)
 | |
|     };
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swaps(&rep.size);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetGammaRampSizeReply), &rep);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeGetPermissions(ClientPtr client)
 | |
| {
 | |
|     xXF86VidModeGetPermissionsReply rep =  {
 | |
|         .type = X_Reply,
 | |
|         .sequenceNumber = client->sequence,
 | |
|         .length = 0,
 | |
|         .permissions = XF86VM_READ_PERMISSION
 | |
|     };
 | |
| 
 | |
|     REQUEST(xXF86VidModeGetPermissionsReq);
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
 | |
| 
 | |
|     if (stuff->screen >= screenInfo.numScreens)
 | |
|         return BadValue;
 | |
| 
 | |
|     if (VidModeAllowNonLocal || client->local) {
 | |
|         rep.permissions |= XF86VM_WRITE_PERMISSION;
 | |
|     }
 | |
|     if (client->swapped) {
 | |
|         swaps(&rep.sequenceNumber);
 | |
|         swapl(&rep.length);
 | |
|         swapl(&rep.permissions);
 | |
|     }
 | |
|     WriteToClient(client, sizeof(xXF86VidModeGetPermissionsReply), &rep);
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeSetClientVersion(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetClientVersionReq);
 | |
| 
 | |
|     VidModePrivPtr pPriv;
 | |
| 
 | |
|     DEBUG_P("XF86VidModeSetClientVersion");
 | |
| 
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq);
 | |
| 
 | |
|     if ((pPriv = VM_GETPRIV(client)) == NULL) {
 | |
|         pPriv = malloc(sizeof(VidModePrivRec));
 | |
|         if (!pPriv)
 | |
|             return BadAlloc;
 | |
|         VM_SETPRIV(client, pPriv);
 | |
|     }
 | |
|     pPriv->major = stuff->major;
 | |
| 
 | |
|     pPriv->minor = stuff->minor;
 | |
| 
 | |
|     return Success;
 | |
| }
 | |
| 
 | |
| static int
 | |
| ProcVidModeDispatch(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xReq);
 | |
|     switch (stuff->data) {
 | |
|     case X_XF86VidModeQueryVersion:
 | |
|         return ProcVidModeQueryVersion(client);
 | |
|     case X_XF86VidModeGetModeLine:
 | |
|         return ProcVidModeGetModeLine(client);
 | |
|     case X_XF86VidModeGetMonitor:
 | |
|         return ProcVidModeGetMonitor(client);
 | |
|     case X_XF86VidModeGetAllModeLines:
 | |
|         return ProcVidModeGetAllModeLines(client);
 | |
|     case X_XF86VidModeValidateModeLine:
 | |
|         return ProcVidModeValidateModeLine(client);
 | |
|     case X_XF86VidModeGetViewPort:
 | |
|         return ProcVidModeGetViewPort(client);
 | |
|     case X_XF86VidModeGetDotClocks:
 | |
|         return ProcVidModeGetDotClocks(client);
 | |
|     case X_XF86VidModeSetClientVersion:
 | |
|         return ProcVidModeSetClientVersion(client);
 | |
|     case X_XF86VidModeGetGamma:
 | |
|         return ProcVidModeGetGamma(client);
 | |
|     case X_XF86VidModeGetGammaRamp:
 | |
|         return ProcVidModeGetGammaRamp(client);
 | |
|     case X_XF86VidModeGetGammaRampSize:
 | |
|         return ProcVidModeGetGammaRampSize(client);
 | |
|     case X_XF86VidModeGetPermissions:
 | |
|         return ProcVidModeGetPermissions(client);
 | |
|     default:
 | |
|         if (VidModeAllowNonLocal || client->local) {
 | |
|             switch (stuff->data) {
 | |
|             case X_XF86VidModeAddModeLine:
 | |
|                 return ProcVidModeAddModeLine(client);
 | |
|             case X_XF86VidModeDeleteModeLine:
 | |
|                 return ProcVidModeDeleteModeLine(client);
 | |
|             case X_XF86VidModeModModeLine:
 | |
|                 return ProcVidModeModModeLine(client);
 | |
|             case X_XF86VidModeSwitchMode:
 | |
|                 return ProcVidModeSwitchMode(client);
 | |
|             case X_XF86VidModeSwitchToMode:
 | |
|                 return ProcVidModeSwitchToMode(client);
 | |
|             case X_XF86VidModeLockModeSwitch:
 | |
|                 return ProcVidModeLockModeSwitch(client);
 | |
|             case X_XF86VidModeSetViewPort:
 | |
|                 return ProcVidModeSetViewPort(client);
 | |
|             case X_XF86VidModeSetGamma:
 | |
|                 return ProcVidModeSetGamma(client);
 | |
|             case X_XF86VidModeSetGammaRamp:
 | |
|                 return ProcVidModeSetGammaRamp(client);
 | |
|             default:
 | |
|                 return BadRequest;
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|             return VidModeErrorBase + XF86VidModeClientNotLocal;
 | |
|     }
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetModeLine(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetModeLineReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetModeLine(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetAllModeLines(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetAllModeLinesReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetAllModeLines(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeAddModeLine(ClientPtr client)
 | |
| {
 | |
|     xXF86OldVidModeAddModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeAddModeLineReq *) client->requestBuffer;
 | |
|     int ver;
 | |
| 
 | |
|     REQUEST(xXF86VidModeAddModeLineReq);
 | |
|     ver = ClientMajorVersion(client);
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
 | |
|         swapl(&oldstuff->screen);
 | |
|         swaps(&oldstuff->hdisplay);
 | |
|         swaps(&oldstuff->hsyncstart);
 | |
|         swaps(&oldstuff->hsyncend);
 | |
|         swaps(&oldstuff->htotal);
 | |
|         swaps(&oldstuff->vdisplay);
 | |
|         swaps(&oldstuff->vsyncstart);
 | |
|         swaps(&oldstuff->vsyncend);
 | |
|         swaps(&oldstuff->vtotal);
 | |
|         swapl(&oldstuff->flags);
 | |
|         swapl(&oldstuff->privsize);
 | |
|         SwapRestL(oldstuff);
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
 | |
|         swapl(&stuff->screen);
 | |
|         swaps(&stuff->hdisplay);
 | |
|         swaps(&stuff->hsyncstart);
 | |
|         swaps(&stuff->hsyncend);
 | |
|         swaps(&stuff->htotal);
 | |
|         swaps(&stuff->hskew);
 | |
|         swaps(&stuff->vdisplay);
 | |
|         swaps(&stuff->vsyncstart);
 | |
|         swaps(&stuff->vsyncend);
 | |
|         swaps(&stuff->vtotal);
 | |
|         swapl(&stuff->flags);
 | |
|         swapl(&stuff->privsize);
 | |
|         SwapRestL(stuff);
 | |
|     }
 | |
|     return ProcVidModeAddModeLine(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeDeleteModeLine(ClientPtr client)
 | |
| {
 | |
|     xXF86OldVidModeDeleteModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer;
 | |
|     int ver;
 | |
| 
 | |
|     REQUEST(xXF86VidModeDeleteModeLineReq);
 | |
|     ver = ClientMajorVersion(client);
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
 | |
|         swapl(&oldstuff->screen);
 | |
|         swaps(&oldstuff->hdisplay);
 | |
|         swaps(&oldstuff->hsyncstart);
 | |
|         swaps(&oldstuff->hsyncend);
 | |
|         swaps(&oldstuff->htotal);
 | |
|         swaps(&oldstuff->vdisplay);
 | |
|         swaps(&oldstuff->vsyncstart);
 | |
|         swaps(&oldstuff->vsyncend);
 | |
|         swaps(&oldstuff->vtotal);
 | |
|         swapl(&oldstuff->flags);
 | |
|         swapl(&oldstuff->privsize);
 | |
|         SwapRestL(oldstuff);
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
 | |
|         swapl(&stuff->screen);
 | |
|         swaps(&stuff->hdisplay);
 | |
|         swaps(&stuff->hsyncstart);
 | |
|         swaps(&stuff->hsyncend);
 | |
|         swaps(&stuff->htotal);
 | |
|         swaps(&stuff->hskew);
 | |
|         swaps(&stuff->vdisplay);
 | |
|         swaps(&stuff->vsyncstart);
 | |
|         swaps(&stuff->vsyncend);
 | |
|         swaps(&stuff->vtotal);
 | |
|         swapl(&stuff->flags);
 | |
|         swapl(&stuff->privsize);
 | |
|         SwapRestL(stuff);
 | |
|     }
 | |
|     return ProcVidModeDeleteModeLine(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeModModeLine(ClientPtr client)
 | |
| {
 | |
|     xXF86OldVidModeModModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeModModeLineReq *) client->requestBuffer;
 | |
|     int ver;
 | |
| 
 | |
|     REQUEST(xXF86VidModeModModeLineReq);
 | |
|     ver = ClientMajorVersion(client);
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
 | |
|         swapl(&oldstuff->screen);
 | |
|         swaps(&oldstuff->hdisplay);
 | |
|         swaps(&oldstuff->hsyncstart);
 | |
|         swaps(&oldstuff->hsyncend);
 | |
|         swaps(&oldstuff->htotal);
 | |
|         swaps(&oldstuff->vdisplay);
 | |
|         swaps(&oldstuff->vsyncstart);
 | |
|         swaps(&oldstuff->vsyncend);
 | |
|         swaps(&oldstuff->vtotal);
 | |
|         swapl(&oldstuff->flags);
 | |
|         swapl(&oldstuff->privsize);
 | |
|         SwapRestL(oldstuff);
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
 | |
|         swapl(&stuff->screen);
 | |
|         swaps(&stuff->hdisplay);
 | |
|         swaps(&stuff->hsyncstart);
 | |
|         swaps(&stuff->hsyncend);
 | |
|         swaps(&stuff->htotal);
 | |
|         swaps(&stuff->hskew);
 | |
|         swaps(&stuff->vdisplay);
 | |
|         swaps(&stuff->vsyncstart);
 | |
|         swaps(&stuff->vsyncend);
 | |
|         swaps(&stuff->vtotal);
 | |
|         swapl(&stuff->flags);
 | |
|         swapl(&stuff->privsize);
 | |
|         SwapRestL(stuff);
 | |
|     }
 | |
|     return ProcVidModeModModeLine(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeValidateModeLine(ClientPtr client)
 | |
| {
 | |
|     xXF86OldVidModeValidateModeLineReq *oldstuff =
 | |
|         (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer;
 | |
|     int ver;
 | |
| 
 | |
|     REQUEST(xXF86VidModeValidateModeLineReq);
 | |
|     ver = ClientMajorVersion(client);
 | |
|     if (ver < 2) {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
 | |
|         swapl(&oldstuff->screen);
 | |
|         swaps(&oldstuff->hdisplay);
 | |
|         swaps(&oldstuff->hsyncstart);
 | |
|         swaps(&oldstuff->hsyncend);
 | |
|         swaps(&oldstuff->htotal);
 | |
|         swaps(&oldstuff->vdisplay);
 | |
|         swaps(&oldstuff->vsyncstart);
 | |
|         swaps(&oldstuff->vsyncend);
 | |
|         swaps(&oldstuff->vtotal);
 | |
|         swapl(&oldstuff->flags);
 | |
|         swapl(&oldstuff->privsize);
 | |
|         SwapRestL(oldstuff);
 | |
|     }
 | |
|     else {
 | |
|         REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
 | |
|         swapl(&stuff->screen);
 | |
|         swaps(&stuff->hdisplay);
 | |
|         swaps(&stuff->hsyncstart);
 | |
|         swaps(&stuff->hsyncend);
 | |
|         swaps(&stuff->htotal);
 | |
|         swaps(&stuff->hskew);
 | |
|         swaps(&stuff->vdisplay);
 | |
|         swaps(&stuff->vsyncstart);
 | |
|         swaps(&stuff->vsyncend);
 | |
|         swaps(&stuff->vtotal);
 | |
|         swapl(&stuff->flags);
 | |
|         swapl(&stuff->privsize);
 | |
|         SwapRestL(stuff);
 | |
|     }
 | |
|     return ProcVidModeValidateModeLine(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSwitchMode(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSwitchModeReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSwitchModeReq);
 | |
|     swaps(&stuff->screen);
 | |
|     swaps(&stuff->zoom);
 | |
|     return ProcVidModeSwitchMode(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSwitchToMode(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSwitchToModeReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSwitchToModeReq);
 | |
|     swapl(&stuff->screen);
 | |
|     return ProcVidModeSwitchToMode(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeLockModeSwitch(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeLockModeSwitchReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq);
 | |
|     swaps(&stuff->screen);
 | |
|     swaps(&stuff->lock);
 | |
|     return ProcVidModeLockModeSwitch(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetMonitor(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetMonitorReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetMonitor(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetViewPort(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetViewPortReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetViewPort(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSetViewPort(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetViewPortReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetViewPortReq);
 | |
|     swaps(&stuff->screen);
 | |
|     swapl(&stuff->x);
 | |
|     swapl(&stuff->y);
 | |
|     return ProcVidModeSetViewPort(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetDotClocks(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetDotClocksReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetDotClocks(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSetClientVersion(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetClientVersionReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq);
 | |
|     swaps(&stuff->major);
 | |
|     swaps(&stuff->minor);
 | |
|     return ProcVidModeSetClientVersion(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSetGamma(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeSetGammaReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeSetGammaReq);
 | |
|     swaps(&stuff->screen);
 | |
|     swapl(&stuff->red);
 | |
|     swapl(&stuff->green);
 | |
|     swapl(&stuff->blue);
 | |
|     return ProcVidModeSetGamma(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetGamma(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetGammaReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetGamma(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeSetGammaRamp(ClientPtr client)
 | |
| {
 | |
|     int length;
 | |
| 
 | |
|     REQUEST(xXF86VidModeSetGammaRampReq);
 | |
|     REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq);
 | |
|     swaps(&stuff->size);
 | |
|     swaps(&stuff->screen);
 | |
|     length = ((stuff->size + 1) & ~1) * 6;
 | |
|     REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length);
 | |
|     SwapRestS(stuff);
 | |
|     return ProcVidModeSetGammaRamp(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetGammaRamp(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetGammaRampReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
 | |
|     swaps(&stuff->size);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetGammaRamp(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetGammaRampSize(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetGammaRampSizeReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetGammaRampSize(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeGetPermissions(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xXF86VidModeGetPermissionsReq);
 | |
|     REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
 | |
|     swaps(&stuff->screen);
 | |
|     return ProcVidModeGetPermissions(client);
 | |
| }
 | |
| 
 | |
| static int _X_COLD
 | |
| SProcVidModeDispatch(ClientPtr client)
 | |
| {
 | |
|     REQUEST(xReq);
 | |
|     switch (stuff->data) {
 | |
|     case X_XF86VidModeQueryVersion:
 | |
|         return ProcVidModeQueryVersion(client);
 | |
|     case X_XF86VidModeGetModeLine:
 | |
|         return SProcVidModeGetModeLine(client);
 | |
|     case X_XF86VidModeGetMonitor:
 | |
|         return SProcVidModeGetMonitor(client);
 | |
|     case X_XF86VidModeGetAllModeLines:
 | |
|         return SProcVidModeGetAllModeLines(client);
 | |
|     case X_XF86VidModeGetViewPort:
 | |
|         return SProcVidModeGetViewPort(client);
 | |
|     case X_XF86VidModeValidateModeLine:
 | |
|         return SProcVidModeValidateModeLine(client);
 | |
|     case X_XF86VidModeGetDotClocks:
 | |
|         return SProcVidModeGetDotClocks(client);
 | |
|     case X_XF86VidModeSetClientVersion:
 | |
|         return SProcVidModeSetClientVersion(client);
 | |
|     case X_XF86VidModeGetGamma:
 | |
|         return SProcVidModeGetGamma(client);
 | |
|     case X_XF86VidModeGetGammaRamp:
 | |
|         return SProcVidModeGetGammaRamp(client);
 | |
|     case X_XF86VidModeGetGammaRampSize:
 | |
|         return SProcVidModeGetGammaRampSize(client);
 | |
|     case X_XF86VidModeGetPermissions:
 | |
|         return SProcVidModeGetPermissions(client);
 | |
|     default:
 | |
|         if (VidModeAllowNonLocal || client->local) {
 | |
|             switch (stuff->data) {
 | |
|             case X_XF86VidModeAddModeLine:
 | |
|                 return SProcVidModeAddModeLine(client);
 | |
|             case X_XF86VidModeDeleteModeLine:
 | |
|                 return SProcVidModeDeleteModeLine(client);
 | |
|             case X_XF86VidModeModModeLine:
 | |
|                 return SProcVidModeModModeLine(client);
 | |
|             case X_XF86VidModeSwitchMode:
 | |
|                 return SProcVidModeSwitchMode(client);
 | |
|             case X_XF86VidModeSwitchToMode:
 | |
|                 return SProcVidModeSwitchToMode(client);
 | |
|             case X_XF86VidModeLockModeSwitch:
 | |
|                 return SProcVidModeLockModeSwitch(client);
 | |
|             case X_XF86VidModeSetViewPort:
 | |
|                 return SProcVidModeSetViewPort(client);
 | |
|             case X_XF86VidModeSetGamma:
 | |
|                 return SProcVidModeSetGamma(client);
 | |
|             case X_XF86VidModeSetGammaRamp:
 | |
|                 return SProcVidModeSetGammaRamp(client);
 | |
|             default:
 | |
|                 return BadRequest;
 | |
|             }
 | |
|         }
 | |
|         else
 | |
|             return VidModeErrorBase + XF86VidModeClientNotLocal;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void
 | |
| VidModeAddExtension(Bool allow_non_local)
 | |
| {
 | |
|     ExtensionEntry *extEntry;
 | |
| 
 | |
|     DEBUG_P("VidModeAddExtension");
 | |
| 
 | |
|     if (!dixRegisterPrivateKey(VidModeClientPrivateKey, PRIVATE_CLIENT, 0))
 | |
|         return;
 | |
| 
 | |
|     if ((extEntry = AddExtension(XF86VIDMODENAME,
 | |
|                                  XF86VidModeNumberEvents,
 | |
|                                  XF86VidModeNumberErrors,
 | |
|                                  ProcVidModeDispatch,
 | |
|                                  SProcVidModeDispatch,
 | |
|                                  NULL, StandardMinorOpcode))) {
 | |
|         VidModeErrorBase = extEntry->errorBase;
 | |
|         VidModeAllowNonLocal = allow_non_local;
 | |
|     }
 | |
| }
 | |
| 
 | |
| VidModePtr VidModeGetPtr(ScreenPtr pScreen)
 | |
| {
 | |
|     return (VidModePtr) (dixLookupPrivate(&pScreen->devPrivates, VidModePrivateKey));
 | |
| }
 | |
| 
 | |
| VidModePtr VidModeInit(ScreenPtr pScreen)
 | |
| {
 | |
|     if (!dixRegisterPrivateKey(VidModePrivateKey, PRIVATE_SCREEN, sizeof(VidModeRec)))
 | |
|         return NULL;
 | |
| 
 | |
|     return VidModeGetPtr(pScreen);
 | |
| }
 | |
| 
 | |
| #endif /* XF86VIDMODE */
 |