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