vmwarexinerama.c revision a241306c
16df26cacSmrg/*
26df26cacSmrg * Copyright 2006 by VMware, Inc.
36df26cacSmrg *
46df26cacSmrg * Permission is hereby granted, free of charge, to any person obtaining a
56df26cacSmrg * copy of this software and associated documentation files (the "Software"),
66df26cacSmrg * to deal in the Software without restriction, including without limitation
76df26cacSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
86df26cacSmrg * and/or sell copies of the Software, and to permit persons to whom the
96df26cacSmrg * Software is furnished to do so, subject to the following conditions:
106df26cacSmrg *
116df26cacSmrg * The above copyright notice and this permission notice shall be included in
126df26cacSmrg * all copies or substantial portions of the Software.
136df26cacSmrg *
146df26cacSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
156df26cacSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
166df26cacSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
176df26cacSmrg * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
186df26cacSmrg * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
196df26cacSmrg * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
206df26cacSmrg * OTHER DEALINGS IN THE SOFTWARE.
216df26cacSmrg *
226df26cacSmrg * Except as contained in this notice, the name of the copyright holder(s)
236df26cacSmrg * and author(s) shall not be used in advertising or otherwise to promote
246df26cacSmrg * the sale, use or other dealings in this Software without prior written
256df26cacSmrg * authorization from the copyright holder(s) and author(s).
266df26cacSmrg */
276df26cacSmrg
286df26cacSmrg/*
296df26cacSmrg * vmwarexinerama.c --
306df26cacSmrg *
316df26cacSmrg *      The implementation of the Xinerama protocol extension.
326df26cacSmrg */
336df26cacSmrg
346df26cacSmrg
356df26cacSmrg#ifdef HAVE_CONFIG_H
366df26cacSmrg#include "config.h"
376df26cacSmrg#endif
386df26cacSmrg
396df26cacSmrg#include "dixstruct.h"
406df26cacSmrg#include "extnsionst.h"
416df26cacSmrg#include <X11/X.h>
426df26cacSmrg#include <X11/extensions/panoramiXproto.h>
436df26cacSmrg
446df26cacSmrg#include "vmware.h"
456df26cacSmrg
46a241306cSmrg#ifndef HAVE_XORG_SERVER_1_5_0
47a241306cSmrg#include <xf86_ansic.h>
48a241306cSmrg#include <xf86_libc.h>
49a241306cSmrg#endif
50a241306cSmrg
516df26cacSmrg
526df26cacSmrg/*
536df26cacSmrg *----------------------------------------------------------------------------
546df26cacSmrg *
556df26cacSmrg * VMwareXineramaQueryVersion --
566df26cacSmrg *
576df26cacSmrg *      Implementation of QueryVersion command handler. Initialises and
586df26cacSmrg *      sends a reply.
596df26cacSmrg *
606df26cacSmrg * Results:
616df26cacSmrg *      Standard response codes.
626df26cacSmrg *
636df26cacSmrg * Side effects:
646df26cacSmrg *      Writes reply to client.
656df26cacSmrg *
666df26cacSmrg *----------------------------------------------------------------------------
676df26cacSmrg */
686df26cacSmrg
696df26cacSmrgstatic int
706df26cacSmrgVMwareXineramaQueryVersion(ClientPtr client)
716df26cacSmrg{
726df26cacSmrg    xPanoramiXQueryVersionReply	  rep;
736df26cacSmrg    register int		  n;
746df26cacSmrg
756df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
766df26cacSmrg    rep.type = X_Reply;
776df26cacSmrg    rep.length = 0;
786df26cacSmrg    rep.sequenceNumber = client->sequence;
796df26cacSmrg    rep.majorVersion = 1;
806df26cacSmrg    rep.minorVersion = 0;
816df26cacSmrg    if(client->swapped) {
826df26cacSmrg        swaps(&rep.sequenceNumber, n);
836df26cacSmrg        swapl(&rep.length, n);
846df26cacSmrg        swaps(&rep.majorVersion, n);
856df26cacSmrg        swaps(&rep.minorVersion, n);
866df26cacSmrg    }
876df26cacSmrg    WriteToClient(client, sizeof(xPanoramiXQueryVersionReply), (char *)&rep);
886df26cacSmrg    return (client->noClientException);
896df26cacSmrg}
906df26cacSmrg
916df26cacSmrg
926df26cacSmrg/*
936df26cacSmrg *----------------------------------------------------------------------------
946df26cacSmrg *
956df26cacSmrg * VMwareXineramaGetState --
966df26cacSmrg *
976df26cacSmrg *      Implementation of GetState command handler. Initialises and
986df26cacSmrg *      sends a reply.
996df26cacSmrg *
1006df26cacSmrg * Results:
1016df26cacSmrg *      Standard response codes.
1026df26cacSmrg *
1036df26cacSmrg * Side effects:
1046df26cacSmrg *      Writes reply to client.
1056df26cacSmrg *
1066df26cacSmrg *----------------------------------------------------------------------------
1076df26cacSmrg */
1086df26cacSmrg
1096df26cacSmrgstatic int
1106df26cacSmrgVMwareXineramaGetState(ClientPtr client)
1116df26cacSmrg{
1126df26cacSmrg    REQUEST(xPanoramiXGetStateReq);
1136df26cacSmrg    WindowPtr			pWin;
1146df26cacSmrg    xPanoramiXGetStateReply	rep;
1156df26cacSmrg    register int		n;
1166df26cacSmrg    ExtensionEntry *ext;
1176df26cacSmrg    ScrnInfoPtr pScrn;
1186df26cacSmrg    VMWAREPtr pVMWARE;
1196df26cacSmrg
1206df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
1216df26cacSmrg    pWin = LookupWindow(stuff->window, client);
1226df26cacSmrg    if(!pWin) return BadWindow;
1236df26cacSmrg
1246df26cacSmrg    if (!(ext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
1256df26cacSmrg       return BadMatch;
1266df26cacSmrg    }
1276df26cacSmrg    pScrn = ext->extPrivate;
1286df26cacSmrg    pVMWARE = VMWAREPTR(pScrn);
1296df26cacSmrg
1306df26cacSmrg    rep.type = X_Reply;
1316df26cacSmrg    rep.length = 0;
1326df26cacSmrg    rep.sequenceNumber = client->sequence;
1336df26cacSmrg    rep.state = pVMWARE->xinerama;
1346df26cacSmrg    if(client->swapped) {
1356df26cacSmrg       swaps (&rep.sequenceNumber, n);
1366df26cacSmrg       swapl (&rep.length, n);
1376df26cacSmrg       swaps (&rep.state, n);
1386df26cacSmrg    }
1396df26cacSmrg    WriteToClient(client, sizeof(xPanoramiXGetStateReply), (char *)&rep);
1406df26cacSmrg    return client->noClientException;
1416df26cacSmrg}
1426df26cacSmrg
1436df26cacSmrg
1446df26cacSmrg/*
1456df26cacSmrg *----------------------------------------------------------------------------
1466df26cacSmrg *
1476df26cacSmrg * VMwareXineramaGetScreenCount --
1486df26cacSmrg *
1496df26cacSmrg *      Implementation of GetScreenCount command handler. Initialises and
1506df26cacSmrg *      sends a reply.
1516df26cacSmrg *
1526df26cacSmrg * Results:
1536df26cacSmrg *      Standard response codes.
1546df26cacSmrg *
1556df26cacSmrg * Side effects:
1566df26cacSmrg *      Writes reply to client.
1576df26cacSmrg *
1586df26cacSmrg *----------------------------------------------------------------------------
1596df26cacSmrg */
1606df26cacSmrg
1616df26cacSmrgstatic int
1626df26cacSmrgVMwareXineramaGetScreenCount(ClientPtr client)
1636df26cacSmrg{
1646df26cacSmrg    REQUEST(xPanoramiXGetScreenCountReq);
1656df26cacSmrg    WindowPtr				pWin;
1666df26cacSmrg    xPanoramiXGetScreenCountReply	rep;
1676df26cacSmrg    register int			n;
1686df26cacSmrg    ExtensionEntry *ext;
1696df26cacSmrg    ScrnInfoPtr pScrn;
1706df26cacSmrg    VMWAREPtr pVMWARE;
1716df26cacSmrg
1726df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
1736df26cacSmrg    pWin = LookupWindow(stuff->window, client);
1746df26cacSmrg    if(!pWin) return BadWindow;
1756df26cacSmrg
1766df26cacSmrg    if (!(ext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
1776df26cacSmrg       return BadMatch;
1786df26cacSmrg    }
1796df26cacSmrg    pScrn = ext->extPrivate;
1806df26cacSmrg    pVMWARE = VMWAREPTR(pScrn);
1816df26cacSmrg
1826df26cacSmrg    rep.type = X_Reply;
1836df26cacSmrg    rep.length = 0;
1846df26cacSmrg    rep.sequenceNumber = client->sequence;
1856df26cacSmrg    rep.ScreenCount = pVMWARE->xineramaNumOutputs;
1866df26cacSmrg    if(client->swapped) {
1876df26cacSmrg       swaps(&rep.sequenceNumber, n);
1886df26cacSmrg       swapl(&rep.length, n);
1896df26cacSmrg       swaps(&rep.ScreenCount, n);
1906df26cacSmrg    }
1916df26cacSmrg    WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep);
1926df26cacSmrg    return client->noClientException;
1936df26cacSmrg}
1946df26cacSmrg
1956df26cacSmrg
1966df26cacSmrg/*
1976df26cacSmrg *----------------------------------------------------------------------------
1986df26cacSmrg *
1996df26cacSmrg * VMwareXineramaGetScreenSize --
2006df26cacSmrg *
2016df26cacSmrg *      Implementation of GetScreenSize command handler. Initialises and
2026df26cacSmrg *      sends a reply.
2036df26cacSmrg *
2046df26cacSmrg * Results:
2056df26cacSmrg *      Standard response codes.
2066df26cacSmrg *
2076df26cacSmrg * Side effects:
2086df26cacSmrg *      Writes reply to client.
2096df26cacSmrg *
2106df26cacSmrg *----------------------------------------------------------------------------
2116df26cacSmrg */
2126df26cacSmrg
2136df26cacSmrgstatic int
2146df26cacSmrgVMwareXineramaGetScreenSize(ClientPtr client)
2156df26cacSmrg{
2166df26cacSmrg    REQUEST(xPanoramiXGetScreenSizeReq);
2176df26cacSmrg    WindowPtr				pWin;
2186df26cacSmrg    xPanoramiXGetScreenSizeReply	rep;
2196df26cacSmrg    register int			n;
2206df26cacSmrg    ExtensionEntry *ext;
2216df26cacSmrg    ScrnInfoPtr pScrn;
2226df26cacSmrg    VMWAREPtr pVMWARE;
2236df26cacSmrg
2246df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
2256df26cacSmrg    pWin = LookupWindow (stuff->window, client);
2266df26cacSmrg    if(!pWin)  return BadWindow;
2276df26cacSmrg
2286df26cacSmrg    if (!(ext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
2296df26cacSmrg       return BadMatch;
2306df26cacSmrg    }
2316df26cacSmrg    pScrn = ext->extPrivate;
2326df26cacSmrg    pVMWARE = VMWAREPTR(pScrn);
2336df26cacSmrg
2346df26cacSmrg    rep.type = X_Reply;
2356df26cacSmrg    rep.length = 0;
2366df26cacSmrg    rep.sequenceNumber = client->sequence;
2376df26cacSmrg    rep.width  = pVMWARE->xineramaState[stuff->screen].width;
2386df26cacSmrg    rep.height  = pVMWARE->xineramaState[stuff->screen].height;
2396df26cacSmrg    if(client->swapped) {
2406df26cacSmrg       swaps(&rep.sequenceNumber, n);
2416df26cacSmrg       swapl(&rep.length, n);
2426df26cacSmrg       swaps(&rep.width, n);
2436df26cacSmrg       swaps(&rep.height, n);
2446df26cacSmrg    }
2456df26cacSmrg    WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep);
2466df26cacSmrg    return client->noClientException;
2476df26cacSmrg}
2486df26cacSmrg
2496df26cacSmrg
2506df26cacSmrg/*
2516df26cacSmrg *----------------------------------------------------------------------------
2526df26cacSmrg *
2536df26cacSmrg * VMwareXineramaIsActive --
2546df26cacSmrg *
2556df26cacSmrg *      Implementation of IsActive command handler. Initialises and
2566df26cacSmrg *      sends a reply.
2576df26cacSmrg *
2586df26cacSmrg * Results:
2596df26cacSmrg *      Standard response codes.
2606df26cacSmrg *
2616df26cacSmrg * Side effects:
2626df26cacSmrg *      Writes reply to client.
2636df26cacSmrg *
2646df26cacSmrg *----------------------------------------------------------------------------
2656df26cacSmrg */
2666df26cacSmrg
2676df26cacSmrgstatic int
2686df26cacSmrgVMwareXineramaIsActive(ClientPtr client)
2696df26cacSmrg{
2706df26cacSmrg    xXineramaIsActiveReply	rep;
2716df26cacSmrg    ExtensionEntry *ext;
2726df26cacSmrg    ScrnInfoPtr pScrn;
2736df26cacSmrg    VMWAREPtr pVMWARE;
2746df26cacSmrg
2756df26cacSmrg    REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
2766df26cacSmrg
2776df26cacSmrg    if (!(ext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
2786df26cacSmrg       return BadMatch;
2796df26cacSmrg    }
2806df26cacSmrg    pScrn = ext->extPrivate;
2816df26cacSmrg    pVMWARE = VMWAREPTR(pScrn);
2826df26cacSmrg
2836df26cacSmrg    rep.type = X_Reply;
2846df26cacSmrg    rep.length = 0;
2856df26cacSmrg    rep.sequenceNumber = client->sequence;
2866df26cacSmrg    rep.state = pVMWARE->xinerama;
2876df26cacSmrg    if(client->swapped) {
2886df26cacSmrg	register int n;
2896df26cacSmrg	swaps(&rep.sequenceNumber, n);
2906df26cacSmrg	swapl(&rep.length, n);
2916df26cacSmrg	swapl(&rep.state, n);
2926df26cacSmrg    }
2936df26cacSmrg    WriteToClient(client, sizeof(xXineramaIsActiveReply), (char *) &rep);
2946df26cacSmrg    return client->noClientException;
2956df26cacSmrg}
2966df26cacSmrg
2976df26cacSmrg
2986df26cacSmrg/*
2996df26cacSmrg *----------------------------------------------------------------------------
3006df26cacSmrg *
3016df26cacSmrg * VMwareXineramaQueryScreens --
3026df26cacSmrg *
3036df26cacSmrg *      Implementation of QueryScreens command handler. Initialises and
3046df26cacSmrg *      sends a reply.
3056df26cacSmrg *
3066df26cacSmrg * Results:
3076df26cacSmrg *      Standard response codes.
3086df26cacSmrg *
3096df26cacSmrg * Side effects:
3106df26cacSmrg *      Writes reply to client.
3116df26cacSmrg *
3126df26cacSmrg *----------------------------------------------------------------------------
3136df26cacSmrg */
3146df26cacSmrg
3156df26cacSmrgstatic int
3166df26cacSmrgVMwareXineramaQueryScreens(ClientPtr client)
3176df26cacSmrg{
3186df26cacSmrg    xXineramaQueryScreensReply	rep;
3196df26cacSmrg    ExtensionEntry *ext;
3206df26cacSmrg    ScrnInfoPtr pScrn;
3216df26cacSmrg    VMWAREPtr pVMWARE;
3226df26cacSmrg
3236df26cacSmrg    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
3246df26cacSmrg
3256df26cacSmrg    if (!(ext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
3266df26cacSmrg       return BadMatch;
3276df26cacSmrg    }
3286df26cacSmrg    pScrn = ext->extPrivate;
3296df26cacSmrg    pVMWARE = VMWAREPTR(pScrn);
3306df26cacSmrg
3316df26cacSmrg    rep.type = X_Reply;
3326df26cacSmrg    rep.sequenceNumber = client->sequence;
3336df26cacSmrg    rep.number = pVMWARE->xinerama ? pVMWARE->xineramaNumOutputs : 0;
3346df26cacSmrg    rep.length = rep.number * sz_XineramaScreenInfo >> 2;
3356df26cacSmrg    if(client->swapped) {
3366df26cacSmrg       register int n;
3376df26cacSmrg       swaps(&rep.sequenceNumber, n);
3386df26cacSmrg       swapl(&rep.length, n);
3396df26cacSmrg       swapl(&rep.number, n);
3406df26cacSmrg    }
3416df26cacSmrg    WriteToClient(client, sizeof(xXineramaQueryScreensReply), (char *)&rep);
3426df26cacSmrg
3436df26cacSmrg    if(pVMWARE->xinerama) {
3446df26cacSmrg       xXineramaScreenInfo scratch;
3456df26cacSmrg       int i;
3466df26cacSmrg
3476df26cacSmrg       for(i = 0; i < pVMWARE->xineramaNumOutputs; i++) {
3486df26cacSmrg	  scratch.x_org  = pVMWARE->xineramaState[i].x_org;
3496df26cacSmrg	  scratch.y_org  = pVMWARE->xineramaState[i].y_org;
3506df26cacSmrg	  scratch.width  = pVMWARE->xineramaState[i].width;
3516df26cacSmrg	  scratch.height = pVMWARE->xineramaState[i].height;
3526df26cacSmrg	  if(client->swapped) {
3536df26cacSmrg	     register int n;
3546df26cacSmrg	     swaps(&scratch.x_org, n);
3556df26cacSmrg	     swaps(&scratch.y_org, n);
3566df26cacSmrg	     swaps(&scratch.width, n);
3576df26cacSmrg	     swaps(&scratch.height, n);
3586df26cacSmrg	  }
3596df26cacSmrg	  WriteToClient(client, sz_XineramaScreenInfo, (char *)&scratch);
3606df26cacSmrg       }
3616df26cacSmrg    }
3626df26cacSmrg
3636df26cacSmrg    return client->noClientException;
3646df26cacSmrg}
3656df26cacSmrg
3666df26cacSmrg
3676df26cacSmrg/*
3686df26cacSmrg *----------------------------------------------------------------------------
3696df26cacSmrg *
3706df26cacSmrg * VMwareXineramaDispatch --
3716df26cacSmrg *
3726df26cacSmrg *      Dispatcher for Xinerama commands. Calls the correct handler for
3736df26cacSmrg *      each command type.
3746df26cacSmrg *
3756df26cacSmrg * Results:
3766df26cacSmrg *      Standard response codes.
3776df26cacSmrg *
3786df26cacSmrg * Side effects:
3796df26cacSmrg *      Side effects of individual command handlers.
3806df26cacSmrg *
3816df26cacSmrg *----------------------------------------------------------------------------
3826df26cacSmrg */
3836df26cacSmrg
3846df26cacSmrgstatic int
3856df26cacSmrgVMwareXineramaDispatch(ClientPtr client)
3866df26cacSmrg{
3876df26cacSmrg    REQUEST(xReq);
3886df26cacSmrg    switch (stuff->data) {
3896df26cacSmrg	case X_PanoramiXQueryVersion:
3906df26cacSmrg	     return VMwareXineramaQueryVersion(client);
3916df26cacSmrg	case X_PanoramiXGetState:
3926df26cacSmrg	     return VMwareXineramaGetState(client);
3936df26cacSmrg	case X_PanoramiXGetScreenCount:
3946df26cacSmrg	     return VMwareXineramaGetScreenCount(client);
3956df26cacSmrg	case X_PanoramiXGetScreenSize:
3966df26cacSmrg	     return VMwareXineramaGetScreenSize(client);
3976df26cacSmrg	case X_XineramaIsActive:
3986df26cacSmrg	     return VMwareXineramaIsActive(client);
3996df26cacSmrg	case X_XineramaQueryScreens:
4006df26cacSmrg	     return VMwareXineramaQueryScreens(client);
4016df26cacSmrg    }
4026df26cacSmrg    return BadRequest;
4036df26cacSmrg}
4046df26cacSmrg
4056df26cacSmrg
4066df26cacSmrg/*
4076df26cacSmrg *----------------------------------------------------------------------------
4086df26cacSmrg *
4096df26cacSmrg * SVMwareXineramaQueryVersion --
4106df26cacSmrg *
4116df26cacSmrg *      Wrapper for QueryVersion handler that handles input from other-endian
4126df26cacSmrg *      clients.
4136df26cacSmrg *
4146df26cacSmrg * Results:
4156df26cacSmrg *      Standard response codes.
4166df26cacSmrg *
4176df26cacSmrg * Side effects:
4186df26cacSmrg *      Side effects of unswapped implementation.
4196df26cacSmrg *
4206df26cacSmrg *----------------------------------------------------------------------------
4216df26cacSmrg */
4226df26cacSmrg
4236df26cacSmrgstatic int
4246df26cacSmrgSVMwareXineramaQueryVersion (ClientPtr client)
4256df26cacSmrg{
4266df26cacSmrg    REQUEST(xPanoramiXQueryVersionReq);
4276df26cacSmrg    register int n;
4286df26cacSmrg    swaps(&stuff->length,n);
4296df26cacSmrg    REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
4306df26cacSmrg    return VMwareXineramaQueryVersion(client);
4316df26cacSmrg}
4326df26cacSmrg
4336df26cacSmrg
4346df26cacSmrg/*
4356df26cacSmrg *----------------------------------------------------------------------------
4366df26cacSmrg *
4376df26cacSmrg * SVMwareXineramaGetState --
4386df26cacSmrg *
4396df26cacSmrg *      Wrapper for GetState handler that handles input from other-endian
4406df26cacSmrg *      clients.
4416df26cacSmrg *
4426df26cacSmrg * Results:
4436df26cacSmrg *      Standard response codes.
4446df26cacSmrg *
4456df26cacSmrg * Side effects:
4466df26cacSmrg *      Side effects of unswapped implementation.
4476df26cacSmrg *
4486df26cacSmrg *----------------------------------------------------------------------------
4496df26cacSmrg */
4506df26cacSmrg
4516df26cacSmrgstatic int
4526df26cacSmrgSVMwareXineramaGetState(ClientPtr client)
4536df26cacSmrg{
4546df26cacSmrg    REQUEST(xPanoramiXGetStateReq);
4556df26cacSmrg    register int n;
4566df26cacSmrg    swaps (&stuff->length, n);
4576df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
4586df26cacSmrg    return VMwareXineramaGetState(client);
4596df26cacSmrg}
4606df26cacSmrg
4616df26cacSmrg
4626df26cacSmrg/*
4636df26cacSmrg *----------------------------------------------------------------------------
4646df26cacSmrg *
4656df26cacSmrg * SVMwareXineramaGetScreenCount --
4666df26cacSmrg *
4676df26cacSmrg *      Wrapper for GetScreenCount handler that handles input from other-endian
4686df26cacSmrg *      clients.
4696df26cacSmrg *
4706df26cacSmrg * Results:
4716df26cacSmrg *      Standard response codes.
4726df26cacSmrg *
4736df26cacSmrg * Side effects:
4746df26cacSmrg *      Side effects of unswapped implementation.
4756df26cacSmrg *
4766df26cacSmrg *----------------------------------------------------------------------------
4776df26cacSmrg */
4786df26cacSmrg
4796df26cacSmrgstatic int
4806df26cacSmrgSVMwareXineramaGetScreenCount(ClientPtr client)
4816df26cacSmrg{
4826df26cacSmrg    REQUEST(xPanoramiXGetScreenCountReq);
4836df26cacSmrg    register int n;
4846df26cacSmrg    swaps (&stuff->length, n);
4856df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
4866df26cacSmrg    return VMwareXineramaGetScreenCount(client);
4876df26cacSmrg}
4886df26cacSmrg
4896df26cacSmrg
4906df26cacSmrg/*
4916df26cacSmrg *----------------------------------------------------------------------------
4926df26cacSmrg *
4936df26cacSmrg * SVMwareXineramaGetScreenSize --
4946df26cacSmrg *
4956df26cacSmrg *      Wrapper for GetScreenSize handler that handles input from other-endian
4966df26cacSmrg *      clients.
4976df26cacSmrg *
4986df26cacSmrg * Results:
4996df26cacSmrg *      Standard response codes.
5006df26cacSmrg *
5016df26cacSmrg * Side effects:
5026df26cacSmrg *      Side effects of unswapped implementation.
5036df26cacSmrg *
5046df26cacSmrg *----------------------------------------------------------------------------
5056df26cacSmrg */
5066df26cacSmrg
5076df26cacSmrgstatic int
5086df26cacSmrgSVMwareXineramaGetScreenSize(ClientPtr client)
5096df26cacSmrg{
5106df26cacSmrg    REQUEST(xPanoramiXGetScreenSizeReq);
5116df26cacSmrg    register int n;
5126df26cacSmrg    swaps (&stuff->length, n);
5136df26cacSmrg    REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
5146df26cacSmrg    return VMwareXineramaGetScreenSize(client);
5156df26cacSmrg}
5166df26cacSmrg
5176df26cacSmrg
5186df26cacSmrg/*
5196df26cacSmrg *----------------------------------------------------------------------------
5206df26cacSmrg *
5216df26cacSmrg * SVMwareXineramaIsActive --
5226df26cacSmrg *
5236df26cacSmrg *      Wrapper for IsActive handler that handles input from other-endian
5246df26cacSmrg *      clients.
5256df26cacSmrg *
5266df26cacSmrg * Results:
5276df26cacSmrg *      Standard response codes.
5286df26cacSmrg *
5296df26cacSmrg * Side effects:
5306df26cacSmrg *      Side effects of unswapped implementation.
5316df26cacSmrg *
5326df26cacSmrg *----------------------------------------------------------------------------
5336df26cacSmrg */
5346df26cacSmrg
5356df26cacSmrgstatic int
5366df26cacSmrgSVMwareXineramaIsActive(ClientPtr client)
5376df26cacSmrg{
5386df26cacSmrg    REQUEST(xXineramaIsActiveReq);
5396df26cacSmrg    register int n;
5406df26cacSmrg    swaps (&stuff->length, n);
5416df26cacSmrg    REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
5426df26cacSmrg    return VMwareXineramaIsActive(client);
5436df26cacSmrg}
5446df26cacSmrg
5456df26cacSmrg
5466df26cacSmrg/*
5476df26cacSmrg *----------------------------------------------------------------------------
5486df26cacSmrg *
5496df26cacSmrg * SVMwareXineramaQueryScreens --
5506df26cacSmrg *
5516df26cacSmrg *      Wrapper for QueryScreens handler that handles input from other-endian
5526df26cacSmrg *      clients.
5536df26cacSmrg *
5546df26cacSmrg * Results:
5556df26cacSmrg *      Standard response codes.
5566df26cacSmrg *
5576df26cacSmrg * Side effects:
5586df26cacSmrg *      Side effects of unswapped implementation.
5596df26cacSmrg *
5606df26cacSmrg *----------------------------------------------------------------------------
5616df26cacSmrg */
5626df26cacSmrg
5636df26cacSmrgstatic int
5646df26cacSmrgSVMwareXineramaQueryScreens(ClientPtr client)
5656df26cacSmrg{
5666df26cacSmrg    REQUEST(xXineramaQueryScreensReq);
5676df26cacSmrg    register int n;
5686df26cacSmrg    swaps (&stuff->length, n);
5696df26cacSmrg    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
5706df26cacSmrg    return VMwareXineramaQueryScreens(client);
5716df26cacSmrg}
5726df26cacSmrg
5736df26cacSmrg
5746df26cacSmrg/*
5756df26cacSmrg *----------------------------------------------------------------------------
5766df26cacSmrg *
5776df26cacSmrg * SVMwareXineramaDispatch --
5786df26cacSmrg *
5796df26cacSmrg *      Wrapper for dispatcher that handles input from other-endian clients.
5806df26cacSmrg *
5816df26cacSmrg * Results:
5826df26cacSmrg *      Standard response codes.
5836df26cacSmrg *
5846df26cacSmrg * Side effects:
5856df26cacSmrg *      Side effects of individual command handlers.
5866df26cacSmrg *
5876df26cacSmrg *----------------------------------------------------------------------------
5886df26cacSmrg */
5896df26cacSmrg
5906df26cacSmrgstatic int
5916df26cacSmrgSVMwareXineramaDispatch(ClientPtr client)
5926df26cacSmrg{
5936df26cacSmrg    REQUEST(xReq);
5946df26cacSmrg    switch (stuff->data) {
5956df26cacSmrg	case X_PanoramiXQueryVersion:
5966df26cacSmrg	     return SVMwareXineramaQueryVersion(client);
5976df26cacSmrg	case X_PanoramiXGetState:
5986df26cacSmrg	     return SVMwareXineramaGetState(client);
5996df26cacSmrg	case X_PanoramiXGetScreenCount:
6006df26cacSmrg	     return SVMwareXineramaGetScreenCount(client);
6016df26cacSmrg	case X_PanoramiXGetScreenSize:
6026df26cacSmrg	     return SVMwareXineramaGetScreenSize(client);
6036df26cacSmrg	case X_XineramaIsActive:
6046df26cacSmrg	     return SVMwareXineramaIsActive(client);
6056df26cacSmrg	case X_XineramaQueryScreens:
6066df26cacSmrg	     return SVMwareXineramaQueryScreens(client);
6076df26cacSmrg    }
6086df26cacSmrg    return BadRequest;
6096df26cacSmrg}
6106df26cacSmrg
6116df26cacSmrg
6126df26cacSmrg/*
6136df26cacSmrg *----------------------------------------------------------------------------
6146df26cacSmrg *
6156df26cacSmrg * VMwareXineramaResetProc --
6166df26cacSmrg *
6176df26cacSmrg *      Cleanup handler called when the extension is removed.
6186df26cacSmrg *
6196df26cacSmrg * Results:
6206df26cacSmrg *      None
6216df26cacSmrg *
6226df26cacSmrg * Side effects:
6236df26cacSmrg *      None
6246df26cacSmrg *
6256df26cacSmrg *----------------------------------------------------------------------------
6266df26cacSmrg */
6276df26cacSmrg
6286df26cacSmrgstatic void
6296df26cacSmrgVMwareXineramaResetProc(ExtensionEntry* extEntry)
6306df26cacSmrg{
6316df26cacSmrg    /* Called by CloseDownExtensions() */
6326df26cacSmrg
6336df26cacSmrg   ScrnInfoPtr pScrn = extEntry->extPrivate;
6346df26cacSmrg   VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
6356df26cacSmrg
6366df26cacSmrg   if (pVMWARE->xineramaState) {
637a241306cSmrg      free(pVMWARE->xineramaState);
6386df26cacSmrg      pVMWARE->xineramaState = NULL;
6396df26cacSmrg      pVMWARE->xineramaNumOutputs = 0;
6406df26cacSmrg      pVMWARE->xinerama = FALSE;
6416df26cacSmrg   }
6426df26cacSmrg}
6436df26cacSmrg
6446df26cacSmrg
6456df26cacSmrg/*
6466df26cacSmrg *----------------------------------------------------------------------------
6476df26cacSmrg *
6486df26cacSmrg * VMwareCtrl_ExitInit --
6496df26cacSmrg *
6506df26cacSmrg *      Initialiser for the Xinerama protocol extension.
6516df26cacSmrg *
6526df26cacSmrg * Results:
6536df26cacSmrg *      None.
6546df26cacSmrg *
6556df26cacSmrg * Side effects:
6566df26cacSmrg *      Protocol extension will be registered if successful.
6576df26cacSmrg *
6586df26cacSmrg *----------------------------------------------------------------------------
6596df26cacSmrg */
6606df26cacSmrg
6616df26cacSmrgvoid
6626df26cacSmrgVMwareXinerama_ExtInit(ScrnInfoPtr pScrn)
6636df26cacSmrg{
6646df26cacSmrg   ExtensionEntry *myext;
6656df26cacSmrg   VMWAREPtr pVMWARE = VMWAREPTR(pScrn);
6666df26cacSmrg
6676df26cacSmrg#ifdef PANORAMIX
6686df26cacSmrg   if(!noPanoramiXExtension) {
6696df26cacSmrg      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
6706df26cacSmrg                 "Built-in Xinerama active, not initializing VMware Xinerama\n");
6716df26cacSmrg      pVMWARE->xinerama = FALSE;
6726df26cacSmrg      return;
6736df26cacSmrg   }
6746df26cacSmrg#endif
6756df26cacSmrg
6766df26cacSmrg   if (!(myext = CheckExtension(PANORAMIX_PROTOCOL_NAME))) {
6776df26cacSmrg      if (!(myext = AddExtension(PANORAMIX_PROTOCOL_NAME, 0, 0,
6786df26cacSmrg                                 VMwareXineramaDispatch,
6796df26cacSmrg                                 SVMwareXineramaDispatch,
6806df26cacSmrg                                 VMwareXineramaResetProc,
6816df26cacSmrg                                 StandardMinorOpcode))) {
6826df26cacSmrg         xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
6836df26cacSmrg                    "Failed to add VMware Xinerama extension.\n");
6846df26cacSmrg         return;
6856df26cacSmrg      }
6866df26cacSmrg
6876df26cacSmrg      pVMWARE->xinerama = TRUE;
6886df26cacSmrg
6896df26cacSmrg      myext->extPrivate = pScrn;
6906df26cacSmrg
6916df26cacSmrg      xf86DrvMsg(pScrn->scrnIndex, X_INFO,
6926df26cacSmrg                 "Initialized VMware Xinerama extension.\n");
6936df26cacSmrg   }
6946df26cacSmrg}
695