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