1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright 2002-2004 Red Hat Inc., Durham, North Carolina.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * All Rights Reserved.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining
7*4882a593Smuzhiyun * a copy of this software and associated documentation files (the
8*4882a593Smuzhiyun * "Software"), to deal in the Software without restriction, including
9*4882a593Smuzhiyun * without limitation on the rights to use, copy, modify, merge,
10*4882a593Smuzhiyun * publish, distribute, sublicense, and/or sell copies of the Software,
11*4882a593Smuzhiyun * and to permit persons to whom the Software is furnished to do so,
12*4882a593Smuzhiyun * subject to the following conditions:
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the
15*4882a593Smuzhiyun * next paragraph) shall be included in all copies or substantial
16*4882a593Smuzhiyun * portions of the Software.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21*4882a593Smuzhiyun * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
22*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25*4882a593Smuzhiyun * SOFTWARE.
26*4882a593Smuzhiyun */
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun /*
29*4882a593Smuzhiyun * Authors:
30*4882a593Smuzhiyun * Rickard E. (Rik) Faith <faith@redhat.com>
31*4882a593Smuzhiyun *
32*4882a593Smuzhiyun */
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun /** \file
35*4882a593Smuzhiyun * This file implements the server-side part of the DMX protocol. A
36*4882a593Smuzhiyun * vector of fucntions is provided at extension initialization time, so
37*4882a593Smuzhiyun * most all of the useful functions in this file are declared static and
38*4882a593Smuzhiyun * do not appear in the doxygen documentation.
39*4882a593Smuzhiyun *
40*4882a593Smuzhiyun * Much of the low-level work is done by functions in \a dmxextension.c
41*4882a593Smuzhiyun *
42*4882a593Smuzhiyun * Please see the Client-to-Server DMX Extension to the X Protocol
43*4882a593Smuzhiyun * document for details about the protocol. */
44*4882a593Smuzhiyun
45*4882a593Smuzhiyun #ifdef HAVE_DMX_CONFIG_H
46*4882a593Smuzhiyun #include <dmx-config.h>
47*4882a593Smuzhiyun #endif
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun #include <X11/X.h>
50*4882a593Smuzhiyun #include <X11/Xproto.h>
51*4882a593Smuzhiyun #include "misc.h"
52*4882a593Smuzhiyun #include "os.h"
53*4882a593Smuzhiyun #include "dixstruct.h"
54*4882a593Smuzhiyun #include "extnsionst.h"
55*4882a593Smuzhiyun #include "extinit.h"
56*4882a593Smuzhiyun #include "opaque.h"
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun #include "dmx.h"
59*4882a593Smuzhiyun #include "dmxextension.h"
60*4882a593Smuzhiyun #include <X11/extensions/dmxproto.h>
61*4882a593Smuzhiyun #include <X11/extensions/dmx.h>
62*4882a593Smuzhiyun #include "protocol-versions.h"
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun #ifdef PANORAMIX
65*4882a593Smuzhiyun #include "panoramiXsrv.h"
66*4882a593Smuzhiyun #endif
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun static unsigned char DMXCode;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun static int
_DMXXineramaActive(void)71*4882a593Smuzhiyun _DMXXineramaActive(void)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun #ifdef PANORAMIX
74*4882a593Smuzhiyun return !noPanoramiXExtension;
75*4882a593Smuzhiyun #else
76*4882a593Smuzhiyun return 0;
77*4882a593Smuzhiyun #endif
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun static void
dmxSetScreenAttribute(int bit,DMXScreenAttributesPtr attr,CARD32 value)81*4882a593Smuzhiyun dmxSetScreenAttribute(int bit, DMXScreenAttributesPtr attr, CARD32 value)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun switch (1 << bit) {
84*4882a593Smuzhiyun case DMXScreenWindowWidth:
85*4882a593Smuzhiyun attr->screenWindowWidth = value;
86*4882a593Smuzhiyun break;
87*4882a593Smuzhiyun case DMXScreenWindowHeight:
88*4882a593Smuzhiyun attr->screenWindowHeight = value;
89*4882a593Smuzhiyun break;
90*4882a593Smuzhiyun case DMXScreenWindowXoffset:
91*4882a593Smuzhiyun attr->screenWindowXoffset = value;
92*4882a593Smuzhiyun break;
93*4882a593Smuzhiyun case DMXScreenWindowYoffset:
94*4882a593Smuzhiyun attr->screenWindowYoffset = value;
95*4882a593Smuzhiyun break;
96*4882a593Smuzhiyun case DMXRootWindowWidth:
97*4882a593Smuzhiyun attr->rootWindowWidth = value;
98*4882a593Smuzhiyun break;
99*4882a593Smuzhiyun case DMXRootWindowHeight:
100*4882a593Smuzhiyun attr->rootWindowHeight = value;
101*4882a593Smuzhiyun break;
102*4882a593Smuzhiyun case DMXRootWindowXoffset:
103*4882a593Smuzhiyun attr->rootWindowXoffset = value;
104*4882a593Smuzhiyun break;
105*4882a593Smuzhiyun case DMXRootWindowYoffset:
106*4882a593Smuzhiyun attr->rootWindowYoffset = value;
107*4882a593Smuzhiyun break;
108*4882a593Smuzhiyun case DMXRootWindowXorigin:
109*4882a593Smuzhiyun attr->rootWindowXorigin = value;
110*4882a593Smuzhiyun break;
111*4882a593Smuzhiyun case DMXRootWindowYorigin:
112*4882a593Smuzhiyun attr->rootWindowYorigin = value;
113*4882a593Smuzhiyun break;
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun
117*4882a593Smuzhiyun static int
dmxFetchScreenAttributes(unsigned int mask,DMXScreenAttributesPtr attr,CARD32 * value_list)118*4882a593Smuzhiyun dmxFetchScreenAttributes(unsigned int mask,
119*4882a593Smuzhiyun DMXScreenAttributesPtr attr, CARD32 *value_list)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun int i;
122*4882a593Smuzhiyun CARD32 *value = value_list;
123*4882a593Smuzhiyun int count = 0;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun for (i = 0; i < 32; i++) {
126*4882a593Smuzhiyun if (mask & (1 << i)) {
127*4882a593Smuzhiyun dmxSetScreenAttribute(i, attr, *value);
128*4882a593Smuzhiyun ++value;
129*4882a593Smuzhiyun ++count;
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun }
132*4882a593Smuzhiyun return count;
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun static void
dmxSetDesktopAttribute(int bit,DMXDesktopAttributesPtr attr,CARD32 value)136*4882a593Smuzhiyun dmxSetDesktopAttribute(int bit, DMXDesktopAttributesPtr attr, CARD32 value)
137*4882a593Smuzhiyun {
138*4882a593Smuzhiyun switch (1 << bit) {
139*4882a593Smuzhiyun case DMXDesktopWidth:
140*4882a593Smuzhiyun attr->width = value;
141*4882a593Smuzhiyun break;
142*4882a593Smuzhiyun case DMXDesktopHeight:
143*4882a593Smuzhiyun attr->height = value;
144*4882a593Smuzhiyun break;
145*4882a593Smuzhiyun case DMXDesktopShiftX:
146*4882a593Smuzhiyun attr->shiftX = value;
147*4882a593Smuzhiyun break;
148*4882a593Smuzhiyun case DMXDesktopShiftY:
149*4882a593Smuzhiyun attr->shiftY = value;
150*4882a593Smuzhiyun break;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun static int
dmxFetchDesktopAttributes(unsigned int mask,DMXDesktopAttributesPtr attr,CARD32 * value_list)155*4882a593Smuzhiyun dmxFetchDesktopAttributes(unsigned int mask,
156*4882a593Smuzhiyun DMXDesktopAttributesPtr attr, CARD32 *value_list)
157*4882a593Smuzhiyun {
158*4882a593Smuzhiyun int i;
159*4882a593Smuzhiyun CARD32 *value = value_list;
160*4882a593Smuzhiyun int count = 0;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun for (i = 0; i < 32; i++) {
163*4882a593Smuzhiyun if (mask & (1 << i)) {
164*4882a593Smuzhiyun dmxSetDesktopAttribute(i, attr, *value);
165*4882a593Smuzhiyun ++value;
166*4882a593Smuzhiyun ++count;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun return count;
170*4882a593Smuzhiyun }
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun static void
dmxSetInputAttribute(int bit,DMXInputAttributesPtr attr,CARD32 value)173*4882a593Smuzhiyun dmxSetInputAttribute(int bit, DMXInputAttributesPtr attr, CARD32 value)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun switch (1 << bit) {
176*4882a593Smuzhiyun case DMXInputType:
177*4882a593Smuzhiyun attr->inputType = value;
178*4882a593Smuzhiyun break;
179*4882a593Smuzhiyun case DMXInputPhysicalScreen:
180*4882a593Smuzhiyun attr->physicalScreen = value;
181*4882a593Smuzhiyun break;
182*4882a593Smuzhiyun case DMXInputSendsCore:
183*4882a593Smuzhiyun attr->sendsCore = ! !value;
184*4882a593Smuzhiyun break;
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun }
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun static int
dmxFetchInputAttributes(unsigned int mask,DMXInputAttributesPtr attr,CARD32 * value_list)189*4882a593Smuzhiyun dmxFetchInputAttributes(unsigned int mask,
190*4882a593Smuzhiyun DMXInputAttributesPtr attr, CARD32 *value_list)
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun int i;
193*4882a593Smuzhiyun CARD32 *value = value_list;
194*4882a593Smuzhiyun int count = 0;
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun for (i = 0; i < 32; i++) {
197*4882a593Smuzhiyun if (mask & (1 << i)) {
198*4882a593Smuzhiyun dmxSetInputAttribute(i, attr, *value);
199*4882a593Smuzhiyun ++value;
200*4882a593Smuzhiyun ++count;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun return count;
204*4882a593Smuzhiyun }
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun static int
ProcDMXQueryVersion(ClientPtr client)207*4882a593Smuzhiyun ProcDMXQueryVersion(ClientPtr client)
208*4882a593Smuzhiyun {
209*4882a593Smuzhiyun xDMXQueryVersionReply rep = {
210*4882a593Smuzhiyun .type = X_Reply,
211*4882a593Smuzhiyun .sequenceNumber = client->sequence,
212*4882a593Smuzhiyun .length = 0,
213*4882a593Smuzhiyun .majorVersion = SERVER_DMX_MAJOR_VERSION,
214*4882a593Smuzhiyun .minorVersion = SERVER_DMX_MINOR_VERSION,
215*4882a593Smuzhiyun .patchVersion = SERVER_DMX_PATCH_VERSION
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXQueryVersionReq);
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun if (client->swapped) {
221*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
222*4882a593Smuzhiyun swapl(&rep.length);
223*4882a593Smuzhiyun swapl(&rep.majorVersion);
224*4882a593Smuzhiyun swapl(&rep.minorVersion);
225*4882a593Smuzhiyun swapl(&rep.patchVersion);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXQueryVersionReply), &rep);
228*4882a593Smuzhiyun return Success;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun static int
ProcDMXSync(ClientPtr client)232*4882a593Smuzhiyun ProcDMXSync(ClientPtr client)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun xDMXSyncReply rep;
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXSyncReq);
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun dmxFlushPendingSyncs();
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun rep = (xDMXSyncReply) {
241*4882a593Smuzhiyun .type = X_Reply,
242*4882a593Smuzhiyun .sequenceNumber = client->sequence,
243*4882a593Smuzhiyun .length = 0,
244*4882a593Smuzhiyun .status = 0
245*4882a593Smuzhiyun };
246*4882a593Smuzhiyun if (client->swapped) {
247*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
248*4882a593Smuzhiyun swapl(&rep.length);
249*4882a593Smuzhiyun swapl(&rep.status);
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXSyncReply), &rep);
252*4882a593Smuzhiyun return Success;
253*4882a593Smuzhiyun }
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun static int
ProcDMXForceWindowCreation(ClientPtr client)256*4882a593Smuzhiyun ProcDMXForceWindowCreation(ClientPtr client)
257*4882a593Smuzhiyun {
258*4882a593Smuzhiyun xDMXForceWindowCreationReply rep;
259*4882a593Smuzhiyun
260*4882a593Smuzhiyun REQUEST(xDMXForceWindowCreationReq);
261*4882a593Smuzhiyun WindowPtr pWin;
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXForceWindowCreationReq);
264*4882a593Smuzhiyun
265*4882a593Smuzhiyun #ifdef PANORAMIX
266*4882a593Smuzhiyun if (!noPanoramiXExtension) {
267*4882a593Smuzhiyun PanoramiXRes *win;
268*4882a593Smuzhiyun int i;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun if (Success != dixLookupResourceByType((void **) &win,
271*4882a593Smuzhiyun stuff->window, XRT_WINDOW,
272*4882a593Smuzhiyun client, DixReadAccess))
273*4882a593Smuzhiyun return -1; /* BadWindow */
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun FOR_NSCREENS(i) {
276*4882a593Smuzhiyun if (Success != dixLookupWindow(&pWin, win->info[i].id, client,
277*4882a593Smuzhiyun DixReadAccess))
278*4882a593Smuzhiyun return -1; /* BadWindow */
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun dmxForceWindowCreation(pWin);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun goto doreply;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun #endif
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun if (Success != dixLookupWindow(&pWin, stuff->window, client, DixReadAccess))
287*4882a593Smuzhiyun return -1; /* BadWindow */
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun dmxForceWindowCreation(pWin);
290*4882a593Smuzhiyun doreply:
291*4882a593Smuzhiyun dmxFlushPendingSyncs();
292*4882a593Smuzhiyun rep = (xDMXForceWindowCreationReply) {
293*4882a593Smuzhiyun .type = X_Reply,
294*4882a593Smuzhiyun .sequenceNumber = client->sequence,
295*4882a593Smuzhiyun .length = 0,
296*4882a593Smuzhiyun .status = 0
297*4882a593Smuzhiyun };
298*4882a593Smuzhiyun if (client->swapped) {
299*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
300*4882a593Smuzhiyun swapl(&rep.length);
301*4882a593Smuzhiyun swapl(&rep.status);
302*4882a593Smuzhiyun }
303*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXForceWindowCreationReply), &rep);
304*4882a593Smuzhiyun return Success;
305*4882a593Smuzhiyun }
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun static int
ProcDMXGetScreenCount(ClientPtr client)308*4882a593Smuzhiyun ProcDMXGetScreenCount(ClientPtr client)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun xDMXGetScreenCountReply rep;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetScreenCountReq);
313*4882a593Smuzhiyun
314*4882a593Smuzhiyun rep = (xDMXGetScreenCountReply) {
315*4882a593Smuzhiyun .type = X_Reply,
316*4882a593Smuzhiyun .sequenceNumber = client->sequence,
317*4882a593Smuzhiyun .length = 0,
318*4882a593Smuzhiyun .screenCount = dmxGetNumScreens()
319*4882a593Smuzhiyun };
320*4882a593Smuzhiyun if (client->swapped) {
321*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
322*4882a593Smuzhiyun swapl(&rep.length);
323*4882a593Smuzhiyun swapl(&rep.screenCount);
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetScreenCountReply), &rep);
326*4882a593Smuzhiyun return Success;
327*4882a593Smuzhiyun }
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun static int
ProcDMXGetScreenAttributes(ClientPtr client)330*4882a593Smuzhiyun ProcDMXGetScreenAttributes(ClientPtr client)
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun REQUEST(xDMXGetScreenAttributesReq);
333*4882a593Smuzhiyun xDMXGetScreenAttributesReply rep;
334*4882a593Smuzhiyun int length;
335*4882a593Smuzhiyun int paddedLength;
336*4882a593Smuzhiyun DMXScreenAttributesRec attr;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetScreenAttributesReq);
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun if (stuff->physicalScreen < 0
341*4882a593Smuzhiyun || stuff->physicalScreen >= dmxGetNumScreens())
342*4882a593Smuzhiyun return BadValue;
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun if (!dmxGetScreenAttributes(stuff->physicalScreen, &attr))
345*4882a593Smuzhiyun return BadValue;
346*4882a593Smuzhiyun
347*4882a593Smuzhiyun length = attr.displayName ? strlen(attr.displayName) : 0;
348*4882a593Smuzhiyun paddedLength = pad_to_int32(length);
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun rep = (xDMXGetScreenAttributesReply) {
351*4882a593Smuzhiyun .type = X_Reply,
352*4882a593Smuzhiyun .sequenceNumber = client->sequence,
353*4882a593Smuzhiyun .length =
354*4882a593Smuzhiyun bytes_to_int32((sizeof(xDMXGetScreenAttributesReply) -
355*4882a593Smuzhiyun sizeof(xGenericReply))
356*4882a593Smuzhiyun + paddedLength),
357*4882a593Smuzhiyun .displayNameLength = length,
358*4882a593Smuzhiyun .logicalScreen = attr.logicalScreen,
359*4882a593Smuzhiyun .screenWindowWidth = attr.screenWindowWidth,
360*4882a593Smuzhiyun .screenWindowHeight = attr.screenWindowHeight,
361*4882a593Smuzhiyun .screenWindowXoffset = attr.screenWindowXoffset,
362*4882a593Smuzhiyun .screenWindowYoffset = attr.screenWindowYoffset,
363*4882a593Smuzhiyun .rootWindowWidth = attr.rootWindowWidth,
364*4882a593Smuzhiyun .rootWindowHeight = attr.rootWindowHeight,
365*4882a593Smuzhiyun .rootWindowXoffset = attr.rootWindowXoffset,
366*4882a593Smuzhiyun .rootWindowYoffset = attr.rootWindowYoffset,
367*4882a593Smuzhiyun .rootWindowXorigin = attr.rootWindowXorigin,
368*4882a593Smuzhiyun .rootWindowYorigin = attr.rootWindowYorigin
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun
371*4882a593Smuzhiyun if (client->swapped) {
372*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
373*4882a593Smuzhiyun swapl(&rep.length);
374*4882a593Smuzhiyun swapl(&rep.displayNameLength);
375*4882a593Smuzhiyun swapl(&rep.logicalScreen);
376*4882a593Smuzhiyun swaps(&rep.screenWindowWidth);
377*4882a593Smuzhiyun swaps(&rep.screenWindowHeight);
378*4882a593Smuzhiyun swaps(&rep.screenWindowXoffset);
379*4882a593Smuzhiyun swaps(&rep.screenWindowYoffset);
380*4882a593Smuzhiyun swaps(&rep.rootWindowWidth);
381*4882a593Smuzhiyun swaps(&rep.rootWindowHeight);
382*4882a593Smuzhiyun swaps(&rep.rootWindowXoffset);
383*4882a593Smuzhiyun swaps(&rep.rootWindowYoffset);
384*4882a593Smuzhiyun swaps(&rep.rootWindowXorigin);
385*4882a593Smuzhiyun swaps(&rep.rootWindowYorigin);
386*4882a593Smuzhiyun }
387*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetScreenAttributesReply), &rep);
388*4882a593Smuzhiyun if (length)
389*4882a593Smuzhiyun WriteToClient(client, length, attr.displayName);
390*4882a593Smuzhiyun return Success;
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun
393*4882a593Smuzhiyun static int
ProcDMXChangeScreensAttributes(ClientPtr client)394*4882a593Smuzhiyun ProcDMXChangeScreensAttributes(ClientPtr client)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun REQUEST(xDMXChangeScreensAttributesReq);
397*4882a593Smuzhiyun xDMXChangeScreensAttributesReply rep;
398*4882a593Smuzhiyun int status = DMX_BAD_XINERAMA;
399*4882a593Smuzhiyun unsigned int mask = 0;
400*4882a593Smuzhiyun unsigned int i;
401*4882a593Smuzhiyun CARD32 *screen_list;
402*4882a593Smuzhiyun CARD32 *mask_list;
403*4882a593Smuzhiyun CARD32 *value_list;
404*4882a593Smuzhiyun DMXScreenAttributesPtr attribs;
405*4882a593Smuzhiyun int errorScreen = 0;
406*4882a593Smuzhiyun unsigned int len;
407*4882a593Smuzhiyun int ones = 0;
408*4882a593Smuzhiyun
409*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXChangeScreensAttributesReq);
410*4882a593Smuzhiyun len =
411*4882a593Smuzhiyun client->req_len -
412*4882a593Smuzhiyun bytes_to_int32(sizeof(xDMXChangeScreensAttributesReq));
413*4882a593Smuzhiyun if (len < stuff->screenCount + stuff->maskCount)
414*4882a593Smuzhiyun return BadLength;
415*4882a593Smuzhiyun
416*4882a593Smuzhiyun screen_list = (CARD32 *) (stuff + 1);
417*4882a593Smuzhiyun mask_list = &screen_list[stuff->screenCount];
418*4882a593Smuzhiyun value_list = &mask_list[stuff->maskCount];
419*4882a593Smuzhiyun
420*4882a593Smuzhiyun for (i = 0; i < stuff->maskCount; i++)
421*4882a593Smuzhiyun ones += Ones(mask_list[i]);
422*4882a593Smuzhiyun if (len != stuff->screenCount + stuff->maskCount + ones)
423*4882a593Smuzhiyun return BadLength;
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun if (!_DMXXineramaActive())
426*4882a593Smuzhiyun goto noxinerama;
427*4882a593Smuzhiyun
428*4882a593Smuzhiyun if (!(attribs = xallocarray(stuff->screenCount, sizeof(*attribs))))
429*4882a593Smuzhiyun return BadAlloc;
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun for (i = 0; i < stuff->screenCount; i++) {
432*4882a593Smuzhiyun int count;
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun if (i < stuff->maskCount)
435*4882a593Smuzhiyun mask = mask_list[i];
436*4882a593Smuzhiyun dmxGetScreenAttributes(screen_list[i], &attribs[i]);
437*4882a593Smuzhiyun count = dmxFetchScreenAttributes(mask, &attribs[i], value_list);
438*4882a593Smuzhiyun value_list += count;
439*4882a593Smuzhiyun }
440*4882a593Smuzhiyun
441*4882a593Smuzhiyun #ifdef PANORAMIX
442*4882a593Smuzhiyun status = dmxConfigureScreenWindows(stuff->screenCount,
443*4882a593Smuzhiyun screen_list, attribs, &errorScreen);
444*4882a593Smuzhiyun #endif
445*4882a593Smuzhiyun
446*4882a593Smuzhiyun free(attribs);
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun if (status == BadValue)
449*4882a593Smuzhiyun return status;
450*4882a593Smuzhiyun
451*4882a593Smuzhiyun noxinerama:
452*4882a593Smuzhiyun rep = (xDMXChangeScreensAttributesReply) {
453*4882a593Smuzhiyun .type = X_Reply,
454*4882a593Smuzhiyun .sequenceNumber = client->sequence,
455*4882a593Smuzhiyun .length = 0,
456*4882a593Smuzhiyun .status = status,
457*4882a593Smuzhiyun .errorScreen = errorScreen
458*4882a593Smuzhiyun };
459*4882a593Smuzhiyun if (client->swapped) {
460*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
461*4882a593Smuzhiyun swapl(&rep.length);
462*4882a593Smuzhiyun swapl(&rep.status);
463*4882a593Smuzhiyun swapl(&rep.errorScreen);
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXChangeScreensAttributesReply), &rep);
466*4882a593Smuzhiyun return Success;
467*4882a593Smuzhiyun }
468*4882a593Smuzhiyun
469*4882a593Smuzhiyun static int
ProcDMXAddScreen(ClientPtr client)470*4882a593Smuzhiyun ProcDMXAddScreen(ClientPtr client)
471*4882a593Smuzhiyun {
472*4882a593Smuzhiyun REQUEST(xDMXAddScreenReq);
473*4882a593Smuzhiyun xDMXAddScreenReply rep;
474*4882a593Smuzhiyun int status = 0;
475*4882a593Smuzhiyun CARD32 *value_list;
476*4882a593Smuzhiyun DMXScreenAttributesRec attr;
477*4882a593Smuzhiyun int count;
478*4882a593Smuzhiyun char *name;
479*4882a593Smuzhiyun int len;
480*4882a593Smuzhiyun int paddedLength;
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXAddScreenReq);
483*4882a593Smuzhiyun paddedLength = pad_to_int32(stuff->displayNameLength);
484*4882a593Smuzhiyun len = client->req_len - bytes_to_int32(sizeof(xDMXAddScreenReq));
485*4882a593Smuzhiyun if (len != Ones(stuff->valueMask) + paddedLength / 4)
486*4882a593Smuzhiyun return BadLength;
487*4882a593Smuzhiyun
488*4882a593Smuzhiyun memset(&attr, 0, sizeof(attr));
489*4882a593Smuzhiyun dmxGetScreenAttributes(stuff->physicalScreen, &attr);
490*4882a593Smuzhiyun value_list = (CARD32 *) (stuff + 1);
491*4882a593Smuzhiyun count = dmxFetchScreenAttributes(stuff->valueMask, &attr, value_list);
492*4882a593Smuzhiyun
493*4882a593Smuzhiyun if (!(name = malloc(stuff->displayNameLength + 1 + 4)))
494*4882a593Smuzhiyun return BadAlloc;
495*4882a593Smuzhiyun memcpy(name, &value_list[count], stuff->displayNameLength);
496*4882a593Smuzhiyun name[stuff->displayNameLength] = '\0';
497*4882a593Smuzhiyun attr.displayName = name;
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun status = dmxAttachScreen(stuff->physicalScreen, &attr);
500*4882a593Smuzhiyun
501*4882a593Smuzhiyun free(name);
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun rep = (xDMXAddScreenReply) {
504*4882a593Smuzhiyun .type = X_Reply,
505*4882a593Smuzhiyun .sequenceNumber = client->sequence,
506*4882a593Smuzhiyun .length = 0,
507*4882a593Smuzhiyun .status = status,
508*4882a593Smuzhiyun .physicalScreen = stuff->physicalScreen
509*4882a593Smuzhiyun };
510*4882a593Smuzhiyun if (client->swapped) {
511*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
512*4882a593Smuzhiyun swapl(&rep.length);
513*4882a593Smuzhiyun swapl(&rep.status);
514*4882a593Smuzhiyun swapl(&rep.physicalScreen);
515*4882a593Smuzhiyun }
516*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXAddScreenReply), &rep);
517*4882a593Smuzhiyun return Success;
518*4882a593Smuzhiyun }
519*4882a593Smuzhiyun
520*4882a593Smuzhiyun static int
ProcDMXRemoveScreen(ClientPtr client)521*4882a593Smuzhiyun ProcDMXRemoveScreen(ClientPtr client)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun REQUEST(xDMXRemoveScreenReq);
524*4882a593Smuzhiyun xDMXRemoveScreenReply rep;
525*4882a593Smuzhiyun int status = 0;
526*4882a593Smuzhiyun
527*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXRemoveScreenReq);
528*4882a593Smuzhiyun
529*4882a593Smuzhiyun status = dmxDetachScreen(stuff->physicalScreen);
530*4882a593Smuzhiyun
531*4882a593Smuzhiyun rep = (xDMXRemoveScreenReply) {
532*4882a593Smuzhiyun .type = X_Reply,
533*4882a593Smuzhiyun .sequenceNumber = client->sequence,
534*4882a593Smuzhiyun .length = 0,
535*4882a593Smuzhiyun .status = status
536*4882a593Smuzhiyun };
537*4882a593Smuzhiyun if (client->swapped) {
538*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
539*4882a593Smuzhiyun swapl(&rep.length);
540*4882a593Smuzhiyun swapl(&rep.status);
541*4882a593Smuzhiyun }
542*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXRemoveScreenReply), &rep);
543*4882a593Smuzhiyun return Success;
544*4882a593Smuzhiyun }
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun #ifdef PANORAMIX
547*4882a593Smuzhiyun static int
dmxPopulatePanoramiX(ClientPtr client,Window window,CARD32 * screens,CARD32 * windows,xRectangle * pos,xRectangle * vis)548*4882a593Smuzhiyun dmxPopulatePanoramiX(ClientPtr client, Window window,
549*4882a593Smuzhiyun CARD32 *screens, CARD32 *windows,
550*4882a593Smuzhiyun xRectangle *pos, xRectangle *vis)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun WindowPtr pWin;
553*4882a593Smuzhiyun PanoramiXRes *win;
554*4882a593Smuzhiyun int i;
555*4882a593Smuzhiyun int count = 0;
556*4882a593Smuzhiyun DMXWindowAttributesRec attr;
557*4882a593Smuzhiyun
558*4882a593Smuzhiyun if (Success != dixLookupResourceByType((void **) &win,
559*4882a593Smuzhiyun window, XRT_WINDOW,
560*4882a593Smuzhiyun client, DixReadAccess))
561*4882a593Smuzhiyun return -1; /* BadWindow */
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun FOR_NSCREENS(i) {
564*4882a593Smuzhiyun if (Success != dixLookupWindow(&pWin, win->info[i].id, client,
565*4882a593Smuzhiyun DixReadAccess))
566*4882a593Smuzhiyun return -1; /* BadWindow */
567*4882a593Smuzhiyun if (dmxGetWindowAttributes(pWin, &attr)) {
568*4882a593Smuzhiyun screens[count] = attr.screen;
569*4882a593Smuzhiyun windows[count] = attr.window;
570*4882a593Smuzhiyun pos[count] = attr.pos;
571*4882a593Smuzhiyun vis[count] = attr.vis;
572*4882a593Smuzhiyun ++count; /* Only count existing windows */
573*4882a593Smuzhiyun }
574*4882a593Smuzhiyun }
575*4882a593Smuzhiyun return count;
576*4882a593Smuzhiyun }
577*4882a593Smuzhiyun #endif
578*4882a593Smuzhiyun
579*4882a593Smuzhiyun static int
dmxPopulate(ClientPtr client,Window window,CARD32 * screens,CARD32 * windows,xRectangle * pos,xRectangle * vis)580*4882a593Smuzhiyun dmxPopulate(ClientPtr client, Window window, CARD32 *screens,
581*4882a593Smuzhiyun CARD32 *windows, xRectangle *pos, xRectangle *vis)
582*4882a593Smuzhiyun {
583*4882a593Smuzhiyun WindowPtr pWin;
584*4882a593Smuzhiyun DMXWindowAttributesRec attr;
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun #ifdef PANORAMIX
587*4882a593Smuzhiyun if (!noPanoramiXExtension)
588*4882a593Smuzhiyun return dmxPopulatePanoramiX(client, window, screens, windows, pos, vis);
589*4882a593Smuzhiyun #endif
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun if (Success != dixLookupWindow(&pWin, window, client, DixReadAccess))
592*4882a593Smuzhiyun return -1; /* BadWindow */
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun dmxGetWindowAttributes(pWin, &attr);
595*4882a593Smuzhiyun *screens = attr.screen;
596*4882a593Smuzhiyun *windows = attr.window;
597*4882a593Smuzhiyun *pos = attr.pos;
598*4882a593Smuzhiyun *vis = attr.vis;
599*4882a593Smuzhiyun return 1;
600*4882a593Smuzhiyun }
601*4882a593Smuzhiyun
602*4882a593Smuzhiyun static int
dmxMaxNumScreens(void)603*4882a593Smuzhiyun dmxMaxNumScreens(void)
604*4882a593Smuzhiyun {
605*4882a593Smuzhiyun #ifdef PANORAMIX
606*4882a593Smuzhiyun if (!noPanoramiXExtension)
607*4882a593Smuzhiyun return PanoramiXNumScreens;
608*4882a593Smuzhiyun #endif
609*4882a593Smuzhiyun return 1;
610*4882a593Smuzhiyun }
611*4882a593Smuzhiyun
612*4882a593Smuzhiyun static int
ProcDMXGetWindowAttributes(ClientPtr client)613*4882a593Smuzhiyun ProcDMXGetWindowAttributes(ClientPtr client)
614*4882a593Smuzhiyun {
615*4882a593Smuzhiyun REQUEST(xDMXGetWindowAttributesReq);
616*4882a593Smuzhiyun xDMXGetWindowAttributesReply rep;
617*4882a593Smuzhiyun int i;
618*4882a593Smuzhiyun CARD32 *screens;
619*4882a593Smuzhiyun CARD32 *windows;
620*4882a593Smuzhiyun xRectangle *pos, *vis;
621*4882a593Smuzhiyun int count = dmxMaxNumScreens();
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetWindowAttributesReq);
624*4882a593Smuzhiyun
625*4882a593Smuzhiyun if (!(screens = xallocarray(count, sizeof(*screens))))
626*4882a593Smuzhiyun return BadAlloc;
627*4882a593Smuzhiyun if (!(windows = xallocarray(count, sizeof(*windows)))) {
628*4882a593Smuzhiyun free(screens);
629*4882a593Smuzhiyun return BadAlloc;
630*4882a593Smuzhiyun }
631*4882a593Smuzhiyun if (!(pos = xallocarray(count, sizeof(*pos)))) {
632*4882a593Smuzhiyun free(windows);
633*4882a593Smuzhiyun free(screens);
634*4882a593Smuzhiyun return BadAlloc;
635*4882a593Smuzhiyun }
636*4882a593Smuzhiyun if (!(vis = xallocarray(count, sizeof(*vis)))) {
637*4882a593Smuzhiyun free(pos);
638*4882a593Smuzhiyun free(windows);
639*4882a593Smuzhiyun free(screens);
640*4882a593Smuzhiyun return BadAlloc;
641*4882a593Smuzhiyun }
642*4882a593Smuzhiyun
643*4882a593Smuzhiyun if ((count = dmxPopulate(client, stuff->window, screens, windows,
644*4882a593Smuzhiyun pos, vis)) < 0) {
645*4882a593Smuzhiyun free(vis);
646*4882a593Smuzhiyun free(pos);
647*4882a593Smuzhiyun free(windows);
648*4882a593Smuzhiyun free(screens);
649*4882a593Smuzhiyun return BadWindow;
650*4882a593Smuzhiyun }
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun rep = (xDMXGetWindowAttributesReply) {
653*4882a593Smuzhiyun .type = X_Reply,
654*4882a593Smuzhiyun .sequenceNumber = client->sequence,
655*4882a593Smuzhiyun .length = count * 6,
656*4882a593Smuzhiyun .screenCount = count
657*4882a593Smuzhiyun };
658*4882a593Smuzhiyun if (client->swapped) {
659*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
660*4882a593Smuzhiyun swapl(&rep.length);
661*4882a593Smuzhiyun swapl(&rep.screenCount);
662*4882a593Smuzhiyun for (i = 0; i < count; i++) {
663*4882a593Smuzhiyun swapl(&screens[i]);
664*4882a593Smuzhiyun swapl(&windows[i]);
665*4882a593Smuzhiyun
666*4882a593Smuzhiyun swaps(&pos[i].x);
667*4882a593Smuzhiyun swaps(&pos[i].y);
668*4882a593Smuzhiyun swaps(&pos[i].width);
669*4882a593Smuzhiyun swaps(&pos[i].height);
670*4882a593Smuzhiyun
671*4882a593Smuzhiyun swaps(&vis[i].x);
672*4882a593Smuzhiyun swaps(&vis[i].y);
673*4882a593Smuzhiyun swaps(&vis[i].width);
674*4882a593Smuzhiyun swaps(&vis[i].height);
675*4882a593Smuzhiyun }
676*4882a593Smuzhiyun }
677*4882a593Smuzhiyun
678*4882a593Smuzhiyun dmxFlushPendingSyncs();
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetWindowAttributesReply), &rep);
681*4882a593Smuzhiyun if (count) {
682*4882a593Smuzhiyun WriteToClient(client, count * sizeof(*screens), screens);
683*4882a593Smuzhiyun WriteToClient(client, count * sizeof(*windows), windows);
684*4882a593Smuzhiyun WriteToClient(client, count * sizeof(*pos), pos);
685*4882a593Smuzhiyun WriteToClient(client, count * sizeof(*vis), vis);
686*4882a593Smuzhiyun }
687*4882a593Smuzhiyun
688*4882a593Smuzhiyun free(vis);
689*4882a593Smuzhiyun free(pos);
690*4882a593Smuzhiyun free(windows);
691*4882a593Smuzhiyun free(screens);
692*4882a593Smuzhiyun
693*4882a593Smuzhiyun return Success;
694*4882a593Smuzhiyun }
695*4882a593Smuzhiyun
696*4882a593Smuzhiyun static int
ProcDMXGetDesktopAttributes(ClientPtr client)697*4882a593Smuzhiyun ProcDMXGetDesktopAttributes(ClientPtr client)
698*4882a593Smuzhiyun {
699*4882a593Smuzhiyun xDMXGetDesktopAttributesReply rep;
700*4882a593Smuzhiyun DMXDesktopAttributesRec attr;
701*4882a593Smuzhiyun
702*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetDesktopAttributesReq);
703*4882a593Smuzhiyun
704*4882a593Smuzhiyun dmxGetDesktopAttributes(&attr);
705*4882a593Smuzhiyun
706*4882a593Smuzhiyun rep = (xDMXGetDesktopAttributesReply) {
707*4882a593Smuzhiyun .type = X_Reply,
708*4882a593Smuzhiyun .sequenceNumber = client->sequence,
709*4882a593Smuzhiyun .length = 0,
710*4882a593Smuzhiyun .width = attr.width,
711*4882a593Smuzhiyun .height = attr.height,
712*4882a593Smuzhiyun .shiftX = attr.shiftX,
713*4882a593Smuzhiyun .shiftY = attr.shiftY
714*4882a593Smuzhiyun };
715*4882a593Smuzhiyun
716*4882a593Smuzhiyun if (client->swapped) {
717*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
718*4882a593Smuzhiyun swapl(&rep.length);
719*4882a593Smuzhiyun swaps(&rep.width);
720*4882a593Smuzhiyun swaps(&rep.height);
721*4882a593Smuzhiyun swaps(&rep.shiftX);
722*4882a593Smuzhiyun swaps(&rep.shiftY);
723*4882a593Smuzhiyun }
724*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetDesktopAttributesReply), &rep);
725*4882a593Smuzhiyun return Success;
726*4882a593Smuzhiyun }
727*4882a593Smuzhiyun
728*4882a593Smuzhiyun static int
ProcDMXChangeDesktopAttributes(ClientPtr client)729*4882a593Smuzhiyun ProcDMXChangeDesktopAttributes(ClientPtr client)
730*4882a593Smuzhiyun {
731*4882a593Smuzhiyun REQUEST(xDMXChangeDesktopAttributesReq);
732*4882a593Smuzhiyun xDMXChangeDesktopAttributesReply rep;
733*4882a593Smuzhiyun int status = DMX_BAD_XINERAMA;
734*4882a593Smuzhiyun CARD32 *value_list;
735*4882a593Smuzhiyun DMXDesktopAttributesRec attr;
736*4882a593Smuzhiyun int len;
737*4882a593Smuzhiyun
738*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXChangeDesktopAttributesReq);
739*4882a593Smuzhiyun len = client->req_len - (sizeof(xDMXChangeDesktopAttributesReq) >> 2);
740*4882a593Smuzhiyun if (len != Ones(stuff->valueMask))
741*4882a593Smuzhiyun return BadLength;
742*4882a593Smuzhiyun
743*4882a593Smuzhiyun if (!_DMXXineramaActive())
744*4882a593Smuzhiyun goto noxinerama;
745*4882a593Smuzhiyun
746*4882a593Smuzhiyun value_list = (CARD32 *) (stuff + 1);
747*4882a593Smuzhiyun
748*4882a593Smuzhiyun dmxGetDesktopAttributes(&attr);
749*4882a593Smuzhiyun dmxFetchDesktopAttributes(stuff->valueMask, &attr, value_list);
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun #ifdef PANORAMIX
752*4882a593Smuzhiyun status = dmxConfigureDesktop(&attr);
753*4882a593Smuzhiyun #endif
754*4882a593Smuzhiyun if (status == BadValue)
755*4882a593Smuzhiyun return status;
756*4882a593Smuzhiyun
757*4882a593Smuzhiyun noxinerama:
758*4882a593Smuzhiyun rep = (xDMXChangeDesktopAttributesReply) {
759*4882a593Smuzhiyun .type = X_Reply,
760*4882a593Smuzhiyun .sequenceNumber = client->sequence,
761*4882a593Smuzhiyun .length = 0,
762*4882a593Smuzhiyun .status = status
763*4882a593Smuzhiyun };
764*4882a593Smuzhiyun if (client->swapped) {
765*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
766*4882a593Smuzhiyun swapl(&rep.length);
767*4882a593Smuzhiyun swapl(&rep.status);
768*4882a593Smuzhiyun }
769*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXChangeDesktopAttributesReply), &rep);
770*4882a593Smuzhiyun return Success;
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun static int
ProcDMXGetInputCount(ClientPtr client)774*4882a593Smuzhiyun ProcDMXGetInputCount(ClientPtr client)
775*4882a593Smuzhiyun {
776*4882a593Smuzhiyun xDMXGetInputCountReply rep;
777*4882a593Smuzhiyun
778*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetInputCountReq);
779*4882a593Smuzhiyun
780*4882a593Smuzhiyun rep = (xDMXGetInputCountReply) {
781*4882a593Smuzhiyun .type = X_Reply,
782*4882a593Smuzhiyun .sequenceNumber = client->sequence,
783*4882a593Smuzhiyun .length = 0,
784*4882a593Smuzhiyun .inputCount = dmxGetInputCount()
785*4882a593Smuzhiyun };
786*4882a593Smuzhiyun if (client->swapped) {
787*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
788*4882a593Smuzhiyun swapl(&rep.length);
789*4882a593Smuzhiyun swapl(&rep.inputCount);
790*4882a593Smuzhiyun }
791*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetInputCountReply), &rep);
792*4882a593Smuzhiyun return Success;
793*4882a593Smuzhiyun }
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun static int
ProcDMXGetInputAttributes(ClientPtr client)796*4882a593Smuzhiyun ProcDMXGetInputAttributes(ClientPtr client)
797*4882a593Smuzhiyun {
798*4882a593Smuzhiyun REQUEST(xDMXGetInputAttributesReq);
799*4882a593Smuzhiyun xDMXGetInputAttributesReply rep;
800*4882a593Smuzhiyun int length;
801*4882a593Smuzhiyun int paddedLength;
802*4882a593Smuzhiyun DMXInputAttributesRec attr;
803*4882a593Smuzhiyun
804*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetInputAttributesReq);
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun if (dmxGetInputAttributes(stuff->deviceId, &attr))
807*4882a593Smuzhiyun return BadValue;
808*4882a593Smuzhiyun
809*4882a593Smuzhiyun length = attr.name ? strlen(attr.name) : 0;
810*4882a593Smuzhiyun paddedLength = pad_to_int32(length);
811*4882a593Smuzhiyun
812*4882a593Smuzhiyun rep = (xDMXGetInputAttributesReply) {
813*4882a593Smuzhiyun .type = X_Reply,
814*4882a593Smuzhiyun .sequenceNumber = client->sequence,
815*4882a593Smuzhiyun .length = bytes_to_int32(paddedLength),
816*4882a593Smuzhiyun
817*4882a593Smuzhiyun .inputType = attr.inputType,
818*4882a593Smuzhiyun .physicalScreen = attr.physicalScreen,
819*4882a593Smuzhiyun .physicalId = attr.physicalId,
820*4882a593Smuzhiyun .nameLength = length,
821*4882a593Smuzhiyun .isCore = attr.isCore,
822*4882a593Smuzhiyun .sendsCore = attr.sendsCore,
823*4882a593Smuzhiyun .detached = attr.detached
824*4882a593Smuzhiyun };
825*4882a593Smuzhiyun
826*4882a593Smuzhiyun if (client->swapped) {
827*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
828*4882a593Smuzhiyun swapl(&rep.length);
829*4882a593Smuzhiyun swapl(&rep.inputType);
830*4882a593Smuzhiyun swapl(&rep.physicalScreen);
831*4882a593Smuzhiyun swapl(&rep.physicalId);
832*4882a593Smuzhiyun swapl(&rep.nameLength);
833*4882a593Smuzhiyun }
834*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXGetInputAttributesReply), &rep);
835*4882a593Smuzhiyun if (length)
836*4882a593Smuzhiyun WriteToClient(client, length, attr.name);
837*4882a593Smuzhiyun return Success;
838*4882a593Smuzhiyun }
839*4882a593Smuzhiyun
840*4882a593Smuzhiyun static int
ProcDMXAddInput(ClientPtr client)841*4882a593Smuzhiyun ProcDMXAddInput(ClientPtr client)
842*4882a593Smuzhiyun {
843*4882a593Smuzhiyun REQUEST(xDMXAddInputReq);
844*4882a593Smuzhiyun xDMXAddInputReply rep;
845*4882a593Smuzhiyun int status = 0;
846*4882a593Smuzhiyun CARD32 *value_list;
847*4882a593Smuzhiyun DMXInputAttributesRec attr;
848*4882a593Smuzhiyun int count;
849*4882a593Smuzhiyun char *name;
850*4882a593Smuzhiyun int len;
851*4882a593Smuzhiyun int paddedLength;
852*4882a593Smuzhiyun int id = -1;
853*4882a593Smuzhiyun
854*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXAddInputReq);
855*4882a593Smuzhiyun paddedLength = pad_to_int32(stuff->displayNameLength);
856*4882a593Smuzhiyun len = client->req_len - (sizeof(xDMXAddInputReq) >> 2);
857*4882a593Smuzhiyun if (len != Ones(stuff->valueMask) + paddedLength / 4)
858*4882a593Smuzhiyun return BadLength;
859*4882a593Smuzhiyun
860*4882a593Smuzhiyun memset(&attr, 0, sizeof(attr));
861*4882a593Smuzhiyun value_list = (CARD32 *) (stuff + 1);
862*4882a593Smuzhiyun count = dmxFetchInputAttributes(stuff->valueMask, &attr, value_list);
863*4882a593Smuzhiyun
864*4882a593Smuzhiyun if (!(name = malloc(stuff->displayNameLength + 1 + 4)))
865*4882a593Smuzhiyun return BadAlloc;
866*4882a593Smuzhiyun memcpy(name, &value_list[count], stuff->displayNameLength);
867*4882a593Smuzhiyun name[stuff->displayNameLength] = '\0';
868*4882a593Smuzhiyun attr.name = name;
869*4882a593Smuzhiyun
870*4882a593Smuzhiyun status = dmxAddInput(&attr, &id);
871*4882a593Smuzhiyun
872*4882a593Smuzhiyun free(name);
873*4882a593Smuzhiyun
874*4882a593Smuzhiyun if (status)
875*4882a593Smuzhiyun return status;
876*4882a593Smuzhiyun
877*4882a593Smuzhiyun rep = (xDMXAddInputReply) {
878*4882a593Smuzhiyun .type = X_Reply,
879*4882a593Smuzhiyun .sequenceNumber = client->sequence,
880*4882a593Smuzhiyun .length = 0,
881*4882a593Smuzhiyun .status = status,
882*4882a593Smuzhiyun .physicalId = id
883*4882a593Smuzhiyun };
884*4882a593Smuzhiyun if (client->swapped) {
885*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
886*4882a593Smuzhiyun swapl(&rep.length);
887*4882a593Smuzhiyun swapl(&rep.status);
888*4882a593Smuzhiyun swapl(&rep.physicalId);
889*4882a593Smuzhiyun }
890*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXAddInputReply), &rep);
891*4882a593Smuzhiyun return Success;
892*4882a593Smuzhiyun }
893*4882a593Smuzhiyun
894*4882a593Smuzhiyun static int
ProcDMXRemoveInput(ClientPtr client)895*4882a593Smuzhiyun ProcDMXRemoveInput(ClientPtr client)
896*4882a593Smuzhiyun {
897*4882a593Smuzhiyun REQUEST(xDMXRemoveInputReq);
898*4882a593Smuzhiyun xDMXRemoveInputReply rep;
899*4882a593Smuzhiyun int status = 0;
900*4882a593Smuzhiyun
901*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXRemoveInputReq);
902*4882a593Smuzhiyun
903*4882a593Smuzhiyun status = dmxRemoveInput(stuff->physicalId);
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun if (status)
906*4882a593Smuzhiyun return status;
907*4882a593Smuzhiyun
908*4882a593Smuzhiyun rep = (xDMXRemoveInputReply) {
909*4882a593Smuzhiyun .type = X_Reply,
910*4882a593Smuzhiyun .sequenceNumber = client->sequence,
911*4882a593Smuzhiyun .length = 0,
912*4882a593Smuzhiyun .status = status
913*4882a593Smuzhiyun };
914*4882a593Smuzhiyun if (client->swapped) {
915*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
916*4882a593Smuzhiyun swapl(&rep.length);
917*4882a593Smuzhiyun swapl(&rep.status);
918*4882a593Smuzhiyun }
919*4882a593Smuzhiyun WriteToClient(client, sizeof(xDMXRemoveInputReply), &rep);
920*4882a593Smuzhiyun return Success;
921*4882a593Smuzhiyun }
922*4882a593Smuzhiyun
923*4882a593Smuzhiyun static int
ProcDMXDispatch(ClientPtr client)924*4882a593Smuzhiyun ProcDMXDispatch(ClientPtr client)
925*4882a593Smuzhiyun {
926*4882a593Smuzhiyun REQUEST(xReq);
927*4882a593Smuzhiyun
928*4882a593Smuzhiyun switch (stuff->data) {
929*4882a593Smuzhiyun case X_DMXQueryVersion:
930*4882a593Smuzhiyun return ProcDMXQueryVersion(client);
931*4882a593Smuzhiyun case X_DMXSync:
932*4882a593Smuzhiyun return ProcDMXSync(client);
933*4882a593Smuzhiyun case X_DMXForceWindowCreation:
934*4882a593Smuzhiyun return ProcDMXForceWindowCreation(client);
935*4882a593Smuzhiyun case X_DMXGetScreenCount:
936*4882a593Smuzhiyun return ProcDMXGetScreenCount(client);
937*4882a593Smuzhiyun case X_DMXGetScreenAttributes:
938*4882a593Smuzhiyun return ProcDMXGetScreenAttributes(client);
939*4882a593Smuzhiyun case X_DMXChangeScreensAttributes:
940*4882a593Smuzhiyun return ProcDMXChangeScreensAttributes(client);
941*4882a593Smuzhiyun case X_DMXAddScreen:
942*4882a593Smuzhiyun return ProcDMXAddScreen(client);
943*4882a593Smuzhiyun case X_DMXRemoveScreen:
944*4882a593Smuzhiyun return ProcDMXRemoveScreen(client);
945*4882a593Smuzhiyun case X_DMXGetWindowAttributes:
946*4882a593Smuzhiyun return ProcDMXGetWindowAttributes(client);
947*4882a593Smuzhiyun case X_DMXGetDesktopAttributes:
948*4882a593Smuzhiyun return ProcDMXGetDesktopAttributes(client);
949*4882a593Smuzhiyun case X_DMXChangeDesktopAttributes:
950*4882a593Smuzhiyun return ProcDMXChangeDesktopAttributes(client);
951*4882a593Smuzhiyun case X_DMXGetInputCount:
952*4882a593Smuzhiyun return ProcDMXGetInputCount(client);
953*4882a593Smuzhiyun case X_DMXGetInputAttributes:
954*4882a593Smuzhiyun return ProcDMXGetInputAttributes(client);
955*4882a593Smuzhiyun case X_DMXAddInput:
956*4882a593Smuzhiyun return ProcDMXAddInput(client);
957*4882a593Smuzhiyun case X_DMXRemoveInput:
958*4882a593Smuzhiyun return ProcDMXRemoveInput(client);
959*4882a593Smuzhiyun
960*4882a593Smuzhiyun case X_DMXGetScreenInformationDEPRECATED:
961*4882a593Smuzhiyun case X_DMXForceWindowCreationDEPRECATED:
962*4882a593Smuzhiyun case X_DMXReconfigureScreenDEPRECATED:
963*4882a593Smuzhiyun return BadImplementation;
964*4882a593Smuzhiyun
965*4882a593Smuzhiyun default:
966*4882a593Smuzhiyun return BadRequest;
967*4882a593Smuzhiyun }
968*4882a593Smuzhiyun }
969*4882a593Smuzhiyun
970*4882a593Smuzhiyun static int _X_COLD
SProcDMXQueryVersion(ClientPtr client)971*4882a593Smuzhiyun SProcDMXQueryVersion(ClientPtr client)
972*4882a593Smuzhiyun {
973*4882a593Smuzhiyun REQUEST(xDMXQueryVersionReq);
974*4882a593Smuzhiyun
975*4882a593Smuzhiyun swaps(&stuff->length);
976*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXQueryVersionReq);
977*4882a593Smuzhiyun return ProcDMXQueryVersion(client);
978*4882a593Smuzhiyun }
979*4882a593Smuzhiyun
980*4882a593Smuzhiyun static int _X_COLD
SProcDMXSync(ClientPtr client)981*4882a593Smuzhiyun SProcDMXSync(ClientPtr client)
982*4882a593Smuzhiyun {
983*4882a593Smuzhiyun REQUEST(xDMXSyncReq);
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun swaps(&stuff->length);
986*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXSyncReq);
987*4882a593Smuzhiyun return ProcDMXSync(client);
988*4882a593Smuzhiyun }
989*4882a593Smuzhiyun
990*4882a593Smuzhiyun static int _X_COLD
SProcDMXForceWindowCreation(ClientPtr client)991*4882a593Smuzhiyun SProcDMXForceWindowCreation(ClientPtr client)
992*4882a593Smuzhiyun {
993*4882a593Smuzhiyun REQUEST(xDMXForceWindowCreationReq);
994*4882a593Smuzhiyun
995*4882a593Smuzhiyun swaps(&stuff->length);
996*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXForceWindowCreationReq);
997*4882a593Smuzhiyun swapl(&stuff->window);
998*4882a593Smuzhiyun return ProcDMXForceWindowCreation(client);
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun
1001*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetScreenCount(ClientPtr client)1002*4882a593Smuzhiyun SProcDMXGetScreenCount(ClientPtr client)
1003*4882a593Smuzhiyun {
1004*4882a593Smuzhiyun REQUEST(xDMXGetScreenCountReq);
1005*4882a593Smuzhiyun
1006*4882a593Smuzhiyun swaps(&stuff->length);
1007*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetScreenCountReq);
1008*4882a593Smuzhiyun return ProcDMXGetScreenCount(client);
1009*4882a593Smuzhiyun }
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetScreenAttributes(ClientPtr client)1012*4882a593Smuzhiyun SProcDMXGetScreenAttributes(ClientPtr client)
1013*4882a593Smuzhiyun {
1014*4882a593Smuzhiyun REQUEST(xDMXGetScreenAttributesReq);
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun swaps(&stuff->length);
1017*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetScreenAttributesReq);
1018*4882a593Smuzhiyun swapl(&stuff->physicalScreen);
1019*4882a593Smuzhiyun return ProcDMXGetScreenAttributes(client);
1020*4882a593Smuzhiyun }
1021*4882a593Smuzhiyun
1022*4882a593Smuzhiyun static int _X_COLD
SProcDMXChangeScreensAttributes(ClientPtr client)1023*4882a593Smuzhiyun SProcDMXChangeScreensAttributes(ClientPtr client)
1024*4882a593Smuzhiyun {
1025*4882a593Smuzhiyun REQUEST(xDMXChangeScreensAttributesReq);
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun swaps(&stuff->length);
1028*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXGetScreenAttributesReq);
1029*4882a593Smuzhiyun swapl(&stuff->screenCount);
1030*4882a593Smuzhiyun swapl(&stuff->maskCount);
1031*4882a593Smuzhiyun SwapRestL(stuff);
1032*4882a593Smuzhiyun return ProcDMXGetScreenAttributes(client);
1033*4882a593Smuzhiyun }
1034*4882a593Smuzhiyun
1035*4882a593Smuzhiyun static int _X_COLD
SProcDMXAddScreen(ClientPtr client)1036*4882a593Smuzhiyun SProcDMXAddScreen(ClientPtr client)
1037*4882a593Smuzhiyun {
1038*4882a593Smuzhiyun int paddedLength;
1039*4882a593Smuzhiyun
1040*4882a593Smuzhiyun REQUEST(xDMXAddScreenReq);
1041*4882a593Smuzhiyun
1042*4882a593Smuzhiyun swaps(&stuff->length);
1043*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXAddScreenReq);
1044*4882a593Smuzhiyun swapl(&stuff->displayNameLength);
1045*4882a593Smuzhiyun swapl(&stuff->valueMask);
1046*4882a593Smuzhiyun paddedLength = pad_to_int32(stuff->displayNameLength);
1047*4882a593Smuzhiyun SwapLongs((CARD32 *) (stuff + 1), LengthRestL(stuff) - paddedLength / 4);
1048*4882a593Smuzhiyun return ProcDMXAddScreen(client);
1049*4882a593Smuzhiyun }
1050*4882a593Smuzhiyun
1051*4882a593Smuzhiyun static int _X_COLD
SProcDMXRemoveScreen(ClientPtr client)1052*4882a593Smuzhiyun SProcDMXRemoveScreen(ClientPtr client)
1053*4882a593Smuzhiyun {
1054*4882a593Smuzhiyun REQUEST(xDMXRemoveScreenReq);
1055*4882a593Smuzhiyun
1056*4882a593Smuzhiyun swaps(&stuff->length);
1057*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXRemoveScreenReq);
1058*4882a593Smuzhiyun swapl(&stuff->physicalScreen);
1059*4882a593Smuzhiyun return ProcDMXRemoveScreen(client);
1060*4882a593Smuzhiyun }
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetWindowAttributes(ClientPtr client)1063*4882a593Smuzhiyun SProcDMXGetWindowAttributes(ClientPtr client)
1064*4882a593Smuzhiyun {
1065*4882a593Smuzhiyun REQUEST(xDMXGetWindowAttributesReq);
1066*4882a593Smuzhiyun
1067*4882a593Smuzhiyun swaps(&stuff->length);
1068*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetWindowAttributesReq);
1069*4882a593Smuzhiyun swapl(&stuff->window);
1070*4882a593Smuzhiyun return ProcDMXGetWindowAttributes(client);
1071*4882a593Smuzhiyun }
1072*4882a593Smuzhiyun
1073*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetDesktopAttributes(ClientPtr client)1074*4882a593Smuzhiyun SProcDMXGetDesktopAttributes(ClientPtr client)
1075*4882a593Smuzhiyun {
1076*4882a593Smuzhiyun REQUEST(xDMXGetDesktopAttributesReq);
1077*4882a593Smuzhiyun
1078*4882a593Smuzhiyun swaps(&stuff->length);
1079*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetDesktopAttributesReq);
1080*4882a593Smuzhiyun return ProcDMXGetDesktopAttributes(client);
1081*4882a593Smuzhiyun }
1082*4882a593Smuzhiyun
1083*4882a593Smuzhiyun static int _X_COLD
SProcDMXChangeDesktopAttributes(ClientPtr client)1084*4882a593Smuzhiyun SProcDMXChangeDesktopAttributes(ClientPtr client)
1085*4882a593Smuzhiyun {
1086*4882a593Smuzhiyun REQUEST(xDMXChangeDesktopAttributesReq);
1087*4882a593Smuzhiyun
1088*4882a593Smuzhiyun swaps(&stuff->length);
1089*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXChangeDesktopAttributesReq);
1090*4882a593Smuzhiyun swapl(&stuff->valueMask);
1091*4882a593Smuzhiyun SwapRestL(stuff);
1092*4882a593Smuzhiyun return ProcDMXChangeDesktopAttributes(client);
1093*4882a593Smuzhiyun }
1094*4882a593Smuzhiyun
1095*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetInputCount(ClientPtr client)1096*4882a593Smuzhiyun SProcDMXGetInputCount(ClientPtr client)
1097*4882a593Smuzhiyun {
1098*4882a593Smuzhiyun REQUEST(xDMXGetInputCountReq);
1099*4882a593Smuzhiyun
1100*4882a593Smuzhiyun swaps(&stuff->length);
1101*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetInputCountReq);
1102*4882a593Smuzhiyun return ProcDMXGetInputCount(client);
1103*4882a593Smuzhiyun }
1104*4882a593Smuzhiyun
1105*4882a593Smuzhiyun static int _X_COLD
SProcDMXGetInputAttributes(ClientPtr client)1106*4882a593Smuzhiyun SProcDMXGetInputAttributes(ClientPtr client)
1107*4882a593Smuzhiyun {
1108*4882a593Smuzhiyun REQUEST(xDMXGetInputAttributesReq);
1109*4882a593Smuzhiyun
1110*4882a593Smuzhiyun swaps(&stuff->length);
1111*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXGetInputAttributesReq);
1112*4882a593Smuzhiyun swapl(&stuff->deviceId);
1113*4882a593Smuzhiyun return ProcDMXGetInputAttributes(client);
1114*4882a593Smuzhiyun }
1115*4882a593Smuzhiyun
1116*4882a593Smuzhiyun static int _X_COLD
SProcDMXAddInput(ClientPtr client)1117*4882a593Smuzhiyun SProcDMXAddInput(ClientPtr client)
1118*4882a593Smuzhiyun {
1119*4882a593Smuzhiyun int paddedLength;
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun REQUEST(xDMXAddInputReq);
1122*4882a593Smuzhiyun
1123*4882a593Smuzhiyun swaps(&stuff->length);
1124*4882a593Smuzhiyun REQUEST_AT_LEAST_SIZE(xDMXAddInputReq);
1125*4882a593Smuzhiyun swapl(&stuff->displayNameLength);
1126*4882a593Smuzhiyun swapl(&stuff->valueMask);
1127*4882a593Smuzhiyun paddedLength = pad_to_int32(stuff->displayNameLength);
1128*4882a593Smuzhiyun SwapLongs((CARD32 *) (stuff + 1), LengthRestL(stuff) - paddedLength / 4);
1129*4882a593Smuzhiyun return ProcDMXAddInput(client);
1130*4882a593Smuzhiyun }
1131*4882a593Smuzhiyun
1132*4882a593Smuzhiyun static int _X_COLD
SProcDMXRemoveInput(ClientPtr client)1133*4882a593Smuzhiyun SProcDMXRemoveInput(ClientPtr client)
1134*4882a593Smuzhiyun {
1135*4882a593Smuzhiyun REQUEST(xDMXRemoveInputReq);
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun swaps(&stuff->length);
1138*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xDMXRemoveInputReq);
1139*4882a593Smuzhiyun swapl(&stuff->physicalId);
1140*4882a593Smuzhiyun return ProcDMXRemoveInput(client);
1141*4882a593Smuzhiyun }
1142*4882a593Smuzhiyun
1143*4882a593Smuzhiyun static int _X_COLD
SProcDMXDispatch(ClientPtr client)1144*4882a593Smuzhiyun SProcDMXDispatch(ClientPtr client)
1145*4882a593Smuzhiyun {
1146*4882a593Smuzhiyun REQUEST(xReq);
1147*4882a593Smuzhiyun
1148*4882a593Smuzhiyun switch (stuff->data) {
1149*4882a593Smuzhiyun case X_DMXQueryVersion:
1150*4882a593Smuzhiyun return SProcDMXQueryVersion(client);
1151*4882a593Smuzhiyun case X_DMXSync:
1152*4882a593Smuzhiyun return SProcDMXSync(client);
1153*4882a593Smuzhiyun case X_DMXForceWindowCreation:
1154*4882a593Smuzhiyun return SProcDMXForceWindowCreation(client);
1155*4882a593Smuzhiyun case X_DMXGetScreenCount:
1156*4882a593Smuzhiyun return SProcDMXGetScreenCount(client);
1157*4882a593Smuzhiyun case X_DMXGetScreenAttributes:
1158*4882a593Smuzhiyun return SProcDMXGetScreenAttributes(client);
1159*4882a593Smuzhiyun case X_DMXChangeScreensAttributes:
1160*4882a593Smuzhiyun return SProcDMXChangeScreensAttributes(client);
1161*4882a593Smuzhiyun case X_DMXAddScreen:
1162*4882a593Smuzhiyun return SProcDMXAddScreen(client);
1163*4882a593Smuzhiyun case X_DMXRemoveScreen:
1164*4882a593Smuzhiyun return SProcDMXRemoveScreen(client);
1165*4882a593Smuzhiyun case X_DMXGetWindowAttributes:
1166*4882a593Smuzhiyun return SProcDMXGetWindowAttributes(client);
1167*4882a593Smuzhiyun case X_DMXGetDesktopAttributes:
1168*4882a593Smuzhiyun return SProcDMXGetDesktopAttributes(client);
1169*4882a593Smuzhiyun case X_DMXChangeDesktopAttributes:
1170*4882a593Smuzhiyun return SProcDMXChangeDesktopAttributes(client);
1171*4882a593Smuzhiyun case X_DMXGetInputCount:
1172*4882a593Smuzhiyun return SProcDMXGetInputCount(client);
1173*4882a593Smuzhiyun case X_DMXGetInputAttributes:
1174*4882a593Smuzhiyun return SProcDMXGetInputAttributes(client);
1175*4882a593Smuzhiyun case X_DMXAddInput:
1176*4882a593Smuzhiyun return SProcDMXAddInput(client);
1177*4882a593Smuzhiyun case X_DMXRemoveInput:
1178*4882a593Smuzhiyun return SProcDMXRemoveInput(client);
1179*4882a593Smuzhiyun
1180*4882a593Smuzhiyun case X_DMXGetScreenInformationDEPRECATED:
1181*4882a593Smuzhiyun case X_DMXForceWindowCreationDEPRECATED:
1182*4882a593Smuzhiyun case X_DMXReconfigureScreenDEPRECATED:
1183*4882a593Smuzhiyun return BadImplementation;
1184*4882a593Smuzhiyun
1185*4882a593Smuzhiyun default:
1186*4882a593Smuzhiyun return BadRequest;
1187*4882a593Smuzhiyun }
1188*4882a593Smuzhiyun }
1189*4882a593Smuzhiyun
1190*4882a593Smuzhiyun /** Initialize the extension. */
1191*4882a593Smuzhiyun void
DMXExtensionInit(void)1192*4882a593Smuzhiyun DMXExtensionInit(void)
1193*4882a593Smuzhiyun {
1194*4882a593Smuzhiyun ExtensionEntry *extEntry;
1195*4882a593Smuzhiyun
1196*4882a593Smuzhiyun if ((extEntry = AddExtension(DMX_EXTENSION_NAME, 0, 0,
1197*4882a593Smuzhiyun ProcDMXDispatch, SProcDMXDispatch,
1198*4882a593Smuzhiyun NULL, StandardMinorOpcode)))
1199*4882a593Smuzhiyun DMXCode = extEntry->base;
1200*4882a593Smuzhiyun }
1201