xref: /OK3568_Linux_fs/external/xserver/pseudoramiX/pseudoramiX.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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