Imported Upstream version 1.15.1
[deb_xorg-server.git] / Xext / dpms.c
CommitLineData
a09e091a
JB
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#ifdef HAVE_DIX_CONFIG_H
30#include <dix-config.h>
31#endif
32
33#include <X11/X.h>
34#include <X11/Xproto.h>
35#include "misc.h"
36#include "os.h"
37#include "dixstruct.h"
38#include "extnsionst.h"
39#include "opaque.h"
40#include <X11/extensions/dpmsproto.h>
41#include "dpmsproc.h"
42#include "extinit.h"
43
44static int
45ProcDPMSGetVersion(ClientPtr client)
46{
47 /* REQUEST(xDPMSGetVersionReq); */
48 xDPMSGetVersionReply rep = {
49 .type = X_Reply,
50 .sequenceNumber = client->sequence,
51 .length = 0,
52 .majorVersion = DPMSMajorVersion,
53 .minorVersion = DPMSMinorVersion
54 };
55
56 REQUEST_SIZE_MATCH(xDPMSGetVersionReq);
57
58 if (client->swapped) {
59 swaps(&rep.sequenceNumber);
60 swaps(&rep.majorVersion);
61 swaps(&rep.minorVersion);
62 }
63 WriteToClient(client, sizeof(xDPMSGetVersionReply), &rep);
64 return Success;
65}
66
67static int
68ProcDPMSCapable(ClientPtr client)
69{
70 /* REQUEST(xDPMSCapableReq); */
71 xDPMSCapableReply rep = {
72 .type = X_Reply,
73 .sequenceNumber = client->sequence,
74 .length = 0,
75 .capable = DPMSCapableFlag
76 };
77
78 REQUEST_SIZE_MATCH(xDPMSCapableReq);
79
80 if (client->swapped) {
81 swaps(&rep.sequenceNumber);
82 }
83 WriteToClient(client, sizeof(xDPMSCapableReply), &rep);
84 return Success;
85}
86
87static int
88ProcDPMSGetTimeouts(ClientPtr client)
89{
90 /* REQUEST(xDPMSGetTimeoutsReq); */
91 xDPMSGetTimeoutsReply rep = {
92 .type = X_Reply,
93 .sequenceNumber = client->sequence,
94 .length = 0,
95 .standby = DPMSStandbyTime / MILLI_PER_SECOND,
96 .suspend = DPMSSuspendTime / MILLI_PER_SECOND,
97 .off = DPMSOffTime / MILLI_PER_SECOND
98 };
99
100 REQUEST_SIZE_MATCH(xDPMSGetTimeoutsReq);
101
102 if (client->swapped) {
103 swaps(&rep.sequenceNumber);
104 swaps(&rep.standby);
105 swaps(&rep.suspend);
106 swaps(&rep.off);
107 }
108 WriteToClient(client, sizeof(xDPMSGetTimeoutsReply), &rep);
109 return Success;
110}
111
112static int
113ProcDPMSSetTimeouts(ClientPtr client)
114{
115 REQUEST(xDPMSSetTimeoutsReq);
116
117 REQUEST_SIZE_MATCH(xDPMSSetTimeoutsReq);
118
119 if ((stuff->off != 0) && (stuff->off < stuff->suspend)) {
120 client->errorValue = stuff->off;
121 return BadValue;
122 }
123 if ((stuff->suspend != 0) && (stuff->suspend < stuff->standby)) {
124 client->errorValue = stuff->suspend;
125 return BadValue;
126 }
127
128 DPMSStandbyTime = stuff->standby * MILLI_PER_SECOND;
129 DPMSSuspendTime = stuff->suspend * MILLI_PER_SECOND;
130 DPMSOffTime = stuff->off * MILLI_PER_SECOND;
131 SetScreenSaverTimer();
132
133 return Success;
134}
135
136static int
137ProcDPMSEnable(ClientPtr client)
138{
139 Bool was_enabled = DPMSEnabled;
140
141 REQUEST_SIZE_MATCH(xDPMSEnableReq);
142
143 if (DPMSCapableFlag) {
144 DPMSEnabled = TRUE;
145 if (!was_enabled)
146 SetScreenSaverTimer();
147 }
148
149 return Success;
150}
151
152static int
153ProcDPMSDisable(ClientPtr client)
154{
155 /* REQUEST(xDPMSDisableReq); */
156
157 REQUEST_SIZE_MATCH(xDPMSDisableReq);
158
159 DPMSSet(client, DPMSModeOn);
160
161 DPMSEnabled = FALSE;
162
163 return Success;
164}
165
166static int
167ProcDPMSForceLevel(ClientPtr client)
168{
169 REQUEST(xDPMSForceLevelReq);
170
171 REQUEST_SIZE_MATCH(xDPMSForceLevelReq);
172
173 if (!DPMSEnabled)
174 return BadMatch;
175
176 if (stuff->level != DPMSModeOn &&
177 stuff->level != DPMSModeStandby &&
178 stuff->level != DPMSModeSuspend && stuff->level != DPMSModeOff) {
179 client->errorValue = stuff->level;
180 return BadValue;
181 }
182
183 DPMSSet(client, stuff->level);
184
185 return Success;
186}
187
188static int
189ProcDPMSInfo(ClientPtr client)
190{
191 /* REQUEST(xDPMSInfoReq); */
192 xDPMSInfoReply rep = {
193 .type = X_Reply,
194 .sequenceNumber = client->sequence,
195 .length = 0,
196 .power_level = DPMSPowerLevel,
197 .state = DPMSEnabled
198 };
199
200 REQUEST_SIZE_MATCH(xDPMSInfoReq);
201
202 if (client->swapped) {
203 swaps(&rep.sequenceNumber);
204 swaps(&rep.power_level);
205 }
206 WriteToClient(client, sizeof(xDPMSInfoReply), &rep);
207 return Success;
208}
209
210static int
211ProcDPMSDispatch(ClientPtr client)
212{
213 REQUEST(xReq);
214
215 switch (stuff->data) {
216 case X_DPMSGetVersion:
217 return ProcDPMSGetVersion(client);
218 case X_DPMSCapable:
219 return ProcDPMSCapable(client);
220 case X_DPMSGetTimeouts:
221 return ProcDPMSGetTimeouts(client);
222 case X_DPMSSetTimeouts:
223 return ProcDPMSSetTimeouts(client);
224 case X_DPMSEnable:
225 return ProcDPMSEnable(client);
226 case X_DPMSDisable:
227 return ProcDPMSDisable(client);
228 case X_DPMSForceLevel:
229 return ProcDPMSForceLevel(client);
230 case X_DPMSInfo:
231 return ProcDPMSInfo(client);
232 default:
233 return BadRequest;
234 }
235}
236
237static int
238SProcDPMSGetVersion(ClientPtr client)
239{
240 REQUEST(xDPMSGetVersionReq);
241
242 swaps(&stuff->length);
243 REQUEST_SIZE_MATCH(xDPMSGetVersionReq);
244 swaps(&stuff->majorVersion);
245 swaps(&stuff->minorVersion);
246 return ProcDPMSGetVersion(client);
247}
248
249static int
250SProcDPMSCapable(ClientPtr client)
251{
252 REQUEST(xDPMSCapableReq);
253
254 swaps(&stuff->length);
255 REQUEST_SIZE_MATCH(xDPMSCapableReq);
256
257 return ProcDPMSCapable(client);
258}
259
260static int
261SProcDPMSGetTimeouts(ClientPtr client)
262{
263 REQUEST(xDPMSGetTimeoutsReq);
264
265 swaps(&stuff->length);
266 REQUEST_SIZE_MATCH(xDPMSGetTimeoutsReq);
267
268 return ProcDPMSGetTimeouts(client);
269}
270
271static int
272SProcDPMSSetTimeouts(ClientPtr client)
273{
274 REQUEST(xDPMSSetTimeoutsReq);
275
276 swaps(&stuff->length);
277 REQUEST_SIZE_MATCH(xDPMSSetTimeoutsReq);
278
279 swaps(&stuff->standby);
280 swaps(&stuff->suspend);
281 swaps(&stuff->off);
282 return ProcDPMSSetTimeouts(client);
283}
284
285static int
286SProcDPMSEnable(ClientPtr client)
287{
288 REQUEST(xDPMSEnableReq);
289
290 swaps(&stuff->length);
291 REQUEST_SIZE_MATCH(xDPMSEnableReq);
292
293 return ProcDPMSEnable(client);
294}
295
296static int
297SProcDPMSDisable(ClientPtr client)
298{
299 REQUEST(xDPMSDisableReq);
300
301 swaps(&stuff->length);
302 REQUEST_SIZE_MATCH(xDPMSDisableReq);
303
304 return ProcDPMSDisable(client);
305}
306
307static int
308SProcDPMSForceLevel(ClientPtr client)
309{
310 REQUEST(xDPMSForceLevelReq);
311
312 swaps(&stuff->length);
313 REQUEST_SIZE_MATCH(xDPMSForceLevelReq);
314
315 swaps(&stuff->level);
316
317 return ProcDPMSForceLevel(client);
318}
319
320static int
321SProcDPMSInfo(ClientPtr client)
322{
323 REQUEST(xDPMSInfoReq);
324
325 swaps(&stuff->length);
326 REQUEST_SIZE_MATCH(xDPMSInfoReq);
327
328 return ProcDPMSInfo(client);
329}
330
331static int
332SProcDPMSDispatch(ClientPtr client)
333{
334 REQUEST(xReq);
335 switch (stuff->data) {
336 case X_DPMSGetVersion:
337 return SProcDPMSGetVersion(client);
338 case X_DPMSCapable:
339 return SProcDPMSCapable(client);
340 case X_DPMSGetTimeouts:
341 return SProcDPMSGetTimeouts(client);
342 case X_DPMSSetTimeouts:
343 return SProcDPMSSetTimeouts(client);
344 case X_DPMSEnable:
345 return SProcDPMSEnable(client);
346 case X_DPMSDisable:
347 return SProcDPMSDisable(client);
348 case X_DPMSForceLevel:
349 return SProcDPMSForceLevel(client);
350 case X_DPMSInfo:
351 return SProcDPMSInfo(client);
352 default:
353 return BadRequest;
354 }
355}
356
357void
358DPMSExtensionInit(void)
359{
360 AddExtension(DPMSExtensionName, 0, 0,
361 ProcDPMSDispatch, SProcDPMSDispatch,
362 NULL, StandardMinorOpcode);
363}