1706f2543Smrg/*
2706f2543Smrg * Minimal implementation of PanoramiX/Xinerama
3706f2543Smrg *
4706f2543Smrg * This is used in rootless mode where the underlying window server
5706f2543Smrg * already provides an abstracted view of multiple screens as one
6706f2543Smrg * large screen area.
7706f2543Smrg *
8706f2543Smrg * This code is largely based on panoramiX.c, which contains the
9706f2543Smrg * following copyright notice:
10706f2543Smrg */
11706f2543Smrg/*****************************************************************
12706f2543SmrgCopyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
13706f2543SmrgPermission is hereby granted, free of charge, to any person obtaining a copy
14706f2543Smrgof this software and associated documentation files (the "Software"), to deal
15706f2543Smrgin the Software without restriction, including without limitation the rights
16706f2543Smrgto use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17706f2543Smrgcopies of the Software.
18706f2543Smrg
19706f2543SmrgThe above copyright notice and this permission notice shall be included in
20706f2543Smrgall copies or substantial portions of the Software.
21706f2543Smrg
22706f2543SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23706f2543SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24706f2543SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
25706f2543SmrgDIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
26706f2543SmrgBUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
27706f2543SmrgWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
28706f2543SmrgIN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29706f2543Smrg
30706f2543SmrgExcept as contained in this notice, the name of Digital Equipment Corporation
31706f2543Smrgshall not be used in advertising or otherwise to promote the sale, use or other
32706f2543Smrgdealings in this Software without prior written authorization from Digital
33706f2543SmrgEquipment Corporation.
34706f2543Smrg******************************************************************/
35706f2543Smrg
36706f2543Smrg#ifdef HAVE_DIX_CONFIG_H
37706f2543Smrg#include <dix-config.h>
38706f2543Smrg#endif
39706f2543Smrg
40706f2543Smrg#include "darwin.h"
41706f2543Smrg#include "pseudoramiX.h"
42706f2543Smrg#include "extnsionst.h"
43706f2543Smrg#include "dixstruct.h"
44706f2543Smrg#include "window.h"
45706f2543Smrg#include <X11/extensions/panoramiXproto.h>
46706f2543Smrg#include "globals.h"
47706f2543Smrg
48706f2543SmrgBool noPseudoramiXExtension = FALSE;
49706f2543Smrg
50706f2543Smrgextern int ProcPanoramiXQueryVersion (ClientPtr client);
51706f2543Smrg
52706f2543Smrgstatic void PseudoramiXResetProc(ExtensionEntry *extEntry);
53706f2543Smrg
54706f2543Smrgstatic int ProcPseudoramiXQueryVersion(ClientPtr client);
55706f2543Smrgstatic int ProcPseudoramiXGetState(ClientPtr client);
56706f2543Smrgstatic int ProcPseudoramiXGetScreenCount(ClientPtr client);
57706f2543Smrgstatic int ProcPseudoramiXGetScreenSize(ClientPtr client);
58706f2543Smrgstatic int ProcPseudoramiXIsActive(ClientPtr client);
59706f2543Smrgstatic int ProcPseudoramiXQueryScreens(ClientPtr client);
60706f2543Smrgstatic int ProcPseudoramiXDispatch(ClientPtr client);
61706f2543Smrg
62706f2543Smrgstatic int SProcPseudoramiXQueryVersion(ClientPtr client);
63706f2543Smrgstatic int SProcPseudoramiXGetState(ClientPtr client);
64706f2543Smrgstatic int SProcPseudoramiXGetScreenCount(ClientPtr client);
65706f2543Smrgstatic int SProcPseudoramiXGetScreenSize(ClientPtr client);
66706f2543Smrgstatic int SProcPseudoramiXIsActive(ClientPtr client);
67706f2543Smrgstatic int SProcPseudoramiXQueryScreens(ClientPtr client);
68706f2543Smrgstatic int SProcPseudoramiXDispatch(ClientPtr client);
69706f2543Smrg
70706f2543Smrg
71706f2543Smrgtypedef struct {
72706f2543Smrg    int x;
73706f2543Smrg    int y;
74706f2543Smrg    int w;
75706f2543Smrg    int h;
76706f2543Smrg} PseudoramiXScreenRec;
77706f2543Smrg
78706f2543Smrgstatic PseudoramiXScreenRec *pseudoramiXScreens = NULL;
79706f2543Smrgstatic int pseudoramiXScreensAllocated = 0;
80706f2543Smrgstatic int pseudoramiXNumScreens = 0;
81706f2543Smrgstatic unsigned long pseudoramiXGeneration = 0;
82706f2543Smrg
83706f2543Smrg
84706f2543Smrg// Add a PseudoramiX screen.
85706f2543Smrg// The rest of the X server will know nothing about this screen.
86706f2543Smrg// Can be called before or after extension init.
87706f2543Smrg// Screens must be re-added once per generation.
88706f2543Smrgvoid
89706f2543SmrgPseudoramiXAddScreen(int x, int y, int w, int h)
90706f2543Smrg{
91706f2543Smrg    PseudoramiXScreenRec *s;
92706f2543Smrg
93706f2543Smrg    if (noPseudoramiXExtension) return;
94706f2543Smrg
95706f2543Smrg    if (pseudoramiXNumScreens == pseudoramiXScreensAllocated) {
96706f2543Smrg        pseudoramiXScreensAllocated += pseudoramiXScreensAllocated + 1;
97706f2543Smrg        pseudoramiXScreens = realloc(pseudoramiXScreens,
98706f2543Smrg                                      pseudoramiXScreensAllocated *
99706f2543Smrg                                      sizeof(PseudoramiXScreenRec));
100706f2543Smrg    }
101706f2543Smrg
102706f2543Smrg    DEBUG_LOG("x: %d, y: %d, w: %d, h: %d\n", x, y, w, h);
103706f2543Smrg
104706f2543Smrg    s = &pseudoramiXScreens[pseudoramiXNumScreens++];
105706f2543Smrg    s->x = x;
106706f2543Smrg    s->y = y;
107706f2543Smrg    s->w = w;
108706f2543Smrg    s->h = h;
109706f2543Smrg}
110706f2543Smrg
111706f2543Smrg
112706f2543Smrg// Initialize PseudoramiX.
113706f2543Smrg// Copied from PanoramiXExtensionInit
114706f2543Smrgvoid PseudoramiXExtensionInit(int argc, char *argv[])
115706f2543Smrg{
116706f2543Smrg    Bool	     	success = FALSE;
117706f2543Smrg    ExtensionEntry 	*extEntry;
118706f2543Smrg
119706f2543Smrg    if (noPseudoramiXExtension) return;
120706f2543Smrg
121706f2543Smrg    TRACE();
122706f2543Smrg
123706f2543Smrg    /* Even with only one screen we need to enable PseudoramiX to allow
124706f2543Smrg       dynamic screen configuration changes. */
125706f2543Smrg#if 0
126706f2543Smrg    if (pseudoramiXNumScreens == 1) {
127706f2543Smrg        // Only one screen - disable Xinerama extension.
128706f2543Smrg        noPseudoramiXExtension = TRUE;
129706f2543Smrg        return;
130706f2543Smrg    }
131706f2543Smrg#endif
132706f2543Smrg
133706f2543Smrg    if (pseudoramiXGeneration != serverGeneration) {
134706f2543Smrg        extEntry = AddExtension(PANORAMIX_PROTOCOL_NAME, 0, 0,
135706f2543Smrg                                ProcPseudoramiXDispatch,
136706f2543Smrg                                SProcPseudoramiXDispatch,
137706f2543Smrg                                PseudoramiXResetProc,
138706f2543Smrg                                StandardMinorOpcode);
139706f2543Smrg        if (!extEntry) {
140706f2543Smrg            ErrorF("PseudoramiXExtensionInit(): AddExtension failed\n");
141706f2543Smrg        } else {
142706f2543Smrg            pseudoramiXGeneration = serverGeneration;
143706f2543Smrg            success = TRUE;
144706f2543Smrg        }
145706f2543Smrg    }
146706f2543Smrg
147706f2543Smrg    if (!success) {
148706f2543Smrg        ErrorF("%s Extension (PseudoramiX) failed to initialize\n",
149706f2543Smrg               PANORAMIX_PROTOCOL_NAME);
150706f2543Smrg        return;
151706f2543Smrg    }
152706f2543Smrg}
153706f2543Smrg
154706f2543Smrg
155706f2543Smrgvoid PseudoramiXResetScreens(void)
156706f2543Smrg{
157706f2543Smrg    TRACE();
158706f2543Smrg
159706f2543Smrg    pseudoramiXNumScreens = 0;
160706f2543Smrg}
161706f2543Smrg
162706f2543Smrg
163706f2543Smrgstatic void PseudoramiXResetProc(ExtensionEntry *extEntry)
164706f2543Smrg{
165706f2543Smrg    TRACE();
166706f2543Smrg
167706f2543Smrg    PseudoramiXResetScreens();
168706f2543Smrg}
169706f2543Smrg
170706f2543Smrg
171706f2543Smrg// was PanoramiX
172706f2543Smrgstatic int ProcPseudoramiXQueryVersion(ClientPtr client)
173706f2543Smrg{
174706f2543Smrg    TRACE();
175706f2543Smrg
176706f2543Smrg    return ProcPanoramiXQueryVersion(client);
177706f2543Smrg}
178706f2543Smrg
179706f2543Smrg
180706f2543Smrg// was PanoramiX
181706f2543Smrgstatic int ProcPseudoramiXGetState(ClientPtr client)
182706f2543Smrg{
183706f2543Smrg    REQUEST(xPanoramiXGetStateReq);
184706f2543Smrg    WindowPtr pWin;
185706f2543Smrg    xPanoramiXGetStateReply rep;
186706f2543Smrg    register int n, rc;
187706f2543Smrg
188706f2543Smrg    TRACE();
189706f2543Smrg
190706f2543Smrg    REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
191706f2543Smrg    rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
192706f2543Smrg    if (rc != Success)
193706f2543Smrg	return rc;
194706f2543Smrg
195706f2543Smrg    rep.type = X_Reply;
196706f2543Smrg    rep.length = 0;
197706f2543Smrg    rep.sequenceNumber = client->sequence;
198706f2543Smrg    rep.state = !noPseudoramiXExtension;
199706f2543Smrg    if (client->swapped) {
200706f2543Smrg        swaps (&rep.sequenceNumber, n);
201706f2543Smrg        swapl (&rep.length, n);
202706f2543Smrg        swaps (&rep.state, n);
203706f2543Smrg    }
204706f2543Smrg    WriteToClient (client, sizeof (xPanoramiXGetStateReply), (char *) &rep);
205706f2543Smrg    return Success;
206706f2543Smrg}
207706f2543Smrg
208706f2543Smrg
209706f2543Smrg// was PanoramiX
210706f2543Smrgstatic int ProcPseudoramiXGetScreenCount(ClientPtr client)
211706f2543Smrg{
212706f2543Smrg    REQUEST(xPanoramiXGetScreenCountReq);
213706f2543Smrg    WindowPtr pWin;
214706f2543Smrg    xPanoramiXGetScreenCountReply rep;
215706f2543Smrg    register int n, rc;
216706f2543Smrg
217706f2543Smrg    TRACE();
218706f2543Smrg
219706f2543Smrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
220706f2543Smrg    rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
221706f2543Smrg    if (rc != Success)
222706f2543Smrg	return rc;
223706f2543Smrg
224706f2543Smrg    rep.type = X_Reply;
225706f2543Smrg    rep.length = 0;
226706f2543Smrg    rep.sequenceNumber = client->sequence;
227706f2543Smrg    rep.ScreenCount = pseudoramiXNumScreens;
228706f2543Smrg    if (client->swapped) {
229706f2543Smrg        swaps (&rep.sequenceNumber, n);
230706f2543Smrg        swapl (&rep.length, n);
231706f2543Smrg        swaps (&rep.ScreenCount, n);
232706f2543Smrg    }
233706f2543Smrg    WriteToClient (client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep);
234706f2543Smrg    return Success;
235706f2543Smrg}
236706f2543Smrg
237706f2543Smrg
238706f2543Smrg// was PanoramiX
239706f2543Smrgstatic int ProcPseudoramiXGetScreenSize(ClientPtr client)
240706f2543Smrg{
241706f2543Smrg    REQUEST(xPanoramiXGetScreenSizeReq);
242706f2543Smrg    WindowPtr			pWin;
243706f2543Smrg    xPanoramiXGetScreenSizeReply	rep;
244706f2543Smrg    register int			n, rc;
245706f2543Smrg
246706f2543Smrg    TRACE();
247706f2543Smrg
248706f2543Smrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
249706f2543Smrg    rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
250706f2543Smrg    if (rc != Success)
251706f2543Smrg	return rc;
252706f2543Smrg
253706f2543Smrg    rep.type = X_Reply;
254706f2543Smrg    rep.length = 0;
255706f2543Smrg    rep.sequenceNumber = client->sequence;
256706f2543Smrg    /* screen dimensions */
257706f2543Smrg    rep.width  = pseudoramiXScreens[stuff->screen].w;
258706f2543Smrg    // was screenInfo.screens[stuff->screen]->width;
259706f2543Smrg    rep.height = pseudoramiXScreens[stuff->screen].h;
260706f2543Smrg    // was screenInfo.screens[stuff->screen]->height;
261706f2543Smrg    if (client->swapped) {
262706f2543Smrg        swaps (&rep.sequenceNumber, n);
263706f2543Smrg        swapl (&rep.length, n);
264706f2543Smrg        swaps (&rep.width, n);
265706f2543Smrg        swaps (&rep.height, n);
266706f2543Smrg    }
267706f2543Smrg    WriteToClient (client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep);
268706f2543Smrg    return Success;
269706f2543Smrg}
270706f2543Smrg
271706f2543Smrg
272706f2543Smrg// was Xinerama
273706f2543Smrgstatic int ProcPseudoramiXIsActive(ClientPtr client)
274706f2543Smrg{
275706f2543Smrg    /* REQUEST(xXineramaIsActiveReq); */
276706f2543Smrg    xXineramaIsActiveReply	rep;
277706f2543Smrg
278706f2543Smrg    TRACE();
279706f2543Smrg
280706f2543Smrg    REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
281706f2543Smrg
282706f2543Smrg    rep.type = X_Reply;
283706f2543Smrg    rep.length = 0;
284706f2543Smrg    rep.sequenceNumber = client->sequence;
285706f2543Smrg    rep.state = !noPseudoramiXExtension;
286706f2543Smrg    if (client->swapped) {
287706f2543Smrg	register int n;
288706f2543Smrg	swaps (&rep.sequenceNumber, n);
289706f2543Smrg	swapl (&rep.length, n);
290706f2543Smrg	swapl (&rep.state, n);
291706f2543Smrg    }
292706f2543Smrg    WriteToClient (client, sizeof (xXineramaIsActiveReply), (char *) &rep);
293706f2543Smrg    return Success;
294706f2543Smrg}
295706f2543Smrg
296706f2543Smrg
297706f2543Smrg// was Xinerama
298706f2543Smrgstatic int ProcPseudoramiXQueryScreens(ClientPtr client)
299706f2543Smrg{
300706f2543Smrg    /* REQUEST(xXineramaQueryScreensReq); */
301706f2543Smrg    xXineramaQueryScreensReply	rep;
302706f2543Smrg
303706f2543Smrg    DEBUG_LOG("noPseudoramiXExtension=%d, pseudoramiXNumScreens=%d\n", noPseudoramiXExtension, pseudoramiXNumScreens);
304706f2543Smrg
305706f2543Smrg    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
306706f2543Smrg
307706f2543Smrg    rep.type = X_Reply;
308706f2543Smrg    rep.sequenceNumber = client->sequence;
309706f2543Smrg    rep.number = noPseudoramiXExtension ? 0 : pseudoramiXNumScreens;
310706f2543Smrg    rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
311706f2543Smrg    if (client->swapped) {
312706f2543Smrg	register int n;
313706f2543Smrg	swaps (&rep.sequenceNumber, n);
314706f2543Smrg	swapl (&rep.length, n);
315706f2543Smrg	swapl (&rep.number, n);
316706f2543Smrg    }
317706f2543Smrg    WriteToClient (client, sizeof (xXineramaQueryScreensReply), (char *) &rep);
318706f2543Smrg
319706f2543Smrg    if (!noPseudoramiXExtension) {
320706f2543Smrg	xXineramaScreenInfo scratch;
321706f2543Smrg	int i;
322706f2543Smrg
323706f2543Smrg	for(i = 0; i < pseudoramiXNumScreens; i++) {
324706f2543Smrg	    scratch.x_org  = pseudoramiXScreens[i].x;
325706f2543Smrg	    scratch.y_org  = pseudoramiXScreens[i].y;
326706f2543Smrg	    scratch.width  = pseudoramiXScreens[i].w;
327706f2543Smrg	    scratch.height = pseudoramiXScreens[i].h;
328706f2543Smrg
329706f2543Smrg	    if(client->swapped) {
330706f2543Smrg		register int n;
331706f2543Smrg		swaps (&scratch.x_org, n);
332706f2543Smrg		swaps (&scratch.y_org, n);
333706f2543Smrg		swaps (&scratch.width, n);
334706f2543Smrg		swaps (&scratch.height, n);
335706f2543Smrg	    }
336706f2543Smrg	    WriteToClient (client, sz_XineramaScreenInfo, (char *) &scratch);
337706f2543Smrg	}
338706f2543Smrg    }
339706f2543Smrg
340706f2543Smrg    return Success;
341706f2543Smrg}
342706f2543Smrg
343706f2543Smrg
344706f2543Smrg// was PanoramiX
345706f2543Smrgstatic int ProcPseudoramiXDispatch (ClientPtr client)
346706f2543Smrg{   REQUEST(xReq);
347706f2543Smrg    TRACE();
348706f2543Smrg    switch (stuff->data)
349706f2543Smrg    {
350706f2543Smrg	case X_PanoramiXQueryVersion:
351706f2543Smrg	     return ProcPseudoramiXQueryVersion(client);
352706f2543Smrg	case X_PanoramiXGetState:
353706f2543Smrg	     return ProcPseudoramiXGetState(client);
354706f2543Smrg	case X_PanoramiXGetScreenCount:
355706f2543Smrg	     return ProcPseudoramiXGetScreenCount(client);
356706f2543Smrg	case X_PanoramiXGetScreenSize:
357706f2543Smrg	     return ProcPseudoramiXGetScreenSize(client);
358706f2543Smrg	case X_XineramaIsActive:
359706f2543Smrg	     return ProcPseudoramiXIsActive(client);
360706f2543Smrg	case X_XineramaQueryScreens:
361706f2543Smrg	     return ProcPseudoramiXQueryScreens(client);
362706f2543Smrg    }
363706f2543Smrg    return BadRequest;
364706f2543Smrg}
365706f2543Smrg
366706f2543Smrg
367706f2543Smrg
368706f2543Smrgstatic int
369706f2543SmrgSProcPseudoramiXQueryVersion (ClientPtr client)
370706f2543Smrg{
371706f2543Smrg	REQUEST(xPanoramiXQueryVersionReq);
372706f2543Smrg	register int n;
373706f2543Smrg
374706f2543Smrg    TRACE();
375706f2543Smrg
376706f2543Smrg	swaps(&stuff->length,n);
377706f2543Smrg	REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
378706f2543Smrg	return ProcPseudoramiXQueryVersion(client);
379706f2543Smrg}
380706f2543Smrg
381706f2543Smrgstatic int
382706f2543SmrgSProcPseudoramiXGetState(ClientPtr client)
383706f2543Smrg{
384706f2543Smrg	REQUEST(xPanoramiXGetStateReq);
385706f2543Smrg	register int n;
386706f2543Smrg
387706f2543Smrg    TRACE();
388706f2543Smrg
389706f2543Smrg 	swaps (&stuff->length, n);
390706f2543Smrg	REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
391706f2543Smrg	return ProcPseudoramiXGetState(client);
392706f2543Smrg}
393706f2543Smrg
394706f2543Smrgstatic int
395706f2543SmrgSProcPseudoramiXGetScreenCount(ClientPtr client)
396706f2543Smrg{
397706f2543Smrg	REQUEST(xPanoramiXGetScreenCountReq);
398706f2543Smrg	register int n;
399706f2543Smrg
400706f2543Smrg    TRACE();
401706f2543Smrg
402706f2543Smrg	swaps (&stuff->length, n);
403706f2543Smrg	REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
404706f2543Smrg	return ProcPseudoramiXGetScreenCount(client);
405706f2543Smrg}
406706f2543Smrg
407706f2543Smrgstatic int
408706f2543SmrgSProcPseudoramiXGetScreenSize(ClientPtr client)
409706f2543Smrg{
410706f2543Smrg	REQUEST(xPanoramiXGetScreenSizeReq);
411706f2543Smrg	register int n;
412706f2543Smrg
413706f2543Smrg    TRACE();
414706f2543Smrg
415706f2543Smrg	swaps (&stuff->length, n);
416706f2543Smrg	REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
417706f2543Smrg	return ProcPseudoramiXGetScreenSize(client);
418706f2543Smrg}
419706f2543Smrg
420706f2543Smrg
421706f2543Smrgstatic int
422706f2543SmrgSProcPseudoramiXIsActive(ClientPtr client)
423706f2543Smrg{
424706f2543Smrg	REQUEST(xXineramaIsActiveReq);
425706f2543Smrg	register int n;
426706f2543Smrg
427706f2543Smrg    TRACE();
428706f2543Smrg
429706f2543Smrg	swaps (&stuff->length, n);
430706f2543Smrg	REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
431706f2543Smrg	return ProcPseudoramiXIsActive(client);
432706f2543Smrg}
433706f2543Smrg
434706f2543Smrg
435706f2543Smrgstatic int
436706f2543SmrgSProcPseudoramiXQueryScreens(ClientPtr client)
437706f2543Smrg{
438706f2543Smrg	REQUEST(xXineramaQueryScreensReq);
439706f2543Smrg	register int n;
440706f2543Smrg
441706f2543Smrg    TRACE();
442706f2543Smrg
443706f2543Smrg	swaps (&stuff->length, n);
444706f2543Smrg	REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
445706f2543Smrg	return ProcPseudoramiXQueryScreens(client);
446706f2543Smrg}
447706f2543Smrg
448706f2543Smrg
449706f2543Smrgstatic int
450706f2543SmrgSProcPseudoramiXDispatch (ClientPtr client)
451706f2543Smrg{   REQUEST(xReq);
452706f2543Smrg
453706f2543Smrg    TRACE();
454706f2543Smrg
455706f2543Smrg    switch (stuff->data)
456706f2543Smrg    {
457706f2543Smrg	case X_PanoramiXQueryVersion:
458706f2543Smrg	     return SProcPseudoramiXQueryVersion(client);
459706f2543Smrg	case X_PanoramiXGetState:
460706f2543Smrg	     return SProcPseudoramiXGetState(client);
461706f2543Smrg	case X_PanoramiXGetScreenCount:
462706f2543Smrg	     return SProcPseudoramiXGetScreenCount(client);
463706f2543Smrg	case X_PanoramiXGetScreenSize:
464706f2543Smrg	     return SProcPseudoramiXGetScreenSize(client);
465706f2543Smrg	case X_XineramaIsActive:
466706f2543Smrg	     return SProcPseudoramiXIsActive(client);
467706f2543Smrg	case X_XineramaQueryScreens:
468706f2543Smrg	     return SProcPseudoramiXQueryScreens(client);
469706f2543Smrg    }
470706f2543Smrg    return BadRequest;
471706f2543Smrg}
472