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