1 /* $XConsortium: XF86VMode.c /main/2 1995/11/14 18:17:58 kaleb $ */
2 /* $XFree86: xc/lib/Xxf86vm/XF86VMode.c,v 3.32 2001/07/25 15:04:54 dawes Exp $ */
3 /*
4
5 Copyright (c) 1995 Kaleb S. KEITHLEY
6
7 Permission is hereby granted, free of charge, to any person obtaining
8 a copy of this software and associated documentation files (the
9 "Software"), to deal in the Software without restriction, including
10 without limitation the rights to use, copy, modify, merge, publish,
11 distribute, sublicense, and/or sell copies of the Software, and to
12 permit persons to whom the Software is furnished to do so, subject to
13 the following conditions:
14
15 The above copyright notice and this permission notice shall be
16 included in all copies or substantial portions of the Software.
17
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21 IN NO EVENT SHALL Kaleb S. KEITHLEY BE LIABLE FOR ANY CLAIM, DAMAGES
22 OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
23 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
24 OTHER DEALINGS IN THE SOFTWARE.
25
26 Except as contained in this notice, the name of Kaleb S. KEITHLEY
27 shall not be used in advertising or otherwise to promote the sale, use
28 or other dealings in this Software without prior written authorization
29 from Kaleb S. KEITHLEY.
30
31 */
32 /* $XConsortium: XF86VMode.c /main/4 1996/01/16 07:52:25 kaleb CHECKEDOUT $ */
33
34 /* THIS IS NOT AN X CONSORTIUM STANDARD */
35
36 #define NEED_EVENTS
37 #define NEED_REPLIES
38
39 #ifndef XBUILD_IN_CLIENT
40 /* Apparently some X11 systems can't include this multiple times... */
41 #ifndef SDL_INCLUDED_XLIBINT_H
42 #define SDL_INCLUDED_XLIBINT_H 1
43 #include <X11/Xlibint.h>
44 #endif
45 #include "../extensions/xf86vmstr.h"
46 #include "../extensions/Xext.h"
47 #include "../extensions/extutil.h"
48 #else
49 #include "include/extensions/xf86vmstr.h"
50 #include "include/extensions/Xext.h"
51 #include "include/extensions/extutil.h"
52 #endif
53
54 #ifdef DEBUG
55 #include <stdio.h>
56 #endif
57
58 #ifndef MODE_BAD
59 #define MODE_BAD 255
60 #endif
61
62 static XExtensionInfo _xf86vidmode_info_data;
63 static XExtensionInfo *xf86vidmode_info = &_xf86vidmode_info_data;
64 static char *xf86vidmode_extension_name = XF86VIDMODENAME;
65
66 #define XF86VidModeCheckExtension(dpy,i,val) \
67 XextCheckExtension (dpy, i, xf86vidmode_extension_name, val)
68
69 /*****************************************************************************
70 * *
71 * private utility routines *
72 * *
73 *****************************************************************************/
74
75 static XEXT_CLOSE_DISPLAY_PROTO(close_display);
76 static /* const */ XExtensionHooks xf86vidmode_extension_hooks = {
77 NULL, /* create_gc */
78 NULL, /* copy_gc */
79 NULL, /* flush_gc */
80 NULL, /* free_gc */
81 NULL, /* create_font */
82 NULL, /* free_font */
83 close_display, /* close_display */
84 NULL, /* wire_to_event */
85 NULL, /* event_to_wire */
86 NULL, /* error */
87 NULL, /* error_string */
88 };
89
90 static XEXT_GENERATE_FIND_DISPLAY (find_display, xf86vidmode_info,
91 xf86vidmode_extension_name,
92 &xf86vidmode_extension_hooks,
93 0, NULL)
94
95 static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86vidmode_info)
96
97
98 /*****************************************************************************
99 * *
100 * public XFree86-VidMode Extension routines *
101 * *
102 *****************************************************************************/
103
104 Bool
105 SDL_NAME(XF86VidModeQueryExtension) (dpy, event_basep, error_basep)
106 Display *dpy;
107 int *event_basep, *error_basep;
108 {
109 XExtDisplayInfo *info = find_display (dpy);
110
111 if (XextHasExtension(info)) {
112 *event_basep = info->codes->first_event;
113 *error_basep = info->codes->first_error;
114 return True;
115 } else {
116 return False;
117 }
118 }
119
120 Bool
121 SDL_NAME(XF86VidModeQueryVersion)(dpy, majorVersion, minorVersion)
122 Display* dpy;
123 int* majorVersion;
124 int* minorVersion;
125 {
126 XExtDisplayInfo *info = find_display (dpy);
127 xXF86VidModeQueryVersionReply rep;
128 xXF86VidModeQueryVersionReq *req;
129
130 XF86VidModeCheckExtension (dpy, info, False);
131
132 LockDisplay(dpy);
133 GetReq(XF86VidModeQueryVersion, req);
134 req->reqType = info->codes->major_opcode;
135 req->xf86vidmodeReqType = X_XF86VidModeQueryVersion;
136 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
137 UnlockDisplay(dpy);
138 SyncHandle();
139 return False;
140 }
141 *majorVersion = rep.majorVersion;
142 *minorVersion = rep.minorVersion;
143 UnlockDisplay(dpy);
144 SyncHandle();
145 if (*majorVersion >= 2)
146 SDL_NAME(XF86VidModeSetClientVersion)(dpy);
147 return True;
148 }
149
150 Bool
SDL_NAME(XF86VidModeSetClientVersion)151 SDL_NAME(XF86VidModeSetClientVersion)(Display *dpy)
152 {
153 XExtDisplayInfo *info = find_display(dpy);
154 xXF86VidModeSetClientVersionReq *req;
155
156 XF86VidModeCheckExtension(dpy, info, False);
157
158 LockDisplay(dpy);
159 GetReq(XF86VidModeSetClientVersion, req);
160 req->reqType = info->codes->major_opcode;
161 req->xf86vidmodeReqType = X_XF86VidModeSetClientVersion;
162 req->major = XF86VIDMODE_MAJOR_VERSION;
163 req->minor = XF86VIDMODE_MINOR_VERSION;
164 UnlockDisplay(dpy);
165 SyncHandle();
166 return True;
167 }
168
169 Bool
SDL_NAME(XF86VidModeSetGamma)170 SDL_NAME(XF86VidModeSetGamma)(Display *dpy, int screen, SDL_NAME(XF86VidModeGamma) *Gamma)
171 {
172 XExtDisplayInfo *info = find_display(dpy);
173 xXF86VidModeSetGammaReq *req;
174
175 XF86VidModeCheckExtension(dpy, info, False);
176
177 LockDisplay(dpy);
178 GetReq(XF86VidModeSetGamma, req);
179 req->reqType = info->codes->major_opcode;
180 req->xf86vidmodeReqType = X_XF86VidModeSetGamma;
181 req->screen = screen;
182 req->red = (CARD32)(Gamma->red * 10000.);
183 req->green = (CARD32)(Gamma->green * 10000.);
184 req->blue = (CARD32)(Gamma->blue * 10000.);
185 UnlockDisplay(dpy);
186 SyncHandle();
187 return True;
188 }
189
190 Bool
SDL_NAME(XF86VidModeGetGamma)191 SDL_NAME(XF86VidModeGetGamma)(Display *dpy, int screen, SDL_NAME(XF86VidModeGamma) *Gamma)
192 {
193 XExtDisplayInfo *info = find_display (dpy);
194 xXF86VidModeGetGammaReply rep;
195 xXF86VidModeGetGammaReq *req;
196
197 XF86VidModeCheckExtension (dpy, info, False);
198
199 LockDisplay(dpy);
200 GetReq(XF86VidModeGetGamma, req);
201 req->reqType = info->codes->major_opcode;
202 req->xf86vidmodeReqType = X_XF86VidModeGetGamma;
203 req->screen = screen;
204 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
205 UnlockDisplay(dpy);
206 SyncHandle();
207 return False;
208 }
209 Gamma->red = ((float)rep.red) / 10000.;
210 Gamma->green = ((float)rep.green) / 10000.;
211 Gamma->blue = ((float)rep.blue) / 10000.;
212 UnlockDisplay(dpy);
213 SyncHandle();
214 return True;
215 }
216
217 Bool
218 SDL_NAME(XF86VidModeGetModeLine)(dpy, screen, dotclock, modeline)
219 Display* dpy;
220 int screen;
221 int* dotclock;
SDL_NAME(XF86VidModeModeLine)222 SDL_NAME(XF86VidModeModeLine)* modeline;
223 {
224 XExtDisplayInfo *info = find_display (dpy);
225 xXF86VidModeGetModeLineReply rep;
226 xXF86OldVidModeGetModeLineReply oldrep;
227 xXF86VidModeGetModeLineReq *req;
228 int majorVersion, minorVersion;
229
230 XF86VidModeCheckExtension (dpy, info, False);
231 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
232
233 LockDisplay(dpy);
234 GetReq(XF86VidModeGetModeLine, req);
235 req->reqType = info->codes->major_opcode;
236 req->xf86vidmodeReqType = X_XF86VidModeGetModeLine;
237 req->screen = screen;
238
239 if (majorVersion < 2) {
240 if (!_XReply(dpy, (xReply *)&oldrep,
241 (SIZEOF(xXF86OldVidModeGetModeLineReply) - SIZEOF(xReply)) >> 2, xFalse)) {
242 UnlockDisplay(dpy);
243 SyncHandle();
244 return False;
245 }
246 *dotclock = oldrep.dotclock;
247 modeline->hdisplay = oldrep.hdisplay;
248 modeline->hsyncstart = oldrep.hsyncstart;
249 modeline->hsyncend = oldrep.hsyncend;
250 modeline->htotal = oldrep.htotal;
251 modeline->hskew = 0;
252 modeline->vdisplay = oldrep.vdisplay;
253 modeline->vsyncstart = oldrep.vsyncstart;
254 modeline->vsyncend = oldrep.vsyncend;
255 modeline->vtotal = oldrep.vtotal;
256 modeline->flags = oldrep.flags;
257 modeline->privsize = oldrep.privsize;
258 } else {
259 if (!_XReply(dpy, (xReply *)&rep,
260 (SIZEOF(xXF86VidModeGetModeLineReply) - SIZEOF(xReply)) >> 2, xFalse)) {
261 UnlockDisplay(dpy);
262 SyncHandle();
263 return False;
264 }
265 *dotclock = rep.dotclock;
266 modeline->hdisplay = rep.hdisplay;
267 modeline->hsyncstart = rep.hsyncstart;
268 modeline->hsyncend = rep.hsyncend;
269 modeline->htotal = rep.htotal;
270 modeline->hskew = rep.hskew;
271 modeline->vdisplay = rep.vdisplay;
272 modeline->vsyncstart = rep.vsyncstart;
273 modeline->vsyncend = rep.vsyncend;
274 modeline->vtotal = rep.vtotal;
275 modeline->flags = rep.flags;
276 modeline->privsize = rep.privsize;
277 }
278
279 if (modeline->privsize > 0) {
280 if (!(modeline->private = Xcalloc(modeline->privsize, sizeof(INT32)))) {
281 _XEatData(dpy, (modeline->privsize) * sizeof(INT32));
282 Xfree(modeline->private);
283 return False;
284 }
285 _XRead(dpy, (char*)modeline->private, modeline->privsize * sizeof(INT32));
286 } else {
287 modeline->private = NULL;
288 }
289 UnlockDisplay(dpy);
290 SyncHandle();
291 return True;
292 }
293
294 Bool
295 SDL_NAME(XF86VidModeGetAllModeLines)(dpy, screen, modecount, modelinesPtr)
296 Display* dpy;
297 int screen;
298 int* modecount;
SDL_NAME(XF86VidModeModeInfo)299 SDL_NAME(XF86VidModeModeInfo) ***modelinesPtr;
300 {
301 XExtDisplayInfo *info = find_display (dpy);
302 xXF86VidModeGetAllModeLinesReply rep;
303 xXF86VidModeGetAllModeLinesReq *req;
304 SDL_NAME(XF86VidModeModeInfo) *mdinfptr, **modelines;
305 xXF86VidModeModeInfo xmdline;
306 xXF86OldVidModeModeInfo oldxmdline;
307 int i;
308 int majorVersion, minorVersion;
309 Bool protocolBug = False;
310
311 XF86VidModeCheckExtension (dpy, info, False);
312
313 /*
314 * Note: There was a bug in the protocol implementation in versions
315 * 0.x with x < 8 (the .private field wasn't being passed over the wire).
316 * Check the server's version, and accept the old format if appropriate.
317 */
318
319 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
320 if (majorVersion == 0 && minorVersion < 8) {
321 protocolBug = True;
322 #ifdef DEBUG
323 fprintf(stderr, "XF86VidModeGetAllModeLines: Warning: Xserver is"
324 "running an old version (%d.%d)\n", majorVersion,
325 minorVersion);
326 #endif
327 }
328
329 LockDisplay(dpy);
330 GetReq(XF86VidModeGetAllModeLines, req);
331 req->reqType = info->codes->major_opcode;
332 req->xf86vidmodeReqType = X_XF86VidModeGetAllModeLines;
333 req->screen = screen;
334 if (!_XReply(dpy, (xReply *)&rep,
335 (SIZEOF(xXF86VidModeGetAllModeLinesReply) - SIZEOF(xReply)) >> 2, xFalse)) {
336 UnlockDisplay(dpy);
337 SyncHandle();
338 return False;
339 }
340
341 *modecount = rep.modecount;
342
343 if (!(modelines = (SDL_NAME(XF86VidModeModeInfo) **) Xcalloc(rep.modecount,
344 sizeof(SDL_NAME(XF86VidModeModeInfo) *)
345 +sizeof(SDL_NAME(XF86VidModeModeInfo))))) {
346 if (majorVersion < 2)
347 _XEatData(dpy, (rep.modecount) * sizeof(xXF86OldVidModeModeInfo));
348 else
349 _XEatData(dpy, (rep.modecount) * sizeof(xXF86VidModeModeInfo));
350 Xfree(modelines);
351 UnlockDisplay(dpy);
352 SyncHandle();
353 return False;
354 }
355 mdinfptr = (SDL_NAME(XF86VidModeModeInfo) *) (
356 (char *) modelines
357 + rep.modecount*sizeof(SDL_NAME(XF86VidModeModeInfo) *)
358 );
359
360 for (i = 0; i < rep.modecount; i++) {
361 modelines[i] = mdinfptr++;
362 if (majorVersion < 2) {
363 _XRead(dpy, (char*)&oldxmdline, sizeof(xXF86OldVidModeModeInfo));
364 modelines[i]->dotclock = oldxmdline.dotclock;
365 modelines[i]->hdisplay = oldxmdline.hdisplay;
366 modelines[i]->hsyncstart = oldxmdline.hsyncstart;
367 modelines[i]->hsyncend = oldxmdline.hsyncend;
368 modelines[i]->htotal = oldxmdline.htotal;
369 modelines[i]->hskew = 0;
370 modelines[i]->vdisplay = oldxmdline.vdisplay;
371 modelines[i]->vsyncstart = oldxmdline.vsyncstart;
372 modelines[i]->vsyncend = oldxmdline.vsyncend;
373 modelines[i]->vtotal = oldxmdline.vtotal;
374 modelines[i]->flags = oldxmdline.flags;
375 if (protocolBug) {
376 modelines[i]->privsize = 0;
377 modelines[i]->private = NULL;
378 } else {
379 modelines[i]->privsize = oldxmdline.privsize;
380 if (oldxmdline.privsize > 0) {
381 if (!(modelines[i]->private =
382 Xcalloc(oldxmdline.privsize, sizeof(INT32)))) {
383 _XEatData(dpy, (oldxmdline.privsize) * sizeof(INT32));
384 Xfree(modelines[i]->private);
385 } else {
386 _XRead(dpy, (char*)modelines[i]->private,
387 oldxmdline.privsize * sizeof(INT32));
388 }
389 } else {
390 modelines[i]->private = NULL;
391 }
392 }
393 } else {
394 _XRead(dpy, (char*)&xmdline, sizeof(xXF86VidModeModeInfo));
395 modelines[i]->dotclock = xmdline.dotclock;
396 modelines[i]->hdisplay = xmdline.hdisplay;
397 modelines[i]->hsyncstart = xmdline.hsyncstart;
398 modelines[i]->hsyncend = xmdline.hsyncend;
399 modelines[i]->htotal = xmdline.htotal;
400 modelines[i]->hskew = xmdline.hskew;
401 modelines[i]->vdisplay = xmdline.vdisplay;
402 modelines[i]->vsyncstart = xmdline.vsyncstart;
403 modelines[i]->vsyncend = xmdline.vsyncend;
404 modelines[i]->vtotal = xmdline.vtotal;
405 modelines[i]->flags = xmdline.flags;
406 if (protocolBug) {
407 modelines[i]->privsize = 0;
408 modelines[i]->private = NULL;
409 } else {
410 modelines[i]->privsize = xmdline.privsize;
411 if (xmdline.privsize > 0) {
412 if (!(modelines[i]->private =
413 Xcalloc(xmdline.privsize, sizeof(INT32)))) {
414 _XEatData(dpy, (xmdline.privsize) * sizeof(INT32));
415 Xfree(modelines[i]->private);
416 } else {
417 _XRead(dpy, (char*)modelines[i]->private,
418 xmdline.privsize * sizeof(INT32));
419 }
420 } else {
421 modelines[i]->private = NULL;
422 }
423 }
424 }
425 }
426 *modelinesPtr = modelines;
427 UnlockDisplay(dpy);
428 SyncHandle();
429 return True;
430 }
431
432 /*
433 * GetReq replacement for use with VidMode protocols earlier than 2.0
434 */
435 #if !defined(UNIXCPP) || defined(ANSICPP)
436 #define GetOldReq(name, oldname, req) \
437 WORD64ALIGN\
438 if ((dpy->bufptr + SIZEOF(x##oldname##Req)) > dpy->bufmax)\
439 _XFlush(dpy);\
440 req = (x##oldname##Req *)(dpy->last_req = dpy->bufptr);\
441 req->reqType = X_##name;\
442 req->length = (SIZEOF(x##oldname##Req))>>2;\
443 dpy->bufptr += SIZEOF(x##oldname##Req);\
444 dpy->request++
445
446 #else /* non-ANSI C uses empty comment instead of "##" for token concatenation */
447 #define GetOldReq(name, oldname, req) \
448 WORD64ALIGN\
449 if ((dpy->bufptr + SIZEOF(x/**/oldname/**/Req)) > dpy->bufmax)\
450 _XFlush(dpy);\
451 req = (x/**/oldname/**/Req *)(dpy->last_req = dpy->bufptr);\
452 req->reqType = X_/**/name;\
453 req->length = (SIZEOF(x/**/oldname/**/Req))>>2;\
454 dpy->bufptr += SIZEOF(x/**/oldname/**/Req);\
455 dpy->request++
456 #endif
457
458 Bool
459 SDL_NAME(XF86VidModeAddModeLine) (dpy, screen, newmodeline, aftermodeline)
460 Display *dpy;
461 int screen;
462 SDL_NAME(XF86VidModeModeInfo)* newmodeline;
463 SDL_NAME(XF86VidModeModeInfo)* aftermodeline;
464 {
465 XExtDisplayInfo *info = find_display (dpy);
466 xXF86VidModeAddModeLineReq *req;
467 xXF86OldVidModeAddModeLineReq *oldreq;
468 int majorVersion, minorVersion;
469
470 XF86VidModeCheckExtension (dpy, info, False);
471 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
472
473 LockDisplay(dpy);
474 if (majorVersion < 2) {
475 GetOldReq(XF86VidModeAddModeLine, XF86OldVidModeAddModeLine, oldreq);
476 oldreq->reqType = info->codes->major_opcode;
477 oldreq->xf86vidmodeReqType = X_XF86VidModeAddModeLine;
478 oldreq->screen = screen;
479 oldreq->dotclock = newmodeline->dotclock;
480 oldreq->hdisplay = newmodeline->hdisplay;
481 oldreq->hsyncstart = newmodeline->hsyncstart;
482 oldreq->hsyncend = newmodeline->hsyncend;
483 oldreq->htotal = newmodeline->htotal;
484 oldreq->vdisplay = newmodeline->vdisplay;
485 oldreq->vsyncstart = newmodeline->vsyncstart;
486 oldreq->vsyncend = newmodeline->vsyncend;
487 oldreq->vtotal = newmodeline->vtotal;
488 oldreq->flags = newmodeline->flags;
489 oldreq->privsize = newmodeline->privsize;
490 if (aftermodeline != NULL) {
491 oldreq->after_dotclock = aftermodeline->dotclock;
492 oldreq->after_hdisplay = aftermodeline->hdisplay;
493 oldreq->after_hsyncstart = aftermodeline->hsyncstart;
494 oldreq->after_hsyncend = aftermodeline->hsyncend;
495 oldreq->after_htotal = aftermodeline->htotal;
496 oldreq->after_vdisplay = aftermodeline->vdisplay;
497 oldreq->after_vsyncstart = aftermodeline->vsyncstart;
498 oldreq->after_vsyncend = aftermodeline->vsyncend;
499 oldreq->after_vtotal = aftermodeline->vtotal;
500 oldreq->after_flags = aftermodeline->flags;
501 } else {
502 oldreq->after_dotclock = 0;
503 oldreq->after_hdisplay = 0;
504 oldreq->after_hsyncstart = 0;
505 oldreq->after_hsyncend = 0;
506 oldreq->after_htotal = 0;
507 oldreq->after_vdisplay = 0;
508 oldreq->after_vsyncstart = 0;
509 oldreq->after_vsyncend = 0;
510 oldreq->after_vtotal = 0;
511 oldreq->after_flags = 0;
512 }
513 if (newmodeline->privsize) {
514 oldreq->length += newmodeline->privsize;
515 Data32(dpy, (long *) newmodeline->private,
516 newmodeline->privsize * sizeof(INT32));
517 }
518 } else {
519 GetReq(XF86VidModeAddModeLine, req);
520 req->reqType = info->codes->major_opcode;
521 req->xf86vidmodeReqType = X_XF86VidModeAddModeLine;
522 req->screen = screen;
523 req->dotclock = newmodeline->dotclock;
524 req->hdisplay = newmodeline->hdisplay;
525 req->hsyncstart = newmodeline->hsyncstart;
526 req->hsyncend = newmodeline->hsyncend;
527 req->htotal = newmodeline->htotal;
528 req->hskew = newmodeline->hskew;
529 req->vdisplay = newmodeline->vdisplay;
530 req->vsyncstart = newmodeline->vsyncstart;
531 req->vsyncend = newmodeline->vsyncend;
532 req->vtotal = newmodeline->vtotal;
533 req->flags = newmodeline->flags;
534 req->privsize = newmodeline->privsize;
535 if (aftermodeline != NULL) {
536 req->after_dotclock = aftermodeline->dotclock;
537 req->after_hdisplay = aftermodeline->hdisplay;
538 req->after_hsyncstart = aftermodeline->hsyncstart;
539 req->after_hsyncend = aftermodeline->hsyncend;
540 req->after_htotal = aftermodeline->htotal;
541 req->after_hskew = aftermodeline->hskew;
542 req->after_vdisplay = aftermodeline->vdisplay;
543 req->after_vsyncstart = aftermodeline->vsyncstart;
544 req->after_vsyncend = aftermodeline->vsyncend;
545 req->after_vtotal = aftermodeline->vtotal;
546 req->after_flags = aftermodeline->flags;
547 } else {
548 req->after_dotclock = 0;
549 req->after_hdisplay = 0;
550 req->after_hsyncstart = 0;
551 req->after_hsyncend = 0;
552 req->after_htotal = 0;
553 req->after_hskew = 0;
554 req->after_vdisplay = 0;
555 req->after_vsyncstart = 0;
556 req->after_vsyncend = 0;
557 req->after_vtotal = 0;
558 req->after_flags = 0;
559 }
560 if (newmodeline->privsize) {
561 req->length += newmodeline->privsize;
562 Data32(dpy, (long *) newmodeline->private,
563 newmodeline->privsize * sizeof(INT32));
564 }
565 }
566 UnlockDisplay(dpy);
567 SyncHandle();
568 return True;
569 }
570
571 Bool
572 SDL_NAME(XF86VidModeDeleteModeLine) (dpy, screen, modeline)
573 Display *dpy;
574 int screen;
SDL_NAME(XF86VidModeModeInfo)575 SDL_NAME(XF86VidModeModeInfo)* modeline;
576 {
577 XExtDisplayInfo *info = find_display (dpy);
578 xXF86VidModeDeleteModeLineReq *req;
579 xXF86OldVidModeDeleteModeLineReq *oldreq;
580 int majorVersion, minorVersion;
581
582 XF86VidModeCheckExtension (dpy, info, 0);
583 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
584
585 LockDisplay(dpy);
586 if (majorVersion < 2) {
587 GetOldReq(XF86VidModeDeleteModeLine, XF86OldVidModeDeleteModeLine, oldreq);
588 oldreq->reqType = info->codes->major_opcode;
589 oldreq->xf86vidmodeReqType = X_XF86VidModeDeleteModeLine;
590 oldreq->screen = screen;
591 oldreq->dotclock = modeline->dotclock;
592 oldreq->hdisplay = modeline->hdisplay;
593 oldreq->hsyncstart = modeline->hsyncstart;
594 oldreq->hsyncend = modeline->hsyncend;
595 oldreq->htotal = modeline->htotal;
596 oldreq->vdisplay = modeline->vdisplay;
597 oldreq->vsyncstart = modeline->vsyncstart;
598 oldreq->vsyncend = modeline->vsyncend;
599 oldreq->vtotal = modeline->vtotal;
600 oldreq->flags = modeline->flags;
601 oldreq->privsize = modeline->privsize;
602 if (modeline->privsize) {
603 oldreq->length += modeline->privsize;
604 Data32(dpy, (long *) modeline->private,
605 modeline->privsize * sizeof(INT32));
606 }
607 } else {
608 GetReq(XF86VidModeDeleteModeLine, req);
609 req->reqType = info->codes->major_opcode;
610 req->xf86vidmodeReqType = X_XF86VidModeDeleteModeLine;
611 req->screen = screen;
612 req->dotclock = modeline->dotclock;
613 req->hdisplay = modeline->hdisplay;
614 req->hsyncstart = modeline->hsyncstart;
615 req->hsyncend = modeline->hsyncend;
616 req->htotal = modeline->htotal;
617 req->hskew = modeline->hskew;
618 req->vdisplay = modeline->vdisplay;
619 req->vsyncstart = modeline->vsyncstart;
620 req->vsyncend = modeline->vsyncend;
621 req->vtotal = modeline->vtotal;
622 req->flags = modeline->flags;
623 req->privsize = modeline->privsize;
624 if (modeline->privsize) {
625 req->length += modeline->privsize;
626 Data32(dpy, (long *) modeline->private,
627 modeline->privsize * sizeof(INT32));
628 }
629 }
630 UnlockDisplay(dpy);
631 SyncHandle();
632 return True;
633 }
634
635 Bool
636 SDL_NAME(XF86VidModeModModeLine) (dpy, screen, modeline)
637 Display *dpy;
638 int screen;
SDL_NAME(XF86VidModeModeLine)639 SDL_NAME(XF86VidModeModeLine)* modeline;
640 {
641 XExtDisplayInfo *info = find_display (dpy);
642 xXF86VidModeModModeLineReq *req;
643 xXF86OldVidModeModModeLineReq *oldreq;
644 int majorVersion, minorVersion;
645
646 XF86VidModeCheckExtension (dpy, info, 0);
647 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
648
649 LockDisplay(dpy);
650 if (majorVersion < 2) {
651 GetOldReq(XF86VidModeModModeLine, XF86OldVidModeModModeLine, oldreq);
652 oldreq->reqType = info->codes->major_opcode;
653 oldreq->xf86vidmodeReqType = X_XF86VidModeModModeLine;
654 oldreq->screen = screen;
655 oldreq->hdisplay = modeline->hdisplay;
656 oldreq->hsyncstart = modeline->hsyncstart;
657 oldreq->hsyncend = modeline->hsyncend;
658 oldreq->htotal = modeline->htotal;
659 oldreq->vdisplay = modeline->vdisplay;
660 oldreq->vsyncstart = modeline->vsyncstart;
661 oldreq->vsyncend = modeline->vsyncend;
662 oldreq->vtotal = modeline->vtotal;
663 oldreq->flags = modeline->flags;
664 oldreq->privsize = modeline->privsize;
665 if (modeline->privsize) {
666 oldreq->length += modeline->privsize;
667 Data32(dpy, (long *) modeline->private,
668 modeline->privsize * sizeof(INT32));
669 }
670 } else {
671 GetReq(XF86VidModeModModeLine, req);
672 req->reqType = info->codes->major_opcode;
673 req->xf86vidmodeReqType = X_XF86VidModeModModeLine;
674 req->screen = screen;
675 req->hdisplay = modeline->hdisplay;
676 req->hsyncstart = modeline->hsyncstart;
677 req->hsyncend = modeline->hsyncend;
678 req->htotal = modeline->htotal;
679 req->hskew = modeline->hskew;
680 req->vdisplay = modeline->vdisplay;
681 req->vsyncstart = modeline->vsyncstart;
682 req->vsyncend = modeline->vsyncend;
683 req->vtotal = modeline->vtotal;
684 req->flags = modeline->flags;
685 req->privsize = modeline->privsize;
686 if (modeline->privsize) {
687 req->length += modeline->privsize;
688 Data32(dpy, (long *) modeline->private,
689 modeline->privsize * sizeof(INT32));
690 }
691 }
692 UnlockDisplay(dpy);
693 SyncHandle();
694 return True;
695 }
696
697 Status
698 SDL_NAME(XF86VidModeValidateModeLine) (dpy, screen, modeline)
699 Display *dpy;
700 int screen;
SDL_NAME(XF86VidModeModeInfo)701 SDL_NAME(XF86VidModeModeInfo)* modeline;
702 {
703 XExtDisplayInfo *info = find_display (dpy);
704 xXF86VidModeValidateModeLineReq *req;
705 xXF86OldVidModeValidateModeLineReq *oldreq;
706 xXF86VidModeValidateModeLineReply rep;
707 int majorVersion, minorVersion;
708
709 XF86VidModeCheckExtension (dpy, info, 0);
710 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
711
712 LockDisplay(dpy);
713
714 if (majorVersion < 2) {
715 GetOldReq(XF86VidModeValidateModeLine, XF86OldVidModeValidateModeLine, oldreq);
716 oldreq->reqType = info->codes->major_opcode;
717 oldreq->xf86vidmodeReqType = X_XF86VidModeValidateModeLine;
718 oldreq->screen = screen;
719 oldreq->dotclock = modeline->dotclock;
720 oldreq->hdisplay = modeline->hdisplay;
721 oldreq->hsyncstart = modeline->hsyncstart;
722 oldreq->hsyncend = modeline->hsyncend;
723 oldreq->htotal = modeline->htotal;
724 oldreq->vdisplay = modeline->vdisplay;
725 oldreq->vsyncstart = modeline->vsyncstart;
726 oldreq->vsyncend = modeline->vsyncend;
727 oldreq->vtotal = modeline->vtotal;
728 oldreq->flags = modeline->flags;
729 oldreq->privsize = modeline->privsize;
730 if (modeline->privsize) {
731 oldreq->length += modeline->privsize;
732 Data32(dpy, (long *) modeline->private,
733 modeline->privsize * sizeof(INT32));
734 }
735 } else {
736 GetReq(XF86VidModeValidateModeLine, req);
737 req->reqType = info->codes->major_opcode;
738 req->xf86vidmodeReqType = X_XF86VidModeValidateModeLine;
739 req->screen = screen;
740 req->dotclock = modeline->dotclock;
741 req->hdisplay = modeline->hdisplay;
742 req->hsyncstart = modeline->hsyncstart;
743 req->hsyncend = modeline->hsyncend;
744 req->htotal = modeline->htotal;
745 req->hskew = modeline->hskew;
746 req->vdisplay = modeline->vdisplay;
747 req->vsyncstart = modeline->vsyncstart;
748 req->vsyncend = modeline->vsyncend;
749 req->vtotal = modeline->vtotal;
750 req->flags = modeline->flags;
751 req->privsize = modeline->privsize;
752 if (modeline->privsize) {
753 req->length += modeline->privsize;
754 Data32(dpy, (long *) modeline->private,
755 modeline->privsize * sizeof(INT32));
756 }
757 }
758 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
759 UnlockDisplay(dpy);
760 SyncHandle();
761 return MODE_BAD;
762 }
763 UnlockDisplay(dpy);
764 SyncHandle();
765 return rep.status;
766 }
767
768 Bool
769 SDL_NAME(XF86VidModeSwitchMode)(dpy, screen, zoom)
770 Display* dpy;
771 int screen;
772 int zoom;
773 {
774 XExtDisplayInfo *info = find_display (dpy);
775 xXF86VidModeSwitchModeReq *req;
776
777 XF86VidModeCheckExtension (dpy, info, False);
778
779 LockDisplay(dpy);
780 GetReq(XF86VidModeSwitchMode, req);
781 req->reqType = info->codes->major_opcode;
782 req->xf86vidmodeReqType = X_XF86VidModeSwitchMode;
783 req->screen = screen;
784 req->zoom = zoom;
785 UnlockDisplay(dpy);
786 SyncHandle();
787 return True;
788 }
789
790 Bool
791 SDL_NAME(XF86VidModeSwitchToMode)(dpy, screen, modeline)
792 Display* dpy;
793 int screen;
SDL_NAME(XF86VidModeModeInfo)794 SDL_NAME(XF86VidModeModeInfo)* modeline;
795 {
796 XExtDisplayInfo *info = find_display (dpy);
797 xXF86VidModeSwitchToModeReq *req;
798 xXF86OldVidModeSwitchToModeReq *oldreq;
799 int majorVersion, minorVersion;
800 Bool protocolBug = False;
801
802 XF86VidModeCheckExtension (dpy, info, False);
803
804 /*
805 * Note: There was a bug in the protocol implementation in versions
806 * 0.x with x < 8 (the .private field wasn't expected to be sent over
807 * the wire). Check the server's version, and accept the old format
808 * if appropriate.
809 */
810
811 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
812 if (majorVersion == 0 && minorVersion < 8) {
813 protocolBug = True;
814 #ifdef DEBUG
815 fprintf(stderr, "XF86VidModeSwitchToMode: Warning: Xserver is"
816 "running an old version (%d.%d)\n", majorVersion,
817 minorVersion);
818 #endif
819 }
820
821 LockDisplay(dpy);
822 if (majorVersion < 2) {
823 GetOldReq(XF86VidModeSwitchToMode, XF86OldVidModeSwitchToMode, oldreq);
824 oldreq->reqType = info->codes->major_opcode;
825 oldreq->xf86vidmodeReqType = X_XF86VidModeSwitchToMode;
826 oldreq->screen = screen;
827 oldreq->dotclock = modeline->dotclock;
828 oldreq->hdisplay = modeline->hdisplay;
829 oldreq->hsyncstart = modeline->hsyncstart;
830 oldreq->hsyncend = modeline->hsyncend;
831 oldreq->htotal = modeline->htotal;
832 oldreq->vdisplay = modeline->vdisplay;
833 oldreq->vsyncstart = modeline->vsyncstart;
834 oldreq->vsyncend = modeline->vsyncend;
835 oldreq->vtotal = modeline->vtotal;
836 oldreq->flags = modeline->flags;
837 if (protocolBug) {
838 oldreq->privsize = 0;
839 } else {
840 oldreq->privsize = modeline->privsize;
841 if (modeline->privsize) {
842 oldreq->length += modeline->privsize;
843 Data32(dpy, (long *) modeline->private,
844 modeline->privsize * sizeof(INT32));
845 }
846 }
847 } else {
848 GetReq(XF86VidModeSwitchToMode, req);
849 req->reqType = info->codes->major_opcode;
850 req->xf86vidmodeReqType = X_XF86VidModeSwitchToMode;
851 req->screen = screen;
852 req->dotclock = modeline->dotclock;
853 req->hdisplay = modeline->hdisplay;
854 req->hsyncstart = modeline->hsyncstart;
855 req->hsyncend = modeline->hsyncend;
856 req->htotal = modeline->htotal;
857 req->hskew = modeline->hskew;
858 req->vdisplay = modeline->vdisplay;
859 req->vsyncstart = modeline->vsyncstart;
860 req->vsyncend = modeline->vsyncend;
861 req->vtotal = modeline->vtotal;
862 req->flags = modeline->flags;
863 if (protocolBug) {
864 req->privsize = 0;
865 } else {
866 req->privsize = modeline->privsize;
867 if (modeline->privsize) {
868 req->length += modeline->privsize;
869 Data32(dpy, (long *) modeline->private,
870 modeline->privsize * sizeof(INT32));
871 }
872 }
873 }
874 UnlockDisplay(dpy);
875 SyncHandle();
876 return True;
877 }
878
879 Bool
880 SDL_NAME(XF86VidModeLockModeSwitch)(dpy, screen, lock)
881 Display* dpy;
882 int screen;
883 int lock;
884 {
885 XExtDisplayInfo *info = find_display (dpy);
886 xXF86VidModeLockModeSwitchReq *req;
887
888 XF86VidModeCheckExtension (dpy, info, False);
889
890 LockDisplay(dpy);
891 GetReq(XF86VidModeLockModeSwitch, req);
892 req->reqType = info->codes->major_opcode;
893 req->xf86vidmodeReqType = X_XF86VidModeLockModeSwitch;
894 req->screen = screen;
895 req->lock = lock;
896 UnlockDisplay(dpy);
897 SyncHandle();
898 return True;
899 }
900
901 Bool
902 SDL_NAME(XF86VidModeGetMonitor)(dpy, screen, monitor)
903 Display* dpy;
904 int screen;
SDL_NAME(XF86VidModeMonitor)905 SDL_NAME(XF86VidModeMonitor)* monitor;
906 {
907 XExtDisplayInfo *info = find_display (dpy);
908 xXF86VidModeGetMonitorReply rep;
909 xXF86VidModeGetMonitorReq *req;
910 CARD32 syncrange;
911 int i;
912
913 XF86VidModeCheckExtension (dpy, info, False);
914
915 LockDisplay(dpy);
916 GetReq(XF86VidModeGetMonitor, req);
917 req->reqType = info->codes->major_opcode;
918 req->xf86vidmodeReqType = X_XF86VidModeGetMonitor;
919 req->screen = screen;
920 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
921 UnlockDisplay(dpy);
922 SyncHandle();
923 return False;
924 }
925 monitor->nhsync = rep.nhsync;
926 monitor->nvsync = rep.nvsync;
927 #if 0
928 monitor->bandwidth = (float)rep.bandwidth / 1e6;
929 #endif
930 if (rep.vendorLength) {
931 if (!(monitor->vendor = (char *)Xcalloc(rep.vendorLength + 1, 1))) {
932 _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
933 ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
934 UnlockDisplay(dpy);
935 SyncHandle();
936 return False;
937 }
938 } else {
939 monitor->vendor = NULL;
940 }
941 if (rep.modelLength) {
942 if (!(monitor->model = Xcalloc(rep.modelLength + 1, 1))) {
943 _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
944 ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
945 if (monitor->vendor)
946 Xfree(monitor->vendor);
947 UnlockDisplay(dpy);
948 SyncHandle();
949 return False;
950 }
951 } else {
952 monitor->model = NULL;
953 }
954 if (!(monitor->hsync = Xcalloc(rep.nhsync, sizeof(SDL_NAME(XF86VidModeSyncRange))))) {
955 _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
956 ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
957
958 if (monitor->vendor)
959 Xfree(monitor->vendor);
960 if (monitor->model)
961 Xfree(monitor->model);
962 UnlockDisplay(dpy);
963 SyncHandle();
964 return False;
965 }
966 if (!(monitor->vsync = Xcalloc(rep.nvsync, sizeof(SDL_NAME(XF86VidModeSyncRange))))) {
967 _XEatData(dpy, (rep.nhsync + rep.nvsync) * 4 +
968 ((rep.vendorLength+3) & ~3) + ((rep.modelLength+3) & ~3));
969 if (monitor->vendor)
970 Xfree(monitor->vendor);
971 if (monitor->model)
972 Xfree(monitor->model);
973 Xfree(monitor->hsync);
974 UnlockDisplay(dpy);
975 SyncHandle();
976 return False;
977 }
978 for (i = 0; i < rep.nhsync; i++) {
979 _XRead(dpy, (char *)&syncrange, 4);
980 monitor->hsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
981 monitor->hsync[i].hi = (float)(syncrange >> 16) / 100.0;
982 }
983 for (i = 0; i < rep.nvsync; i++) {
984 _XRead(dpy, (char *)&syncrange, 4);
985 monitor->vsync[i].lo = (float)(syncrange & 0xFFFF) / 100.0;
986 monitor->vsync[i].hi = (float)(syncrange >> 16) / 100.0;
987 }
988 if (rep.vendorLength)
989 _XReadPad(dpy, monitor->vendor, rep.vendorLength);
990 else
991 monitor->vendor = "";
992 if (rep.modelLength)
993 _XReadPad(dpy, monitor->model, rep.modelLength);
994 else
995 monitor->model = "";
996
997 UnlockDisplay(dpy);
998 SyncHandle();
999 return True;
1000 }
1001
1002 Bool
1003 SDL_NAME(XF86VidModeGetViewPort)(dpy, screen, x, y)
1004 Display* dpy;
1005 int screen;
1006 int *x, *y;
1007 {
1008 XExtDisplayInfo *info = find_display (dpy);
1009 xXF86VidModeGetViewPortReply rep;
1010 xXF86VidModeGetViewPortReq *req;
1011 int majorVersion, minorVersion;
1012 Bool protocolBug = False;
1013
1014 XF86VidModeCheckExtension (dpy, info, False);
1015
1016 /*
1017 * Note: There was a bug in the protocol implementation in versions
1018 * 0.x with x < 8 (no reply was sent, so the client would hang)
1019 * Check the server's version, and don't wait for a reply with older
1020 * versions.
1021 */
1022
1023 SDL_NAME(XF86VidModeQueryVersion)(dpy, &majorVersion, &minorVersion);
1024 if (majorVersion == 0 && minorVersion < 8) {
1025 protocolBug = True;
1026 #ifdef DEBUG
1027 fprintf(stderr, "XF86VidModeGetViewPort: Warning: Xserver is"
1028 "running an old version (%d.%d)\n", majorVersion,
1029 minorVersion);
1030 #endif
1031 }
1032 LockDisplay(dpy);
1033 GetReq(XF86VidModeGetViewPort, req);
1034 req->reqType = info->codes->major_opcode;
1035 req->xf86vidmodeReqType = X_XF86VidModeGetViewPort;
1036 req->screen = screen;
1037 if (protocolBug) {
1038 *x = 0;
1039 *y = 0;
1040 } else {
1041 if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
1042 UnlockDisplay(dpy);
1043 SyncHandle();
1044 return False;
1045 }
1046 *x = rep.x;
1047 *y = rep.y;
1048 }
1049
1050 UnlockDisplay(dpy);
1051 SyncHandle();
1052 return True;
1053 }
1054
1055 Bool
1056 SDL_NAME(XF86VidModeSetViewPort)(dpy, screen, x, y)
1057 Display* dpy;
1058 int screen;
1059 int x, y;
1060 {
1061 XExtDisplayInfo *info = find_display (dpy);
1062 xXF86VidModeSetViewPortReq *req;
1063
1064 XF86VidModeCheckExtension (dpy, info, False);
1065
1066 LockDisplay(dpy);
1067 GetReq(XF86VidModeSetViewPort, req);
1068 req->reqType = info->codes->major_opcode;
1069 req->xf86vidmodeReqType = X_XF86VidModeSetViewPort;
1070 req->screen = screen;
1071 req->x = x;
1072 req->y = y;
1073
1074 UnlockDisplay(dpy);
1075 SyncHandle();
1076 return True;
1077 }
1078
1079 Bool
1080 SDL_NAME(XF86VidModeGetDotClocks)(dpy, screen,
1081 flagsPtr, numclocksPtr, maxclocksPtr, clocksPtr)
1082 Display* dpy;
1083 int screen;
1084 int *flagsPtr, *numclocksPtr, *maxclocksPtr, *clocksPtr[];
1085 {
1086 XExtDisplayInfo *info = find_display (dpy);
1087 xXF86VidModeGetDotClocksReply rep;
1088 xXF86VidModeGetDotClocksReq *req;
1089 int i, *dotclocks;
1090 CARD32 dotclk;
1091
1092 XF86VidModeCheckExtension (dpy, info, False);
1093
1094 LockDisplay(dpy);
1095 GetReq(XF86VidModeGetDotClocks, req);
1096 req->reqType = info->codes->major_opcode;
1097 req->xf86vidmodeReqType = X_XF86VidModeGetDotClocks;
1098 req->screen = screen;
1099 if (!_XReply(dpy, (xReply *)&rep,
1100 (SIZEOF(xXF86VidModeGetDotClocksReply) - SIZEOF(xReply)) >> 2, xFalse))
1101 {
1102 UnlockDisplay(dpy);
1103 SyncHandle();
1104 return False;
1105 }
1106 *numclocksPtr = rep.clocks;
1107 *maxclocksPtr = rep.maxclocks;
1108 *flagsPtr = rep.flags;
1109
1110 if (!(dotclocks = (int*) Xcalloc(rep.clocks, sizeof(int)))) {
1111 _XEatData(dpy, (rep.clocks) * 4);
1112 Xfree(dotclocks);
1113 UnlockDisplay(dpy);
1114 SyncHandle();
1115 return False;
1116 }
1117
1118 for (i = 0; i < rep.clocks; i++) {
1119 _XRead(dpy, (char*)&dotclk, 4);
1120 dotclocks[i] = dotclk;
1121 }
1122 *clocksPtr = dotclocks;
1123 UnlockDisplay(dpy);
1124 SyncHandle();
1125 return True;
1126 }
1127
1128 Bool
SDL_NAME(XF86VidModeSetGammaRamp)1129 SDL_NAME(XF86VidModeSetGammaRamp) (
1130 Display *dpy,
1131 int screen,
1132 int size,
1133 unsigned short *red,
1134 unsigned short *green,
1135 unsigned short *blue
1136 )
1137 {
1138 int length = (size + 1) & ~1;
1139 XExtDisplayInfo *info = find_display (dpy);
1140 xXF86VidModeSetGammaRampReq *req;
1141
1142 XF86VidModeCheckExtension (dpy, info, False);
1143 LockDisplay(dpy);
1144 GetReq(XF86VidModeSetGammaRamp, req);
1145 req->reqType = info->codes->major_opcode;
1146 req->xf86vidmodeReqType = X_XF86VidModeSetGammaRamp;
1147 req->screen = screen;
1148 req->length += (length >> 1) * 3;
1149 req->size = size;
1150 _XSend(dpy, (char*)red, size * 2);
1151 _XSend(dpy, (char*)green, size * 2);
1152 _XSend(dpy, (char*)blue, size * 2);
1153 UnlockDisplay(dpy);
1154 SyncHandle();
1155 return True;
1156 }
1157
1158
1159 Bool
SDL_NAME(XF86VidModeGetGammaRamp)1160 SDL_NAME(XF86VidModeGetGammaRamp) (
1161 Display *dpy,
1162 int screen,
1163 int size,
1164 unsigned short *red,
1165 unsigned short *green,
1166 unsigned short *blue
1167 )
1168 {
1169 XExtDisplayInfo *info = find_display (dpy);
1170 xXF86VidModeGetGammaRampReq *req;
1171 xXF86VidModeGetGammaRampReply rep;
1172
1173 XF86VidModeCheckExtension (dpy, info, False);
1174
1175 LockDisplay(dpy);
1176 GetReq(XF86VidModeGetGammaRamp, req);
1177 req->reqType = info->codes->major_opcode;
1178 req->xf86vidmodeReqType = X_XF86VidModeGetGammaRamp;
1179 req->screen = screen;
1180 req->size = size;
1181 if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) {
1182 UnlockDisplay (dpy);
1183 SyncHandle ();
1184 return False;
1185 }
1186 if(rep.size) {
1187 _XRead(dpy, (char*)red, rep.size << 1);
1188 _XRead(dpy, (char*)green, rep.size << 1);
1189 _XRead(dpy, (char*)blue, rep.size << 1);
1190 }
1191
1192 UnlockDisplay(dpy);
1193 SyncHandle();
1194 return True;
1195 }
1196
SDL_NAME(XF86VidModeGetGammaRampSize)1197 Bool SDL_NAME(XF86VidModeGetGammaRampSize)(
1198 Display *dpy,
1199 int screen,
1200 int *size
1201 )
1202 {
1203 XExtDisplayInfo *info = find_display (dpy);
1204 xXF86VidModeGetGammaRampSizeReq *req;
1205 xXF86VidModeGetGammaRampSizeReply rep;
1206
1207 *size = 0;
1208
1209 XF86VidModeCheckExtension (dpy, info, False);
1210
1211 LockDisplay(dpy);
1212 GetReq(XF86VidModeGetGammaRampSize, req);
1213 req->reqType = info->codes->major_opcode;
1214 req->xf86vidmodeReqType = X_XF86VidModeGetGammaRampSize;
1215 req->screen = screen;
1216 if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) {
1217 UnlockDisplay (dpy);
1218 SyncHandle ();
1219 return False;
1220 }
1221 *size = rep.size;
1222 UnlockDisplay(dpy);
1223 SyncHandle();
1224 return True;
1225 }
1226
1227