xref: /OK3568_Linux_fs/external/xserver/Xext/vidmode.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun 
3*4882a593Smuzhiyun Copyright 1995  Kaleb S. KEITHLEY
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun Permission is hereby granted, free of charge, to any person obtaining
6*4882a593Smuzhiyun a copy of this software and associated documentation files (the
7*4882a593Smuzhiyun "Software"), to deal in the Software without restriction, including
8*4882a593Smuzhiyun without limitation the rights to use, copy, modify, merge, publish,
9*4882a593Smuzhiyun distribute, sublicense, and/or sell copies of the Software, and to
10*4882a593Smuzhiyun permit persons to whom the Software is furnished to do so, subject to
11*4882a593Smuzhiyun the following conditions:
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun The above copyright notice and this permission notice shall be
14*4882a593Smuzhiyun included in all copies or substantial portions of the Software.
15*4882a593Smuzhiyun 
16*4882a593Smuzhiyun THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17*4882a593Smuzhiyun EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18*4882a593Smuzhiyun MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19*4882a593Smuzhiyun IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES
20*4882a593Smuzhiyun OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21*4882a593Smuzhiyun ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22*4882a593Smuzhiyun OTHER DEALINGS IN THE SOFTWARE.
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun Except as contained in this notice, the name of Kaleb S. KEITHLEY
25*4882a593Smuzhiyun shall not be used in advertising or otherwise to promote the sale, use
26*4882a593Smuzhiyun or other dealings in this Software without prior written authorization
27*4882a593Smuzhiyun from Kaleb S. KEITHLEY
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun /* THIS IS NOT AN X CONSORTIUM STANDARD OR AN X PROJECT TEAM SPECIFICATION */
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
33*4882a593Smuzhiyun #include <dix-config.h>
34*4882a593Smuzhiyun #endif
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #ifdef XF86VIDMODE
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #include <X11/X.h>
39*4882a593Smuzhiyun #include <X11/Xproto.h>
40*4882a593Smuzhiyun #include <X11/extensions/xf86vmproto.h>
41*4882a593Smuzhiyun #include "misc.h"
42*4882a593Smuzhiyun #include "dixstruct.h"
43*4882a593Smuzhiyun #include "extnsionst.h"
44*4882a593Smuzhiyun #include "scrnintstr.h"
45*4882a593Smuzhiyun #include "servermd.h"
46*4882a593Smuzhiyun #include "swaprep.h"
47*4882a593Smuzhiyun #include "vidmodestr.h"
48*4882a593Smuzhiyun #include "globals.h"
49*4882a593Smuzhiyun #include "protocol-versions.h"
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun static int VidModeErrorBase;
52*4882a593Smuzhiyun static int VidModeAllowNonLocal;
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun static DevPrivateKeyRec VidModeClientPrivateKeyRec;
55*4882a593Smuzhiyun #define VidModeClientPrivateKey (&VidModeClientPrivateKeyRec)
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun static DevPrivateKeyRec VidModePrivateKeyRec;
58*4882a593Smuzhiyun #define VidModePrivateKey (&VidModePrivateKeyRec)
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun /* This holds the client's version information */
61*4882a593Smuzhiyun typedef struct {
62*4882a593Smuzhiyun     int major;
63*4882a593Smuzhiyun     int minor;
64*4882a593Smuzhiyun } VidModePrivRec, *VidModePrivPtr;
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #define VM_GETPRIV(c) ((VidModePrivPtr) \
67*4882a593Smuzhiyun     dixLookupPrivate(&(c)->devPrivates, VidModeClientPrivateKey))
68*4882a593Smuzhiyun #define VM_SETPRIV(c,p) \
69*4882a593Smuzhiyun     dixSetPrivate(&(c)->devPrivates, VidModeClientPrivateKey, p)
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #ifdef DEBUG
72*4882a593Smuzhiyun #define DEBUG_P(x) DebugF(x"\n")
73*4882a593Smuzhiyun #else
74*4882a593Smuzhiyun #define DEBUG_P(x) /**/
75*4882a593Smuzhiyun #endif
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun static DisplayModePtr
VidModeCreateMode(void)78*4882a593Smuzhiyun VidModeCreateMode(void)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun     DisplayModePtr mode;
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun     mode = malloc(sizeof(DisplayModeRec));
83*4882a593Smuzhiyun     if (mode != NULL) {
84*4882a593Smuzhiyun         mode->name = "";
85*4882a593Smuzhiyun         mode->VScan = 1;        /* divides refresh rate. default = 1 */
86*4882a593Smuzhiyun         mode->Private = NULL;
87*4882a593Smuzhiyun         mode->next = mode;
88*4882a593Smuzhiyun         mode->prev = mode;
89*4882a593Smuzhiyun     }
90*4882a593Smuzhiyun     return mode;
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun static void
VidModeCopyMode(DisplayModePtr modefrom,DisplayModePtr modeto)94*4882a593Smuzhiyun VidModeCopyMode(DisplayModePtr modefrom, DisplayModePtr modeto)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun     memcpy(modeto, modefrom, sizeof(DisplayModeRec));
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun static int
VidModeGetModeValue(DisplayModePtr mode,int valtyp)100*4882a593Smuzhiyun VidModeGetModeValue(DisplayModePtr mode, int valtyp)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun     int ret = 0;
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun     switch (valtyp) {
105*4882a593Smuzhiyun     case VIDMODE_H_DISPLAY:
106*4882a593Smuzhiyun         ret = mode->HDisplay;
107*4882a593Smuzhiyun         break;
108*4882a593Smuzhiyun     case VIDMODE_H_SYNCSTART:
109*4882a593Smuzhiyun         ret = mode->HSyncStart;
110*4882a593Smuzhiyun         break;
111*4882a593Smuzhiyun     case VIDMODE_H_SYNCEND:
112*4882a593Smuzhiyun         ret = mode->HSyncEnd;
113*4882a593Smuzhiyun         break;
114*4882a593Smuzhiyun     case VIDMODE_H_TOTAL:
115*4882a593Smuzhiyun         ret = mode->HTotal;
116*4882a593Smuzhiyun         break;
117*4882a593Smuzhiyun     case VIDMODE_H_SKEW:
118*4882a593Smuzhiyun         ret = mode->HSkew;
119*4882a593Smuzhiyun         break;
120*4882a593Smuzhiyun     case VIDMODE_V_DISPLAY:
121*4882a593Smuzhiyun         ret = mode->VDisplay;
122*4882a593Smuzhiyun         break;
123*4882a593Smuzhiyun     case VIDMODE_V_SYNCSTART:
124*4882a593Smuzhiyun         ret = mode->VSyncStart;
125*4882a593Smuzhiyun         break;
126*4882a593Smuzhiyun     case VIDMODE_V_SYNCEND:
127*4882a593Smuzhiyun         ret = mode->VSyncEnd;
128*4882a593Smuzhiyun         break;
129*4882a593Smuzhiyun     case VIDMODE_V_TOTAL:
130*4882a593Smuzhiyun         ret = mode->VTotal;
131*4882a593Smuzhiyun         break;
132*4882a593Smuzhiyun     case VIDMODE_FLAGS:
133*4882a593Smuzhiyun         ret = mode->Flags;
134*4882a593Smuzhiyun         break;
135*4882a593Smuzhiyun     case VIDMODE_CLOCK:
136*4882a593Smuzhiyun         ret = mode->Clock;
137*4882a593Smuzhiyun         break;
138*4882a593Smuzhiyun     }
139*4882a593Smuzhiyun     return ret;
140*4882a593Smuzhiyun }
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun static void
VidModeSetModeValue(DisplayModePtr mode,int valtyp,int val)143*4882a593Smuzhiyun VidModeSetModeValue(DisplayModePtr mode, int valtyp, int val)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun     switch (valtyp) {
146*4882a593Smuzhiyun     case VIDMODE_H_DISPLAY:
147*4882a593Smuzhiyun         mode->HDisplay = val;
148*4882a593Smuzhiyun         break;
149*4882a593Smuzhiyun     case VIDMODE_H_SYNCSTART:
150*4882a593Smuzhiyun         mode->HSyncStart = val;
151*4882a593Smuzhiyun         break;
152*4882a593Smuzhiyun     case VIDMODE_H_SYNCEND:
153*4882a593Smuzhiyun         mode->HSyncEnd = val;
154*4882a593Smuzhiyun         break;
155*4882a593Smuzhiyun     case VIDMODE_H_TOTAL:
156*4882a593Smuzhiyun         mode->HTotal = val;
157*4882a593Smuzhiyun         break;
158*4882a593Smuzhiyun     case VIDMODE_H_SKEW:
159*4882a593Smuzhiyun         mode->HSkew = val;
160*4882a593Smuzhiyun         break;
161*4882a593Smuzhiyun     case VIDMODE_V_DISPLAY:
162*4882a593Smuzhiyun         mode->VDisplay = val;
163*4882a593Smuzhiyun         break;
164*4882a593Smuzhiyun     case VIDMODE_V_SYNCSTART:
165*4882a593Smuzhiyun         mode->VSyncStart = val;
166*4882a593Smuzhiyun         break;
167*4882a593Smuzhiyun     case VIDMODE_V_SYNCEND:
168*4882a593Smuzhiyun         mode->VSyncEnd = val;
169*4882a593Smuzhiyun         break;
170*4882a593Smuzhiyun     case VIDMODE_V_TOTAL:
171*4882a593Smuzhiyun         mode->VTotal = val;
172*4882a593Smuzhiyun         break;
173*4882a593Smuzhiyun     case VIDMODE_FLAGS:
174*4882a593Smuzhiyun         mode->Flags = val;
175*4882a593Smuzhiyun         break;
176*4882a593Smuzhiyun     case VIDMODE_CLOCK:
177*4882a593Smuzhiyun         mode->Clock = val;
178*4882a593Smuzhiyun         break;
179*4882a593Smuzhiyun     }
180*4882a593Smuzhiyun     return;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun static int
ClientMajorVersion(ClientPtr client)184*4882a593Smuzhiyun ClientMajorVersion(ClientPtr client)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun     VidModePrivPtr pPriv;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun     pPriv = VM_GETPRIV(client);
189*4882a593Smuzhiyun     if (!pPriv)
190*4882a593Smuzhiyun         return 0;
191*4882a593Smuzhiyun     else
192*4882a593Smuzhiyun         return pPriv->major;
193*4882a593Smuzhiyun }
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun static int
ProcVidModeQueryVersion(ClientPtr client)196*4882a593Smuzhiyun ProcVidModeQueryVersion(ClientPtr client)
197*4882a593Smuzhiyun {
198*4882a593Smuzhiyun     xXF86VidModeQueryVersionReply rep = {
199*4882a593Smuzhiyun         .type = X_Reply,
200*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
201*4882a593Smuzhiyun         .length = 0,
202*4882a593Smuzhiyun         .majorVersion = SERVER_XF86VIDMODE_MAJOR_VERSION,
203*4882a593Smuzhiyun         .minorVersion = SERVER_XF86VIDMODE_MINOR_VERSION
204*4882a593Smuzhiyun     };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun     DEBUG_P("XF86VidModeQueryVersion");
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeQueryVersionReq);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun     if (client->swapped) {
211*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
212*4882a593Smuzhiyun         swapl(&rep.length);
213*4882a593Smuzhiyun         swaps(&rep.majorVersion);
214*4882a593Smuzhiyun         swaps(&rep.minorVersion);
215*4882a593Smuzhiyun     }
216*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeQueryVersionReply), &rep);
217*4882a593Smuzhiyun     return Success;
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun static int
ProcVidModeGetModeLine(ClientPtr client)221*4882a593Smuzhiyun ProcVidModeGetModeLine(ClientPtr client)
222*4882a593Smuzhiyun {
223*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetModeLineReq);
224*4882a593Smuzhiyun     xXF86VidModeGetModeLineReply rep = {
225*4882a593Smuzhiyun         .type = X_Reply,
226*4882a593Smuzhiyun         .sequenceNumber = client->sequence
227*4882a593Smuzhiyun     };
228*4882a593Smuzhiyun     ScreenPtr pScreen;
229*4882a593Smuzhiyun     VidModePtr pVidMode;
230*4882a593Smuzhiyun     DisplayModePtr mode;
231*4882a593Smuzhiyun     int dotClock;
232*4882a593Smuzhiyun     int ver;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetModeline");
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
237*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun     if (ver < 2) {
240*4882a593Smuzhiyun         rep.length = bytes_to_int32(SIZEOF(xXF86OldVidModeGetModeLineReply) -
241*4882a593Smuzhiyun                                     SIZEOF(xGenericReply));
242*4882a593Smuzhiyun     }
243*4882a593Smuzhiyun     else {
244*4882a593Smuzhiyun         rep.length = bytes_to_int32(SIZEOF(xXF86VidModeGetModeLineReply) -
245*4882a593Smuzhiyun                                     SIZEOF(xGenericReply));
246*4882a593Smuzhiyun     }
247*4882a593Smuzhiyun 
248*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
249*4882a593Smuzhiyun         return BadValue;
250*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
251*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
252*4882a593Smuzhiyun     if (pVidMode == NULL)
253*4882a593Smuzhiyun         return BadImplementation;
254*4882a593Smuzhiyun 
255*4882a593Smuzhiyun     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
256*4882a593Smuzhiyun         return BadValue;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     rep.dotclock = dotClock;
259*4882a593Smuzhiyun     rep.hdisplay = VidModeGetModeValue(mode, VIDMODE_H_DISPLAY);
260*4882a593Smuzhiyun     rep.hsyncstart = VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART);
261*4882a593Smuzhiyun     rep.hsyncend = VidModeGetModeValue(mode, VIDMODE_H_SYNCEND);
262*4882a593Smuzhiyun     rep.htotal = VidModeGetModeValue(mode, VIDMODE_H_TOTAL);
263*4882a593Smuzhiyun     rep.hskew = VidModeGetModeValue(mode, VIDMODE_H_SKEW);
264*4882a593Smuzhiyun     rep.vdisplay = VidModeGetModeValue(mode, VIDMODE_V_DISPLAY);
265*4882a593Smuzhiyun     rep.vsyncstart = VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART);
266*4882a593Smuzhiyun     rep.vsyncend = VidModeGetModeValue(mode, VIDMODE_V_SYNCEND);
267*4882a593Smuzhiyun     rep.vtotal = VidModeGetModeValue(mode, VIDMODE_V_TOTAL);
268*4882a593Smuzhiyun     rep.flags = VidModeGetModeValue(mode, VIDMODE_FLAGS);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun     DebugF("GetModeLine - scrn: %d clock: %ld\n",
271*4882a593Smuzhiyun            stuff->screen, (unsigned long) rep.dotclock);
272*4882a593Smuzhiyun     DebugF("GetModeLine - hdsp: %d hbeg: %d hend: %d httl: %d\n",
273*4882a593Smuzhiyun            rep.hdisplay, rep.hsyncstart, rep.hsyncend, rep.htotal);
274*4882a593Smuzhiyun     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
275*4882a593Smuzhiyun            rep.vdisplay, rep.vsyncstart, rep.vsyncend,
276*4882a593Smuzhiyun            rep.vtotal, (unsigned long) rep.flags);
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun     /*
279*4882a593Smuzhiyun      * Older servers sometimes had server privates that the VidMode
280*4882a593Smuzhiyun      * extention made available. So to be compatiable pretend that
281*4882a593Smuzhiyun      * there are no server privates to pass to the client
282*4882a593Smuzhiyun      */
283*4882a593Smuzhiyun     rep.privsize = 0;
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun     if (client->swapped) {
286*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
287*4882a593Smuzhiyun         swapl(&rep.length);
288*4882a593Smuzhiyun         swapl(&rep.dotclock);
289*4882a593Smuzhiyun         swaps(&rep.hdisplay);
290*4882a593Smuzhiyun         swaps(&rep.hsyncstart);
291*4882a593Smuzhiyun         swaps(&rep.hsyncend);
292*4882a593Smuzhiyun         swaps(&rep.htotal);
293*4882a593Smuzhiyun         swaps(&rep.hskew);
294*4882a593Smuzhiyun         swaps(&rep.vdisplay);
295*4882a593Smuzhiyun         swaps(&rep.vsyncstart);
296*4882a593Smuzhiyun         swaps(&rep.vsyncend);
297*4882a593Smuzhiyun         swaps(&rep.vtotal);
298*4882a593Smuzhiyun         swapl(&rep.flags);
299*4882a593Smuzhiyun         swapl(&rep.privsize);
300*4882a593Smuzhiyun     }
301*4882a593Smuzhiyun     if (ver < 2) {
302*4882a593Smuzhiyun         xXF86OldVidModeGetModeLineReply oldrep = {
303*4882a593Smuzhiyun             .type = rep.type,
304*4882a593Smuzhiyun             .sequenceNumber = rep.sequenceNumber,
305*4882a593Smuzhiyun             .length = rep.length,
306*4882a593Smuzhiyun             .dotclock = rep.dotclock,
307*4882a593Smuzhiyun             .hdisplay = rep.hdisplay,
308*4882a593Smuzhiyun             .hsyncstart = rep.hsyncstart,
309*4882a593Smuzhiyun             .hsyncend = rep.hsyncend,
310*4882a593Smuzhiyun             .htotal = rep.htotal,
311*4882a593Smuzhiyun             .vdisplay = rep.vdisplay,
312*4882a593Smuzhiyun             .vsyncstart = rep.vsyncstart,
313*4882a593Smuzhiyun             .vsyncend = rep.vsyncend,
314*4882a593Smuzhiyun             .vtotal = rep.vtotal,
315*4882a593Smuzhiyun             .flags = rep.flags,
316*4882a593Smuzhiyun             .privsize = rep.privsize
317*4882a593Smuzhiyun         };
318*4882a593Smuzhiyun         WriteToClient(client, sizeof(xXF86OldVidModeGetModeLineReply), &oldrep);
319*4882a593Smuzhiyun     }
320*4882a593Smuzhiyun     else {
321*4882a593Smuzhiyun         WriteToClient(client, sizeof(xXF86VidModeGetModeLineReply), &rep);
322*4882a593Smuzhiyun     }
323*4882a593Smuzhiyun     return Success;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
326*4882a593Smuzhiyun static int
ProcVidModeGetAllModeLines(ClientPtr client)327*4882a593Smuzhiyun ProcVidModeGetAllModeLines(ClientPtr client)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetAllModeLinesReq);
330*4882a593Smuzhiyun     xXF86VidModeGetAllModeLinesReply rep;
331*4882a593Smuzhiyun     ScreenPtr pScreen;
332*4882a593Smuzhiyun     VidModePtr pVidMode;
333*4882a593Smuzhiyun     DisplayModePtr mode;
334*4882a593Smuzhiyun     int modecount, dotClock;
335*4882a593Smuzhiyun     int ver;
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetAllModelines");
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq);
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
342*4882a593Smuzhiyun         return BadValue;
343*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
344*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
345*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
346*4882a593Smuzhiyun     if (pVidMode == NULL)
347*4882a593Smuzhiyun         return BadImplementation;
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun     modecount = pVidMode->GetNumOfModes(pScreen);
350*4882a593Smuzhiyun     if (modecount < 1)
351*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeExtensionDisabled;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
354*4882a593Smuzhiyun         return BadValue;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun     rep = (xXF86VidModeGetAllModeLinesReply) {
357*4882a593Smuzhiyun         .type = X_Reply,
358*4882a593Smuzhiyun         .length = SIZEOF(xXF86VidModeGetAllModeLinesReply) -
359*4882a593Smuzhiyun             SIZEOF(xGenericReply),
360*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
361*4882a593Smuzhiyun         .modecount = modecount
362*4882a593Smuzhiyun     };
363*4882a593Smuzhiyun     if (ver < 2)
364*4882a593Smuzhiyun         rep.length += modecount * sizeof(xXF86OldVidModeModeInfo);
365*4882a593Smuzhiyun     else
366*4882a593Smuzhiyun         rep.length += modecount * sizeof(xXF86VidModeModeInfo);
367*4882a593Smuzhiyun     rep.length >>= 2;
368*4882a593Smuzhiyun     if (client->swapped) {
369*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
370*4882a593Smuzhiyun         swapl(&rep.length);
371*4882a593Smuzhiyun         swapl(&rep.modecount);
372*4882a593Smuzhiyun     }
373*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetAllModeLinesReply), &rep);
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun     do {
376*4882a593Smuzhiyun         xXF86VidModeModeInfo mdinf = {
377*4882a593Smuzhiyun             .dotclock = dotClock,
378*4882a593Smuzhiyun             .hdisplay = VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
379*4882a593Smuzhiyun             .hsyncstart = VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
380*4882a593Smuzhiyun             .hsyncend = VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
381*4882a593Smuzhiyun             .htotal = VidModeGetModeValue(mode, VIDMODE_H_TOTAL),
382*4882a593Smuzhiyun             .hskew = VidModeGetModeValue(mode, VIDMODE_H_SKEW),
383*4882a593Smuzhiyun             .vdisplay = VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
384*4882a593Smuzhiyun             .vsyncstart = VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
385*4882a593Smuzhiyun             .vsyncend = VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
386*4882a593Smuzhiyun             .vtotal = VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
387*4882a593Smuzhiyun             .flags = VidModeGetModeValue(mode, VIDMODE_FLAGS),
388*4882a593Smuzhiyun             .privsize = 0
389*4882a593Smuzhiyun         };
390*4882a593Smuzhiyun         if (client->swapped) {
391*4882a593Smuzhiyun             swapl(&mdinf.dotclock);
392*4882a593Smuzhiyun             swaps(&mdinf.hdisplay);
393*4882a593Smuzhiyun             swaps(&mdinf.hsyncstart);
394*4882a593Smuzhiyun             swaps(&mdinf.hsyncend);
395*4882a593Smuzhiyun             swaps(&mdinf.htotal);
396*4882a593Smuzhiyun             swapl(&mdinf.hskew);
397*4882a593Smuzhiyun             swaps(&mdinf.vdisplay);
398*4882a593Smuzhiyun             swaps(&mdinf.vsyncstart);
399*4882a593Smuzhiyun             swaps(&mdinf.vsyncend);
400*4882a593Smuzhiyun             swaps(&mdinf.vtotal);
401*4882a593Smuzhiyun             swapl(&mdinf.flags);
402*4882a593Smuzhiyun             swapl(&mdinf.privsize);
403*4882a593Smuzhiyun         }
404*4882a593Smuzhiyun         if (ver < 2) {
405*4882a593Smuzhiyun             xXF86OldVidModeModeInfo oldmdinf = {
406*4882a593Smuzhiyun                 .dotclock = mdinf.dotclock,
407*4882a593Smuzhiyun                 .hdisplay = mdinf.hdisplay,
408*4882a593Smuzhiyun                 .hsyncstart = mdinf.hsyncstart,
409*4882a593Smuzhiyun                 .hsyncend = mdinf.hsyncend,
410*4882a593Smuzhiyun                 .htotal = mdinf.htotal,
411*4882a593Smuzhiyun                 .vdisplay = mdinf.vdisplay,
412*4882a593Smuzhiyun                 .vsyncstart = mdinf.vsyncstart,
413*4882a593Smuzhiyun                 .vsyncend = mdinf.vsyncend,
414*4882a593Smuzhiyun                 .vtotal = mdinf.vtotal,
415*4882a593Smuzhiyun                 .flags = mdinf.flags,
416*4882a593Smuzhiyun                 .privsize = mdinf.privsize
417*4882a593Smuzhiyun             };
418*4882a593Smuzhiyun             WriteToClient(client, sizeof(xXF86OldVidModeModeInfo), &oldmdinf);
419*4882a593Smuzhiyun         }
420*4882a593Smuzhiyun         else {
421*4882a593Smuzhiyun             WriteToClient(client, sizeof(xXF86VidModeModeInfo), &mdinf);
422*4882a593Smuzhiyun         }
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
425*4882a593Smuzhiyun 
426*4882a593Smuzhiyun     return Success;
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun #define MODEMATCH(mode,stuff)	  \
430*4882a593Smuzhiyun      (VidModeGetModeValue(mode, VIDMODE_H_DISPLAY)  == stuff->hdisplay \
431*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART)  == stuff->hsyncstart \
432*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_H_SYNCEND)  == stuff->hsyncend \
433*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_H_TOTAL)  == stuff->htotal \
434*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_V_DISPLAY)  == stuff->vdisplay \
435*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART)  == stuff->vsyncstart \
436*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_V_SYNCEND)  == stuff->vsyncend \
437*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_V_TOTAL)  == stuff->vtotal \
438*4882a593Smuzhiyun      && VidModeGetModeValue(mode, VIDMODE_FLAGS)  == stuff->flags )
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun static int
ProcVidModeAddModeLine(ClientPtr client)441*4882a593Smuzhiyun ProcVidModeAddModeLine(ClientPtr client)
442*4882a593Smuzhiyun {
443*4882a593Smuzhiyun     REQUEST(xXF86VidModeAddModeLineReq);
444*4882a593Smuzhiyun     xXF86OldVidModeAddModeLineReq *oldstuff =
445*4882a593Smuzhiyun         (xXF86OldVidModeAddModeLineReq *) client->requestBuffer;
446*4882a593Smuzhiyun     xXF86VidModeAddModeLineReq newstuff;
447*4882a593Smuzhiyun     ScreenPtr pScreen;
448*4882a593Smuzhiyun     VidModePtr pVidMode;
449*4882a593Smuzhiyun     DisplayModePtr mode;
450*4882a593Smuzhiyun     int len;
451*4882a593Smuzhiyun     int dotClock;
452*4882a593Smuzhiyun     int ver;
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun     DEBUG_P("XF86VidModeAddModeline");
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun     if (ver < 2) {
459*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
460*4882a593Smuzhiyun         len =
461*4882a593Smuzhiyun             client->req_len -
462*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86OldVidModeAddModeLineReq));
463*4882a593Smuzhiyun     }
464*4882a593Smuzhiyun     else {
465*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
466*4882a593Smuzhiyun         len =
467*4882a593Smuzhiyun             client->req_len -
468*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86VidModeAddModeLineReq));
469*4882a593Smuzhiyun     }
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun     if (ver < 2) {
472*4882a593Smuzhiyun         /* convert from old format */
473*4882a593Smuzhiyun         stuff = &newstuff;
474*4882a593Smuzhiyun         stuff->length = oldstuff->length;
475*4882a593Smuzhiyun         stuff->screen = oldstuff->screen;
476*4882a593Smuzhiyun         stuff->dotclock = oldstuff->dotclock;
477*4882a593Smuzhiyun         stuff->hdisplay = oldstuff->hdisplay;
478*4882a593Smuzhiyun         stuff->hsyncstart = oldstuff->hsyncstart;
479*4882a593Smuzhiyun         stuff->hsyncend = oldstuff->hsyncend;
480*4882a593Smuzhiyun         stuff->htotal = oldstuff->htotal;
481*4882a593Smuzhiyun         stuff->hskew = 0;
482*4882a593Smuzhiyun         stuff->vdisplay = oldstuff->vdisplay;
483*4882a593Smuzhiyun         stuff->vsyncstart = oldstuff->vsyncstart;
484*4882a593Smuzhiyun         stuff->vsyncend = oldstuff->vsyncend;
485*4882a593Smuzhiyun         stuff->vtotal = oldstuff->vtotal;
486*4882a593Smuzhiyun         stuff->flags = oldstuff->flags;
487*4882a593Smuzhiyun         stuff->privsize = oldstuff->privsize;
488*4882a593Smuzhiyun         stuff->after_dotclock = oldstuff->after_dotclock;
489*4882a593Smuzhiyun         stuff->after_hdisplay = oldstuff->after_hdisplay;
490*4882a593Smuzhiyun         stuff->after_hsyncstart = oldstuff->after_hsyncstart;
491*4882a593Smuzhiyun         stuff->after_hsyncend = oldstuff->after_hsyncend;
492*4882a593Smuzhiyun         stuff->after_htotal = oldstuff->after_htotal;
493*4882a593Smuzhiyun         stuff->after_hskew = 0;
494*4882a593Smuzhiyun         stuff->after_vdisplay = oldstuff->after_vdisplay;
495*4882a593Smuzhiyun         stuff->after_vsyncstart = oldstuff->after_vsyncstart;
496*4882a593Smuzhiyun         stuff->after_vsyncend = oldstuff->after_vsyncend;
497*4882a593Smuzhiyun         stuff->after_vtotal = oldstuff->after_vtotal;
498*4882a593Smuzhiyun         stuff->after_flags = oldstuff->after_flags;
499*4882a593Smuzhiyun     }
500*4882a593Smuzhiyun     DebugF("AddModeLine - scrn: %d clock: %ld\n",
501*4882a593Smuzhiyun            (int) stuff->screen, (unsigned long) stuff->dotclock);
502*4882a593Smuzhiyun     DebugF("AddModeLine - hdsp: %d hbeg: %d hend: %d httl: %d\n",
503*4882a593Smuzhiyun            stuff->hdisplay, stuff->hsyncstart,
504*4882a593Smuzhiyun            stuff->hsyncend, stuff->htotal);
505*4882a593Smuzhiyun     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
506*4882a593Smuzhiyun            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend,
507*4882a593Smuzhiyun            stuff->vtotal, (unsigned long) stuff->flags);
508*4882a593Smuzhiyun     DebugF("      after - scrn: %d clock: %ld\n",
509*4882a593Smuzhiyun            (int) stuff->screen, (unsigned long) stuff->after_dotclock);
510*4882a593Smuzhiyun     DebugF("              hdsp: %d hbeg: %d hend: %d httl: %d\n",
511*4882a593Smuzhiyun            stuff->after_hdisplay, stuff->after_hsyncstart,
512*4882a593Smuzhiyun            stuff->after_hsyncend, stuff->after_htotal);
513*4882a593Smuzhiyun     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
514*4882a593Smuzhiyun            stuff->after_vdisplay, stuff->after_vsyncstart,
515*4882a593Smuzhiyun            stuff->after_vsyncend, stuff->after_vtotal,
516*4882a593Smuzhiyun            (unsigned long) stuff->after_flags);
517*4882a593Smuzhiyun 
518*4882a593Smuzhiyun     if (len != stuff->privsize)
519*4882a593Smuzhiyun         return BadLength;
520*4882a593Smuzhiyun 
521*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
522*4882a593Smuzhiyun         return BadValue;
523*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun     if (stuff->hsyncstart < stuff->hdisplay ||
526*4882a593Smuzhiyun         stuff->hsyncend < stuff->hsyncstart ||
527*4882a593Smuzhiyun         stuff->htotal < stuff->hsyncend ||
528*4882a593Smuzhiyun         stuff->vsyncstart < stuff->vdisplay ||
529*4882a593Smuzhiyun         stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend)
530*4882a593Smuzhiyun         return BadValue;
531*4882a593Smuzhiyun 
532*4882a593Smuzhiyun     if (stuff->after_hsyncstart < stuff->after_hdisplay ||
533*4882a593Smuzhiyun         stuff->after_hsyncend < stuff->after_hsyncstart ||
534*4882a593Smuzhiyun         stuff->after_htotal < stuff->after_hsyncend ||
535*4882a593Smuzhiyun         stuff->after_vsyncstart < stuff->after_vdisplay ||
536*4882a593Smuzhiyun         stuff->after_vsyncend < stuff->after_vsyncstart ||
537*4882a593Smuzhiyun         stuff->after_vtotal < stuff->after_vsyncend)
538*4882a593Smuzhiyun         return BadValue;
539*4882a593Smuzhiyun 
540*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
541*4882a593Smuzhiyun     if (pVidMode == NULL)
542*4882a593Smuzhiyun         return BadImplementation;
543*4882a593Smuzhiyun 
544*4882a593Smuzhiyun     if (stuff->after_htotal != 0 || stuff->after_vtotal != 0) {
545*4882a593Smuzhiyun         Bool found = FALSE;
546*4882a593Smuzhiyun 
547*4882a593Smuzhiyun         if (pVidMode->GetFirstModeline(pScreen, &mode, &dotClock)) {
548*4882a593Smuzhiyun             do {
549*4882a593Smuzhiyun                 if ((pVidMode->GetDotClock(pScreen, stuff->dotclock)
550*4882a593Smuzhiyun                      == dotClock) && MODEMATCH(mode, stuff)) {
551*4882a593Smuzhiyun                     found = TRUE;
552*4882a593Smuzhiyun                     break;
553*4882a593Smuzhiyun                 }
554*4882a593Smuzhiyun             } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
555*4882a593Smuzhiyun         }
556*4882a593Smuzhiyun         if (!found)
557*4882a593Smuzhiyun             return BadValue;
558*4882a593Smuzhiyun     }
559*4882a593Smuzhiyun 
560*4882a593Smuzhiyun     mode = VidModeCreateMode();
561*4882a593Smuzhiyun     if (mode == NULL)
562*4882a593Smuzhiyun         return BadValue;
563*4882a593Smuzhiyun 
564*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_CLOCK, stuff->dotclock);
565*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_DISPLAY, stuff->hdisplay);
566*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
567*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SYNCEND, stuff->hsyncend);
568*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_TOTAL, stuff->htotal);
569*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SKEW, stuff->hskew);
570*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_DISPLAY, stuff->vdisplay);
571*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
572*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_SYNCEND, stuff->vsyncend);
573*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_TOTAL, stuff->vtotal);
574*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_FLAGS, stuff->flags);
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun     if (stuff->privsize)
577*4882a593Smuzhiyun         DebugF("AddModeLine - Privates in request have been ignored\n");
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun     /* Check that the mode is consistent with the monitor specs */
580*4882a593Smuzhiyun     switch (pVidMode->CheckModeForMonitor(pScreen, mode)) {
581*4882a593Smuzhiyun     case MODE_OK:
582*4882a593Smuzhiyun         break;
583*4882a593Smuzhiyun     case MODE_HSYNC:
584*4882a593Smuzhiyun     case MODE_H_ILLEGAL:
585*4882a593Smuzhiyun         free(mode);
586*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeBadHTimings;
587*4882a593Smuzhiyun     case MODE_VSYNC:
588*4882a593Smuzhiyun     case MODE_V_ILLEGAL:
589*4882a593Smuzhiyun         free(mode);
590*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeBadVTimings;
591*4882a593Smuzhiyun     default:
592*4882a593Smuzhiyun         free(mode);
593*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeModeUnsuitable;
594*4882a593Smuzhiyun     }
595*4882a593Smuzhiyun 
596*4882a593Smuzhiyun     /* Check that the driver is happy with the mode */
597*4882a593Smuzhiyun     if (pVidMode->CheckModeForDriver(pScreen, mode) != MODE_OK) {
598*4882a593Smuzhiyun         free(mode);
599*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeModeUnsuitable;
600*4882a593Smuzhiyun     }
601*4882a593Smuzhiyun 
602*4882a593Smuzhiyun     pVidMode->SetCrtcForMode(pScreen, mode);
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun     pVidMode->AddModeline(pScreen, mode);
605*4882a593Smuzhiyun 
606*4882a593Smuzhiyun     DebugF("AddModeLine - Succeeded\n");
607*4882a593Smuzhiyun 
608*4882a593Smuzhiyun     return Success;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun 
611*4882a593Smuzhiyun static int
ProcVidModeDeleteModeLine(ClientPtr client)612*4882a593Smuzhiyun ProcVidModeDeleteModeLine(ClientPtr client)
613*4882a593Smuzhiyun {
614*4882a593Smuzhiyun     REQUEST(xXF86VidModeDeleteModeLineReq);
615*4882a593Smuzhiyun     xXF86OldVidModeDeleteModeLineReq *oldstuff =
616*4882a593Smuzhiyun         (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer;
617*4882a593Smuzhiyun     xXF86VidModeDeleteModeLineReq newstuff;
618*4882a593Smuzhiyun     ScreenPtr pScreen;
619*4882a593Smuzhiyun     VidModePtr pVidMode;
620*4882a593Smuzhiyun     DisplayModePtr mode;
621*4882a593Smuzhiyun     int len, dotClock;
622*4882a593Smuzhiyun     int ver;
623*4882a593Smuzhiyun 
624*4882a593Smuzhiyun     DEBUG_P("XF86VidModeDeleteModeline");
625*4882a593Smuzhiyun 
626*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun     if (ver < 2) {
629*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
630*4882a593Smuzhiyun         len =
631*4882a593Smuzhiyun             client->req_len -
632*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86OldVidModeDeleteModeLineReq));
633*4882a593Smuzhiyun     }
634*4882a593Smuzhiyun     else {
635*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
636*4882a593Smuzhiyun         len =
637*4882a593Smuzhiyun             client->req_len -
638*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86VidModeDeleteModeLineReq));
639*4882a593Smuzhiyun     }
640*4882a593Smuzhiyun 
641*4882a593Smuzhiyun     if (ver < 2) {
642*4882a593Smuzhiyun         /* convert from old format */
643*4882a593Smuzhiyun         stuff = &newstuff;
644*4882a593Smuzhiyun         stuff->length = oldstuff->length;
645*4882a593Smuzhiyun         stuff->screen = oldstuff->screen;
646*4882a593Smuzhiyun         stuff->dotclock = oldstuff->dotclock;
647*4882a593Smuzhiyun         stuff->hdisplay = oldstuff->hdisplay;
648*4882a593Smuzhiyun         stuff->hsyncstart = oldstuff->hsyncstart;
649*4882a593Smuzhiyun         stuff->hsyncend = oldstuff->hsyncend;
650*4882a593Smuzhiyun         stuff->htotal = oldstuff->htotal;
651*4882a593Smuzhiyun         stuff->hskew = 0;
652*4882a593Smuzhiyun         stuff->vdisplay = oldstuff->vdisplay;
653*4882a593Smuzhiyun         stuff->vsyncstart = oldstuff->vsyncstart;
654*4882a593Smuzhiyun         stuff->vsyncend = oldstuff->vsyncend;
655*4882a593Smuzhiyun         stuff->vtotal = oldstuff->vtotal;
656*4882a593Smuzhiyun         stuff->flags = oldstuff->flags;
657*4882a593Smuzhiyun         stuff->privsize = oldstuff->privsize;
658*4882a593Smuzhiyun     }
659*4882a593Smuzhiyun     DebugF("DeleteModeLine - scrn: %d clock: %ld\n",
660*4882a593Smuzhiyun            (int) stuff->screen, (unsigned long) stuff->dotclock);
661*4882a593Smuzhiyun     DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
662*4882a593Smuzhiyun            stuff->hdisplay, stuff->hsyncstart,
663*4882a593Smuzhiyun            stuff->hsyncend, stuff->htotal);
664*4882a593Smuzhiyun     DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
665*4882a593Smuzhiyun            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
666*4882a593Smuzhiyun            (unsigned long) stuff->flags);
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun     if (len != stuff->privsize) {
669*4882a593Smuzhiyun         DebugF("req_len = %ld, sizeof(Req) = %d, privsize = %ld, "
670*4882a593Smuzhiyun                "len = %d, length = %d\n",
671*4882a593Smuzhiyun                (unsigned long) client->req_len,
672*4882a593Smuzhiyun                (int) sizeof(xXF86VidModeDeleteModeLineReq) >> 2,
673*4882a593Smuzhiyun                (unsigned long) stuff->privsize, len, stuff->length);
674*4882a593Smuzhiyun         return BadLength;
675*4882a593Smuzhiyun     }
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
678*4882a593Smuzhiyun         return BadValue;
679*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
680*4882a593Smuzhiyun 
681*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
682*4882a593Smuzhiyun     if (pVidMode == NULL)
683*4882a593Smuzhiyun         return BadImplementation;
684*4882a593Smuzhiyun 
685*4882a593Smuzhiyun     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
686*4882a593Smuzhiyun         return BadValue;
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun     DebugF("Checking against clock: %d (%d)\n",
689*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
690*4882a593Smuzhiyun     DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
691*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
692*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
693*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
694*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
695*4882a593Smuzhiyun     DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
696*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
697*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
698*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
699*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
700*4882a593Smuzhiyun            VidModeGetModeValue(mode, VIDMODE_FLAGS));
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun     if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
703*4882a593Smuzhiyun         MODEMATCH(mode, stuff))
704*4882a593Smuzhiyun         return BadValue;
705*4882a593Smuzhiyun 
706*4882a593Smuzhiyun     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
707*4882a593Smuzhiyun         return BadValue;
708*4882a593Smuzhiyun 
709*4882a593Smuzhiyun     do {
710*4882a593Smuzhiyun         DebugF("Checking against clock: %d (%d)\n",
711*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
712*4882a593Smuzhiyun         DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
713*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
714*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
715*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
716*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
717*4882a593Smuzhiyun         DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
718*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
719*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
720*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
721*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
722*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_FLAGS));
723*4882a593Smuzhiyun 
724*4882a593Smuzhiyun         if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
725*4882a593Smuzhiyun             MODEMATCH(mode, stuff)) {
726*4882a593Smuzhiyun             pVidMode->DeleteModeline(pScreen, mode);
727*4882a593Smuzhiyun             DebugF("DeleteModeLine - Succeeded\n");
728*4882a593Smuzhiyun             return Success;
729*4882a593Smuzhiyun         }
730*4882a593Smuzhiyun     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
731*4882a593Smuzhiyun 
732*4882a593Smuzhiyun     return BadValue;
733*4882a593Smuzhiyun }
734*4882a593Smuzhiyun 
735*4882a593Smuzhiyun static int
ProcVidModeModModeLine(ClientPtr client)736*4882a593Smuzhiyun ProcVidModeModModeLine(ClientPtr client)
737*4882a593Smuzhiyun {
738*4882a593Smuzhiyun     REQUEST(xXF86VidModeModModeLineReq);
739*4882a593Smuzhiyun     xXF86OldVidModeModModeLineReq *oldstuff =
740*4882a593Smuzhiyun         (xXF86OldVidModeModModeLineReq *) client->requestBuffer;
741*4882a593Smuzhiyun     xXF86VidModeModModeLineReq newstuff;
742*4882a593Smuzhiyun     ScreenPtr pScreen;
743*4882a593Smuzhiyun     VidModePtr pVidMode;
744*4882a593Smuzhiyun     DisplayModePtr mode, modetmp;
745*4882a593Smuzhiyun     int len, dotClock;
746*4882a593Smuzhiyun     int ver;
747*4882a593Smuzhiyun 
748*4882a593Smuzhiyun     DEBUG_P("XF86VidModeModModeline");
749*4882a593Smuzhiyun 
750*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
751*4882a593Smuzhiyun 
752*4882a593Smuzhiyun     if (ver < 2) {
753*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
754*4882a593Smuzhiyun         len =
755*4882a593Smuzhiyun             client->req_len -
756*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86OldVidModeModModeLineReq));
757*4882a593Smuzhiyun     }
758*4882a593Smuzhiyun     else {
759*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
760*4882a593Smuzhiyun         len =
761*4882a593Smuzhiyun             client->req_len -
762*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86VidModeModModeLineReq));
763*4882a593Smuzhiyun     }
764*4882a593Smuzhiyun 
765*4882a593Smuzhiyun     if (ver < 2) {
766*4882a593Smuzhiyun         /* convert from old format */
767*4882a593Smuzhiyun         stuff = &newstuff;
768*4882a593Smuzhiyun         stuff->length = oldstuff->length;
769*4882a593Smuzhiyun         stuff->screen = oldstuff->screen;
770*4882a593Smuzhiyun         stuff->hdisplay = oldstuff->hdisplay;
771*4882a593Smuzhiyun         stuff->hsyncstart = oldstuff->hsyncstart;
772*4882a593Smuzhiyun         stuff->hsyncend = oldstuff->hsyncend;
773*4882a593Smuzhiyun         stuff->htotal = oldstuff->htotal;
774*4882a593Smuzhiyun         stuff->hskew = 0;
775*4882a593Smuzhiyun         stuff->vdisplay = oldstuff->vdisplay;
776*4882a593Smuzhiyun         stuff->vsyncstart = oldstuff->vsyncstart;
777*4882a593Smuzhiyun         stuff->vsyncend = oldstuff->vsyncend;
778*4882a593Smuzhiyun         stuff->vtotal = oldstuff->vtotal;
779*4882a593Smuzhiyun         stuff->flags = oldstuff->flags;
780*4882a593Smuzhiyun         stuff->privsize = oldstuff->privsize;
781*4882a593Smuzhiyun     }
782*4882a593Smuzhiyun     DebugF("ModModeLine - scrn: %d hdsp: %d hbeg: %d hend: %d httl: %d\n",
783*4882a593Smuzhiyun            (int) stuff->screen, stuff->hdisplay, stuff->hsyncstart,
784*4882a593Smuzhiyun            stuff->hsyncend, stuff->htotal);
785*4882a593Smuzhiyun     DebugF("              vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
786*4882a593Smuzhiyun            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend,
787*4882a593Smuzhiyun            stuff->vtotal, (unsigned long) stuff->flags);
788*4882a593Smuzhiyun 
789*4882a593Smuzhiyun     if (len != stuff->privsize)
790*4882a593Smuzhiyun         return BadLength;
791*4882a593Smuzhiyun 
792*4882a593Smuzhiyun     if (stuff->hsyncstart < stuff->hdisplay ||
793*4882a593Smuzhiyun         stuff->hsyncend < stuff->hsyncstart ||
794*4882a593Smuzhiyun         stuff->htotal < stuff->hsyncend ||
795*4882a593Smuzhiyun         stuff->vsyncstart < stuff->vdisplay ||
796*4882a593Smuzhiyun         stuff->vsyncend < stuff->vsyncstart || stuff->vtotal < stuff->vsyncend)
797*4882a593Smuzhiyun         return BadValue;
798*4882a593Smuzhiyun 
799*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
800*4882a593Smuzhiyun         return BadValue;
801*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
802*4882a593Smuzhiyun 
803*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
804*4882a593Smuzhiyun     if (pVidMode == NULL)
805*4882a593Smuzhiyun         return BadImplementation;
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
808*4882a593Smuzhiyun         return BadValue;
809*4882a593Smuzhiyun 
810*4882a593Smuzhiyun     modetmp = VidModeCreateMode();
811*4882a593Smuzhiyun     VidModeCopyMode(mode, modetmp);
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_DISPLAY, stuff->hdisplay);
814*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
815*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCEND, stuff->hsyncend);
816*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_TOTAL, stuff->htotal);
817*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SKEW, stuff->hskew);
818*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_DISPLAY, stuff->vdisplay);
819*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
820*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCEND, stuff->vsyncend);
821*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_TOTAL, stuff->vtotal);
822*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_FLAGS, stuff->flags);
823*4882a593Smuzhiyun 
824*4882a593Smuzhiyun     if (stuff->privsize)
825*4882a593Smuzhiyun         DebugF("ModModeLine - Privates in request have been ignored\n");
826*4882a593Smuzhiyun 
827*4882a593Smuzhiyun     /* Check that the mode is consistent with the monitor specs */
828*4882a593Smuzhiyun     switch (pVidMode->CheckModeForMonitor(pScreen, modetmp)) {
829*4882a593Smuzhiyun     case MODE_OK:
830*4882a593Smuzhiyun         break;
831*4882a593Smuzhiyun     case MODE_HSYNC:
832*4882a593Smuzhiyun     case MODE_H_ILLEGAL:
833*4882a593Smuzhiyun         free(modetmp);
834*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeBadHTimings;
835*4882a593Smuzhiyun     case MODE_VSYNC:
836*4882a593Smuzhiyun     case MODE_V_ILLEGAL:
837*4882a593Smuzhiyun         free(modetmp);
838*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeBadVTimings;
839*4882a593Smuzhiyun     default:
840*4882a593Smuzhiyun         free(modetmp);
841*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeModeUnsuitable;
842*4882a593Smuzhiyun     }
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun     /* Check that the driver is happy with the mode */
845*4882a593Smuzhiyun     if (pVidMode->CheckModeForDriver(pScreen, modetmp) != MODE_OK) {
846*4882a593Smuzhiyun         free(modetmp);
847*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeModeUnsuitable;
848*4882a593Smuzhiyun     }
849*4882a593Smuzhiyun     free(modetmp);
850*4882a593Smuzhiyun 
851*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_DISPLAY, stuff->hdisplay);
852*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
853*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SYNCEND, stuff->hsyncend);
854*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_TOTAL, stuff->htotal);
855*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_H_SKEW, stuff->hskew);
856*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_DISPLAY, stuff->vdisplay);
857*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
858*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_SYNCEND, stuff->vsyncend);
859*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_V_TOTAL, stuff->vtotal);
860*4882a593Smuzhiyun     VidModeSetModeValue(mode, VIDMODE_FLAGS, stuff->flags);
861*4882a593Smuzhiyun 
862*4882a593Smuzhiyun     pVidMode->SetCrtcForMode(pScreen, mode);
863*4882a593Smuzhiyun     pVidMode->SwitchMode(pScreen, mode);
864*4882a593Smuzhiyun 
865*4882a593Smuzhiyun     DebugF("ModModeLine - Succeeded\n");
866*4882a593Smuzhiyun     return Success;
867*4882a593Smuzhiyun }
868*4882a593Smuzhiyun 
869*4882a593Smuzhiyun static int
ProcVidModeValidateModeLine(ClientPtr client)870*4882a593Smuzhiyun ProcVidModeValidateModeLine(ClientPtr client)
871*4882a593Smuzhiyun {
872*4882a593Smuzhiyun     REQUEST(xXF86VidModeValidateModeLineReq);
873*4882a593Smuzhiyun     xXF86OldVidModeValidateModeLineReq *oldstuff =
874*4882a593Smuzhiyun         (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer;
875*4882a593Smuzhiyun     xXF86VidModeValidateModeLineReq newstuff;
876*4882a593Smuzhiyun     xXF86VidModeValidateModeLineReply rep;
877*4882a593Smuzhiyun     ScreenPtr pScreen;
878*4882a593Smuzhiyun     VidModePtr pVidMode;
879*4882a593Smuzhiyun     DisplayModePtr mode, modetmp = NULL;
880*4882a593Smuzhiyun     int len, status, dotClock;
881*4882a593Smuzhiyun     int ver;
882*4882a593Smuzhiyun 
883*4882a593Smuzhiyun     DEBUG_P("XF86VidModeValidateModeline");
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
886*4882a593Smuzhiyun 
887*4882a593Smuzhiyun     if (ver < 2) {
888*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
889*4882a593Smuzhiyun         len = client->req_len -
890*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86OldVidModeValidateModeLineReq));
891*4882a593Smuzhiyun     }
892*4882a593Smuzhiyun     else {
893*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
894*4882a593Smuzhiyun         len =
895*4882a593Smuzhiyun             client->req_len -
896*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86VidModeValidateModeLineReq));
897*4882a593Smuzhiyun     }
898*4882a593Smuzhiyun 
899*4882a593Smuzhiyun     if (ver < 2) {
900*4882a593Smuzhiyun         /* convert from old format */
901*4882a593Smuzhiyun         stuff = &newstuff;
902*4882a593Smuzhiyun         stuff->length = oldstuff->length;
903*4882a593Smuzhiyun         stuff->screen = oldstuff->screen;
904*4882a593Smuzhiyun         stuff->dotclock = oldstuff->dotclock;
905*4882a593Smuzhiyun         stuff->hdisplay = oldstuff->hdisplay;
906*4882a593Smuzhiyun         stuff->hsyncstart = oldstuff->hsyncstart;
907*4882a593Smuzhiyun         stuff->hsyncend = oldstuff->hsyncend;
908*4882a593Smuzhiyun         stuff->htotal = oldstuff->htotal;
909*4882a593Smuzhiyun         stuff->hskew = 0;
910*4882a593Smuzhiyun         stuff->vdisplay = oldstuff->vdisplay;
911*4882a593Smuzhiyun         stuff->vsyncstart = oldstuff->vsyncstart;
912*4882a593Smuzhiyun         stuff->vsyncend = oldstuff->vsyncend;
913*4882a593Smuzhiyun         stuff->vtotal = oldstuff->vtotal;
914*4882a593Smuzhiyun         stuff->flags = oldstuff->flags;
915*4882a593Smuzhiyun         stuff->privsize = oldstuff->privsize;
916*4882a593Smuzhiyun     }
917*4882a593Smuzhiyun 
918*4882a593Smuzhiyun     DebugF("ValidateModeLine - scrn: %d clock: %ld\n",
919*4882a593Smuzhiyun            (int) stuff->screen, (unsigned long) stuff->dotclock);
920*4882a593Smuzhiyun     DebugF("                   hdsp: %d hbeg: %d hend: %d httl: %d\n",
921*4882a593Smuzhiyun            stuff->hdisplay, stuff->hsyncstart,
922*4882a593Smuzhiyun            stuff->hsyncend, stuff->htotal);
923*4882a593Smuzhiyun     DebugF("                   vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
924*4882a593Smuzhiyun            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
925*4882a593Smuzhiyun            (unsigned long) stuff->flags);
926*4882a593Smuzhiyun 
927*4882a593Smuzhiyun     if (len != stuff->privsize)
928*4882a593Smuzhiyun         return BadLength;
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
931*4882a593Smuzhiyun         return BadValue;
932*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun     status = MODE_OK;
935*4882a593Smuzhiyun 
936*4882a593Smuzhiyun     if (stuff->hsyncstart < stuff->hdisplay ||
937*4882a593Smuzhiyun         stuff->hsyncend < stuff->hsyncstart ||
938*4882a593Smuzhiyun         stuff->htotal < stuff->hsyncend ||
939*4882a593Smuzhiyun         stuff->vsyncstart < stuff->vdisplay ||
940*4882a593Smuzhiyun         stuff->vsyncend < stuff->vsyncstart ||
941*4882a593Smuzhiyun         stuff->vtotal < stuff->vsyncend) {
942*4882a593Smuzhiyun         status = MODE_BAD;
943*4882a593Smuzhiyun         goto status_reply;
944*4882a593Smuzhiyun     }
945*4882a593Smuzhiyun 
946*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
947*4882a593Smuzhiyun     if (pVidMode == NULL)
948*4882a593Smuzhiyun         return BadImplementation;
949*4882a593Smuzhiyun 
950*4882a593Smuzhiyun     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
951*4882a593Smuzhiyun         return BadValue;
952*4882a593Smuzhiyun 
953*4882a593Smuzhiyun     modetmp = VidModeCreateMode();
954*4882a593Smuzhiyun     VidModeCopyMode(mode, modetmp);
955*4882a593Smuzhiyun 
956*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_DISPLAY, stuff->hdisplay);
957*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCSTART, stuff->hsyncstart);
958*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SYNCEND, stuff->hsyncend);
959*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_TOTAL, stuff->htotal);
960*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_H_SKEW, stuff->hskew);
961*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_DISPLAY, stuff->vdisplay);
962*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCSTART, stuff->vsyncstart);
963*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_SYNCEND, stuff->vsyncend);
964*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_V_TOTAL, stuff->vtotal);
965*4882a593Smuzhiyun     VidModeSetModeValue(modetmp, VIDMODE_FLAGS, stuff->flags);
966*4882a593Smuzhiyun     if (stuff->privsize)
967*4882a593Smuzhiyun         DebugF("ValidateModeLine - Privates in request have been ignored\n");
968*4882a593Smuzhiyun 
969*4882a593Smuzhiyun     /* Check that the mode is consistent with the monitor specs */
970*4882a593Smuzhiyun     if ((status =
971*4882a593Smuzhiyun          pVidMode->CheckModeForMonitor(pScreen, modetmp)) != MODE_OK)
972*4882a593Smuzhiyun         goto status_reply;
973*4882a593Smuzhiyun 
974*4882a593Smuzhiyun     /* Check that the driver is happy with the mode */
975*4882a593Smuzhiyun     status = pVidMode->CheckModeForDriver(pScreen, modetmp);
976*4882a593Smuzhiyun 
977*4882a593Smuzhiyun  status_reply:
978*4882a593Smuzhiyun     free(modetmp);
979*4882a593Smuzhiyun 
980*4882a593Smuzhiyun     rep = (xXF86VidModeValidateModeLineReply) {
981*4882a593Smuzhiyun         .type = X_Reply,
982*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
983*4882a593Smuzhiyun         .length = bytes_to_int32(SIZEOF(xXF86VidModeValidateModeLineReply)
984*4882a593Smuzhiyun                                  - SIZEOF(xGenericReply)),
985*4882a593Smuzhiyun         .status = status
986*4882a593Smuzhiyun     };
987*4882a593Smuzhiyun     if (client->swapped) {
988*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
989*4882a593Smuzhiyun         swapl(&rep.length);
990*4882a593Smuzhiyun         swapl(&rep.status);
991*4882a593Smuzhiyun     }
992*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeValidateModeLineReply), &rep);
993*4882a593Smuzhiyun     DebugF("ValidateModeLine - Succeeded (status = %d)\n", status);
994*4882a593Smuzhiyun 
995*4882a593Smuzhiyun     return Success;
996*4882a593Smuzhiyun }
997*4882a593Smuzhiyun 
998*4882a593Smuzhiyun static int
ProcVidModeSwitchMode(ClientPtr client)999*4882a593Smuzhiyun ProcVidModeSwitchMode(ClientPtr client)
1000*4882a593Smuzhiyun {
1001*4882a593Smuzhiyun     REQUEST(xXF86VidModeSwitchModeReq);
1002*4882a593Smuzhiyun     ScreenPtr pScreen;
1003*4882a593Smuzhiyun     VidModePtr pVidMode;
1004*4882a593Smuzhiyun 
1005*4882a593Smuzhiyun     DEBUG_P("XF86VidModeSwitchMode");
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSwitchModeReq);
1008*4882a593Smuzhiyun 
1009*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1010*4882a593Smuzhiyun         return BadValue;
1011*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1012*4882a593Smuzhiyun 
1013*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1014*4882a593Smuzhiyun     if (pVidMode == NULL)
1015*4882a593Smuzhiyun         return BadImplementation;
1016*4882a593Smuzhiyun 
1017*4882a593Smuzhiyun     pVidMode->ZoomViewport(pScreen, (short) stuff->zoom);
1018*4882a593Smuzhiyun 
1019*4882a593Smuzhiyun     return Success;
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun 
1022*4882a593Smuzhiyun static int
ProcVidModeSwitchToMode(ClientPtr client)1023*4882a593Smuzhiyun ProcVidModeSwitchToMode(ClientPtr client)
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun     REQUEST(xXF86VidModeSwitchToModeReq);
1026*4882a593Smuzhiyun     xXF86OldVidModeSwitchToModeReq *oldstuff =
1027*4882a593Smuzhiyun         (xXF86OldVidModeSwitchToModeReq *) client->requestBuffer;
1028*4882a593Smuzhiyun     xXF86VidModeSwitchToModeReq newstuff;
1029*4882a593Smuzhiyun     ScreenPtr pScreen;
1030*4882a593Smuzhiyun     VidModePtr pVidMode;
1031*4882a593Smuzhiyun     DisplayModePtr mode;
1032*4882a593Smuzhiyun     int len, dotClock;
1033*4882a593Smuzhiyun     int ver;
1034*4882a593Smuzhiyun 
1035*4882a593Smuzhiyun     DEBUG_P("XF86VidModeSwitchToMode");
1036*4882a593Smuzhiyun 
1037*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
1038*4882a593Smuzhiyun 
1039*4882a593Smuzhiyun     if (ver < 2) {
1040*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeSwitchToModeReq);
1041*4882a593Smuzhiyun         len =
1042*4882a593Smuzhiyun             client->req_len -
1043*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86OldVidModeSwitchToModeReq));
1044*4882a593Smuzhiyun     }
1045*4882a593Smuzhiyun     else {
1046*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeSwitchToModeReq);
1047*4882a593Smuzhiyun         len =
1048*4882a593Smuzhiyun             client->req_len -
1049*4882a593Smuzhiyun             bytes_to_int32(sizeof(xXF86VidModeSwitchToModeReq));
1050*4882a593Smuzhiyun     }
1051*4882a593Smuzhiyun 
1052*4882a593Smuzhiyun     if (ver < 2) {
1053*4882a593Smuzhiyun         /* convert from old format */
1054*4882a593Smuzhiyun         stuff = &newstuff;
1055*4882a593Smuzhiyun         stuff->length = oldstuff->length;
1056*4882a593Smuzhiyun         stuff->screen = oldstuff->screen;
1057*4882a593Smuzhiyun         stuff->dotclock = oldstuff->dotclock;
1058*4882a593Smuzhiyun         stuff->hdisplay = oldstuff->hdisplay;
1059*4882a593Smuzhiyun         stuff->hsyncstart = oldstuff->hsyncstart;
1060*4882a593Smuzhiyun         stuff->hsyncend = oldstuff->hsyncend;
1061*4882a593Smuzhiyun         stuff->htotal = oldstuff->htotal;
1062*4882a593Smuzhiyun         stuff->hskew = 0;
1063*4882a593Smuzhiyun         stuff->vdisplay = oldstuff->vdisplay;
1064*4882a593Smuzhiyun         stuff->vsyncstart = oldstuff->vsyncstart;
1065*4882a593Smuzhiyun         stuff->vsyncend = oldstuff->vsyncend;
1066*4882a593Smuzhiyun         stuff->vtotal = oldstuff->vtotal;
1067*4882a593Smuzhiyun         stuff->flags = oldstuff->flags;
1068*4882a593Smuzhiyun         stuff->privsize = oldstuff->privsize;
1069*4882a593Smuzhiyun     }
1070*4882a593Smuzhiyun 
1071*4882a593Smuzhiyun     DebugF("SwitchToMode - scrn: %d clock: %ld\n",
1072*4882a593Smuzhiyun            (int) stuff->screen, (unsigned long) stuff->dotclock);
1073*4882a593Smuzhiyun     DebugF("               hdsp: %d hbeg: %d hend: %d httl: %d\n",
1074*4882a593Smuzhiyun            stuff->hdisplay, stuff->hsyncstart,
1075*4882a593Smuzhiyun            stuff->hsyncend, stuff->htotal);
1076*4882a593Smuzhiyun     DebugF("               vdsp: %d vbeg: %d vend: %d vttl: %d flags: %ld\n",
1077*4882a593Smuzhiyun            stuff->vdisplay, stuff->vsyncstart, stuff->vsyncend, stuff->vtotal,
1078*4882a593Smuzhiyun            (unsigned long) stuff->flags);
1079*4882a593Smuzhiyun 
1080*4882a593Smuzhiyun     if (len != stuff->privsize)
1081*4882a593Smuzhiyun         return BadLength;
1082*4882a593Smuzhiyun 
1083*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1084*4882a593Smuzhiyun         return BadValue;
1085*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1086*4882a593Smuzhiyun 
1087*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1088*4882a593Smuzhiyun     if (pVidMode == NULL)
1089*4882a593Smuzhiyun         return BadImplementation;
1090*4882a593Smuzhiyun 
1091*4882a593Smuzhiyun     if (!pVidMode->GetCurrentModeline(pScreen, &mode, &dotClock))
1092*4882a593Smuzhiyun         return BadValue;
1093*4882a593Smuzhiyun 
1094*4882a593Smuzhiyun     if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock)
1095*4882a593Smuzhiyun         && MODEMATCH(mode, stuff))
1096*4882a593Smuzhiyun         return Success;
1097*4882a593Smuzhiyun 
1098*4882a593Smuzhiyun     if (!pVidMode->GetFirstModeline(pScreen, &mode, &dotClock))
1099*4882a593Smuzhiyun         return BadValue;
1100*4882a593Smuzhiyun 
1101*4882a593Smuzhiyun     do {
1102*4882a593Smuzhiyun         DebugF("Checking against clock: %d (%d)\n",
1103*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_CLOCK), dotClock);
1104*4882a593Smuzhiyun         DebugF("                 hdsp: %d hbeg: %d hend: %d httl: %d\n",
1105*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_DISPLAY),
1106*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_SYNCSTART),
1107*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_SYNCEND),
1108*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_H_TOTAL));
1109*4882a593Smuzhiyun         DebugF("                 vdsp: %d vbeg: %d vend: %d vttl: %d flags: %d\n",
1110*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_DISPLAY),
1111*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_SYNCSTART),
1112*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_SYNCEND),
1113*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_V_TOTAL),
1114*4882a593Smuzhiyun                VidModeGetModeValue(mode, VIDMODE_FLAGS));
1115*4882a593Smuzhiyun 
1116*4882a593Smuzhiyun         if ((pVidMode->GetDotClock(pScreen, stuff->dotclock) == dotClock) &&
1117*4882a593Smuzhiyun             MODEMATCH(mode, stuff)) {
1118*4882a593Smuzhiyun 
1119*4882a593Smuzhiyun             if (!pVidMode->SwitchMode(pScreen, mode))
1120*4882a593Smuzhiyun                 return BadValue;
1121*4882a593Smuzhiyun 
1122*4882a593Smuzhiyun             DebugF("SwitchToMode - Succeeded\n");
1123*4882a593Smuzhiyun             return Success;
1124*4882a593Smuzhiyun         }
1125*4882a593Smuzhiyun     } while (pVidMode->GetNextModeline(pScreen, &mode, &dotClock));
1126*4882a593Smuzhiyun 
1127*4882a593Smuzhiyun     return BadValue;
1128*4882a593Smuzhiyun }
1129*4882a593Smuzhiyun 
1130*4882a593Smuzhiyun static int
ProcVidModeLockModeSwitch(ClientPtr client)1131*4882a593Smuzhiyun ProcVidModeLockModeSwitch(ClientPtr client)
1132*4882a593Smuzhiyun {
1133*4882a593Smuzhiyun     REQUEST(xXF86VidModeLockModeSwitchReq);
1134*4882a593Smuzhiyun     ScreenPtr pScreen;
1135*4882a593Smuzhiyun     VidModePtr pVidMode;
1136*4882a593Smuzhiyun 
1137*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq);
1138*4882a593Smuzhiyun 
1139*4882a593Smuzhiyun     DEBUG_P("XF86VidModeLockModeSwitch");
1140*4882a593Smuzhiyun 
1141*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1142*4882a593Smuzhiyun         return BadValue;
1143*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1144*4882a593Smuzhiyun 
1145*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1146*4882a593Smuzhiyun     if (pVidMode == NULL)
1147*4882a593Smuzhiyun         return BadImplementation;
1148*4882a593Smuzhiyun 
1149*4882a593Smuzhiyun     if (!pVidMode->LockZoom(pScreen, (short) stuff->lock))
1150*4882a593Smuzhiyun         return VidModeErrorBase + XF86VidModeZoomLocked;
1151*4882a593Smuzhiyun 
1152*4882a593Smuzhiyun     return Success;
1153*4882a593Smuzhiyun }
1154*4882a593Smuzhiyun 
1155*4882a593Smuzhiyun static int
ProcVidModeGetMonitor(ClientPtr client)1156*4882a593Smuzhiyun ProcVidModeGetMonitor(ClientPtr client)
1157*4882a593Smuzhiyun {
1158*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetMonitorReq);
1159*4882a593Smuzhiyun     xXF86VidModeGetMonitorReply rep = {
1160*4882a593Smuzhiyun         .type = X_Reply,
1161*4882a593Smuzhiyun         .sequenceNumber = client->sequence
1162*4882a593Smuzhiyun     };
1163*4882a593Smuzhiyun     CARD32 *hsyncdata, *vsyncdata;
1164*4882a593Smuzhiyun     ScreenPtr pScreen;
1165*4882a593Smuzhiyun     VidModePtr pVidMode;
1166*4882a593Smuzhiyun     int i, nHsync, nVrefresh;
1167*4882a593Smuzhiyun 
1168*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetMonitor");
1169*4882a593Smuzhiyun 
1170*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq);
1171*4882a593Smuzhiyun 
1172*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1173*4882a593Smuzhiyun         return BadValue;
1174*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1175*4882a593Smuzhiyun 
1176*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1177*4882a593Smuzhiyun     if (pVidMode == NULL)
1178*4882a593Smuzhiyun         return BadImplementation;
1179*4882a593Smuzhiyun 
1180*4882a593Smuzhiyun     nHsync = pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_NHSYNC, 0).i;
1181*4882a593Smuzhiyun     nVrefresh = pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_NVREFRESH, 0).i;
1182*4882a593Smuzhiyun 
1183*4882a593Smuzhiyun     if ((char *) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VENDOR, 0)).ptr)
1184*4882a593Smuzhiyun         rep.vendorLength = strlen((char *) (pVidMode->GetMonitorValue(pScreen,
1185*4882a593Smuzhiyun                                                                       VIDMODE_MON_VENDOR,
1186*4882a593Smuzhiyun                                                                       0)).ptr);
1187*4882a593Smuzhiyun     else
1188*4882a593Smuzhiyun         rep.vendorLength = 0;
1189*4882a593Smuzhiyun     if ((char *) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_MODEL, 0)).ptr)
1190*4882a593Smuzhiyun         rep.modelLength = strlen((char *) (pVidMode->GetMonitorValue(pScreen,
1191*4882a593Smuzhiyun                                                                      VIDMODE_MON_MODEL,
1192*4882a593Smuzhiyun                                                                      0)).ptr);
1193*4882a593Smuzhiyun     else
1194*4882a593Smuzhiyun         rep.modelLength = 0;
1195*4882a593Smuzhiyun     rep.length =
1196*4882a593Smuzhiyun         bytes_to_int32(SIZEOF(xXF86VidModeGetMonitorReply) -
1197*4882a593Smuzhiyun                        SIZEOF(xGenericReply) + (nHsync +
1198*4882a593Smuzhiyun                                                 nVrefresh) * sizeof(CARD32) +
1199*4882a593Smuzhiyun                        pad_to_int32(rep.vendorLength) +
1200*4882a593Smuzhiyun                        pad_to_int32(rep.modelLength));
1201*4882a593Smuzhiyun     rep.nhsync = nHsync;
1202*4882a593Smuzhiyun     rep.nvsync = nVrefresh;
1203*4882a593Smuzhiyun     hsyncdata = xallocarray(nHsync, sizeof(CARD32));
1204*4882a593Smuzhiyun     if (!hsyncdata) {
1205*4882a593Smuzhiyun         return BadAlloc;
1206*4882a593Smuzhiyun     }
1207*4882a593Smuzhiyun     vsyncdata = xallocarray(nVrefresh, sizeof(CARD32));
1208*4882a593Smuzhiyun 
1209*4882a593Smuzhiyun     if (!vsyncdata) {
1210*4882a593Smuzhiyun         free(hsyncdata);
1211*4882a593Smuzhiyun         return BadAlloc;
1212*4882a593Smuzhiyun     }
1213*4882a593Smuzhiyun 
1214*4882a593Smuzhiyun     for (i = 0; i < nHsync; i++) {
1215*4882a593Smuzhiyun         hsyncdata[i] = (unsigned short) (pVidMode->GetMonitorValue(pScreen,
1216*4882a593Smuzhiyun                                                                    VIDMODE_MON_HSYNC_LO,
1217*4882a593Smuzhiyun                                                                    i)).f |
1218*4882a593Smuzhiyun             (unsigned
1219*4882a593Smuzhiyun              short) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_HSYNC_HI,
1220*4882a593Smuzhiyun                                                i)).f << 16;
1221*4882a593Smuzhiyun     }
1222*4882a593Smuzhiyun     for (i = 0; i < nVrefresh; i++) {
1223*4882a593Smuzhiyun         vsyncdata[i] = (unsigned short) (pVidMode->GetMonitorValue(pScreen,
1224*4882a593Smuzhiyun                                                                    VIDMODE_MON_VREFRESH_LO,
1225*4882a593Smuzhiyun                                                                    i)).f |
1226*4882a593Smuzhiyun             (unsigned
1227*4882a593Smuzhiyun              short) (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VREFRESH_HI,
1228*4882a593Smuzhiyun                                                i)).f << 16;
1229*4882a593Smuzhiyun     }
1230*4882a593Smuzhiyun 
1231*4882a593Smuzhiyun     if (client->swapped) {
1232*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1233*4882a593Smuzhiyun         swapl(&rep.length);
1234*4882a593Smuzhiyun     }
1235*4882a593Smuzhiyun     WriteToClient(client, SIZEOF(xXF86VidModeGetMonitorReply), &rep);
1236*4882a593Smuzhiyun     client->pSwapReplyFunc = (ReplySwapPtr) Swap32Write;
1237*4882a593Smuzhiyun     WriteSwappedDataToClient(client, nHsync * sizeof(CARD32), hsyncdata);
1238*4882a593Smuzhiyun     WriteSwappedDataToClient(client, nVrefresh * sizeof(CARD32), vsyncdata);
1239*4882a593Smuzhiyun     if (rep.vendorLength)
1240*4882a593Smuzhiyun         WriteToClient(client, rep.vendorLength,
1241*4882a593Smuzhiyun                  (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_VENDOR, 0)).ptr);
1242*4882a593Smuzhiyun     if (rep.modelLength)
1243*4882a593Smuzhiyun         WriteToClient(client, rep.modelLength,
1244*4882a593Smuzhiyun                  (pVidMode->GetMonitorValue(pScreen, VIDMODE_MON_MODEL, 0)).ptr);
1245*4882a593Smuzhiyun 
1246*4882a593Smuzhiyun     free(hsyncdata);
1247*4882a593Smuzhiyun     free(vsyncdata);
1248*4882a593Smuzhiyun 
1249*4882a593Smuzhiyun     return Success;
1250*4882a593Smuzhiyun }
1251*4882a593Smuzhiyun 
1252*4882a593Smuzhiyun static int
ProcVidModeGetViewPort(ClientPtr client)1253*4882a593Smuzhiyun ProcVidModeGetViewPort(ClientPtr client)
1254*4882a593Smuzhiyun {
1255*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetViewPortReq);
1256*4882a593Smuzhiyun     xXF86VidModeGetViewPortReply rep;
1257*4882a593Smuzhiyun     ScreenPtr pScreen;
1258*4882a593Smuzhiyun     VidModePtr pVidMode;
1259*4882a593Smuzhiyun     int x, y;
1260*4882a593Smuzhiyun 
1261*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetViewPort");
1262*4882a593Smuzhiyun 
1263*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq);
1264*4882a593Smuzhiyun 
1265*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1266*4882a593Smuzhiyun         return BadValue;
1267*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1268*4882a593Smuzhiyun 
1269*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1270*4882a593Smuzhiyun     if (pVidMode == NULL)
1271*4882a593Smuzhiyun         return BadImplementation;
1272*4882a593Smuzhiyun 
1273*4882a593Smuzhiyun     pVidMode->GetViewPort(pScreen, &x, &y);
1274*4882a593Smuzhiyun 
1275*4882a593Smuzhiyun     rep = (xXF86VidModeGetViewPortReply) {
1276*4882a593Smuzhiyun         .type = X_Reply,
1277*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1278*4882a593Smuzhiyun         .length = 0,
1279*4882a593Smuzhiyun         .x = x,
1280*4882a593Smuzhiyun         .y = y
1281*4882a593Smuzhiyun     };
1282*4882a593Smuzhiyun 
1283*4882a593Smuzhiyun     if (client->swapped) {
1284*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1285*4882a593Smuzhiyun         swapl(&rep.length);
1286*4882a593Smuzhiyun         swapl(&rep.x);
1287*4882a593Smuzhiyun         swapl(&rep.y);
1288*4882a593Smuzhiyun     }
1289*4882a593Smuzhiyun     WriteToClient(client, SIZEOF(xXF86VidModeGetViewPortReply), &rep);
1290*4882a593Smuzhiyun     return Success;
1291*4882a593Smuzhiyun }
1292*4882a593Smuzhiyun 
1293*4882a593Smuzhiyun static int
ProcVidModeSetViewPort(ClientPtr client)1294*4882a593Smuzhiyun ProcVidModeSetViewPort(ClientPtr client)
1295*4882a593Smuzhiyun {
1296*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetViewPortReq);
1297*4882a593Smuzhiyun     ScreenPtr pScreen;
1298*4882a593Smuzhiyun     VidModePtr pVidMode;
1299*4882a593Smuzhiyun 
1300*4882a593Smuzhiyun     DEBUG_P("XF86VidModeSetViewPort");
1301*4882a593Smuzhiyun 
1302*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetViewPortReq);
1303*4882a593Smuzhiyun 
1304*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1305*4882a593Smuzhiyun         return BadValue;
1306*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1307*4882a593Smuzhiyun 
1308*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1309*4882a593Smuzhiyun     if (pVidMode == NULL)
1310*4882a593Smuzhiyun         return BadImplementation;
1311*4882a593Smuzhiyun 
1312*4882a593Smuzhiyun     if (!pVidMode->SetViewPort(pScreen, stuff->x, stuff->y))
1313*4882a593Smuzhiyun         return BadValue;
1314*4882a593Smuzhiyun 
1315*4882a593Smuzhiyun     return Success;
1316*4882a593Smuzhiyun }
1317*4882a593Smuzhiyun 
1318*4882a593Smuzhiyun static int
ProcVidModeGetDotClocks(ClientPtr client)1319*4882a593Smuzhiyun ProcVidModeGetDotClocks(ClientPtr client)
1320*4882a593Smuzhiyun {
1321*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetDotClocksReq);
1322*4882a593Smuzhiyun     xXF86VidModeGetDotClocksReply rep;
1323*4882a593Smuzhiyun     ScreenPtr pScreen;
1324*4882a593Smuzhiyun     VidModePtr pVidMode;
1325*4882a593Smuzhiyun     int n;
1326*4882a593Smuzhiyun     int numClocks;
1327*4882a593Smuzhiyun     CARD32 dotclock;
1328*4882a593Smuzhiyun     int *Clocks = NULL;
1329*4882a593Smuzhiyun     Bool ClockProg;
1330*4882a593Smuzhiyun 
1331*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetDotClocks");
1332*4882a593Smuzhiyun 
1333*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq);
1334*4882a593Smuzhiyun 
1335*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1336*4882a593Smuzhiyun         return BadValue;
1337*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1338*4882a593Smuzhiyun 
1339*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1340*4882a593Smuzhiyun     if (pVidMode == NULL)
1341*4882a593Smuzhiyun         return BadImplementation;
1342*4882a593Smuzhiyun 
1343*4882a593Smuzhiyun     numClocks = pVidMode->GetNumOfClocks(pScreen, &ClockProg);
1344*4882a593Smuzhiyun 
1345*4882a593Smuzhiyun     rep = (xXF86VidModeGetDotClocksReply) {
1346*4882a593Smuzhiyun         .type = X_Reply,
1347*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1348*4882a593Smuzhiyun         .length = bytes_to_int32(SIZEOF(xXF86VidModeGetDotClocksReply)
1349*4882a593Smuzhiyun                                  - SIZEOF(xGenericReply) + numClocks),
1350*4882a593Smuzhiyun         .clocks = numClocks,
1351*4882a593Smuzhiyun         .maxclocks = MAXCLOCKS,
1352*4882a593Smuzhiyun         .flags = 0
1353*4882a593Smuzhiyun     };
1354*4882a593Smuzhiyun 
1355*4882a593Smuzhiyun     if (!ClockProg) {
1356*4882a593Smuzhiyun         Clocks = calloc(numClocks, sizeof(int));
1357*4882a593Smuzhiyun         if (!Clocks)
1358*4882a593Smuzhiyun             return BadValue;
1359*4882a593Smuzhiyun         if (!pVidMode->GetClocks(pScreen, Clocks)) {
1360*4882a593Smuzhiyun             free(Clocks);
1361*4882a593Smuzhiyun             return BadValue;
1362*4882a593Smuzhiyun         }
1363*4882a593Smuzhiyun     }
1364*4882a593Smuzhiyun     if (ClockProg) {
1365*4882a593Smuzhiyun         rep.flags |= CLKFLAG_PROGRAMABLE;
1366*4882a593Smuzhiyun     }
1367*4882a593Smuzhiyun     if (client->swapped) {
1368*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1369*4882a593Smuzhiyun         swapl(&rep.length);
1370*4882a593Smuzhiyun         swapl(&rep.clocks);
1371*4882a593Smuzhiyun         swapl(&rep.maxclocks);
1372*4882a593Smuzhiyun         swapl(&rep.flags);
1373*4882a593Smuzhiyun     }
1374*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetDotClocksReply), &rep);
1375*4882a593Smuzhiyun     if (!ClockProg) {
1376*4882a593Smuzhiyun         for (n = 0; n < numClocks; n++) {
1377*4882a593Smuzhiyun             dotclock = Clocks[n];
1378*4882a593Smuzhiyun             if (client->swapped) {
1379*4882a593Smuzhiyun                 WriteSwappedDataToClient(client, 4, (char *) &dotclock);
1380*4882a593Smuzhiyun             }
1381*4882a593Smuzhiyun             else {
1382*4882a593Smuzhiyun                 WriteToClient(client, 4, &dotclock);
1383*4882a593Smuzhiyun             }
1384*4882a593Smuzhiyun         }
1385*4882a593Smuzhiyun     }
1386*4882a593Smuzhiyun 
1387*4882a593Smuzhiyun     free(Clocks);
1388*4882a593Smuzhiyun     return Success;
1389*4882a593Smuzhiyun }
1390*4882a593Smuzhiyun 
1391*4882a593Smuzhiyun static int
ProcVidModeSetGamma(ClientPtr client)1392*4882a593Smuzhiyun ProcVidModeSetGamma(ClientPtr client)
1393*4882a593Smuzhiyun {
1394*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetGammaReq);
1395*4882a593Smuzhiyun     ScreenPtr pScreen;
1396*4882a593Smuzhiyun     VidModePtr pVidMode;
1397*4882a593Smuzhiyun 
1398*4882a593Smuzhiyun     DEBUG_P("XF86VidModeSetGamma");
1399*4882a593Smuzhiyun 
1400*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetGammaReq);
1401*4882a593Smuzhiyun 
1402*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1403*4882a593Smuzhiyun         return BadValue;
1404*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1405*4882a593Smuzhiyun 
1406*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1407*4882a593Smuzhiyun     if (pVidMode == NULL)
1408*4882a593Smuzhiyun         return BadImplementation;
1409*4882a593Smuzhiyun 
1410*4882a593Smuzhiyun     if (!pVidMode->SetGamma(pScreen, ((float) stuff->red) / 10000.,
1411*4882a593Smuzhiyun                          ((float) stuff->green) / 10000.,
1412*4882a593Smuzhiyun                          ((float) stuff->blue) / 10000.))
1413*4882a593Smuzhiyun         return BadValue;
1414*4882a593Smuzhiyun 
1415*4882a593Smuzhiyun     return Success;
1416*4882a593Smuzhiyun }
1417*4882a593Smuzhiyun 
1418*4882a593Smuzhiyun static int
ProcVidModeGetGamma(ClientPtr client)1419*4882a593Smuzhiyun ProcVidModeGetGamma(ClientPtr client)
1420*4882a593Smuzhiyun {
1421*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaReq);
1422*4882a593Smuzhiyun     xXF86VidModeGetGammaReply rep;
1423*4882a593Smuzhiyun     ScreenPtr pScreen;
1424*4882a593Smuzhiyun     VidModePtr pVidMode;
1425*4882a593Smuzhiyun     float red, green, blue;
1426*4882a593Smuzhiyun 
1427*4882a593Smuzhiyun     DEBUG_P("XF86VidModeGetGamma");
1428*4882a593Smuzhiyun 
1429*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq);
1430*4882a593Smuzhiyun 
1431*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1432*4882a593Smuzhiyun         return BadValue;
1433*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1434*4882a593Smuzhiyun 
1435*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1436*4882a593Smuzhiyun     if (pVidMode == NULL)
1437*4882a593Smuzhiyun         return BadImplementation;
1438*4882a593Smuzhiyun 
1439*4882a593Smuzhiyun     if (!pVidMode->GetGamma(pScreen, &red, &green, &blue))
1440*4882a593Smuzhiyun         return BadValue;
1441*4882a593Smuzhiyun     rep = (xXF86VidModeGetGammaReply) {
1442*4882a593Smuzhiyun         .type = X_Reply,
1443*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1444*4882a593Smuzhiyun         .length = 0,
1445*4882a593Smuzhiyun         .red = (CARD32) (red * 10000.),
1446*4882a593Smuzhiyun         .green = (CARD32) (green * 10000.),
1447*4882a593Smuzhiyun         .blue = (CARD32) (blue * 10000.)
1448*4882a593Smuzhiyun     };
1449*4882a593Smuzhiyun     if (client->swapped) {
1450*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1451*4882a593Smuzhiyun         swapl(&rep.length);
1452*4882a593Smuzhiyun         swapl(&rep.red);
1453*4882a593Smuzhiyun         swapl(&rep.green);
1454*4882a593Smuzhiyun         swapl(&rep.blue);
1455*4882a593Smuzhiyun     }
1456*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetGammaReply), &rep);
1457*4882a593Smuzhiyun 
1458*4882a593Smuzhiyun     return Success;
1459*4882a593Smuzhiyun }
1460*4882a593Smuzhiyun 
1461*4882a593Smuzhiyun static int
ProcVidModeSetGammaRamp(ClientPtr client)1462*4882a593Smuzhiyun ProcVidModeSetGammaRamp(ClientPtr client)
1463*4882a593Smuzhiyun {
1464*4882a593Smuzhiyun     CARD16 *r, *g, *b;
1465*4882a593Smuzhiyun     int length;
1466*4882a593Smuzhiyun     ScreenPtr pScreen;
1467*4882a593Smuzhiyun     VidModePtr pVidMode;
1468*4882a593Smuzhiyun 
1469*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetGammaRampReq);
1470*4882a593Smuzhiyun     REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq);
1471*4882a593Smuzhiyun 
1472*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1473*4882a593Smuzhiyun         return BadValue;
1474*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1475*4882a593Smuzhiyun 
1476*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1477*4882a593Smuzhiyun     if (pVidMode == NULL)
1478*4882a593Smuzhiyun         return BadImplementation;
1479*4882a593Smuzhiyun 
1480*4882a593Smuzhiyun     if (stuff->size != pVidMode->GetGammaRampSize(pScreen))
1481*4882a593Smuzhiyun         return BadValue;
1482*4882a593Smuzhiyun 
1483*4882a593Smuzhiyun     length = (stuff->size + 1) & ~1;
1484*4882a593Smuzhiyun 
1485*4882a593Smuzhiyun     REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length * 6);
1486*4882a593Smuzhiyun 
1487*4882a593Smuzhiyun     r = (CARD16 *) &stuff[1];
1488*4882a593Smuzhiyun     g = r + length;
1489*4882a593Smuzhiyun     b = g + length;
1490*4882a593Smuzhiyun 
1491*4882a593Smuzhiyun     if (!pVidMode->SetGammaRamp(pScreen, stuff->size, r, g, b))
1492*4882a593Smuzhiyun         return BadValue;
1493*4882a593Smuzhiyun 
1494*4882a593Smuzhiyun     return Success;
1495*4882a593Smuzhiyun }
1496*4882a593Smuzhiyun 
1497*4882a593Smuzhiyun static int
ProcVidModeGetGammaRamp(ClientPtr client)1498*4882a593Smuzhiyun ProcVidModeGetGammaRamp(ClientPtr client)
1499*4882a593Smuzhiyun {
1500*4882a593Smuzhiyun     CARD16 *ramp = NULL;
1501*4882a593Smuzhiyun     int length;
1502*4882a593Smuzhiyun     size_t ramplen = 0;
1503*4882a593Smuzhiyun     xXF86VidModeGetGammaRampReply rep;
1504*4882a593Smuzhiyun     ScreenPtr pScreen;
1505*4882a593Smuzhiyun     VidModePtr pVidMode;
1506*4882a593Smuzhiyun 
1507*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaRampReq);
1508*4882a593Smuzhiyun 
1509*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
1510*4882a593Smuzhiyun 
1511*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1512*4882a593Smuzhiyun         return BadValue;
1513*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1514*4882a593Smuzhiyun 
1515*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1516*4882a593Smuzhiyun     if (pVidMode == NULL)
1517*4882a593Smuzhiyun         return BadImplementation;
1518*4882a593Smuzhiyun 
1519*4882a593Smuzhiyun     if (stuff->size != pVidMode->GetGammaRampSize(pScreen))
1520*4882a593Smuzhiyun         return BadValue;
1521*4882a593Smuzhiyun 
1522*4882a593Smuzhiyun     length = (stuff->size + 1) & ~1;
1523*4882a593Smuzhiyun 
1524*4882a593Smuzhiyun     if (stuff->size) {
1525*4882a593Smuzhiyun         if (!(ramp = xallocarray(length, 3 * sizeof(CARD16))))
1526*4882a593Smuzhiyun             return BadAlloc;
1527*4882a593Smuzhiyun         ramplen = length * 3 * sizeof(CARD16);
1528*4882a593Smuzhiyun 
1529*4882a593Smuzhiyun         if (!pVidMode->GetGammaRamp(pScreen, stuff->size,
1530*4882a593Smuzhiyun                                  ramp, ramp + length, ramp + (length * 2))) {
1531*4882a593Smuzhiyun             free(ramp);
1532*4882a593Smuzhiyun             return BadValue;
1533*4882a593Smuzhiyun         }
1534*4882a593Smuzhiyun     }
1535*4882a593Smuzhiyun     rep = (xXF86VidModeGetGammaRampReply) {
1536*4882a593Smuzhiyun         .type = X_Reply,
1537*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1538*4882a593Smuzhiyun         .length = (length >> 1) * 3,
1539*4882a593Smuzhiyun         .size = stuff->size
1540*4882a593Smuzhiyun     };
1541*4882a593Smuzhiyun     if (client->swapped) {
1542*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1543*4882a593Smuzhiyun         swapl(&rep.length);
1544*4882a593Smuzhiyun         swaps(&rep.size);
1545*4882a593Smuzhiyun         SwapShorts((short *) ramp, length * 3);
1546*4882a593Smuzhiyun     }
1547*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetGammaRampReply), &rep);
1548*4882a593Smuzhiyun 
1549*4882a593Smuzhiyun     if (stuff->size) {
1550*4882a593Smuzhiyun         WriteToClient(client, ramplen, ramp);
1551*4882a593Smuzhiyun         free(ramp);
1552*4882a593Smuzhiyun     }
1553*4882a593Smuzhiyun 
1554*4882a593Smuzhiyun     return Success;
1555*4882a593Smuzhiyun }
1556*4882a593Smuzhiyun 
1557*4882a593Smuzhiyun 
1558*4882a593Smuzhiyun static int
ProcVidModeGetGammaRampSize(ClientPtr client)1559*4882a593Smuzhiyun ProcVidModeGetGammaRampSize(ClientPtr client)
1560*4882a593Smuzhiyun {
1561*4882a593Smuzhiyun     xXF86VidModeGetGammaRampSizeReply rep;
1562*4882a593Smuzhiyun     ScreenPtr pScreen;
1563*4882a593Smuzhiyun     VidModePtr pVidMode;
1564*4882a593Smuzhiyun 
1565*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaRampSizeReq);
1566*4882a593Smuzhiyun 
1567*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
1568*4882a593Smuzhiyun 
1569*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1570*4882a593Smuzhiyun         return BadValue;
1571*4882a593Smuzhiyun     pScreen = screenInfo.screens[stuff->screen];
1572*4882a593Smuzhiyun 
1573*4882a593Smuzhiyun     pVidMode = VidModeGetPtr(pScreen);
1574*4882a593Smuzhiyun     if (pVidMode == NULL)
1575*4882a593Smuzhiyun         return BadImplementation;
1576*4882a593Smuzhiyun 
1577*4882a593Smuzhiyun     rep = (xXF86VidModeGetGammaRampSizeReply) {
1578*4882a593Smuzhiyun         .type = X_Reply,
1579*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1580*4882a593Smuzhiyun         .length = 0,
1581*4882a593Smuzhiyun         .size = pVidMode->GetGammaRampSize(pScreen)
1582*4882a593Smuzhiyun     };
1583*4882a593Smuzhiyun     if (client->swapped) {
1584*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1585*4882a593Smuzhiyun         swapl(&rep.length);
1586*4882a593Smuzhiyun         swaps(&rep.size);
1587*4882a593Smuzhiyun     }
1588*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetGammaRampSizeReply), &rep);
1589*4882a593Smuzhiyun 
1590*4882a593Smuzhiyun     return Success;
1591*4882a593Smuzhiyun }
1592*4882a593Smuzhiyun 
1593*4882a593Smuzhiyun static int
ProcVidModeGetPermissions(ClientPtr client)1594*4882a593Smuzhiyun ProcVidModeGetPermissions(ClientPtr client)
1595*4882a593Smuzhiyun {
1596*4882a593Smuzhiyun     xXF86VidModeGetPermissionsReply rep =  {
1597*4882a593Smuzhiyun         .type = X_Reply,
1598*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
1599*4882a593Smuzhiyun         .length = 0,
1600*4882a593Smuzhiyun         .permissions = XF86VM_READ_PERMISSION
1601*4882a593Smuzhiyun     };
1602*4882a593Smuzhiyun 
1603*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetPermissionsReq);
1604*4882a593Smuzhiyun 
1605*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
1606*4882a593Smuzhiyun 
1607*4882a593Smuzhiyun     if (stuff->screen >= screenInfo.numScreens)
1608*4882a593Smuzhiyun         return BadValue;
1609*4882a593Smuzhiyun 
1610*4882a593Smuzhiyun     if (VidModeAllowNonLocal || client->local) {
1611*4882a593Smuzhiyun         rep.permissions |= XF86VM_WRITE_PERMISSION;
1612*4882a593Smuzhiyun     }
1613*4882a593Smuzhiyun     if (client->swapped) {
1614*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
1615*4882a593Smuzhiyun         swapl(&rep.length);
1616*4882a593Smuzhiyun         swapl(&rep.permissions);
1617*4882a593Smuzhiyun     }
1618*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXF86VidModeGetPermissionsReply), &rep);
1619*4882a593Smuzhiyun 
1620*4882a593Smuzhiyun     return Success;
1621*4882a593Smuzhiyun }
1622*4882a593Smuzhiyun 
1623*4882a593Smuzhiyun static int
ProcVidModeSetClientVersion(ClientPtr client)1624*4882a593Smuzhiyun ProcVidModeSetClientVersion(ClientPtr client)
1625*4882a593Smuzhiyun {
1626*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetClientVersionReq);
1627*4882a593Smuzhiyun 
1628*4882a593Smuzhiyun     VidModePrivPtr pPriv;
1629*4882a593Smuzhiyun 
1630*4882a593Smuzhiyun     DEBUG_P("XF86VidModeSetClientVersion");
1631*4882a593Smuzhiyun 
1632*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq);
1633*4882a593Smuzhiyun 
1634*4882a593Smuzhiyun     if ((pPriv = VM_GETPRIV(client)) == NULL) {
1635*4882a593Smuzhiyun         pPriv = malloc(sizeof(VidModePrivRec));
1636*4882a593Smuzhiyun         if (!pPriv)
1637*4882a593Smuzhiyun             return BadAlloc;
1638*4882a593Smuzhiyun         VM_SETPRIV(client, pPriv);
1639*4882a593Smuzhiyun     }
1640*4882a593Smuzhiyun     pPriv->major = stuff->major;
1641*4882a593Smuzhiyun 
1642*4882a593Smuzhiyun     pPriv->minor = stuff->minor;
1643*4882a593Smuzhiyun 
1644*4882a593Smuzhiyun     return Success;
1645*4882a593Smuzhiyun }
1646*4882a593Smuzhiyun 
1647*4882a593Smuzhiyun static int
ProcVidModeDispatch(ClientPtr client)1648*4882a593Smuzhiyun ProcVidModeDispatch(ClientPtr client)
1649*4882a593Smuzhiyun {
1650*4882a593Smuzhiyun     REQUEST(xReq);
1651*4882a593Smuzhiyun     switch (stuff->data) {
1652*4882a593Smuzhiyun     case X_XF86VidModeQueryVersion:
1653*4882a593Smuzhiyun         return ProcVidModeQueryVersion(client);
1654*4882a593Smuzhiyun     case X_XF86VidModeGetModeLine:
1655*4882a593Smuzhiyun         return ProcVidModeGetModeLine(client);
1656*4882a593Smuzhiyun     case X_XF86VidModeGetMonitor:
1657*4882a593Smuzhiyun         return ProcVidModeGetMonitor(client);
1658*4882a593Smuzhiyun     case X_XF86VidModeGetAllModeLines:
1659*4882a593Smuzhiyun         return ProcVidModeGetAllModeLines(client);
1660*4882a593Smuzhiyun     case X_XF86VidModeValidateModeLine:
1661*4882a593Smuzhiyun         return ProcVidModeValidateModeLine(client);
1662*4882a593Smuzhiyun     case X_XF86VidModeGetViewPort:
1663*4882a593Smuzhiyun         return ProcVidModeGetViewPort(client);
1664*4882a593Smuzhiyun     case X_XF86VidModeGetDotClocks:
1665*4882a593Smuzhiyun         return ProcVidModeGetDotClocks(client);
1666*4882a593Smuzhiyun     case X_XF86VidModeSetClientVersion:
1667*4882a593Smuzhiyun         return ProcVidModeSetClientVersion(client);
1668*4882a593Smuzhiyun     case X_XF86VidModeGetGamma:
1669*4882a593Smuzhiyun         return ProcVidModeGetGamma(client);
1670*4882a593Smuzhiyun     case X_XF86VidModeGetGammaRamp:
1671*4882a593Smuzhiyun         return ProcVidModeGetGammaRamp(client);
1672*4882a593Smuzhiyun     case X_XF86VidModeGetGammaRampSize:
1673*4882a593Smuzhiyun         return ProcVidModeGetGammaRampSize(client);
1674*4882a593Smuzhiyun     case X_XF86VidModeGetPermissions:
1675*4882a593Smuzhiyun         return ProcVidModeGetPermissions(client);
1676*4882a593Smuzhiyun     default:
1677*4882a593Smuzhiyun         if (VidModeAllowNonLocal || client->local) {
1678*4882a593Smuzhiyun             switch (stuff->data) {
1679*4882a593Smuzhiyun             case X_XF86VidModeAddModeLine:
1680*4882a593Smuzhiyun                 return ProcVidModeAddModeLine(client);
1681*4882a593Smuzhiyun             case X_XF86VidModeDeleteModeLine:
1682*4882a593Smuzhiyun                 return ProcVidModeDeleteModeLine(client);
1683*4882a593Smuzhiyun             case X_XF86VidModeModModeLine:
1684*4882a593Smuzhiyun                 return ProcVidModeModModeLine(client);
1685*4882a593Smuzhiyun             case X_XF86VidModeSwitchMode:
1686*4882a593Smuzhiyun                 return ProcVidModeSwitchMode(client);
1687*4882a593Smuzhiyun             case X_XF86VidModeSwitchToMode:
1688*4882a593Smuzhiyun                 return ProcVidModeSwitchToMode(client);
1689*4882a593Smuzhiyun             case X_XF86VidModeLockModeSwitch:
1690*4882a593Smuzhiyun                 return ProcVidModeLockModeSwitch(client);
1691*4882a593Smuzhiyun             case X_XF86VidModeSetViewPort:
1692*4882a593Smuzhiyun                 return ProcVidModeSetViewPort(client);
1693*4882a593Smuzhiyun             case X_XF86VidModeSetGamma:
1694*4882a593Smuzhiyun                 return ProcVidModeSetGamma(client);
1695*4882a593Smuzhiyun             case X_XF86VidModeSetGammaRamp:
1696*4882a593Smuzhiyun                 return ProcVidModeSetGammaRamp(client);
1697*4882a593Smuzhiyun             default:
1698*4882a593Smuzhiyun                 return BadRequest;
1699*4882a593Smuzhiyun             }
1700*4882a593Smuzhiyun         }
1701*4882a593Smuzhiyun         else
1702*4882a593Smuzhiyun             return VidModeErrorBase + XF86VidModeClientNotLocal;
1703*4882a593Smuzhiyun     }
1704*4882a593Smuzhiyun }
1705*4882a593Smuzhiyun 
1706*4882a593Smuzhiyun static int _X_COLD
SProcVidModeQueryVersion(ClientPtr client)1707*4882a593Smuzhiyun SProcVidModeQueryVersion(ClientPtr client)
1708*4882a593Smuzhiyun {
1709*4882a593Smuzhiyun     REQUEST(xXF86VidModeQueryVersionReq);
1710*4882a593Smuzhiyun     swaps(&stuff->length);
1711*4882a593Smuzhiyun     return ProcVidModeQueryVersion(client);
1712*4882a593Smuzhiyun }
1713*4882a593Smuzhiyun 
1714*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetModeLine(ClientPtr client)1715*4882a593Smuzhiyun SProcVidModeGetModeLine(ClientPtr client)
1716*4882a593Smuzhiyun {
1717*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetModeLineReq);
1718*4882a593Smuzhiyun     swaps(&stuff->length);
1719*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetModeLineReq);
1720*4882a593Smuzhiyun     swaps(&stuff->screen);
1721*4882a593Smuzhiyun     return ProcVidModeGetModeLine(client);
1722*4882a593Smuzhiyun }
1723*4882a593Smuzhiyun 
1724*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetAllModeLines(ClientPtr client)1725*4882a593Smuzhiyun SProcVidModeGetAllModeLines(ClientPtr client)
1726*4882a593Smuzhiyun {
1727*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetAllModeLinesReq);
1728*4882a593Smuzhiyun     swaps(&stuff->length);
1729*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetAllModeLinesReq);
1730*4882a593Smuzhiyun     swaps(&stuff->screen);
1731*4882a593Smuzhiyun     return ProcVidModeGetAllModeLines(client);
1732*4882a593Smuzhiyun }
1733*4882a593Smuzhiyun 
1734*4882a593Smuzhiyun static int _X_COLD
SProcVidModeAddModeLine(ClientPtr client)1735*4882a593Smuzhiyun SProcVidModeAddModeLine(ClientPtr client)
1736*4882a593Smuzhiyun {
1737*4882a593Smuzhiyun     xXF86OldVidModeAddModeLineReq *oldstuff =
1738*4882a593Smuzhiyun         (xXF86OldVidModeAddModeLineReq *) client->requestBuffer;
1739*4882a593Smuzhiyun     int ver;
1740*4882a593Smuzhiyun 
1741*4882a593Smuzhiyun     REQUEST(xXF86VidModeAddModeLineReq);
1742*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
1743*4882a593Smuzhiyun     if (ver < 2) {
1744*4882a593Smuzhiyun         swaps(&oldstuff->length);
1745*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeAddModeLineReq);
1746*4882a593Smuzhiyun         swapl(&oldstuff->screen);
1747*4882a593Smuzhiyun         swaps(&oldstuff->hdisplay);
1748*4882a593Smuzhiyun         swaps(&oldstuff->hsyncstart);
1749*4882a593Smuzhiyun         swaps(&oldstuff->hsyncend);
1750*4882a593Smuzhiyun         swaps(&oldstuff->htotal);
1751*4882a593Smuzhiyun         swaps(&oldstuff->vdisplay);
1752*4882a593Smuzhiyun         swaps(&oldstuff->vsyncstart);
1753*4882a593Smuzhiyun         swaps(&oldstuff->vsyncend);
1754*4882a593Smuzhiyun         swaps(&oldstuff->vtotal);
1755*4882a593Smuzhiyun         swapl(&oldstuff->flags);
1756*4882a593Smuzhiyun         swapl(&oldstuff->privsize);
1757*4882a593Smuzhiyun         SwapRestL(oldstuff);
1758*4882a593Smuzhiyun     }
1759*4882a593Smuzhiyun     else {
1760*4882a593Smuzhiyun         swaps(&stuff->length);
1761*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeAddModeLineReq);
1762*4882a593Smuzhiyun         swapl(&stuff->screen);
1763*4882a593Smuzhiyun         swaps(&stuff->hdisplay);
1764*4882a593Smuzhiyun         swaps(&stuff->hsyncstart);
1765*4882a593Smuzhiyun         swaps(&stuff->hsyncend);
1766*4882a593Smuzhiyun         swaps(&stuff->htotal);
1767*4882a593Smuzhiyun         swaps(&stuff->hskew);
1768*4882a593Smuzhiyun         swaps(&stuff->vdisplay);
1769*4882a593Smuzhiyun         swaps(&stuff->vsyncstart);
1770*4882a593Smuzhiyun         swaps(&stuff->vsyncend);
1771*4882a593Smuzhiyun         swaps(&stuff->vtotal);
1772*4882a593Smuzhiyun         swapl(&stuff->flags);
1773*4882a593Smuzhiyun         swapl(&stuff->privsize);
1774*4882a593Smuzhiyun         SwapRestL(stuff);
1775*4882a593Smuzhiyun     }
1776*4882a593Smuzhiyun     return ProcVidModeAddModeLine(client);
1777*4882a593Smuzhiyun }
1778*4882a593Smuzhiyun 
1779*4882a593Smuzhiyun static int _X_COLD
SProcVidModeDeleteModeLine(ClientPtr client)1780*4882a593Smuzhiyun SProcVidModeDeleteModeLine(ClientPtr client)
1781*4882a593Smuzhiyun {
1782*4882a593Smuzhiyun     xXF86OldVidModeDeleteModeLineReq *oldstuff =
1783*4882a593Smuzhiyun         (xXF86OldVidModeDeleteModeLineReq *) client->requestBuffer;
1784*4882a593Smuzhiyun     int ver;
1785*4882a593Smuzhiyun 
1786*4882a593Smuzhiyun     REQUEST(xXF86VidModeDeleteModeLineReq);
1787*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
1788*4882a593Smuzhiyun     if (ver < 2) {
1789*4882a593Smuzhiyun         swaps(&oldstuff->length);
1790*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeDeleteModeLineReq);
1791*4882a593Smuzhiyun         swapl(&oldstuff->screen);
1792*4882a593Smuzhiyun         swaps(&oldstuff->hdisplay);
1793*4882a593Smuzhiyun         swaps(&oldstuff->hsyncstart);
1794*4882a593Smuzhiyun         swaps(&oldstuff->hsyncend);
1795*4882a593Smuzhiyun         swaps(&oldstuff->htotal);
1796*4882a593Smuzhiyun         swaps(&oldstuff->vdisplay);
1797*4882a593Smuzhiyun         swaps(&oldstuff->vsyncstart);
1798*4882a593Smuzhiyun         swaps(&oldstuff->vsyncend);
1799*4882a593Smuzhiyun         swaps(&oldstuff->vtotal);
1800*4882a593Smuzhiyun         swapl(&oldstuff->flags);
1801*4882a593Smuzhiyun         swapl(&oldstuff->privsize);
1802*4882a593Smuzhiyun         SwapRestL(oldstuff);
1803*4882a593Smuzhiyun     }
1804*4882a593Smuzhiyun     else {
1805*4882a593Smuzhiyun         swaps(&stuff->length);
1806*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeDeleteModeLineReq);
1807*4882a593Smuzhiyun         swapl(&stuff->screen);
1808*4882a593Smuzhiyun         swaps(&stuff->hdisplay);
1809*4882a593Smuzhiyun         swaps(&stuff->hsyncstart);
1810*4882a593Smuzhiyun         swaps(&stuff->hsyncend);
1811*4882a593Smuzhiyun         swaps(&stuff->htotal);
1812*4882a593Smuzhiyun         swaps(&stuff->hskew);
1813*4882a593Smuzhiyun         swaps(&stuff->vdisplay);
1814*4882a593Smuzhiyun         swaps(&stuff->vsyncstart);
1815*4882a593Smuzhiyun         swaps(&stuff->vsyncend);
1816*4882a593Smuzhiyun         swaps(&stuff->vtotal);
1817*4882a593Smuzhiyun         swapl(&stuff->flags);
1818*4882a593Smuzhiyun         swapl(&stuff->privsize);
1819*4882a593Smuzhiyun         SwapRestL(stuff);
1820*4882a593Smuzhiyun     }
1821*4882a593Smuzhiyun     return ProcVidModeDeleteModeLine(client);
1822*4882a593Smuzhiyun }
1823*4882a593Smuzhiyun 
1824*4882a593Smuzhiyun static int _X_COLD
SProcVidModeModModeLine(ClientPtr client)1825*4882a593Smuzhiyun SProcVidModeModModeLine(ClientPtr client)
1826*4882a593Smuzhiyun {
1827*4882a593Smuzhiyun     xXF86OldVidModeModModeLineReq *oldstuff =
1828*4882a593Smuzhiyun         (xXF86OldVidModeModModeLineReq *) client->requestBuffer;
1829*4882a593Smuzhiyun     int ver;
1830*4882a593Smuzhiyun 
1831*4882a593Smuzhiyun     REQUEST(xXF86VidModeModModeLineReq);
1832*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
1833*4882a593Smuzhiyun     if (ver < 2) {
1834*4882a593Smuzhiyun         swaps(&oldstuff->length);
1835*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeModModeLineReq);
1836*4882a593Smuzhiyun         swapl(&oldstuff->screen);
1837*4882a593Smuzhiyun         swaps(&oldstuff->hdisplay);
1838*4882a593Smuzhiyun         swaps(&oldstuff->hsyncstart);
1839*4882a593Smuzhiyun         swaps(&oldstuff->hsyncend);
1840*4882a593Smuzhiyun         swaps(&oldstuff->htotal);
1841*4882a593Smuzhiyun         swaps(&oldstuff->vdisplay);
1842*4882a593Smuzhiyun         swaps(&oldstuff->vsyncstart);
1843*4882a593Smuzhiyun         swaps(&oldstuff->vsyncend);
1844*4882a593Smuzhiyun         swaps(&oldstuff->vtotal);
1845*4882a593Smuzhiyun         swapl(&oldstuff->flags);
1846*4882a593Smuzhiyun         swapl(&oldstuff->privsize);
1847*4882a593Smuzhiyun         SwapRestL(oldstuff);
1848*4882a593Smuzhiyun     }
1849*4882a593Smuzhiyun     else {
1850*4882a593Smuzhiyun         swaps(&stuff->length);
1851*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeModModeLineReq);
1852*4882a593Smuzhiyun         swapl(&stuff->screen);
1853*4882a593Smuzhiyun         swaps(&stuff->hdisplay);
1854*4882a593Smuzhiyun         swaps(&stuff->hsyncstart);
1855*4882a593Smuzhiyun         swaps(&stuff->hsyncend);
1856*4882a593Smuzhiyun         swaps(&stuff->htotal);
1857*4882a593Smuzhiyun         swaps(&stuff->hskew);
1858*4882a593Smuzhiyun         swaps(&stuff->vdisplay);
1859*4882a593Smuzhiyun         swaps(&stuff->vsyncstart);
1860*4882a593Smuzhiyun         swaps(&stuff->vsyncend);
1861*4882a593Smuzhiyun         swaps(&stuff->vtotal);
1862*4882a593Smuzhiyun         swapl(&stuff->flags);
1863*4882a593Smuzhiyun         swapl(&stuff->privsize);
1864*4882a593Smuzhiyun         SwapRestL(stuff);
1865*4882a593Smuzhiyun     }
1866*4882a593Smuzhiyun     return ProcVidModeModModeLine(client);
1867*4882a593Smuzhiyun }
1868*4882a593Smuzhiyun 
1869*4882a593Smuzhiyun static int _X_COLD
SProcVidModeValidateModeLine(ClientPtr client)1870*4882a593Smuzhiyun SProcVidModeValidateModeLine(ClientPtr client)
1871*4882a593Smuzhiyun {
1872*4882a593Smuzhiyun     xXF86OldVidModeValidateModeLineReq *oldstuff =
1873*4882a593Smuzhiyun         (xXF86OldVidModeValidateModeLineReq *) client->requestBuffer;
1874*4882a593Smuzhiyun     int ver;
1875*4882a593Smuzhiyun 
1876*4882a593Smuzhiyun     REQUEST(xXF86VidModeValidateModeLineReq);
1877*4882a593Smuzhiyun     ver = ClientMajorVersion(client);
1878*4882a593Smuzhiyun     if (ver < 2) {
1879*4882a593Smuzhiyun         swaps(&oldstuff->length);
1880*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86OldVidModeValidateModeLineReq);
1881*4882a593Smuzhiyun         swapl(&oldstuff->screen);
1882*4882a593Smuzhiyun         swaps(&oldstuff->hdisplay);
1883*4882a593Smuzhiyun         swaps(&oldstuff->hsyncstart);
1884*4882a593Smuzhiyun         swaps(&oldstuff->hsyncend);
1885*4882a593Smuzhiyun         swaps(&oldstuff->htotal);
1886*4882a593Smuzhiyun         swaps(&oldstuff->vdisplay);
1887*4882a593Smuzhiyun         swaps(&oldstuff->vsyncstart);
1888*4882a593Smuzhiyun         swaps(&oldstuff->vsyncend);
1889*4882a593Smuzhiyun         swaps(&oldstuff->vtotal);
1890*4882a593Smuzhiyun         swapl(&oldstuff->flags);
1891*4882a593Smuzhiyun         swapl(&oldstuff->privsize);
1892*4882a593Smuzhiyun         SwapRestL(oldstuff);
1893*4882a593Smuzhiyun     }
1894*4882a593Smuzhiyun     else {
1895*4882a593Smuzhiyun         swaps(&stuff->length);
1896*4882a593Smuzhiyun         REQUEST_AT_LEAST_SIZE(xXF86VidModeValidateModeLineReq);
1897*4882a593Smuzhiyun         swapl(&stuff->screen);
1898*4882a593Smuzhiyun         swaps(&stuff->hdisplay);
1899*4882a593Smuzhiyun         swaps(&stuff->hsyncstart);
1900*4882a593Smuzhiyun         swaps(&stuff->hsyncend);
1901*4882a593Smuzhiyun         swaps(&stuff->htotal);
1902*4882a593Smuzhiyun         swaps(&stuff->hskew);
1903*4882a593Smuzhiyun         swaps(&stuff->vdisplay);
1904*4882a593Smuzhiyun         swaps(&stuff->vsyncstart);
1905*4882a593Smuzhiyun         swaps(&stuff->vsyncend);
1906*4882a593Smuzhiyun         swaps(&stuff->vtotal);
1907*4882a593Smuzhiyun         swapl(&stuff->flags);
1908*4882a593Smuzhiyun         swapl(&stuff->privsize);
1909*4882a593Smuzhiyun         SwapRestL(stuff);
1910*4882a593Smuzhiyun     }
1911*4882a593Smuzhiyun     return ProcVidModeValidateModeLine(client);
1912*4882a593Smuzhiyun }
1913*4882a593Smuzhiyun 
1914*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSwitchMode(ClientPtr client)1915*4882a593Smuzhiyun SProcVidModeSwitchMode(ClientPtr client)
1916*4882a593Smuzhiyun {
1917*4882a593Smuzhiyun     REQUEST(xXF86VidModeSwitchModeReq);
1918*4882a593Smuzhiyun     swaps(&stuff->length);
1919*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSwitchModeReq);
1920*4882a593Smuzhiyun     swaps(&stuff->screen);
1921*4882a593Smuzhiyun     swaps(&stuff->zoom);
1922*4882a593Smuzhiyun     return ProcVidModeSwitchMode(client);
1923*4882a593Smuzhiyun }
1924*4882a593Smuzhiyun 
1925*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSwitchToMode(ClientPtr client)1926*4882a593Smuzhiyun SProcVidModeSwitchToMode(ClientPtr client)
1927*4882a593Smuzhiyun {
1928*4882a593Smuzhiyun     REQUEST(xXF86VidModeSwitchToModeReq);
1929*4882a593Smuzhiyun     swaps(&stuff->length);
1930*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSwitchToModeReq);
1931*4882a593Smuzhiyun     swapl(&stuff->screen);
1932*4882a593Smuzhiyun     return ProcVidModeSwitchToMode(client);
1933*4882a593Smuzhiyun }
1934*4882a593Smuzhiyun 
1935*4882a593Smuzhiyun static int _X_COLD
SProcVidModeLockModeSwitch(ClientPtr client)1936*4882a593Smuzhiyun SProcVidModeLockModeSwitch(ClientPtr client)
1937*4882a593Smuzhiyun {
1938*4882a593Smuzhiyun     REQUEST(xXF86VidModeLockModeSwitchReq);
1939*4882a593Smuzhiyun     swaps(&stuff->length);
1940*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeLockModeSwitchReq);
1941*4882a593Smuzhiyun     swaps(&stuff->screen);
1942*4882a593Smuzhiyun     swaps(&stuff->lock);
1943*4882a593Smuzhiyun     return ProcVidModeLockModeSwitch(client);
1944*4882a593Smuzhiyun }
1945*4882a593Smuzhiyun 
1946*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetMonitor(ClientPtr client)1947*4882a593Smuzhiyun SProcVidModeGetMonitor(ClientPtr client)
1948*4882a593Smuzhiyun {
1949*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetMonitorReq);
1950*4882a593Smuzhiyun     swaps(&stuff->length);
1951*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetMonitorReq);
1952*4882a593Smuzhiyun     swaps(&stuff->screen);
1953*4882a593Smuzhiyun     return ProcVidModeGetMonitor(client);
1954*4882a593Smuzhiyun }
1955*4882a593Smuzhiyun 
1956*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetViewPort(ClientPtr client)1957*4882a593Smuzhiyun SProcVidModeGetViewPort(ClientPtr client)
1958*4882a593Smuzhiyun {
1959*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetViewPortReq);
1960*4882a593Smuzhiyun     swaps(&stuff->length);
1961*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetViewPortReq);
1962*4882a593Smuzhiyun     swaps(&stuff->screen);
1963*4882a593Smuzhiyun     return ProcVidModeGetViewPort(client);
1964*4882a593Smuzhiyun }
1965*4882a593Smuzhiyun 
1966*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSetViewPort(ClientPtr client)1967*4882a593Smuzhiyun SProcVidModeSetViewPort(ClientPtr client)
1968*4882a593Smuzhiyun {
1969*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetViewPortReq);
1970*4882a593Smuzhiyun     swaps(&stuff->length);
1971*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetViewPortReq);
1972*4882a593Smuzhiyun     swaps(&stuff->screen);
1973*4882a593Smuzhiyun     swapl(&stuff->x);
1974*4882a593Smuzhiyun     swapl(&stuff->y);
1975*4882a593Smuzhiyun     return ProcVidModeSetViewPort(client);
1976*4882a593Smuzhiyun }
1977*4882a593Smuzhiyun 
1978*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetDotClocks(ClientPtr client)1979*4882a593Smuzhiyun SProcVidModeGetDotClocks(ClientPtr client)
1980*4882a593Smuzhiyun {
1981*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetDotClocksReq);
1982*4882a593Smuzhiyun     swaps(&stuff->length);
1983*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetDotClocksReq);
1984*4882a593Smuzhiyun     swaps(&stuff->screen);
1985*4882a593Smuzhiyun     return ProcVidModeGetDotClocks(client);
1986*4882a593Smuzhiyun }
1987*4882a593Smuzhiyun 
1988*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSetClientVersion(ClientPtr client)1989*4882a593Smuzhiyun SProcVidModeSetClientVersion(ClientPtr client)
1990*4882a593Smuzhiyun {
1991*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetClientVersionReq);
1992*4882a593Smuzhiyun     swaps(&stuff->length);
1993*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetClientVersionReq);
1994*4882a593Smuzhiyun     swaps(&stuff->major);
1995*4882a593Smuzhiyun     swaps(&stuff->minor);
1996*4882a593Smuzhiyun     return ProcVidModeSetClientVersion(client);
1997*4882a593Smuzhiyun }
1998*4882a593Smuzhiyun 
1999*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSetGamma(ClientPtr client)2000*4882a593Smuzhiyun SProcVidModeSetGamma(ClientPtr client)
2001*4882a593Smuzhiyun {
2002*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetGammaReq);
2003*4882a593Smuzhiyun     swaps(&stuff->length);
2004*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeSetGammaReq);
2005*4882a593Smuzhiyun     swaps(&stuff->screen);
2006*4882a593Smuzhiyun     swapl(&stuff->red);
2007*4882a593Smuzhiyun     swapl(&stuff->green);
2008*4882a593Smuzhiyun     swapl(&stuff->blue);
2009*4882a593Smuzhiyun     return ProcVidModeSetGamma(client);
2010*4882a593Smuzhiyun }
2011*4882a593Smuzhiyun 
2012*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetGamma(ClientPtr client)2013*4882a593Smuzhiyun SProcVidModeGetGamma(ClientPtr client)
2014*4882a593Smuzhiyun {
2015*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaReq);
2016*4882a593Smuzhiyun     swaps(&stuff->length);
2017*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaReq);
2018*4882a593Smuzhiyun     swaps(&stuff->screen);
2019*4882a593Smuzhiyun     return ProcVidModeGetGamma(client);
2020*4882a593Smuzhiyun }
2021*4882a593Smuzhiyun 
2022*4882a593Smuzhiyun static int _X_COLD
SProcVidModeSetGammaRamp(ClientPtr client)2023*4882a593Smuzhiyun SProcVidModeSetGammaRamp(ClientPtr client)
2024*4882a593Smuzhiyun {
2025*4882a593Smuzhiyun     int length;
2026*4882a593Smuzhiyun 
2027*4882a593Smuzhiyun     REQUEST(xXF86VidModeSetGammaRampReq);
2028*4882a593Smuzhiyun     swaps(&stuff->length);
2029*4882a593Smuzhiyun     REQUEST_AT_LEAST_SIZE(xXF86VidModeSetGammaRampReq);
2030*4882a593Smuzhiyun     swaps(&stuff->size);
2031*4882a593Smuzhiyun     swaps(&stuff->screen);
2032*4882a593Smuzhiyun     length = ((stuff->size + 1) & ~1) * 6;
2033*4882a593Smuzhiyun     REQUEST_FIXED_SIZE(xXF86VidModeSetGammaRampReq, length);
2034*4882a593Smuzhiyun     SwapRestS(stuff);
2035*4882a593Smuzhiyun     return ProcVidModeSetGammaRamp(client);
2036*4882a593Smuzhiyun }
2037*4882a593Smuzhiyun 
2038*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetGammaRamp(ClientPtr client)2039*4882a593Smuzhiyun SProcVidModeGetGammaRamp(ClientPtr client)
2040*4882a593Smuzhiyun {
2041*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaRampReq);
2042*4882a593Smuzhiyun     swaps(&stuff->length);
2043*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampReq);
2044*4882a593Smuzhiyun     swaps(&stuff->size);
2045*4882a593Smuzhiyun     swaps(&stuff->screen);
2046*4882a593Smuzhiyun     return ProcVidModeGetGammaRamp(client);
2047*4882a593Smuzhiyun }
2048*4882a593Smuzhiyun 
2049*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetGammaRampSize(ClientPtr client)2050*4882a593Smuzhiyun SProcVidModeGetGammaRampSize(ClientPtr client)
2051*4882a593Smuzhiyun {
2052*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetGammaRampSizeReq);
2053*4882a593Smuzhiyun     swaps(&stuff->length);
2054*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetGammaRampSizeReq);
2055*4882a593Smuzhiyun     swaps(&stuff->screen);
2056*4882a593Smuzhiyun     return ProcVidModeGetGammaRampSize(client);
2057*4882a593Smuzhiyun }
2058*4882a593Smuzhiyun 
2059*4882a593Smuzhiyun static int _X_COLD
SProcVidModeGetPermissions(ClientPtr client)2060*4882a593Smuzhiyun SProcVidModeGetPermissions(ClientPtr client)
2061*4882a593Smuzhiyun {
2062*4882a593Smuzhiyun     REQUEST(xXF86VidModeGetPermissionsReq);
2063*4882a593Smuzhiyun     swaps(&stuff->length);
2064*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXF86VidModeGetPermissionsReq);
2065*4882a593Smuzhiyun     swaps(&stuff->screen);
2066*4882a593Smuzhiyun     return ProcVidModeGetPermissions(client);
2067*4882a593Smuzhiyun }
2068*4882a593Smuzhiyun 
2069*4882a593Smuzhiyun static int _X_COLD
SProcVidModeDispatch(ClientPtr client)2070*4882a593Smuzhiyun SProcVidModeDispatch(ClientPtr client)
2071*4882a593Smuzhiyun {
2072*4882a593Smuzhiyun     REQUEST(xReq);
2073*4882a593Smuzhiyun     switch (stuff->data) {
2074*4882a593Smuzhiyun     case X_XF86VidModeQueryVersion:
2075*4882a593Smuzhiyun         return SProcVidModeQueryVersion(client);
2076*4882a593Smuzhiyun     case X_XF86VidModeGetModeLine:
2077*4882a593Smuzhiyun         return SProcVidModeGetModeLine(client);
2078*4882a593Smuzhiyun     case X_XF86VidModeGetMonitor:
2079*4882a593Smuzhiyun         return SProcVidModeGetMonitor(client);
2080*4882a593Smuzhiyun     case X_XF86VidModeGetAllModeLines:
2081*4882a593Smuzhiyun         return SProcVidModeGetAllModeLines(client);
2082*4882a593Smuzhiyun     case X_XF86VidModeGetViewPort:
2083*4882a593Smuzhiyun         return SProcVidModeGetViewPort(client);
2084*4882a593Smuzhiyun     case X_XF86VidModeValidateModeLine:
2085*4882a593Smuzhiyun         return SProcVidModeValidateModeLine(client);
2086*4882a593Smuzhiyun     case X_XF86VidModeGetDotClocks:
2087*4882a593Smuzhiyun         return SProcVidModeGetDotClocks(client);
2088*4882a593Smuzhiyun     case X_XF86VidModeSetClientVersion:
2089*4882a593Smuzhiyun         return SProcVidModeSetClientVersion(client);
2090*4882a593Smuzhiyun     case X_XF86VidModeGetGamma:
2091*4882a593Smuzhiyun         return SProcVidModeGetGamma(client);
2092*4882a593Smuzhiyun     case X_XF86VidModeGetGammaRamp:
2093*4882a593Smuzhiyun         return SProcVidModeGetGammaRamp(client);
2094*4882a593Smuzhiyun     case X_XF86VidModeGetGammaRampSize:
2095*4882a593Smuzhiyun         return SProcVidModeGetGammaRampSize(client);
2096*4882a593Smuzhiyun     case X_XF86VidModeGetPermissions:
2097*4882a593Smuzhiyun         return SProcVidModeGetPermissions(client);
2098*4882a593Smuzhiyun     default:
2099*4882a593Smuzhiyun         if (VidModeAllowNonLocal || client->local) {
2100*4882a593Smuzhiyun             switch (stuff->data) {
2101*4882a593Smuzhiyun             case X_XF86VidModeAddModeLine:
2102*4882a593Smuzhiyun                 return SProcVidModeAddModeLine(client);
2103*4882a593Smuzhiyun             case X_XF86VidModeDeleteModeLine:
2104*4882a593Smuzhiyun                 return SProcVidModeDeleteModeLine(client);
2105*4882a593Smuzhiyun             case X_XF86VidModeModModeLine:
2106*4882a593Smuzhiyun                 return SProcVidModeModModeLine(client);
2107*4882a593Smuzhiyun             case X_XF86VidModeSwitchMode:
2108*4882a593Smuzhiyun                 return SProcVidModeSwitchMode(client);
2109*4882a593Smuzhiyun             case X_XF86VidModeSwitchToMode:
2110*4882a593Smuzhiyun                 return SProcVidModeSwitchToMode(client);
2111*4882a593Smuzhiyun             case X_XF86VidModeLockModeSwitch:
2112*4882a593Smuzhiyun                 return SProcVidModeLockModeSwitch(client);
2113*4882a593Smuzhiyun             case X_XF86VidModeSetViewPort:
2114*4882a593Smuzhiyun                 return SProcVidModeSetViewPort(client);
2115*4882a593Smuzhiyun             case X_XF86VidModeSetGamma:
2116*4882a593Smuzhiyun                 return SProcVidModeSetGamma(client);
2117*4882a593Smuzhiyun             case X_XF86VidModeSetGammaRamp:
2118*4882a593Smuzhiyun                 return SProcVidModeSetGammaRamp(client);
2119*4882a593Smuzhiyun             default:
2120*4882a593Smuzhiyun                 return BadRequest;
2121*4882a593Smuzhiyun             }
2122*4882a593Smuzhiyun         }
2123*4882a593Smuzhiyun         else
2124*4882a593Smuzhiyun             return VidModeErrorBase + XF86VidModeClientNotLocal;
2125*4882a593Smuzhiyun     }
2126*4882a593Smuzhiyun }
2127*4882a593Smuzhiyun 
2128*4882a593Smuzhiyun void
VidModeAddExtension(Bool allow_non_local)2129*4882a593Smuzhiyun VidModeAddExtension(Bool allow_non_local)
2130*4882a593Smuzhiyun {
2131*4882a593Smuzhiyun     ExtensionEntry *extEntry;
2132*4882a593Smuzhiyun 
2133*4882a593Smuzhiyun     DEBUG_P("VidModeAddExtension");
2134*4882a593Smuzhiyun 
2135*4882a593Smuzhiyun     if (!dixRegisterPrivateKey(VidModeClientPrivateKey, PRIVATE_CLIENT, 0))
2136*4882a593Smuzhiyun         return;
2137*4882a593Smuzhiyun 
2138*4882a593Smuzhiyun     if ((extEntry = AddExtension(XF86VIDMODENAME,
2139*4882a593Smuzhiyun                                  XF86VidModeNumberEvents,
2140*4882a593Smuzhiyun                                  XF86VidModeNumberErrors,
2141*4882a593Smuzhiyun                                  ProcVidModeDispatch,
2142*4882a593Smuzhiyun                                  SProcVidModeDispatch,
2143*4882a593Smuzhiyun                                  NULL, StandardMinorOpcode))) {
2144*4882a593Smuzhiyun         VidModeErrorBase = extEntry->errorBase;
2145*4882a593Smuzhiyun         VidModeAllowNonLocal = allow_non_local;
2146*4882a593Smuzhiyun     }
2147*4882a593Smuzhiyun }
2148*4882a593Smuzhiyun 
VidModeGetPtr(ScreenPtr pScreen)2149*4882a593Smuzhiyun VidModePtr VidModeGetPtr(ScreenPtr pScreen)
2150*4882a593Smuzhiyun {
2151*4882a593Smuzhiyun     return (VidModePtr) (dixLookupPrivate(&pScreen->devPrivates, VidModePrivateKey));
2152*4882a593Smuzhiyun }
2153*4882a593Smuzhiyun 
VidModeInit(ScreenPtr pScreen)2154*4882a593Smuzhiyun VidModePtr VidModeInit(ScreenPtr pScreen)
2155*4882a593Smuzhiyun {
2156*4882a593Smuzhiyun     if (!dixRegisterPrivateKey(VidModePrivateKey, PRIVATE_SCREEN, sizeof(VidModeRec)))
2157*4882a593Smuzhiyun         return NULL;
2158*4882a593Smuzhiyun 
2159*4882a593Smuzhiyun     return VidModeGetPtr(pScreen);
2160*4882a593Smuzhiyun }
2161*4882a593Smuzhiyun 
2162*4882a593Smuzhiyun #endif /* XF86VIDMODE */
2163