xref: /OK3568_Linux_fs/external/xserver/randr/rrxinerama.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * Copyright © 2006 Keith Packard
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Permission to use, copy, modify, distribute, and sell this software and its
5*4882a593Smuzhiyun  * documentation for any purpose is hereby granted without fee, provided that
6*4882a593Smuzhiyun  * the above copyright notice appear in all copies and that both that copyright
7*4882a593Smuzhiyun  * notice and this permission notice appear in supporting documentation, and
8*4882a593Smuzhiyun  * that the name of the copyright holders not be used in advertising or
9*4882a593Smuzhiyun  * publicity pertaining to distribution of the software without specific,
10*4882a593Smuzhiyun  * written prior permission.  The copyright holders make no representations
11*4882a593Smuzhiyun  * about the suitability of this software for any purpose.  It is provided "as
12*4882a593Smuzhiyun  * is" without express or implied warranty.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15*4882a593Smuzhiyun  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16*4882a593Smuzhiyun  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17*4882a593Smuzhiyun  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18*4882a593Smuzhiyun  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19*4882a593Smuzhiyun  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20*4882a593Smuzhiyun  * OF THIS SOFTWARE.
21*4882a593Smuzhiyun  */
22*4882a593Smuzhiyun /*
23*4882a593Smuzhiyun  * This Xinerama implementation comes from the SiS driver which has
24*4882a593Smuzhiyun  * the following notice:
25*4882a593Smuzhiyun  */
26*4882a593Smuzhiyun /*
27*4882a593Smuzhiyun  * SiS driver main code
28*4882a593Smuzhiyun  *
29*4882a593Smuzhiyun  * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
30*4882a593Smuzhiyun  *
31*4882a593Smuzhiyun  * Redistribution and use in source and binary forms, with or without
32*4882a593Smuzhiyun  * modification, are permitted provided that the following conditions
33*4882a593Smuzhiyun  * are met:
34*4882a593Smuzhiyun  * 1) Redistributions of source code must retain the above copyright
35*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer.
36*4882a593Smuzhiyun  * 2) Redistributions in binary form must reproduce the above copyright
37*4882a593Smuzhiyun  *    notice, this list of conditions and the following disclaimer in the
38*4882a593Smuzhiyun  *    documentation and/or other materials provided with the distribution.
39*4882a593Smuzhiyun  * 3) The name of the author may not be used to endorse or promote products
40*4882a593Smuzhiyun  *    derived from this software without specific prior written permission.
41*4882a593Smuzhiyun  *
42*4882a593Smuzhiyun  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
43*4882a593Smuzhiyun  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
44*4882a593Smuzhiyun  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
45*4882a593Smuzhiyun  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
46*4882a593Smuzhiyun  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47*4882a593Smuzhiyun  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
48*4882a593Smuzhiyun  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
49*4882a593Smuzhiyun  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
50*4882a593Smuzhiyun  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
51*4882a593Smuzhiyun  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52*4882a593Smuzhiyun  *
53*4882a593Smuzhiyun  * Author: Thomas Winischhofer <thomas@winischhofer.net>
54*4882a593Smuzhiyun  *	- driver entirely rewritten since 2001, only basic structure taken from
55*4882a593Smuzhiyun  *	  old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
56*4882a593Smuzhiyun  *	  sis_dga.c; these were mostly taken over; sis_dri.c was changed for
57*4882a593Smuzhiyun  *	  new versions of the DRI layer)
58*4882a593Smuzhiyun  *
59*4882a593Smuzhiyun  * This notice covers the entire driver code unless indicated otherwise.
60*4882a593Smuzhiyun  *
61*4882a593Smuzhiyun  * Formerly based on code which was
62*4882a593Smuzhiyun  * 	     Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
63*4882a593Smuzhiyun  * 	     Written by:
64*4882a593Smuzhiyun  *           Alan Hourihane <alanh@fairlite.demon.co.uk>,
65*4882a593Smuzhiyun  *           Mike Chapman <mike@paranoia.com>,
66*4882a593Smuzhiyun  *           Juanjo Santamarta <santamarta@ctv.es>,
67*4882a593Smuzhiyun  *           Mitani Hiroshi <hmitani@drl.mei.co.jp>,
68*4882a593Smuzhiyun  *           David Thomas <davtom@dream.org.uk>.
69*4882a593Smuzhiyun  */
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun #include "randrstr.h"
72*4882a593Smuzhiyun #include "swaprep.h"
73*4882a593Smuzhiyun #include <X11/extensions/panoramiXproto.h>
74*4882a593Smuzhiyun #include "protocol-versions.h"
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun /* Xinerama is not multi-screen capable; just report about screen 0 */
77*4882a593Smuzhiyun #define RR_XINERAMA_SCREEN  0
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun static int ProcRRXineramaQueryVersion(ClientPtr client);
80*4882a593Smuzhiyun static int ProcRRXineramaGetState(ClientPtr client);
81*4882a593Smuzhiyun static int ProcRRXineramaGetScreenCount(ClientPtr client);
82*4882a593Smuzhiyun static int ProcRRXineramaGetScreenSize(ClientPtr client);
83*4882a593Smuzhiyun static int ProcRRXineramaIsActive(ClientPtr client);
84*4882a593Smuzhiyun static int ProcRRXineramaQueryScreens(ClientPtr client);
85*4882a593Smuzhiyun static int _X_COLD SProcRRXineramaDispatch(ClientPtr client);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun Bool noRRXineramaExtension = FALSE;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun /* Proc */
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun int
ProcRRXineramaQueryVersion(ClientPtr client)92*4882a593Smuzhiyun ProcRRXineramaQueryVersion(ClientPtr client)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun     xPanoramiXQueryVersionReply rep = {
95*4882a593Smuzhiyun         .type = X_Reply,
96*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
97*4882a593Smuzhiyun         .length = 0,
98*4882a593Smuzhiyun         .majorVersion = SERVER_RRXINERAMA_MAJOR_VERSION,
99*4882a593Smuzhiyun         .minorVersion = SERVER_RRXINERAMA_MINOR_VERSION
100*4882a593Smuzhiyun     };
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
103*4882a593Smuzhiyun     if (client->swapped) {
104*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
105*4882a593Smuzhiyun         swapl(&rep.length);
106*4882a593Smuzhiyun         swaps(&rep.majorVersion);
107*4882a593Smuzhiyun         swaps(&rep.minorVersion);
108*4882a593Smuzhiyun     }
109*4882a593Smuzhiyun     WriteToClient(client, sizeof(xPanoramiXQueryVersionReply), &rep);
110*4882a593Smuzhiyun     return Success;
111*4882a593Smuzhiyun }
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun int
ProcRRXineramaGetState(ClientPtr client)114*4882a593Smuzhiyun ProcRRXineramaGetState(ClientPtr client)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun     REQUEST(xPanoramiXGetStateReq);
117*4882a593Smuzhiyun     WindowPtr pWin;
118*4882a593Smuzhiyun     xPanoramiXGetStateReply rep;
119*4882a593Smuzhiyun     register int rc;
120*4882a593Smuzhiyun     ScreenPtr pScreen;
121*4882a593Smuzhiyun     rrScrPrivPtr pScrPriv;
122*4882a593Smuzhiyun     Bool active = FALSE;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
125*4882a593Smuzhiyun     rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
126*4882a593Smuzhiyun     if (rc != Success)
127*4882a593Smuzhiyun         return rc;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun     pScreen = pWin->drawable.pScreen;
130*4882a593Smuzhiyun     pScrPriv = rrGetScrPriv(pScreen);
131*4882a593Smuzhiyun     if (pScrPriv) {
132*4882a593Smuzhiyun         /* XXX do we need more than this? */
133*4882a593Smuzhiyun         active = TRUE;
134*4882a593Smuzhiyun     }
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun     rep = (xPanoramiXGetStateReply) {
137*4882a593Smuzhiyun         .type = X_Reply,
138*4882a593Smuzhiyun         .state = active,
139*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
140*4882a593Smuzhiyun         .length = 0,
141*4882a593Smuzhiyun         .window = stuff->window
142*4882a593Smuzhiyun     };
143*4882a593Smuzhiyun     if (client->swapped) {
144*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
145*4882a593Smuzhiyun         swapl(&rep.length);
146*4882a593Smuzhiyun         swapl(&rep.window);
147*4882a593Smuzhiyun     }
148*4882a593Smuzhiyun     WriteToClient(client, sizeof(xPanoramiXGetStateReply), &rep);
149*4882a593Smuzhiyun     return Success;
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun static int
RRXineramaScreenCount(ScreenPtr pScreen)153*4882a593Smuzhiyun RRXineramaScreenCount(ScreenPtr pScreen)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun     return RRMonitorCountList(pScreen);
156*4882a593Smuzhiyun }
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun static Bool
RRXineramaScreenActive(ScreenPtr pScreen)159*4882a593Smuzhiyun RRXineramaScreenActive(ScreenPtr pScreen)
160*4882a593Smuzhiyun {
161*4882a593Smuzhiyun     return RRXineramaScreenCount(pScreen) > 0;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun int
ProcRRXineramaGetScreenCount(ClientPtr client)165*4882a593Smuzhiyun ProcRRXineramaGetScreenCount(ClientPtr client)
166*4882a593Smuzhiyun {
167*4882a593Smuzhiyun     REQUEST(xPanoramiXGetScreenCountReq);
168*4882a593Smuzhiyun     WindowPtr pWin;
169*4882a593Smuzhiyun     xPanoramiXGetScreenCountReply rep;
170*4882a593Smuzhiyun     register int rc;
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
173*4882a593Smuzhiyun     rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
174*4882a593Smuzhiyun     if (rc != Success)
175*4882a593Smuzhiyun         return rc;
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun     rep = (xPanoramiXGetScreenCountReply)  {
178*4882a593Smuzhiyun         .type = X_Reply,
179*4882a593Smuzhiyun         .ScreenCount = RRXineramaScreenCount(pWin->drawable.pScreen),
180*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
181*4882a593Smuzhiyun         .length = 0,
182*4882a593Smuzhiyun         .window = stuff->window
183*4882a593Smuzhiyun     };
184*4882a593Smuzhiyun     if (client->swapped) {
185*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
186*4882a593Smuzhiyun         swapl(&rep.length);
187*4882a593Smuzhiyun         swapl(&rep.window);
188*4882a593Smuzhiyun     }
189*4882a593Smuzhiyun     WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply), &rep);
190*4882a593Smuzhiyun     return Success;
191*4882a593Smuzhiyun }
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun int
ProcRRXineramaGetScreenSize(ClientPtr client)194*4882a593Smuzhiyun ProcRRXineramaGetScreenSize(ClientPtr client)
195*4882a593Smuzhiyun {
196*4882a593Smuzhiyun     REQUEST(xPanoramiXGetScreenSizeReq);
197*4882a593Smuzhiyun     WindowPtr pWin, pRoot;
198*4882a593Smuzhiyun     ScreenPtr pScreen;
199*4882a593Smuzhiyun     xPanoramiXGetScreenSizeReply rep;
200*4882a593Smuzhiyun     register int rc;
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
203*4882a593Smuzhiyun     rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
204*4882a593Smuzhiyun     if (rc != Success)
205*4882a593Smuzhiyun         return rc;
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun     pScreen = pWin->drawable.pScreen;
208*4882a593Smuzhiyun     pRoot = pScreen->root;
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun     rep = (xPanoramiXGetScreenSizeReply) {
211*4882a593Smuzhiyun         .type = X_Reply,
212*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
213*4882a593Smuzhiyun         .length = 0,
214*4882a593Smuzhiyun         .width = pRoot->drawable.width,
215*4882a593Smuzhiyun         .height = pRoot->drawable.height,
216*4882a593Smuzhiyun         .window = stuff->window,
217*4882a593Smuzhiyun         .screen = stuff->screen
218*4882a593Smuzhiyun     };
219*4882a593Smuzhiyun     if (client->swapped) {
220*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
221*4882a593Smuzhiyun         swapl(&rep.length);
222*4882a593Smuzhiyun         swapl(&rep.width);
223*4882a593Smuzhiyun         swapl(&rep.height);
224*4882a593Smuzhiyun         swapl(&rep.window);
225*4882a593Smuzhiyun         swapl(&rep.screen);
226*4882a593Smuzhiyun     }
227*4882a593Smuzhiyun     WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply), &rep);
228*4882a593Smuzhiyun     return Success;
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun int
ProcRRXineramaIsActive(ClientPtr client)232*4882a593Smuzhiyun ProcRRXineramaIsActive(ClientPtr client)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun     xXineramaIsActiveReply rep;
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun     rep = (xXineramaIsActiveReply) {
239*4882a593Smuzhiyun         .type = X_Reply,
240*4882a593Smuzhiyun         .length = 0,
241*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
242*4882a593Smuzhiyun         .state = RRXineramaScreenActive(screenInfo.screens[RR_XINERAMA_SCREEN])
243*4882a593Smuzhiyun     };
244*4882a593Smuzhiyun     if (client->swapped) {
245*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
246*4882a593Smuzhiyun         swapl(&rep.length);
247*4882a593Smuzhiyun         swapl(&rep.state);
248*4882a593Smuzhiyun     }
249*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXineramaIsActiveReply), &rep);
250*4882a593Smuzhiyun     return Success;
251*4882a593Smuzhiyun }
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun static void
RRXineramaWriteMonitor(ClientPtr client,RRMonitorPtr monitor)254*4882a593Smuzhiyun RRXineramaWriteMonitor(ClientPtr client, RRMonitorPtr monitor)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun     xXineramaScreenInfo scratch;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun     scratch.x_org = monitor->geometry.box.x1;
259*4882a593Smuzhiyun     scratch.y_org = monitor->geometry.box.y1;
260*4882a593Smuzhiyun     scratch.width = monitor->geometry.box.x2 - monitor->geometry.box.x1;
261*4882a593Smuzhiyun     scratch.height = monitor->geometry.box.y2 - monitor->geometry.box.y1;
262*4882a593Smuzhiyun 
263*4882a593Smuzhiyun     if (client->swapped) {
264*4882a593Smuzhiyun         swaps(&scratch.x_org);
265*4882a593Smuzhiyun         swaps(&scratch.y_org);
266*4882a593Smuzhiyun         swaps(&scratch.width);
267*4882a593Smuzhiyun         swaps(&scratch.height);
268*4882a593Smuzhiyun     }
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun     WriteToClient(client, sz_XineramaScreenInfo, &scratch);
271*4882a593Smuzhiyun }
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun int
ProcRRXineramaQueryScreens(ClientPtr client)274*4882a593Smuzhiyun ProcRRXineramaQueryScreens(ClientPtr client)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun     xXineramaQueryScreensReply rep;
277*4882a593Smuzhiyun     ScreenPtr pScreen = screenInfo.screens[RR_XINERAMA_SCREEN];
278*4882a593Smuzhiyun     int m;
279*4882a593Smuzhiyun     RRMonitorPtr monitors = NULL;
280*4882a593Smuzhiyun     int nmonitors = 0;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun     if (RRXineramaScreenActive(pScreen)) {
285*4882a593Smuzhiyun         RRGetInfo(pScreen, FALSE);
286*4882a593Smuzhiyun         if (!RRMonitorMakeList(pScreen, TRUE, &monitors, &nmonitors))
287*4882a593Smuzhiyun             return BadAlloc;
288*4882a593Smuzhiyun     }
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun     rep = (xXineramaQueryScreensReply) {
291*4882a593Smuzhiyun         .type = X_Reply,
292*4882a593Smuzhiyun         .sequenceNumber = client->sequence,
293*4882a593Smuzhiyun         .length = bytes_to_int32(nmonitors * sz_XineramaScreenInfo),
294*4882a593Smuzhiyun         .number = nmonitors
295*4882a593Smuzhiyun     };
296*4882a593Smuzhiyun     if (client->swapped) {
297*4882a593Smuzhiyun         swaps(&rep.sequenceNumber);
298*4882a593Smuzhiyun         swapl(&rep.length);
299*4882a593Smuzhiyun         swapl(&rep.number);
300*4882a593Smuzhiyun     }
301*4882a593Smuzhiyun     WriteToClient(client, sizeof(xXineramaQueryScreensReply), &rep);
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun     for (m = 0; m < nmonitors; m++)
304*4882a593Smuzhiyun         RRXineramaWriteMonitor(client, &monitors[m]);
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun     if (monitors)
307*4882a593Smuzhiyun         RRMonitorFreeList(monitors, nmonitors);
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun     return Success;
310*4882a593Smuzhiyun }
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun static int
ProcRRXineramaDispatch(ClientPtr client)313*4882a593Smuzhiyun ProcRRXineramaDispatch(ClientPtr client)
314*4882a593Smuzhiyun {
315*4882a593Smuzhiyun     REQUEST(xReq);
316*4882a593Smuzhiyun     switch (stuff->data) {
317*4882a593Smuzhiyun     case X_PanoramiXQueryVersion:
318*4882a593Smuzhiyun         return ProcRRXineramaQueryVersion(client);
319*4882a593Smuzhiyun     case X_PanoramiXGetState:
320*4882a593Smuzhiyun         return ProcRRXineramaGetState(client);
321*4882a593Smuzhiyun     case X_PanoramiXGetScreenCount:
322*4882a593Smuzhiyun         return ProcRRXineramaGetScreenCount(client);
323*4882a593Smuzhiyun     case X_PanoramiXGetScreenSize:
324*4882a593Smuzhiyun         return ProcRRXineramaGetScreenSize(client);
325*4882a593Smuzhiyun     case X_XineramaIsActive:
326*4882a593Smuzhiyun         return ProcRRXineramaIsActive(client);
327*4882a593Smuzhiyun     case X_XineramaQueryScreens:
328*4882a593Smuzhiyun         return ProcRRXineramaQueryScreens(client);
329*4882a593Smuzhiyun     }
330*4882a593Smuzhiyun     return BadRequest;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun /* SProc */
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaQueryVersion(ClientPtr client)336*4882a593Smuzhiyun SProcRRXineramaQueryVersion(ClientPtr client)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun     REQUEST(xPanoramiXQueryVersionReq);
339*4882a593Smuzhiyun     swaps(&stuff->length);
340*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
341*4882a593Smuzhiyun     return ProcRRXineramaQueryVersion(client);
342*4882a593Smuzhiyun }
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaGetState(ClientPtr client)345*4882a593Smuzhiyun SProcRRXineramaGetState(ClientPtr client)
346*4882a593Smuzhiyun {
347*4882a593Smuzhiyun     REQUEST(xPanoramiXGetStateReq);
348*4882a593Smuzhiyun     swaps(&stuff->length);
349*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
350*4882a593Smuzhiyun     swapl(&stuff->window);
351*4882a593Smuzhiyun     return ProcRRXineramaGetState(client);
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaGetScreenCount(ClientPtr client)355*4882a593Smuzhiyun SProcRRXineramaGetScreenCount(ClientPtr client)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun     REQUEST(xPanoramiXGetScreenCountReq);
358*4882a593Smuzhiyun     swaps(&stuff->length);
359*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
360*4882a593Smuzhiyun     swapl(&stuff->window);
361*4882a593Smuzhiyun     return ProcRRXineramaGetScreenCount(client);
362*4882a593Smuzhiyun }
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaGetScreenSize(ClientPtr client)365*4882a593Smuzhiyun SProcRRXineramaGetScreenSize(ClientPtr client)
366*4882a593Smuzhiyun {
367*4882a593Smuzhiyun     REQUEST(xPanoramiXGetScreenSizeReq);
368*4882a593Smuzhiyun     swaps(&stuff->length);
369*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
370*4882a593Smuzhiyun     swapl(&stuff->window);
371*4882a593Smuzhiyun     swapl(&stuff->screen);
372*4882a593Smuzhiyun     return ProcRRXineramaGetScreenSize(client);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun 
375*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaIsActive(ClientPtr client)376*4882a593Smuzhiyun SProcRRXineramaIsActive(ClientPtr client)
377*4882a593Smuzhiyun {
378*4882a593Smuzhiyun     REQUEST(xXineramaIsActiveReq);
379*4882a593Smuzhiyun     swaps(&stuff->length);
380*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
381*4882a593Smuzhiyun     return ProcRRXineramaIsActive(client);
382*4882a593Smuzhiyun }
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun static int _X_COLD
SProcRRXineramaQueryScreens(ClientPtr client)385*4882a593Smuzhiyun SProcRRXineramaQueryScreens(ClientPtr client)
386*4882a593Smuzhiyun {
387*4882a593Smuzhiyun     REQUEST(xXineramaQueryScreensReq);
388*4882a593Smuzhiyun     swaps(&stuff->length);
389*4882a593Smuzhiyun     REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
390*4882a593Smuzhiyun     return ProcRRXineramaQueryScreens(client);
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun int
SProcRRXineramaDispatch(ClientPtr client)394*4882a593Smuzhiyun SProcRRXineramaDispatch(ClientPtr client)
395*4882a593Smuzhiyun {
396*4882a593Smuzhiyun     REQUEST(xReq);
397*4882a593Smuzhiyun     switch (stuff->data) {
398*4882a593Smuzhiyun     case X_PanoramiXQueryVersion:
399*4882a593Smuzhiyun         return SProcRRXineramaQueryVersion(client);
400*4882a593Smuzhiyun     case X_PanoramiXGetState:
401*4882a593Smuzhiyun         return SProcRRXineramaGetState(client);
402*4882a593Smuzhiyun     case X_PanoramiXGetScreenCount:
403*4882a593Smuzhiyun         return SProcRRXineramaGetScreenCount(client);
404*4882a593Smuzhiyun     case X_PanoramiXGetScreenSize:
405*4882a593Smuzhiyun         return SProcRRXineramaGetScreenSize(client);
406*4882a593Smuzhiyun     case X_XineramaIsActive:
407*4882a593Smuzhiyun         return SProcRRXineramaIsActive(client);
408*4882a593Smuzhiyun     case X_XineramaQueryScreens:
409*4882a593Smuzhiyun         return SProcRRXineramaQueryScreens(client);
410*4882a593Smuzhiyun     }
411*4882a593Smuzhiyun     return BadRequest;
412*4882a593Smuzhiyun }
413*4882a593Smuzhiyun 
414*4882a593Smuzhiyun void
RRXineramaExtensionInit(void)415*4882a593Smuzhiyun RRXineramaExtensionInit(void)
416*4882a593Smuzhiyun {
417*4882a593Smuzhiyun #ifdef PANORAMIX
418*4882a593Smuzhiyun     if (!noPanoramiXExtension)
419*4882a593Smuzhiyun         return;
420*4882a593Smuzhiyun #endif
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun     if (noRRXineramaExtension)
423*4882a593Smuzhiyun       return;
424*4882a593Smuzhiyun 
425*4882a593Smuzhiyun     /*
426*4882a593Smuzhiyun      * Xinerama isn't capable enough to have multiple protocol screens each
427*4882a593Smuzhiyun      * with their own output geometry.  So if there's more than one protocol
428*4882a593Smuzhiyun      * screen, just don't even try.
429*4882a593Smuzhiyun      */
430*4882a593Smuzhiyun     if (screenInfo.numScreens > 1)
431*4882a593Smuzhiyun         return;
432*4882a593Smuzhiyun 
433*4882a593Smuzhiyun     (void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0, 0,
434*4882a593Smuzhiyun                         ProcRRXineramaDispatch,
435*4882a593Smuzhiyun                         SProcRRXineramaDispatch, NULL, StandardMinorOpcode);
436*4882a593Smuzhiyun }
437