1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Minimal implementation of PanoramiX/Xinerama
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * This is used in rootless mode where the underlying window server
5*4882a593Smuzhiyun * already provides an abstracted view of multiple screens as one
6*4882a593Smuzhiyun * large screen area.
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * This code is largely based on panoramiX.c, which contains the
9*4882a593Smuzhiyun * following copyright notice:
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun /*****************************************************************
12*4882a593Smuzhiyun Copyright (c) 1991, 1997 Digital Equipment Corporation, Maynard, Massachusetts.
13*4882a593Smuzhiyun Permission is hereby granted, free of charge, to any person obtaining a copy
14*4882a593Smuzhiyun of this software and associated documentation files (the "Software"), to deal
15*4882a593Smuzhiyun in the Software without restriction, including without limitation the rights
16*4882a593Smuzhiyun to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17*4882a593Smuzhiyun copies of the Software.
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun The above copyright notice and this permission notice shall be included in
20*4882a593Smuzhiyun all copies or substantial portions of the Software.
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23*4882a593Smuzhiyun IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24*4882a593Smuzhiyun FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25*4882a593Smuzhiyun DIGITAL EQUIPMENT CORPORATION BE LIABLE FOR ANY CLAIM, DAMAGES, INCLUDING,
26*4882a593Smuzhiyun BUT NOT LIMITED TO CONSEQUENTIAL OR INCIDENTAL DAMAGES, OR OTHER LIABILITY,
27*4882a593Smuzhiyun WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
28*4882a593Smuzhiyun IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29*4882a593Smuzhiyun
30*4882a593Smuzhiyun Except as contained in this notice, the name of Digital Equipment Corporation
31*4882a593Smuzhiyun shall not be used in advertising or otherwise to promote the sale, use or other
32*4882a593Smuzhiyun dealings in this Software without prior written authorization from Digital
33*4882a593Smuzhiyun Equipment Corporation.
34*4882a593Smuzhiyun ******************************************************************/
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #ifdef HAVE_DIX_CONFIG_H
37*4882a593Smuzhiyun #include <dix-config.h>
38*4882a593Smuzhiyun #endif
39*4882a593Smuzhiyun
40*4882a593Smuzhiyun #include "pseudoramiX.h"
41*4882a593Smuzhiyun #include "extnsionst.h"
42*4882a593Smuzhiyun #include "nonsdk_extinit.h"
43*4882a593Smuzhiyun #include "dixstruct.h"
44*4882a593Smuzhiyun #include "window.h"
45*4882a593Smuzhiyun #include <X11/extensions/panoramiXproto.h>
46*4882a593Smuzhiyun #include "globals.h"
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun #define TRACE PseudoramiXTrace("TRACE " __FILE__ ":%s",__FUNCTION__)
49*4882a593Smuzhiyun #define DEBUG_LOG PseudoramiXDebug
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun Bool noPseudoramiXExtension = FALSE;
52*4882a593Smuzhiyun extern Bool noRRXineramaExtension;
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun extern int
55*4882a593Smuzhiyun ProcPanoramiXQueryVersion(ClientPtr client);
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun static void
58*4882a593Smuzhiyun PseudoramiXResetProc(ExtensionEntry *extEntry);
59*4882a593Smuzhiyun
60*4882a593Smuzhiyun static int
61*4882a593Smuzhiyun ProcPseudoramiXQueryVersion(ClientPtr client);
62*4882a593Smuzhiyun static int
63*4882a593Smuzhiyun ProcPseudoramiXGetState(ClientPtr client);
64*4882a593Smuzhiyun static int
65*4882a593Smuzhiyun ProcPseudoramiXGetScreenCount(ClientPtr client);
66*4882a593Smuzhiyun static int
67*4882a593Smuzhiyun ProcPseudoramiXGetScreenSize(ClientPtr client);
68*4882a593Smuzhiyun static int
69*4882a593Smuzhiyun ProcPseudoramiXIsActive(ClientPtr client);
70*4882a593Smuzhiyun static int
71*4882a593Smuzhiyun ProcPseudoramiXQueryScreens(ClientPtr client);
72*4882a593Smuzhiyun static int
73*4882a593Smuzhiyun ProcPseudoramiXDispatch(ClientPtr client);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun static int
76*4882a593Smuzhiyun SProcPseudoramiXQueryVersion(ClientPtr client);
77*4882a593Smuzhiyun static int
78*4882a593Smuzhiyun SProcPseudoramiXGetState(ClientPtr client);
79*4882a593Smuzhiyun static int
80*4882a593Smuzhiyun SProcPseudoramiXGetScreenCount(ClientPtr client);
81*4882a593Smuzhiyun static int
82*4882a593Smuzhiyun SProcPseudoramiXGetScreenSize(ClientPtr client);
83*4882a593Smuzhiyun static int
84*4882a593Smuzhiyun SProcPseudoramiXIsActive(ClientPtr client);
85*4882a593Smuzhiyun static int
86*4882a593Smuzhiyun SProcPseudoramiXQueryScreens(ClientPtr client);
87*4882a593Smuzhiyun static int
88*4882a593Smuzhiyun SProcPseudoramiXDispatch(ClientPtr client);
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun typedef struct {
91*4882a593Smuzhiyun int x;
92*4882a593Smuzhiyun int y;
93*4882a593Smuzhiyun int w;
94*4882a593Smuzhiyun int h;
95*4882a593Smuzhiyun } PseudoramiXScreenRec;
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun static PseudoramiXScreenRec *pseudoramiXScreens = NULL;
98*4882a593Smuzhiyun static int pseudoramiXScreensAllocated = 0;
99*4882a593Smuzhiyun static int pseudoramiXNumScreens = 0;
100*4882a593Smuzhiyun static unsigned long pseudoramiXGeneration = 0;
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun static void
103*4882a593Smuzhiyun PseudoramiXTrace(const char *format, ...)
104*4882a593Smuzhiyun _X_ATTRIBUTE_PRINTF(1, 2);
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun static void
PseudoramiXTrace(const char * format,...)107*4882a593Smuzhiyun PseudoramiXTrace(const char *format, ...)
108*4882a593Smuzhiyun {
109*4882a593Smuzhiyun va_list ap;
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun va_start(ap, format);
112*4882a593Smuzhiyun LogVMessageVerb(X_NONE, 10, format, ap);
113*4882a593Smuzhiyun va_end(ap);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun static void
117*4882a593Smuzhiyun PseudoramiXDebug(const char *format, ...)
118*4882a593Smuzhiyun _X_ATTRIBUTE_PRINTF(1, 2);
119*4882a593Smuzhiyun
120*4882a593Smuzhiyun static void
PseudoramiXDebug(const char * format,...)121*4882a593Smuzhiyun PseudoramiXDebug(const char *format, ...)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun va_list ap;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun va_start(ap, format);
126*4882a593Smuzhiyun LogVMessageVerb(X_NONE, 3, format, ap);
127*4882a593Smuzhiyun va_end(ap);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun // Add a PseudoramiX screen.
131*4882a593Smuzhiyun // The rest of the X server will know nothing about this screen.
132*4882a593Smuzhiyun // Can be called before or after extension init.
133*4882a593Smuzhiyun // Screens must be re-added once per generation.
134*4882a593Smuzhiyun void
PseudoramiXAddScreen(int x,int y,int w,int h)135*4882a593Smuzhiyun PseudoramiXAddScreen(int x, int y, int w, int h)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun PseudoramiXScreenRec *s;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun if (noPseudoramiXExtension) return;
140*4882a593Smuzhiyun
141*4882a593Smuzhiyun if (pseudoramiXNumScreens == pseudoramiXScreensAllocated) {
142*4882a593Smuzhiyun pseudoramiXScreensAllocated += pseudoramiXScreensAllocated + 1;
143*4882a593Smuzhiyun pseudoramiXScreens = reallocarray(pseudoramiXScreens,
144*4882a593Smuzhiyun pseudoramiXScreensAllocated,
145*4882a593Smuzhiyun sizeof(PseudoramiXScreenRec));
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun DEBUG_LOG("x: %d, y: %d, w: %d, h: %d\n", x, y, w, h);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun s = &pseudoramiXScreens[pseudoramiXNumScreens++];
151*4882a593Smuzhiyun s->x = x;
152*4882a593Smuzhiyun s->y = y;
153*4882a593Smuzhiyun s->w = w;
154*4882a593Smuzhiyun s->h = h;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun // Initialize PseudoramiX.
158*4882a593Smuzhiyun // Copied from PanoramiXExtensionInit
159*4882a593Smuzhiyun void
PseudoramiXExtensionInit(void)160*4882a593Smuzhiyun PseudoramiXExtensionInit(void)
161*4882a593Smuzhiyun {
162*4882a593Smuzhiyun Bool success = FALSE;
163*4882a593Smuzhiyun ExtensionEntry *extEntry;
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun if (noPseudoramiXExtension) return;
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun TRACE;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun /* Even with only one screen we need to enable PseudoramiX to allow
170*4882a593Smuzhiyun dynamic screen configuration changes. */
171*4882a593Smuzhiyun #if 0
172*4882a593Smuzhiyun if (pseudoramiXNumScreens == 1) {
173*4882a593Smuzhiyun // Only one screen - disable Xinerama extension.
174*4882a593Smuzhiyun noPseudoramiXExtension = TRUE;
175*4882a593Smuzhiyun return;
176*4882a593Smuzhiyun }
177*4882a593Smuzhiyun #endif
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun if (pseudoramiXGeneration != serverGeneration) {
180*4882a593Smuzhiyun extEntry = AddExtension(PANORAMIX_PROTOCOL_NAME, 0, 0,
181*4882a593Smuzhiyun ProcPseudoramiXDispatch,
182*4882a593Smuzhiyun SProcPseudoramiXDispatch,
183*4882a593Smuzhiyun PseudoramiXResetProc,
184*4882a593Smuzhiyun StandardMinorOpcode);
185*4882a593Smuzhiyun if (!extEntry) {
186*4882a593Smuzhiyun ErrorF("PseudoramiXExtensionInit(): AddExtension failed\n");
187*4882a593Smuzhiyun }
188*4882a593Smuzhiyun else {
189*4882a593Smuzhiyun pseudoramiXGeneration = serverGeneration;
190*4882a593Smuzhiyun success = TRUE;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun /* Do not allow RRXinerama to initialize if we did */
195*4882a593Smuzhiyun noRRXineramaExtension = success;
196*4882a593Smuzhiyun
197*4882a593Smuzhiyun if (!success) {
198*4882a593Smuzhiyun ErrorF("%s Extension (PseudoramiX) failed to initialize\n",
199*4882a593Smuzhiyun PANORAMIX_PROTOCOL_NAME);
200*4882a593Smuzhiyun return;
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun }
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun void
PseudoramiXResetScreens(void)205*4882a593Smuzhiyun PseudoramiXResetScreens(void)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun TRACE;
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun pseudoramiXNumScreens = 0;
210*4882a593Smuzhiyun }
211*4882a593Smuzhiyun
212*4882a593Smuzhiyun static void
PseudoramiXResetProc(ExtensionEntry * extEntry)213*4882a593Smuzhiyun PseudoramiXResetProc(ExtensionEntry *extEntry)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun TRACE;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun PseudoramiXResetScreens();
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun // was PanoramiX
221*4882a593Smuzhiyun static int
ProcPseudoramiXQueryVersion(ClientPtr client)222*4882a593Smuzhiyun ProcPseudoramiXQueryVersion(ClientPtr client)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun TRACE;
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun return ProcPanoramiXQueryVersion(client);
227*4882a593Smuzhiyun }
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun // was PanoramiX
230*4882a593Smuzhiyun static int
ProcPseudoramiXGetState(ClientPtr client)231*4882a593Smuzhiyun ProcPseudoramiXGetState(ClientPtr client)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun REQUEST(xPanoramiXGetStateReq);
234*4882a593Smuzhiyun WindowPtr pWin;
235*4882a593Smuzhiyun xPanoramiXGetStateReply rep;
236*4882a593Smuzhiyun register int rc;
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun TRACE;
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
241*4882a593Smuzhiyun rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
242*4882a593Smuzhiyun if (rc != Success)
243*4882a593Smuzhiyun return rc;
244*4882a593Smuzhiyun
245*4882a593Smuzhiyun rep.type = X_Reply;
246*4882a593Smuzhiyun rep.length = 0;
247*4882a593Smuzhiyun rep.sequenceNumber = client->sequence;
248*4882a593Smuzhiyun rep.state = !noPseudoramiXExtension;
249*4882a593Smuzhiyun rep.window = stuff->window;
250*4882a593Smuzhiyun if (client->swapped) {
251*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
252*4882a593Smuzhiyun swapl(&rep.length);
253*4882a593Smuzhiyun swapl(&rep.window);
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun WriteToClient(client, sizeof(xPanoramiXGetStateReply),&rep);
256*4882a593Smuzhiyun return Success;
257*4882a593Smuzhiyun }
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun // was PanoramiX
260*4882a593Smuzhiyun static int
ProcPseudoramiXGetScreenCount(ClientPtr client)261*4882a593Smuzhiyun ProcPseudoramiXGetScreenCount(ClientPtr client)
262*4882a593Smuzhiyun {
263*4882a593Smuzhiyun REQUEST(xPanoramiXGetScreenCountReq);
264*4882a593Smuzhiyun WindowPtr pWin;
265*4882a593Smuzhiyun xPanoramiXGetScreenCountReply rep;
266*4882a593Smuzhiyun register int rc;
267*4882a593Smuzhiyun
268*4882a593Smuzhiyun TRACE;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
271*4882a593Smuzhiyun rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
272*4882a593Smuzhiyun if (rc != Success)
273*4882a593Smuzhiyun return rc;
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun rep.type = X_Reply;
276*4882a593Smuzhiyun rep.length = 0;
277*4882a593Smuzhiyun rep.sequenceNumber = client->sequence;
278*4882a593Smuzhiyun rep.ScreenCount = pseudoramiXNumScreens;
279*4882a593Smuzhiyun rep.window = stuff->window;
280*4882a593Smuzhiyun if (client->swapped) {
281*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
282*4882a593Smuzhiyun swapl(&rep.length);
283*4882a593Smuzhiyun swapl(&rep.window);
284*4882a593Smuzhiyun }
285*4882a593Smuzhiyun WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply),&rep);
286*4882a593Smuzhiyun return Success;
287*4882a593Smuzhiyun }
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun // was PanoramiX
290*4882a593Smuzhiyun static int
ProcPseudoramiXGetScreenSize(ClientPtr client)291*4882a593Smuzhiyun ProcPseudoramiXGetScreenSize(ClientPtr client)
292*4882a593Smuzhiyun {
293*4882a593Smuzhiyun REQUEST(xPanoramiXGetScreenSizeReq);
294*4882a593Smuzhiyun WindowPtr pWin;
295*4882a593Smuzhiyun xPanoramiXGetScreenSizeReply rep;
296*4882a593Smuzhiyun register int rc;
297*4882a593Smuzhiyun
298*4882a593Smuzhiyun TRACE;
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun if (stuff->screen >= pseudoramiXNumScreens)
303*4882a593Smuzhiyun return BadMatch;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
306*4882a593Smuzhiyun if (rc != Success)
307*4882a593Smuzhiyun return rc;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun rep.type = X_Reply;
310*4882a593Smuzhiyun rep.length = 0;
311*4882a593Smuzhiyun rep.sequenceNumber = client->sequence;
312*4882a593Smuzhiyun /* screen dimensions */
313*4882a593Smuzhiyun rep.width = pseudoramiXScreens[stuff->screen].w;
314*4882a593Smuzhiyun // was screenInfo.screens[stuff->screen]->width;
315*4882a593Smuzhiyun rep.height = pseudoramiXScreens[stuff->screen].h;
316*4882a593Smuzhiyun // was screenInfo.screens[stuff->screen]->height;
317*4882a593Smuzhiyun rep.window = stuff->window;
318*4882a593Smuzhiyun rep.screen = stuff->screen;
319*4882a593Smuzhiyun if (client->swapped) {
320*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
321*4882a593Smuzhiyun swapl(&rep.length);
322*4882a593Smuzhiyun swapl(&rep.width);
323*4882a593Smuzhiyun swapl(&rep.height);
324*4882a593Smuzhiyun swapl(&rep.window);
325*4882a593Smuzhiyun swapl(&rep.screen);
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply),&rep);
328*4882a593Smuzhiyun return Success;
329*4882a593Smuzhiyun }
330*4882a593Smuzhiyun
331*4882a593Smuzhiyun // was Xinerama
332*4882a593Smuzhiyun static int
ProcPseudoramiXIsActive(ClientPtr client)333*4882a593Smuzhiyun ProcPseudoramiXIsActive(ClientPtr client)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun /* REQUEST(xXineramaIsActiveReq); */
336*4882a593Smuzhiyun xXineramaIsActiveReply rep;
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun TRACE;
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun rep.type = X_Reply;
343*4882a593Smuzhiyun rep.length = 0;
344*4882a593Smuzhiyun rep.sequenceNumber = client->sequence;
345*4882a593Smuzhiyun rep.state = !noPseudoramiXExtension;
346*4882a593Smuzhiyun if (client->swapped) {
347*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
348*4882a593Smuzhiyun swapl(&rep.length);
349*4882a593Smuzhiyun swapl(&rep.state);
350*4882a593Smuzhiyun }
351*4882a593Smuzhiyun WriteToClient(client, sizeof(xXineramaIsActiveReply),&rep);
352*4882a593Smuzhiyun return Success;
353*4882a593Smuzhiyun }
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun // was Xinerama
356*4882a593Smuzhiyun static int
ProcPseudoramiXQueryScreens(ClientPtr client)357*4882a593Smuzhiyun ProcPseudoramiXQueryScreens(ClientPtr client)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun /* REQUEST(xXineramaQueryScreensReq); */
360*4882a593Smuzhiyun xXineramaQueryScreensReply rep;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun DEBUG_LOG("noPseudoramiXExtension=%d, pseudoramiXNumScreens=%d\n",
363*4882a593Smuzhiyun noPseudoramiXExtension,
364*4882a593Smuzhiyun pseudoramiXNumScreens);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun rep.type = X_Reply;
369*4882a593Smuzhiyun rep.sequenceNumber = client->sequence;
370*4882a593Smuzhiyun rep.number = noPseudoramiXExtension ? 0 : pseudoramiXNumScreens;
371*4882a593Smuzhiyun rep.length = bytes_to_int32(rep.number * sz_XineramaScreenInfo);
372*4882a593Smuzhiyun if (client->swapped) {
373*4882a593Smuzhiyun swaps(&rep.sequenceNumber);
374*4882a593Smuzhiyun swapl(&rep.length);
375*4882a593Smuzhiyun swapl(&rep.number);
376*4882a593Smuzhiyun }
377*4882a593Smuzhiyun WriteToClient(client, sizeof(xXineramaQueryScreensReply),&rep);
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun if (!noPseudoramiXExtension) {
380*4882a593Smuzhiyun xXineramaScreenInfo scratch;
381*4882a593Smuzhiyun int i;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun for (i = 0; i < pseudoramiXNumScreens; i++) {
384*4882a593Smuzhiyun scratch.x_org = pseudoramiXScreens[i].x;
385*4882a593Smuzhiyun scratch.y_org = pseudoramiXScreens[i].y;
386*4882a593Smuzhiyun scratch.width = pseudoramiXScreens[i].w;
387*4882a593Smuzhiyun scratch.height = pseudoramiXScreens[i].h;
388*4882a593Smuzhiyun
389*4882a593Smuzhiyun if (client->swapped) {
390*4882a593Smuzhiyun swaps(&scratch.x_org);
391*4882a593Smuzhiyun swaps(&scratch.y_org);
392*4882a593Smuzhiyun swaps(&scratch.width);
393*4882a593Smuzhiyun swaps(&scratch.height);
394*4882a593Smuzhiyun }
395*4882a593Smuzhiyun WriteToClient(client, sz_XineramaScreenInfo,&scratch);
396*4882a593Smuzhiyun }
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun return Success;
400*4882a593Smuzhiyun }
401*4882a593Smuzhiyun
402*4882a593Smuzhiyun // was PanoramiX
403*4882a593Smuzhiyun static int
ProcPseudoramiXDispatch(ClientPtr client)404*4882a593Smuzhiyun ProcPseudoramiXDispatch(ClientPtr client)
405*4882a593Smuzhiyun {
406*4882a593Smuzhiyun REQUEST(xReq);
407*4882a593Smuzhiyun TRACE;
408*4882a593Smuzhiyun switch (stuff->data) {
409*4882a593Smuzhiyun case X_PanoramiXQueryVersion:
410*4882a593Smuzhiyun return ProcPseudoramiXQueryVersion(client);
411*4882a593Smuzhiyun
412*4882a593Smuzhiyun case X_PanoramiXGetState:
413*4882a593Smuzhiyun return ProcPseudoramiXGetState(client);
414*4882a593Smuzhiyun
415*4882a593Smuzhiyun case X_PanoramiXGetScreenCount:
416*4882a593Smuzhiyun return ProcPseudoramiXGetScreenCount(client);
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun case X_PanoramiXGetScreenSize:
419*4882a593Smuzhiyun return ProcPseudoramiXGetScreenSize(client);
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun case X_XineramaIsActive:
422*4882a593Smuzhiyun return ProcPseudoramiXIsActive(client);
423*4882a593Smuzhiyun
424*4882a593Smuzhiyun case X_XineramaQueryScreens:
425*4882a593Smuzhiyun return ProcPseudoramiXQueryScreens(client);
426*4882a593Smuzhiyun }
427*4882a593Smuzhiyun return BadRequest;
428*4882a593Smuzhiyun }
429*4882a593Smuzhiyun
430*4882a593Smuzhiyun static int
SProcPseudoramiXQueryVersion(ClientPtr client)431*4882a593Smuzhiyun SProcPseudoramiXQueryVersion(ClientPtr client)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun REQUEST(xPanoramiXQueryVersionReq);
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun TRACE;
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun swaps(&stuff->length);
438*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
439*4882a593Smuzhiyun return ProcPseudoramiXQueryVersion(client);
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun static int
SProcPseudoramiXGetState(ClientPtr client)443*4882a593Smuzhiyun SProcPseudoramiXGetState(ClientPtr client)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun REQUEST(xPanoramiXGetStateReq);
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun TRACE;
448*4882a593Smuzhiyun
449*4882a593Smuzhiyun swaps(&stuff->length);
450*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
451*4882a593Smuzhiyun return ProcPseudoramiXGetState(client);
452*4882a593Smuzhiyun }
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun static int
SProcPseudoramiXGetScreenCount(ClientPtr client)455*4882a593Smuzhiyun SProcPseudoramiXGetScreenCount(ClientPtr client)
456*4882a593Smuzhiyun {
457*4882a593Smuzhiyun REQUEST(xPanoramiXGetScreenCountReq);
458*4882a593Smuzhiyun
459*4882a593Smuzhiyun TRACE;
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun swaps(&stuff->length);
462*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
463*4882a593Smuzhiyun return ProcPseudoramiXGetScreenCount(client);
464*4882a593Smuzhiyun }
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun static int
SProcPseudoramiXGetScreenSize(ClientPtr client)467*4882a593Smuzhiyun SProcPseudoramiXGetScreenSize(ClientPtr client)
468*4882a593Smuzhiyun {
469*4882a593Smuzhiyun REQUEST(xPanoramiXGetScreenSizeReq);
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun TRACE;
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun swaps(&stuff->length);
474*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
475*4882a593Smuzhiyun return ProcPseudoramiXGetScreenSize(client);
476*4882a593Smuzhiyun }
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun static int
SProcPseudoramiXIsActive(ClientPtr client)479*4882a593Smuzhiyun SProcPseudoramiXIsActive(ClientPtr client)
480*4882a593Smuzhiyun {
481*4882a593Smuzhiyun REQUEST(xXineramaIsActiveReq);
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun TRACE;
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun swaps(&stuff->length);
486*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
487*4882a593Smuzhiyun return ProcPseudoramiXIsActive(client);
488*4882a593Smuzhiyun }
489*4882a593Smuzhiyun
490*4882a593Smuzhiyun static int
SProcPseudoramiXQueryScreens(ClientPtr client)491*4882a593Smuzhiyun SProcPseudoramiXQueryScreens(ClientPtr client)
492*4882a593Smuzhiyun {
493*4882a593Smuzhiyun REQUEST(xXineramaQueryScreensReq);
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun TRACE;
496*4882a593Smuzhiyun
497*4882a593Smuzhiyun swaps(&stuff->length);
498*4882a593Smuzhiyun REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
499*4882a593Smuzhiyun return ProcPseudoramiXQueryScreens(client);
500*4882a593Smuzhiyun }
501*4882a593Smuzhiyun
502*4882a593Smuzhiyun static int
SProcPseudoramiXDispatch(ClientPtr client)503*4882a593Smuzhiyun SProcPseudoramiXDispatch(ClientPtr client)
504*4882a593Smuzhiyun {
505*4882a593Smuzhiyun REQUEST(xReq);
506*4882a593Smuzhiyun
507*4882a593Smuzhiyun TRACE;
508*4882a593Smuzhiyun
509*4882a593Smuzhiyun switch (stuff->data) {
510*4882a593Smuzhiyun case X_PanoramiXQueryVersion:
511*4882a593Smuzhiyun return SProcPseudoramiXQueryVersion(client);
512*4882a593Smuzhiyun
513*4882a593Smuzhiyun case X_PanoramiXGetState:
514*4882a593Smuzhiyun return SProcPseudoramiXGetState(client);
515*4882a593Smuzhiyun
516*4882a593Smuzhiyun case X_PanoramiXGetScreenCount:
517*4882a593Smuzhiyun return SProcPseudoramiXGetScreenCount(client);
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun case X_PanoramiXGetScreenSize:
520*4882a593Smuzhiyun return SProcPseudoramiXGetScreenSize(client);
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun case X_XineramaIsActive:
523*4882a593Smuzhiyun return SProcPseudoramiXIsActive(client);
524*4882a593Smuzhiyun
525*4882a593Smuzhiyun case X_XineramaQueryScreens:
526*4882a593Smuzhiyun return SProcPseudoramiXQueryScreens(client);
527*4882a593Smuzhiyun }
528*4882a593Smuzhiyun return BadRequest;
529*4882a593Smuzhiyun }
530