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