DPMS.c revision e8a5466a
1/*****************************************************************
2
3Copyright (c) 1996 Digital Equipment Corporation, Maynard, Massachusetts.
4
5Permission is hereby granted, free of charge, to any person obtaining a copy
6of this software and associated documentation files (the "Software"), to deal
7in the Software without restriction, including without limitation the rights
8to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9copies of the Software.
10
11The above copyright notice and this permission notice shall be included in
12all copies or substantial portions of the Software.
13
14THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
18BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
19WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
20IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
22Except as contained in this notice, the name of Digital Equipment Corporation
23shall not be used in advertising or otherwise to promote the sale, use or other
24dealings in this Software without prior written authorization from Digital
25Equipment 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
43static XExtensionInfo _dpms_info_data;
44static XExtensionInfo *dpms_info = &_dpms_info_data;
45static 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
56static int close_display(Display *dpy, XExtCodes *codes);
57static /* 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
71static XEXT_GENERATE_FIND_DISPLAY (find_display, dpms_info,
72				   dpms_extension_name,
73                                   &dpms_extension_hooks, DPMSNumberEvents,
74                                   NULL)
75
76static XEXT_GENERATE_CLOSE_DISPLAY (close_display, dpms_info)
77
78/*****************************************************************************
79 *                                                                           *
80 *                  public routines                                          *
81 *                                                                           *
82 *****************************************************************************/
83
84Bool
85DPMSQueryExtension (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
98Status
99DPMSGetVersion(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
123Bool
124DPMSCapable(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
147Status
148DPMSSetTimeouts(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
176Bool
177DPMSGetTimeouts(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
203Status
204DPMSEnable(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
220Status
221DPMSDisable(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
238Status
239DPMSForceLevel(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
263Status
264DPMSInfo(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