XF86VMode.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:38k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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