vmwarectrl.c revision 16fd1166
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 * vmwarectrl.c -- 306df26cacSmrg * 316df26cacSmrg * The implementation of the VMWARE_CTRL protocol extension that 326df26cacSmrg * allows X clients to communicate with the driver. 336df26cacSmrg */ 346df26cacSmrg 356df26cacSmrg 366df26cacSmrg#ifdef HAVE_CONFIG_H 376df26cacSmrg#include "config.h" 386df26cacSmrg#endif 396df26cacSmrg 406df26cacSmrg#define NEED_REPLIES 416df26cacSmrg#define NEED_EVENTS 426df26cacSmrg#include "dixstruct.h" 436df26cacSmrg#include "extnsionst.h" 446df26cacSmrg#include <X11/X.h> 456df26cacSmrg#include <X11/extensions/panoramiXproto.h> 466df26cacSmrg 476df26cacSmrg#include "vmware.h" 486df26cacSmrg#include "vmwarectrlproto.h" 496df26cacSmrg 506df26cacSmrg 516df26cacSmrg/* 526df26cacSmrg *---------------------------------------------------------------------------- 536df26cacSmrg * 546df26cacSmrg * VMwareCtrlQueryVersion -- 556df26cacSmrg * 566df26cacSmrg * Implementation of QueryVersion command handler. Initialises and 576df26cacSmrg * sends a reply. 586df26cacSmrg * 596df26cacSmrg * Results: 606df26cacSmrg * Standard response codes. 616df26cacSmrg * 626df26cacSmrg * Side effects: 636df26cacSmrg * Writes reply to client 646df26cacSmrg * 656df26cacSmrg *---------------------------------------------------------------------------- 666df26cacSmrg */ 676df26cacSmrg 686df26cacSmrgstatic int 696df26cacSmrgVMwareCtrlQueryVersion(ClientPtr client) 706df26cacSmrg{ 716df26cacSmrg xVMwareCtrlQueryVersionReply rep = { 0, }; 726df26cacSmrg register int n; 736df26cacSmrg 746df26cacSmrg REQUEST_SIZE_MATCH(xVMwareCtrlQueryVersionReq); 756df26cacSmrg 766df26cacSmrg rep.type = X_Reply; 776df26cacSmrg rep.length = 0; 786df26cacSmrg rep.sequenceNumber = client->sequence; 796df26cacSmrg rep.majorVersion = VMWARE_CTRL_MAJOR_VERSION; 806df26cacSmrg rep.minorVersion = VMWARE_CTRL_MINOR_VERSION; 816df26cacSmrg if (client->swapped) { 826df26cacSmrg swaps(&rep.sequenceNumber, n); 836df26cacSmrg swapl(&rep.length, n); 846df26cacSmrg swapl(&rep.majorVersion, n); 856df26cacSmrg swapl(&rep.minorVersion, n); 866df26cacSmrg } 876df26cacSmrg WriteToClient(client, sizeof(xVMwareCtrlQueryVersionReply), (char *)&rep); 886df26cacSmrg 896df26cacSmrg return client->noClientException; 906df26cacSmrg} 916df26cacSmrg 926df26cacSmrg 936df26cacSmrg/* 946df26cacSmrg *---------------------------------------------------------------------------- 956df26cacSmrg * 966df26cacSmrg * VMwareCtrlDoSetRes -- 976df26cacSmrg * 986df26cacSmrg * Set the custom resolution into the mode list. 996df26cacSmrg * 1006df26cacSmrg * This is done by alternately updating one of two dynamic modes. It is 1016df26cacSmrg * done this way because the server gets upset if you try to switch 1026df26cacSmrg * to a new resolution that has the same index as the current one. 1036df26cacSmrg * 1046df26cacSmrg * Results: 1056df26cacSmrg * TRUE on success, FALSE otherwise. 1066df26cacSmrg * 1076df26cacSmrg * Side effects: 1086df26cacSmrg * One dynamic mode will be updated if successful. 1096df26cacSmrg * 1106df26cacSmrg *---------------------------------------------------------------------------- 1116df26cacSmrg */ 1126df26cacSmrg 1136df26cacSmrgstatic Bool 1146df26cacSmrgVMwareCtrlDoSetRes(ScrnInfoPtr pScrn, 1156df26cacSmrg CARD32 x, 1166df26cacSmrg CARD32 y, 1176df26cacSmrg Bool resetXinerama) 1186df26cacSmrg{ 11916fd1166Smrg int modeIndex; 1206df26cacSmrg DisplayModePtr mode; 1216df26cacSmrg VMWAREPtr pVMWARE = VMWAREPTR(pScrn); 1226df26cacSmrg 1236df26cacSmrg if (pScrn && pScrn->modes) { 1246df26cacSmrg VmwareLog(("DoSetRes: %d %d\n", x, y)); 12516fd1166Smrg 1266df26cacSmrg if (resetXinerama) { 1276df26cacSmrg xfree(pVMWARE->xineramaNextState); 1286df26cacSmrg pVMWARE->xineramaNextState = NULL; 1296df26cacSmrg pVMWARE->xineramaNextNumOutputs = 0; 1306df26cacSmrg } 1316df26cacSmrg 13216fd1166Smrg /* 1336df26cacSmrg * Don't resize larger than possible but don't 1346df26cacSmrg * return an X Error either. 1356df26cacSmrg */ 1366df26cacSmrg if (x > pVMWARE->maxWidth || 1376df26cacSmrg y > pVMWARE->maxHeight) { 1386df26cacSmrg return TRUE; 1396df26cacSmrg } 1406df26cacSmrg 1416df26cacSmrg /* 14216fd1166Smrg * Find an dynamic mode which isn't current, and replace it with 14316fd1166Smrg * the requested mode. Normally this will cause us to alternate 14416fd1166Smrg * between two dynamic mode slots, but there are some important 14516fd1166Smrg * corner cases to consider. For example, adding the same mode 14616fd1166Smrg * multiple times, adding a mode that we never switch to, or 14716fd1166Smrg * adding a mode which is a duplicate of a built-in mode. The 14816fd1166Smrg * best way to handle all of these cases is to directly test the 14916fd1166Smrg * dynamic mode against the current mode pointer for this 15016fd1166Smrg * screen. 1516df26cacSmrg */ 1526df26cacSmrg 15316fd1166Smrg for (modeIndex = 0; modeIndex < NUM_DYN_MODES; modeIndex++) { 15416fd1166Smrg /* 15516fd1166Smrg * Initialise the dynamic mode if it hasn't been used before. 15616fd1166Smrg */ 15716fd1166Smrg if (!pVMWARE->dynModes[modeIndex]) { 15816fd1166Smrg pVMWARE->dynModes[modeIndex] = VMWAREAddDisplayMode(pScrn, "DynMode", 1, 1); 15916fd1166Smrg } 16016fd1166Smrg 16116fd1166Smrg mode = pVMWARE->dynModes[modeIndex]; 16216fd1166Smrg if (mode != pScrn->currentMode) { 16316fd1166Smrg break; 16416fd1166Smrg } 1656df26cacSmrg } 1666df26cacSmrg 1676df26cacSmrg mode->HDisplay = x; 1686df26cacSmrg mode->VDisplay = y; 1696df26cacSmrg 1706df26cacSmrg return TRUE; 1716df26cacSmrg } else { 1726df26cacSmrg return FALSE; 1736df26cacSmrg } 1746df26cacSmrg} 1756df26cacSmrg 1766df26cacSmrg 1776df26cacSmrg/* 1786df26cacSmrg *---------------------------------------------------------------------------- 1796df26cacSmrg * 1806df26cacSmrg * VMwareCtrlSetRes -- 1816df26cacSmrg * 1826df26cacSmrg * Implementation of SetRes command handler. Initialises and sends a 1836df26cacSmrg * reply. 1846df26cacSmrg * 1856df26cacSmrg * Results: 1866df26cacSmrg * Standard response codes. 1876df26cacSmrg * 1886df26cacSmrg * Side effects: 1896df26cacSmrg * Writes reply to client 1906df26cacSmrg * 1916df26cacSmrg *---------------------------------------------------------------------------- 1926df26cacSmrg */ 1936df26cacSmrg 1946df26cacSmrgstatic int 1956df26cacSmrgVMwareCtrlSetRes(ClientPtr client) 1966df26cacSmrg{ 1976df26cacSmrg REQUEST(xVMwareCtrlSetResReq); 1986df26cacSmrg xVMwareCtrlSetResReply rep = { 0, }; 1996df26cacSmrg ScrnInfoPtr pScrn; 2006df26cacSmrg ExtensionEntry *ext; 2016df26cacSmrg register int n; 2026df26cacSmrg 2036df26cacSmrg REQUEST_SIZE_MATCH(xVMwareCtrlSetResReq); 2046df26cacSmrg 2056df26cacSmrg if (!(ext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) { 2066df26cacSmrg return BadMatch; 2076df26cacSmrg } 2086df26cacSmrg 2096df26cacSmrg pScrn = ext->extPrivate; 2106df26cacSmrg if (pScrn->scrnIndex != stuff->screen) { 2116df26cacSmrg return BadMatch; 2126df26cacSmrg } 2136df26cacSmrg 2146df26cacSmrg if (!VMwareCtrlDoSetRes(pScrn, stuff->x, stuff->y, TRUE)) { 2156df26cacSmrg return BadValue; 2166df26cacSmrg } 2176df26cacSmrg 2186df26cacSmrg rep.type = X_Reply; 2196df26cacSmrg rep.length = (sizeof(xVMwareCtrlSetResReply) - sizeof(xGenericReply)) >> 2; 2206df26cacSmrg rep.sequenceNumber = client->sequence; 2216df26cacSmrg rep.screen = stuff->screen; 2226df26cacSmrg rep.x = stuff->x; 2236df26cacSmrg rep.y = stuff->y; 2246df26cacSmrg if (client->swapped) { 2256df26cacSmrg swaps(&rep.sequenceNumber, n); 2266df26cacSmrg swapl(&rep.length, n); 2276df26cacSmrg swapl(&rep.screen, n); 2286df26cacSmrg swapl(&rep.x, n); 2296df26cacSmrg swapl(&rep.y, n); 2306df26cacSmrg } 2316df26cacSmrg WriteToClient(client, sizeof(xVMwareCtrlSetResReply), (char *)&rep); 2326df26cacSmrg 2336df26cacSmrg return client->noClientException; 2346df26cacSmrg} 2356df26cacSmrg 2366df26cacSmrg 2376df26cacSmrg/* 2386df26cacSmrg *---------------------------------------------------------------------------- 2396df26cacSmrg * 2406df26cacSmrg * VMwareCtrlDoSetTopology -- 2416df26cacSmrg * 2426df26cacSmrg * Set the custom topology and set a dynamic mode to the bounding box 2436df26cacSmrg * of the passed topology. If a topology is already pending, then do 2446df26cacSmrg * nothing but do not return failure. 2456df26cacSmrg * 2466df26cacSmrg * Results: 2476df26cacSmrg * TRUE on success, FALSE otherwise. 2486df26cacSmrg * 2496df26cacSmrg * Side effects: 2506df26cacSmrg * One dynamic mode and the pending xinerama state will be updated if 2516df26cacSmrg * successful. 2526df26cacSmrg * 2536df26cacSmrg *---------------------------------------------------------------------------- 2546df26cacSmrg */ 2556df26cacSmrg 2566df26cacSmrgstatic Bool 2576df26cacSmrgVMwareCtrlDoSetTopology(ScrnInfoPtr pScrn, 2586df26cacSmrg xXineramaScreenInfo *extents, 2596df26cacSmrg unsigned long number) 2606df26cacSmrg{ 2616df26cacSmrg VMWAREPtr pVMWARE = VMWAREPTR(pScrn); 2626df26cacSmrg 2636df26cacSmrg if (pVMWARE && pVMWARE->xinerama) { 2646df26cacSmrg VMWAREXineramaPtr xineramaState; 2656df26cacSmrg short maxX = 0; 2666df26cacSmrg short maxY = 0; 2676df26cacSmrg size_t i; 2686df26cacSmrg 2696df26cacSmrg if (pVMWARE->xineramaNextState) { 2706df26cacSmrg VmwareLog(("DoSetTopology: Aborting due to existing pending state\n")); 2716df26cacSmrg return TRUE; 2726df26cacSmrg } 2736df26cacSmrg 2746df26cacSmrg for (i = 0; i < number; i++) { 2756df26cacSmrg maxX = MAX(maxX, extents[i].x_org + extents[i].width); 2766df26cacSmrg maxY = MAX(maxY, extents[i].y_org + extents[i].height); 2776df26cacSmrg } 2786df26cacSmrg 2796df26cacSmrg VmwareLog(("DoSetTopology: %d %d\n", maxX, maxY)); 2806df26cacSmrg 2816df26cacSmrg xineramaState = (VMWAREXineramaPtr)xcalloc(number, sizeof(VMWAREXineramaRec)); 2826df26cacSmrg if (xineramaState) { 2836df26cacSmrg memcpy(xineramaState, extents, number * sizeof (VMWAREXineramaRec)); 2846df26cacSmrg 2856df26cacSmrg xfree(pVMWARE->xineramaNextState); 2866df26cacSmrg pVMWARE->xineramaNextState = xineramaState; 2876df26cacSmrg pVMWARE->xineramaNextNumOutputs = number; 2886df26cacSmrg 2896df26cacSmrg return VMwareCtrlDoSetRes(pScrn, maxX, maxY, FALSE); 2906df26cacSmrg } else { 2916df26cacSmrg return FALSE; 2926df26cacSmrg } 2936df26cacSmrg } else { 2946df26cacSmrg return FALSE; 2956df26cacSmrg } 2966df26cacSmrg} 2976df26cacSmrg 2986df26cacSmrg 2996df26cacSmrg/* 3006df26cacSmrg *---------------------------------------------------------------------------- 3016df26cacSmrg * 3026df26cacSmrg * VMwareCtrlSetTopology -- 3036df26cacSmrg * 3046df26cacSmrg * Implementation of SetTopology command handler. Initialises and sends a 3056df26cacSmrg * reply. 3066df26cacSmrg * 3076df26cacSmrg * Results: 3086df26cacSmrg * Standard response codes. 3096df26cacSmrg * 3106df26cacSmrg * Side effects: 3116df26cacSmrg * Writes reply to client 3126df26cacSmrg * 3136df26cacSmrg *---------------------------------------------------------------------------- 3146df26cacSmrg */ 3156df26cacSmrg 3166df26cacSmrgstatic int 3176df26cacSmrgVMwareCtrlSetTopology(ClientPtr client) 3186df26cacSmrg{ 3196df26cacSmrg REQUEST(xVMwareCtrlSetTopologyReq); 3206df26cacSmrg xVMwareCtrlSetTopologyReply rep = { 0, }; 3216df26cacSmrg ScrnInfoPtr pScrn; 3226df26cacSmrg ExtensionEntry *ext; 3236df26cacSmrg register int n; 3246df26cacSmrg xXineramaScreenInfo *extents; 3256df26cacSmrg 3266df26cacSmrg REQUEST_AT_LEAST_SIZE(xVMwareCtrlSetTopologyReq); 3276df26cacSmrg 3286df26cacSmrg if (!(ext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) { 3296df26cacSmrg return BadMatch; 3306df26cacSmrg } 3316df26cacSmrg 3326df26cacSmrg pScrn = ext->extPrivate; 3336df26cacSmrg if (pScrn->scrnIndex != stuff->screen) { 3346df26cacSmrg return BadMatch; 3356df26cacSmrg } 3366df26cacSmrg 3376df26cacSmrg extents = (xXineramaScreenInfo *)(stuff + 1); 3386df26cacSmrg if (!VMwareCtrlDoSetTopology(pScrn, extents, stuff->number)) { 3396df26cacSmrg return BadValue; 3406df26cacSmrg } 3416df26cacSmrg 3426df26cacSmrg rep.type = X_Reply; 3436df26cacSmrg rep.length = (sizeof(xVMwareCtrlSetTopologyReply) - sizeof(xGenericReply)) >> 2; 3446df26cacSmrg rep.sequenceNumber = client->sequence; 3456df26cacSmrg rep.screen = stuff->screen; 3466df26cacSmrg if (client->swapped) { 3476df26cacSmrg swaps(&rep.sequenceNumber, n); 3486df26cacSmrg swapl(&rep.length, n); 3496df26cacSmrg swapl(&rep.screen, n); 3506df26cacSmrg } 3516df26cacSmrg WriteToClient(client, sizeof(xVMwareCtrlSetTopologyReply), (char *)&rep); 3526df26cacSmrg 3536df26cacSmrg return client->noClientException; 3546df26cacSmrg} 3556df26cacSmrg 3566df26cacSmrg 3576df26cacSmrg/* 3586df26cacSmrg *---------------------------------------------------------------------------- 3596df26cacSmrg * 3606df26cacSmrg * VMwareCtrlDispatch -- 3616df26cacSmrg * 3626df26cacSmrg * Dispatcher for VMWARE_CTRL commands. Calls the correct handler for 3636df26cacSmrg * each command type. 3646df26cacSmrg * 3656df26cacSmrg * Results: 3666df26cacSmrg * Standard response codes. 3676df26cacSmrg * 3686df26cacSmrg * Side effects: 3696df26cacSmrg * Side effects of individual command handlers. 3706df26cacSmrg * 3716df26cacSmrg *---------------------------------------------------------------------------- 3726df26cacSmrg */ 3736df26cacSmrg 3746df26cacSmrgstatic int 3756df26cacSmrgVMwareCtrlDispatch(ClientPtr client) 3766df26cacSmrg{ 3776df26cacSmrg REQUEST(xReq); 3786df26cacSmrg 3796df26cacSmrg switch(stuff->data) { 3806df26cacSmrg case X_VMwareCtrlQueryVersion: 3816df26cacSmrg return VMwareCtrlQueryVersion(client); 3826df26cacSmrg case X_VMwareCtrlSetRes: 3836df26cacSmrg return VMwareCtrlSetRes(client); 3846df26cacSmrg case X_VMwareCtrlSetTopology: 3856df26cacSmrg return VMwareCtrlSetTopology(client); 3866df26cacSmrg } 3876df26cacSmrg return BadRequest; 3886df26cacSmrg} 3896df26cacSmrg 3906df26cacSmrg 3916df26cacSmrg/* 3926df26cacSmrg *---------------------------------------------------------------------------- 3936df26cacSmrg * 3946df26cacSmrg * SVMwareCtrlQueryVersion -- 3956df26cacSmrg * 3966df26cacSmrg * Wrapper for QueryVersion handler that handles input from other-endian 3976df26cacSmrg * clients. 3986df26cacSmrg * 3996df26cacSmrg * Results: 4006df26cacSmrg * Standard response codes. 4016df26cacSmrg * 4026df26cacSmrg * Side effects: 4036df26cacSmrg * Side effects of unswapped implementation. 4046df26cacSmrg * 4056df26cacSmrg *---------------------------------------------------------------------------- 4066df26cacSmrg */ 4076df26cacSmrg 4086df26cacSmrgstatic int 4096df26cacSmrgSVMwareCtrlQueryVersion(ClientPtr client) 4106df26cacSmrg{ 4116df26cacSmrg register int n; 4126df26cacSmrg 4136df26cacSmrg REQUEST(xVMwareCtrlQueryVersionReq); 4146df26cacSmrg REQUEST_SIZE_MATCH(xVMwareCtrlQueryVersionReq); 4156df26cacSmrg 4166df26cacSmrg swaps(&stuff->length, n); 4176df26cacSmrg 4186df26cacSmrg return VMwareCtrlQueryVersion(client); 4196df26cacSmrg} 4206df26cacSmrg 4216df26cacSmrg 4226df26cacSmrg/* 4236df26cacSmrg *---------------------------------------------------------------------------- 4246df26cacSmrg * 4256df26cacSmrg * SVMwareCtrlSetRes -- 4266df26cacSmrg * 4276df26cacSmrg * Wrapper for SetRes handler that handles input from other-endian 4286df26cacSmrg * clients. 4296df26cacSmrg * 4306df26cacSmrg * Results: 4316df26cacSmrg * Standard response codes. 4326df26cacSmrg * 4336df26cacSmrg * Side effects: 4346df26cacSmrg * Side effects of unswapped implementation. 4356df26cacSmrg * 4366df26cacSmrg *---------------------------------------------------------------------------- 4376df26cacSmrg */ 4386df26cacSmrg 4396df26cacSmrgstatic int 4406df26cacSmrgSVMwareCtrlSetRes(ClientPtr client) 4416df26cacSmrg{ 4426df26cacSmrg register int n; 4436df26cacSmrg 4446df26cacSmrg REQUEST(xVMwareCtrlSetResReq); 4456df26cacSmrg REQUEST_SIZE_MATCH(xVMwareCtrlSetResReq); 4466df26cacSmrg 4476df26cacSmrg swaps(&stuff->length, n); 4486df26cacSmrg swapl(&stuff->screen, n); 4496df26cacSmrg swapl(&stuff->x, n); 4506df26cacSmrg swapl(&stuff->y, n); 4516df26cacSmrg 4526df26cacSmrg return VMwareCtrlSetRes(client); 4536df26cacSmrg} 4546df26cacSmrg 4556df26cacSmrg 4566df26cacSmrg/* 4576df26cacSmrg *---------------------------------------------------------------------------- 4586df26cacSmrg * 4596df26cacSmrg * SVMwareCtrlSetTopology -- 4606df26cacSmrg * 4616df26cacSmrg * Wrapper for SetTopology handler that handles input from other-endian 4626df26cacSmrg * clients. 4636df26cacSmrg * 4646df26cacSmrg * Results: 4656df26cacSmrg * Standard response codes. 4666df26cacSmrg * 4676df26cacSmrg * Side effects: 4686df26cacSmrg * Side effects of unswapped implementation. 4696df26cacSmrg * 4706df26cacSmrg *---------------------------------------------------------------------------- 4716df26cacSmrg */ 4726df26cacSmrg 4736df26cacSmrgstatic int 4746df26cacSmrgSVMwareCtrlSetTopology(ClientPtr client) 4756df26cacSmrg{ 4766df26cacSmrg register int n; 4776df26cacSmrg 4786df26cacSmrg REQUEST(xVMwareCtrlSetTopologyReq); 4796df26cacSmrg REQUEST_SIZE_MATCH(xVMwareCtrlSetTopologyReq); 4806df26cacSmrg 4816df26cacSmrg swaps(&stuff->length, n); 4826df26cacSmrg swapl(&stuff->screen, n); 4836df26cacSmrg swapl(&stuff->number, n); 4846df26cacSmrg /* Each extent is a struct of shorts. */ 4856df26cacSmrg SwapRestS(stuff); 4866df26cacSmrg 4876df26cacSmrg return VMwareCtrlSetTopology(client); 4886df26cacSmrg} 4896df26cacSmrg 4906df26cacSmrg 4916df26cacSmrg/* 4926df26cacSmrg *---------------------------------------------------------------------------- 4936df26cacSmrg * 4946df26cacSmrg * SVMwareCtrlDispatch -- 4956df26cacSmrg * 4966df26cacSmrg * Wrapper for dispatcher that handles input from other-endian clients. 4976df26cacSmrg * 4986df26cacSmrg * Results: 4996df26cacSmrg * Standard response codes. 5006df26cacSmrg * 5016df26cacSmrg * Side effects: 5026df26cacSmrg * Side effects of individual command handlers. 5036df26cacSmrg * 5046df26cacSmrg *---------------------------------------------------------------------------- 5056df26cacSmrg */ 5066df26cacSmrg 5076df26cacSmrgstatic int 5086df26cacSmrgSVMwareCtrlDispatch(ClientPtr client) 5096df26cacSmrg{ 5106df26cacSmrg REQUEST(xReq); 5116df26cacSmrg 5126df26cacSmrg switch(stuff->data) { 5136df26cacSmrg case X_VMwareCtrlQueryVersion: 5146df26cacSmrg return SVMwareCtrlQueryVersion(client); 5156df26cacSmrg case X_VMwareCtrlSetRes: 5166df26cacSmrg return SVMwareCtrlSetRes(client); 5176df26cacSmrg case X_VMwareCtrlSetTopology: 5186df26cacSmrg return SVMwareCtrlSetTopology(client); 5196df26cacSmrg } 5206df26cacSmrg return BadRequest; 5216df26cacSmrg} 5226df26cacSmrg 5236df26cacSmrg 5246df26cacSmrg/* 5256df26cacSmrg *---------------------------------------------------------------------------- 5266df26cacSmrg * 5276df26cacSmrg * VMwareCtrlResetProc -- 5286df26cacSmrg * 5296df26cacSmrg * Cleanup handler called when the extension is removed. 5306df26cacSmrg * 5316df26cacSmrg * Results: 5326df26cacSmrg * None 5336df26cacSmrg * 5346df26cacSmrg * Side effects: 5356df26cacSmrg * None 5366df26cacSmrg * 5376df26cacSmrg *---------------------------------------------------------------------------- 5386df26cacSmrg */ 5396df26cacSmrg 5406df26cacSmrgstatic void 5416df26cacSmrgVMwareCtrlResetProc(ExtensionEntry* extEntry) 5426df26cacSmrg{ 5436df26cacSmrg /* Currently, no cleanup is necessary. */ 5446df26cacSmrg} 5456df26cacSmrg 5466df26cacSmrg 5476df26cacSmrg/* 5486df26cacSmrg *---------------------------------------------------------------------------- 5496df26cacSmrg * 5506df26cacSmrg * VMwareCtrl_ExitInit -- 5516df26cacSmrg * 5526df26cacSmrg * Initialiser for the VMWARE_CTRL protocol extension. 5536df26cacSmrg * 5546df26cacSmrg * Results: 5556df26cacSmrg * None. 5566df26cacSmrg * 5576df26cacSmrg * Side effects: 5586df26cacSmrg * Protocol extension will be registered if successful. 5596df26cacSmrg * 5606df26cacSmrg *---------------------------------------------------------------------------- 5616df26cacSmrg */ 5626df26cacSmrg 5636df26cacSmrgvoid 5646df26cacSmrgVMwareCtrl_ExtInit(ScrnInfoPtr pScrn) 5656df26cacSmrg{ 5666df26cacSmrg ExtensionEntry *myext; 5676df26cacSmrg 5686df26cacSmrg if (!(myext = CheckExtension(VMWARE_CTRL_PROTOCOL_NAME))) { 5696df26cacSmrg if (!(myext = AddExtension(VMWARE_CTRL_PROTOCOL_NAME, 0, 0, 5706df26cacSmrg VMwareCtrlDispatch, 5716df26cacSmrg SVMwareCtrlDispatch, 5726df26cacSmrg VMwareCtrlResetProc, 5736df26cacSmrg StandardMinorOpcode))) { 5746df26cacSmrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 5756df26cacSmrg "Failed to add VMWARE_CTRL extension\n"); 5766df26cacSmrg return; 5776df26cacSmrg } 5786df26cacSmrg 5796df26cacSmrg /* 5806df26cacSmrg * For now, only support one screen as that's all the virtual 5816df26cacSmrg * hardware supports. 5826df26cacSmrg */ 5836df26cacSmrg myext->extPrivate = pScrn; 5846df26cacSmrg 5856df26cacSmrg xf86DrvMsg(pScrn->scrnIndex, X_INFO, 5866df26cacSmrg "Initialized VMWARE_CTRL extension version %d.%d\n", 5876df26cacSmrg VMWARE_CTRL_MAJOR_VERSION, VMWARE_CTRL_MINOR_VERSION); 5886df26cacSmrg } 5896df26cacSmrg} 590