DPMS.c revision 485f0483
1caade7ccSmrg/* $Xorg: DPMS.c,v 1.3 2000/08/17 19:45:50 cpqbld Exp $ */ 2caade7ccSmrg/***************************************************************** 3caade7ccSmrg 4caade7ccSmrgCopyright (c) 1996 Digital Equipment Corporation, Maynard, Massachusetts. 5caade7ccSmrg 6caade7ccSmrgPermission is hereby granted, free of charge, to any person obtaining a copy 7caade7ccSmrgof this software and associated documentation files (the "Software"), to deal 8caade7ccSmrgin the Software without restriction, including without limitation the rights 9caade7ccSmrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10caade7ccSmrgcopies of the Software. 11caade7ccSmrg 12caade7ccSmrgThe above copyright notice and this permission notice shall be included in 13caade7ccSmrgall copies or substantial portions of the Software. 14caade7ccSmrg 15caade7ccSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16caade7ccSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17caade7ccSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18caade7ccSmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING, 19caade7ccSmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY, 20caade7ccSmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 21caade7ccSmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22caade7ccSmrg 23caade7ccSmrgExcept as contained in this notice, the name of Digital Equipment Corporation 24caade7ccSmrgshall not be used in advertising or otherwise to promote the sale, use or other 25caade7ccSmrgdealings in this Software without prior written authorization from Digital 26caade7ccSmrgEquipment Corporation. 27caade7ccSmrg 28caade7ccSmrg******************************************************************/ 29caade7ccSmrg/* $XFree86: xc/lib/Xext/DPMS.c,v 3.5 2002/10/16 00:37:27 dawes Exp $ */ 30caade7ccSmrg 31caade7ccSmrg/* 32caade7ccSmrg * HISTORY 33caade7ccSmrg */ 34caade7ccSmrg 35caade7ccSmrg#define NEED_REPLIES 36caade7ccSmrg#ifdef HAVE_CONFIG_H 37caade7ccSmrg#include <config.h> 38caade7ccSmrg#endif 39caade7ccSmrg#include <X11/Xlibint.h> 40caade7ccSmrg#include <X11/extensions/dpms.h> 41485f0483Smrg#include <X11/extensions/dpmsproto.h> 42caade7ccSmrg#include <X11/extensions/Xext.h> 43caade7ccSmrg#include <X11/extensions/extutil.h> 44caade7ccSmrg#include <stdio.h> 45caade7ccSmrg 46caade7ccSmrgstatic XExtensionInfo _dpms_info_data; 47caade7ccSmrgstatic XExtensionInfo *dpms_info = &_dpms_info_data; 48caade7ccSmrgstatic char *dpms_extension_name = DPMSExtensionName; 49caade7ccSmrg 50caade7ccSmrg#define DPMSCheckExtension(dpy,i,val) \ 51caade7ccSmrg XextCheckExtension (dpy, i, dpms_extension_name, val) 52caade7ccSmrg 53caade7ccSmrg/***************************************************************************** 54caade7ccSmrg * * 55caade7ccSmrg * private utility routines * 56caade7ccSmrg * * 57caade7ccSmrg *****************************************************************************/ 58caade7ccSmrg 59caade7ccSmrgstatic int close_display(Display *dpy, XExtCodes *codes); 60caade7ccSmrgstatic /* const */ XExtensionHooks dpms_extension_hooks = { 61caade7ccSmrg NULL, /* create_gc */ 62caade7ccSmrg NULL, /* copy_gc */ 63caade7ccSmrg NULL, /* flush_gc */ 64caade7ccSmrg NULL, /* free_gc */ 65caade7ccSmrg NULL, /* create_font */ 66caade7ccSmrg NULL, /* free_font */ 67caade7ccSmrg close_display, /* close_display */ 68caade7ccSmrg NULL, /* wire_to_event */ 69caade7ccSmrg NULL, /* event_to_wire */ 70caade7ccSmrg NULL, /* error */ 71caade7ccSmrg NULL /* error_string */ 72caade7ccSmrg}; 73caade7ccSmrg 74caade7ccSmrgstatic XEXT_GENERATE_FIND_DISPLAY (find_display, dpms_info, 75caade7ccSmrg dpms_extension_name, 76caade7ccSmrg &dpms_extension_hooks, DPMSNumberEvents, 77caade7ccSmrg NULL) 78caade7ccSmrg 79caade7ccSmrgstatic XEXT_GENERATE_CLOSE_DISPLAY (close_display, dpms_info) 80caade7ccSmrg 81caade7ccSmrg/***************************************************************************** 82caade7ccSmrg * * 83caade7ccSmrg * public routines * 84caade7ccSmrg * * 85caade7ccSmrg *****************************************************************************/ 86caade7ccSmrg 87caade7ccSmrgBool 88caade7ccSmrgDPMSQueryExtension (Display *dpy, int *event_basep, int *error_basep) 89caade7ccSmrg{ 90caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 91caade7ccSmrg 92caade7ccSmrg if (XextHasExtension(info)) { 93caade7ccSmrg *event_basep = info->codes->first_event; 94caade7ccSmrg *error_basep = info->codes->first_error; 95caade7ccSmrg return True; 96caade7ccSmrg } else { 97caade7ccSmrg return False; 98caade7ccSmrg } 99caade7ccSmrg} 100caade7ccSmrg 101caade7ccSmrgStatus 102caade7ccSmrgDPMSGetVersion(Display *dpy, int *major_versionp, int *minor_versionp) 103caade7ccSmrg{ 104caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 105caade7ccSmrg xDPMSGetVersionReply rep; 106caade7ccSmrg register xDPMSGetVersionReq *req; 107caade7ccSmrg 108caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 109caade7ccSmrg 110caade7ccSmrg LockDisplay (dpy); 111caade7ccSmrg GetReq (DPMSGetVersion, req); 112caade7ccSmrg req->reqType = info->codes->major_opcode; 113caade7ccSmrg req->dpmsReqType = X_DPMSGetVersion; 114caade7ccSmrg if (!_XReply (dpy, (xReply *) &rep, 0, xTrue)) { 115caade7ccSmrg UnlockDisplay (dpy); 116caade7ccSmrg SyncHandle (); 117caade7ccSmrg return 0; 118caade7ccSmrg } 119caade7ccSmrg *major_versionp = rep.majorVersion; 120caade7ccSmrg *minor_versionp = rep.minorVersion; 121caade7ccSmrg UnlockDisplay (dpy); 122caade7ccSmrg SyncHandle (); 123caade7ccSmrg return 1; 124caade7ccSmrg} 125caade7ccSmrg 126caade7ccSmrgBool 127caade7ccSmrgDPMSCapable(Display *dpy) 128caade7ccSmrg{ 129caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 130caade7ccSmrg register xDPMSCapableReq *req; 131caade7ccSmrg xDPMSCapableReply rep; 132caade7ccSmrg 133caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 134caade7ccSmrg 135caade7ccSmrg LockDisplay(dpy); 136caade7ccSmrg GetReq(DPMSCapable, req); 137caade7ccSmrg req->reqType = info->codes->major_opcode; 138caade7ccSmrg req->dpmsReqType = X_DPMSCapable; 139caade7ccSmrg 140caade7ccSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) { 141caade7ccSmrg UnlockDisplay(dpy); 142caade7ccSmrg SyncHandle(); 143caade7ccSmrg return False; 144caade7ccSmrg } 145caade7ccSmrg UnlockDisplay(dpy); 146caade7ccSmrg SyncHandle(); 147caade7ccSmrg return rep.capable; 148caade7ccSmrg} 149caade7ccSmrg 150caade7ccSmrgStatus 151caade7ccSmrgDPMSSetTimeouts(Display *dpy, CARD16 standby, CARD16 suspend, CARD16 off) 152caade7ccSmrg{ 153caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 154caade7ccSmrg register xDPMSSetTimeoutsReq *req; 155caade7ccSmrg 156caade7ccSmrg if ((off != 0)&&(off < suspend)) 157caade7ccSmrg { 158caade7ccSmrg return BadValue; 159caade7ccSmrg } 160caade7ccSmrg if ((suspend != 0)&&(suspend < standby)) 161caade7ccSmrg { 162caade7ccSmrg return BadValue; 163caade7ccSmrg } 164caade7ccSmrg 165caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 166caade7ccSmrg LockDisplay(dpy); 167caade7ccSmrg GetReq(DPMSSetTimeouts, req); 168caade7ccSmrg req->reqType = info->codes->major_opcode; 169caade7ccSmrg req->dpmsReqType = X_DPMSSetTimeouts; 170caade7ccSmrg req->standby = standby; 171caade7ccSmrg req->suspend = suspend; 172caade7ccSmrg req->off = off; 173caade7ccSmrg 174caade7ccSmrg UnlockDisplay(dpy); 175caade7ccSmrg SyncHandle(); 176caade7ccSmrg return 1; 177caade7ccSmrg} 178caade7ccSmrg 179caade7ccSmrgBool 180caade7ccSmrgDPMSGetTimeouts(Display *dpy, CARD16 *standby, CARD16 *suspend, CARD16 *off) 181caade7ccSmrg{ 182caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 183caade7ccSmrg register xDPMSGetTimeoutsReq *req; 184caade7ccSmrg xDPMSGetTimeoutsReply rep; 185caade7ccSmrg 186caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 187caade7ccSmrg 188caade7ccSmrg LockDisplay(dpy); 189caade7ccSmrg GetReq(DPMSGetTimeouts, req); 190caade7ccSmrg req->reqType = info->codes->major_opcode; 191caade7ccSmrg req->dpmsReqType = X_DPMSGetTimeouts; 192caade7ccSmrg 193caade7ccSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { 194caade7ccSmrg UnlockDisplay(dpy); 195caade7ccSmrg SyncHandle(); 196caade7ccSmrg return False; 197caade7ccSmrg } 198caade7ccSmrg UnlockDisplay(dpy); 199caade7ccSmrg SyncHandle(); 200caade7ccSmrg *standby = rep.standby; 201caade7ccSmrg *suspend = rep.suspend; 202caade7ccSmrg *off = rep.off; 203caade7ccSmrg return 1; 204caade7ccSmrg} 205caade7ccSmrg 206caade7ccSmrgStatus 207caade7ccSmrgDPMSEnable(Display *dpy) 208caade7ccSmrg{ 209caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 210caade7ccSmrg register xDPMSEnableReq *req; 211caade7ccSmrg 212caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 213caade7ccSmrg LockDisplay(dpy); 214caade7ccSmrg GetReq(DPMSEnable, req); 215caade7ccSmrg req->reqType = info->codes->major_opcode; 216caade7ccSmrg req->dpmsReqType = X_DPMSEnable; 217caade7ccSmrg 218caade7ccSmrg UnlockDisplay(dpy); 219caade7ccSmrg SyncHandle(); 220caade7ccSmrg return 1; 221caade7ccSmrg} 222caade7ccSmrg 223caade7ccSmrgStatus 224caade7ccSmrgDPMSDisable(Display *dpy) 225caade7ccSmrg{ 226caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 227caade7ccSmrg register xDPMSDisableReq *req; 228caade7ccSmrg 229caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 230caade7ccSmrg LockDisplay(dpy); 231caade7ccSmrg GetReq(DPMSDisable, req); 232caade7ccSmrg req->reqType = info->codes->major_opcode; 233caade7ccSmrg req->dpmsReqType = X_DPMSDisable; 234caade7ccSmrg 235caade7ccSmrg UnlockDisplay(dpy); 236caade7ccSmrg SyncHandle(); 237caade7ccSmrg return 1; 238caade7ccSmrg} 239caade7ccSmrg 240caade7ccSmrg 241caade7ccSmrgStatus 242caade7ccSmrgDPMSForceLevel(Display *dpy, CARD16 level) 243caade7ccSmrg{ 244caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 245caade7ccSmrg register xDPMSForceLevelReq *req; 246caade7ccSmrg 247caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 248caade7ccSmrg 249caade7ccSmrg if ((level != DPMSModeOn) && 250caade7ccSmrg (level != DPMSModeStandby) && 251caade7ccSmrg (level != DPMSModeSuspend) && 252caade7ccSmrg (level != DPMSModeOff)) 253caade7ccSmrg return BadValue; 254caade7ccSmrg 255caade7ccSmrg LockDisplay(dpy); 256caade7ccSmrg GetReq(DPMSForceLevel, req); 257caade7ccSmrg req->reqType = info->codes->major_opcode; 258caade7ccSmrg req->dpmsReqType = X_DPMSForceLevel; 259caade7ccSmrg req->level = level; 260caade7ccSmrg 261caade7ccSmrg UnlockDisplay(dpy); 262caade7ccSmrg SyncHandle(); 263caade7ccSmrg return 1; 264caade7ccSmrg} 265caade7ccSmrg 266caade7ccSmrgStatus 267caade7ccSmrgDPMSInfo(Display *dpy, CARD16 *power_level, BOOL *state) 268caade7ccSmrg{ 269caade7ccSmrg XExtDisplayInfo *info = find_display (dpy); 270caade7ccSmrg register xDPMSInfoReq *req; 271caade7ccSmrg xDPMSInfoReply rep; 272caade7ccSmrg 273caade7ccSmrg DPMSCheckExtension (dpy, info, 0); 274caade7ccSmrg 275caade7ccSmrg LockDisplay(dpy); 276caade7ccSmrg GetReq(DPMSInfo, req); 277caade7ccSmrg req->reqType = info->codes->major_opcode; 278caade7ccSmrg req->dpmsReqType = X_DPMSInfo; 279caade7ccSmrg 280caade7ccSmrg if (!_XReply(dpy, (xReply *)&rep, 0, xTrue)) { 281caade7ccSmrg UnlockDisplay(dpy); 282caade7ccSmrg SyncHandle(); 283caade7ccSmrg return False; 284caade7ccSmrg } 285caade7ccSmrg UnlockDisplay(dpy); 286caade7ccSmrg SyncHandle(); 287caade7ccSmrg *power_level = rep.power_level; 288caade7ccSmrg *state = rep.state; 289caade7ccSmrg return 1; 290caade7ccSmrg} 291caade7ccSmrg 292caade7ccSmrg 293caade7ccSmrg 294