diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2008-08-23 15:46:08 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2008-08-23 15:46:08 +0000 |
commit | 1dc0e4e5ba3c8a7b9cf0739229c4ea43bc91a797 (patch) | |
tree | 5bfd90bdbb589d76e02fc035f78abee8101de818 /driver/xf86-input-vmmouse | |
parent | 1cd06c9934bba135c31a14587439ee4067564645 (diff) |
xf86-input-vmmouse 12.5.1
Diffstat (limited to 'driver/xf86-input-vmmouse')
-rw-r--r-- | driver/xf86-input-vmmouse/configure.ac | 13 | ||||
-rw-r--r-- | driver/xf86-input-vmmouse/src/vmmouse.c | 259 | ||||
-rw-r--r-- | driver/xf86-input-vmmouse/src/vmmouse_client.c | 6 | ||||
-rw-r--r-- | driver/xf86-input-vmmouse/src/vmmouse_proto.h | 12 |
4 files changed, 186 insertions, 104 deletions
diff --git a/driver/xf86-input-vmmouse/configure.ac b/driver/xf86-input-vmmouse/configure.ac index bf558be6b..a57851fed 100644 --- a/driver/xf86-input-vmmouse/configure.ac +++ b/driver/xf86-input-vmmouse/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-input-vmmouse], - 12.4.0, + 12.5.1, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-input-vmmouse) @@ -75,9 +75,18 @@ XORG_DRIVER_CHECK_EXT(RANDR, randrproto) XORG_DRIVER_CHECK_EXT(XINPUT, inputproto) # Checks for pkg-config packages -PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.99.901] xproto $REQUIRED_MODULES) +PKG_CHECK_MODULES(XORG, [xorg-server >= 1.0.1] xproto $REQUIRED_MODULES) sdkdir=$(pkg-config --variable=sdkdir xorg-server) +PKG_CHECK_EXISTS([xorg-server >= 1.1.0], + [AC_DEFINE([HAVE_XORG_SERVER_1_1_0], 1, + [Has version 1.1.0 or greater of the Xserver])]) + +PKG_CHECK_EXISTS([xorg-server >= 1.3.99.0 xorg-server <= 1.4.0.90], + [AC_DEFINE([CALL_CONVERSION_PROC], 1, + [Call conversion_proc from within the driver, as + Xserver doesn't])]) + CFLAGS="$CFLAGS $XORG_CFLAGS "' -I$(top_srcdir)/src' AC_SUBST([CFLAGS]) diff --git a/driver/xf86-input-vmmouse/src/vmmouse.c b/driver/xf86-input-vmmouse/src/vmmouse.c index 5543c4ca7..1e2a1c9a0 100644 --- a/driver/xf86-input-vmmouse/src/vmmouse.c +++ b/driver/xf86-input-vmmouse/src/vmmouse.c @@ -32,11 +32,11 @@ * * This is a modified version of the mouse input driver * provided in Xserver/hw/xfree86/input/mouse/mouse.c - * + * * Although all data is read using the vmmouse protocol, notification * is still done through the PS/2 port, so all the basic code for * interacting with the port is retained. - * + * */ @@ -77,11 +77,41 @@ #include "vmmouse_client.h" /* + * This is the only way I know to turn a #define of an integer constant into + * a constant string. + */ +#define VMW_INNERSTRINGIFY(s) #s +#define VMW_STRING(str) VMW_INNERSTRINGIFY(str) + +/* + * So that the file compiles unmodified when dropped into an xfree source tree. + */ +#ifndef XORG_VERSION_CURRENT +#define XORG_VERSION_CURRENT XF86_VERSION_CURRENT +#endif + +/* * Version constants */ #define VMMOUSE_MAJOR_VERSION 12 -#define VMMOUSE_MINOR_VERSION 4 -#define VMMOUSE_PATCHLEVEL 0 +#define VMMOUSE_MINOR_VERSION 5 +#define VMMOUSE_PATCHLEVEL 1 +#define VMMOUSE_DRIVER_VERSION \ + (VMMOUSE_MAJOR_VERSION * 65536 + VMMOUSE_MINOR_VERSION * 256 + VMMOUSE_PATCHLEVEL) +#define VMMOUSE_DRIVER_VERSION_STRING \ + VMW_STRING(VMMOUSE_MAJOR_VERSION) "." VMW_STRING(VMMOUSE_MINOR_VERSION) \ + "." VMW_STRING(VMMOUSE_PATCHLEVEL) + +/* + * Standard four digit version string expected by VMware Tools installer. + * As the driver's version is only {major, minor, patchlevel}, simply append an + * extra zero for the fourth digit. + */ +#ifdef __GNUC__ +const char vm_mouse_version[] __attribute__((section(".modinfo"),unused)) = + "version=" VMMOUSE_DRIVER_VERSION_STRING ".0"; +#endif + /***************************************************************************** * static function header @@ -109,8 +139,8 @@ static void MouseCtrl(DeviceIntPtr device, PtrCtrl *ctrl); *****************************************************************************/ typedef struct { int screenNum; - Bool vmmouseAvailable; - Bool relative; + Bool vmmouseAvailable; + Bool relative; } VMMousePrivRec, *VMMousePrivPtr; static const char *reqSymbols[] = { @@ -165,7 +195,7 @@ InputDriverRec VMMOUSE = { "vmmouse", NULL, VMMousePreInit, - VMMouseUnInit, + VMMouseUnInit, NULL, 0 }; @@ -201,8 +231,8 @@ typedef enum { /* * Define the acceptable mouse options * Currently not all of those options are supported - * - */ + * + */ static const OptionInfoRec mouseOptions[] = { { OPTION_ALWAYS_CORE, "AlwaysCore", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SEND_CORE_EVENTS, "SendCoreEvents", OPTV_BOOLEAN, {0}, FALSE }, @@ -247,12 +277,12 @@ static char reverseMap[32] = { 0, 4, 2, 6, 1, 5, 3, 7, * This function collect all the information that is necessary to * determine the configuration of the hardware and to prepare the * device for being used - * + * * Results: * An InputInfoPtr object which points to vmmouse's information, * if the absolute pointing device available * Otherwise, an InputInfoPtr of regular mouse - * + * * Side effects: * VMMouse was initialized with necessary information * @@ -261,7 +291,7 @@ static char reverseMap[32] = { 0, 4, 2, 6, 1, 5, 3, 7, static InputInfoPtr VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) -{ +{ InputInfoPtr pInfo; MouseDevPtr pMse; VMMousePrivPtr mPriv; @@ -269,14 +299,14 @@ VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) /* * let Xserver init the mouse first - */ + */ osInfo = xf86OSMouseInit(0); if (!osInfo) return FALSE; - + mPriv = xcalloc (1, sizeof (VMMousePrivRec)); - + if (!mPriv) { return NULL; } @@ -298,7 +328,7 @@ VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) } else { return NULL; } - + } else { /* * vmmouse is available @@ -309,21 +339,23 @@ VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) * Disable the absolute pointing device for now * It will be enabled during DEVICE_ON phase */ - VMMouseClient_Disable(); + VMMouseClient_Disable(); } - + if (!(pInfo = xf86AllocateInput(drv, 0))) { xfree(mPriv); return NULL; - } + } /* Settup the pInfo */ - pInfo->name = dev->identifier; + pInfo->name = dev->identifier; pInfo->type_name = XI_MOUSE; pInfo->flags = XI86_POINTER_CAPABLE | XI86_SEND_DRAG_EVENTS; pInfo->device_control = VMMouseDeviceControl; pInfo->read_input = VMMouseReadInput; +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 pInfo->motion_history_proc = xf86GetMotionEvents; +#endif pInfo->control_proc = VMMouseControlProc; pInfo->close_proc = VMMouseCloseProc; pInfo->switch_mode = VMMouseSwitchMode; @@ -346,7 +378,7 @@ VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) pMse->PostEvent = VMMousePostEvent; pMse->CommonOptions = MouseCommonOptions; pMse->mousePriv = mPriv; - + /* Collect the options, and process the common options. */ xf86CollectInputOptions(pInfo, NULL, NULL); @@ -368,13 +400,13 @@ VMMousePreInit(InputDriverPtr drv, IDevPtr dev, int flags) } xf86CloseSerial(pInfo->fd); pInfo->fd = -1; - + /* Process the options */ pMse->CommonOptions(pInfo); - + /* set up the current screen num */ mPriv->screenNum = xf86SetIntOption(pInfo->options, "ScreenNumber", 0); - + pInfo->flags |= XI86_CONFIGURED; return pInfo; } @@ -392,11 +424,11 @@ VMMouseAvailableOptions(void *unused) *---------------------------------------------------------------------- * * MouseCtrl -- - * Alter the control paramters for the mouse. - * + * Alter the control paramters for the mouse. + * * Results: - * None - * + * None + * * Side effects: * None * @@ -415,7 +447,7 @@ MouseCtrl(DeviceIntPtr device, PtrCtrl *ctrl) #ifdef EXTMOUSEDEBUG xf86Msg(X_INFO, "VMMOUSE(0): MouseCtrl pMse=%p\n", pMse); #endif - + pMse->num = ctrl->num; pMse->den = ctrl->den; pMse->threshold = ctrl->threshold; @@ -427,10 +459,10 @@ MouseCtrl(DeviceIntPtr device, PtrCtrl *ctrl) * * VMMouseDoPostEvent -- * Post the mouse button event and mouse motion event to Xserver - * + * * Results: * None - * + * * Side effects: * Mouse location and button status was updated * @@ -444,7 +476,7 @@ VMMouseDoPostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy) VMMousePrivPtr mPriv; int truebuttons; int id, change; - + pMse = pInfo->private; mPriv = (VMMousePrivPtr)pMse->mousePriv; @@ -452,15 +484,23 @@ VMMouseDoPostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy) * The following truebuttons/reverseBits and lastButtons are * used to compare the current buttons and the previous buttons * to find the button changes during two mouse events - */ + */ truebuttons = buttons; buttons = reverseBits(reverseMap, buttons); if (dx || dy) { - xf86PostMotionEvent(pInfo->dev, !mPriv->relative, 0, 2, dx, dy); + +#ifdef CALL_CONVERSION_PROC + /* + * Xservers between 1.3.99.0 - 1.4.0.90 do not call conversion_proc, so + * we need to do the conversion from device to screen space. + */ + VMMouseConvertProc(pInfo, 0, 2, dx, dy, 0, 0, 0, 0, &dx, &dy); +#endif + xf86PostMotionEvent(pInfo->dev, !mPriv->relative, 0, 2, dx, dy); } - + if (truebuttons != pMse->lastButtons) { change = buttons ^ reverseBits(reverseMap, pMse->lastButtons); while (change) { @@ -480,10 +520,10 @@ VMMouseDoPostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy) * VMMousePostEvent -- * Prepare the mouse status according to the Z axis mapping * before we post the event to Xserver - * + * * Results: * None - * + * * Side effects: * Buttons was updated according to Z axis mapping * @@ -496,7 +536,7 @@ VMMousePostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy, int dz, int dw MouseDevPtr pMse; int zbutton = 0; VMMousePrivPtr mPriv; - + pMse = pInfo->private; mPriv = (VMMousePrivPtr)pMse->mousePriv; /* Map the Z axis movement. */ @@ -509,7 +549,7 @@ VMMousePostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy, int dz, int dw if(mPriv->relative) dx = dz; else - dx += dz; + dx += dz; dz = 0; } break; @@ -518,7 +558,7 @@ VMMousePostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy, int dz, int dw if(mPriv->relative) dy = dz; else - dy += dz; + dy += dz; dz = 0; } break; @@ -568,7 +608,7 @@ VMMousePostEvent(InputInfoPtr pInfo, int buttons, int dx, int dy, int dz, int dw * * Results: * None - * + * * Side effects: * None * @@ -599,11 +639,11 @@ FlushButtons(MouseDevPtr pMse) * MouseCommonOptions -- * Process acceptable mouse options. Currently we only process * "Buttons" and "ZAxisMapping" options. - * More options can be added later on + * More options can be added later on * * Results: * None - * + * * Side effects: * The buttons was setup according to the options * @@ -658,9 +698,9 @@ MouseCommonOptions(InputInfoPtr pInfo) pMse->positiveZ = pMse->positiveW = 1 << (b2-1); if (b1 > pMse->buttons) pMse->buttons = b1; if (b2 > pMse->buttons) pMse->buttons = b2; - + /* - * Option "ZAxisMapping" "N1 N2 N3 N4" not supported + * Option "ZAxisMapping" "N1 N2 N3 N4" not supported */ pMse->negativeW = pMse->positiveW = MSE_NOZMAP; } else { @@ -681,7 +721,7 @@ MouseCommonOptions(InputInfoPtr pInfo) */ if (origButtons != pMse->buttons) from = X_CONFIG; - + } @@ -694,14 +734,14 @@ MouseCommonOptions(InputInfoPtr pInfo) * * Results: * None - * + * * Side effects: * None * *---------------------------------------------------------------------- */ -static void +static void VMMouseUnInit(InputDriverPtr drv, LocalDevicePtr local, int flags) { xf86Msg(X_INFO, "VMWARE(0): VMMouseUnInit\n"); @@ -713,12 +753,12 @@ VMMouseUnInit(InputDriverPtr drv, LocalDevicePtr local, int flags) * * VMMouseDeviceControl -- * This function was called by Xserver during DEVICE_INIT, DEVICE_ON, - * DEVICE_OFF and DEVICE_CLOSE phase - * + * DEVICE_OFF and DEVICE_CLOSE phase + * * Results: * TRUE, if sucessful * FALSE, if failed - * + * * Side effects: * Absolute pointing device is enabled during DEVICE_ON * Absolute pointing device is disabled during DEVICE_OFF @@ -735,11 +775,11 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) VMMousePrivPtr mPriv; unsigned char map[MSE_MAXBUTTONS + 1]; int i; - + pInfo = device->public.devicePrivate; pMse = pInfo->private; pMse->device = device; - mPriv = (VMMousePrivPtr)pMse->mousePriv; + mPriv = (VMMousePrivPtr)pMse->mousePriv; switch (mode){ case DEVICE_INIT: @@ -753,8 +793,18 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) InitPointerDeviceStruct((DevicePtr)device, map, min(pMse->buttons, MSE_MAXBUTTONS), - miPointerGetMotionEvents, pMse->Ctrl, - miPointerGetMotionBufferSize()); +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 + miPointerGetMotionEvents, +#else + GetMotionHistory, +#endif + pMse->Ctrl, +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 + miPointerGetMotionBufferSize() +#else + GetMotionHistorySize(), 2 +#endif + ); /* X valuator */ xf86InitValuatorAxisStruct(device, 0, 0, -1, 1, 0, 1); @@ -762,7 +812,9 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) /* Y valuator */ xf86InitValuatorAxisStruct(device, 1, 0, -1, 1, 0, 1); xf86InitValuatorDefaults(device, 1); +#if GET_ABI_MAJOR(ABI_XINPUT_VERSION) == 0 xf86MotionHistoryAllocate(pInfo); +#endif xf86Msg(X_INFO, "VMWARE(0): VMMOUSE DEVICE_INIT\n"); #ifdef EXTMOUSEDEBUG @@ -787,17 +839,17 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) /* * enable absolute pointing device here */ - if (!VMMouseClient_Enable()) { + if (!VMMouseClient_Enable()) { xf86Msg(X_ERROR, "VMWARE(0): vmmouse enable failed\n"); mPriv->vmmouseAvailable = FALSE; device->public.on = FALSE; return FALSE; } else { - mPriv->vmmouseAvailable = TRUE; + mPriv->vmmouseAvailable = TRUE; VMMouseClient_RequestAbsolute(); mPriv->relative = FALSE; xf86Msg(X_INFO, "VMWARE(0): vmmouse enabled\n"); - } + } } xf86FlushInput(pInfo->fd); xf86AddEnabledDevice(pInfo); @@ -806,7 +858,7 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) pMse->lastButtons = 0; device->public.on = TRUE; FlushButtons(pMse); - break; + break; case DEVICE_OFF: case DEVICE_CLOSE: xf86Msg(X_INFO, "VMWARE(0): VMMOUSE DEVICE_OFF/CLOSE\n"); @@ -817,7 +869,7 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) VMMouseClient_Disable(); mPriv->vmmouseAvailable = FALSE; } - + xf86RemoveEnabledDevice(pInfo); if (pMse->buffer) { XisbFree(pMse->buffer); @@ -842,15 +894,15 @@ VMMouseDeviceControl(DeviceIntPtr device, int mode) * VMMouseReadInput -- * This function was called by Xserver when there is data available * in the input device - * + * * Results: * None - * + * * Side effects: * Input data in regular PS/2 fd was cleared * Real mouse data was read from the absolute pointing device * and posted to Xserver - * + * *---------------------------------------------------------------------- */ @@ -858,16 +910,16 @@ static void VMMouseReadInput(InputInfoPtr pInfo) { MouseDevPtr pMse; - VMMousePrivPtr mPriv; + VMMousePrivPtr mPriv; int c; - int len = 0; + int len = 0; pMse = pInfo->private; mPriv = pMse->mousePriv; - + /* * First read the bytes in input device to clear the regular PS/2 fd so - * we don't get called again. + * we don't get called again. */ /* * Set blocking to -1 on the first call because we know there is data to @@ -880,10 +932,10 @@ VMMouseReadInput(InputInfoPtr pInfo) len++; /* * regular PS packet consists of 3 bytes - * We read 3 bytes to drain the PS/2 packet + * We read 3 bytes to drain the PS/2 packet */ if(len < 3) continue; - len = 0; + len = 0; /* * Now get the real data from absolute pointing device */ @@ -902,14 +954,14 @@ VMMouseReadInput(InputInfoPtr pInfo) * GetVMMouseMotionEvent -- * Read all the mouse data available from the absolute * pointing device and post it to the Xserver - * + * * Results: * None - * + * * Side effects: * Real mouse data was read from the absolute pointing * device and posted to Xserver - * + * *---------------------------------------------------------------------- */ @@ -919,22 +971,31 @@ GetVMMouseMotionEvent(InputInfoPtr pInfo){ int buttons, dx, dy, dz, dw; VMMOUSE_INPUT_DATA vmmouseInput; int ps2Buttons = 0; + int numPackets; + + pMse = pInfo->private; + while((numPackets = VMMouseClient_GetInput(&vmmouseInput))){ + if (numPackets == VMMOUSE_ERROR) { + VMMouseClient_Disable(); + VMMouseClient_Enable(); + VMMouseClient_RequestAbsolute(); + xf86Msg(X_INFO, "VMWARE(0): re-requesting absolute mode after reset\n"); + break; + } - pMse = pInfo->private; - while(VMMouseClient_GetInput(&vmmouseInput)){ if(vmmouseInput.Buttons & VMMOUSE_MIDDLE_BUTTON) ps2Buttons |= 0x04; /* Middle*/ if(vmmouseInput.Buttons & VMMOUSE_RIGHT_BUTTON) ps2Buttons |= 0x02; /* Right*/ if(vmmouseInput.Buttons & VMMOUSE_LEFT_BUTTON) ps2Buttons |= 0x01; /* Left*/ - + buttons = (ps2Buttons & 0x04) >> 1 | /* Middle */ (ps2Buttons & 0x02) >> 1 | /* Right */ (ps2Buttons & 0x01) << 2; /* Left */ - + dx = vmmouseInput.X; - dy = vmmouseInput.Y; + dy = vmmouseInput.Y; dz = (char)vmmouseInput.Z; dw = 0; /* post an event */ @@ -947,11 +1008,11 @@ GetVMMouseMotionEvent(InputInfoPtr pInfo){ *---------------------------------------------------------------------- * * VMMouseControlProc -- - * This function is unused + * This function is unused * * Results: * None - * + * * Side effects: * None * @@ -970,11 +1031,11 @@ VMMouseControlProc(LocalDevicePtr local, xDeviceCtl * control) *---------------------------------------------------------------------- * * VMMouseCloseProc -- - * This function is unused + * This function is unused * * Results: * None - * + * * Side effects: * None * @@ -992,11 +1053,11 @@ VMMouseCloseProc(LocalDevicePtr local) *---------------------------------------------------------------------- * * VMMouseSwitchProc -- - * This function is unused + * This function is unused * * Results: * None - * + * * Side effects: * None * @@ -1016,13 +1077,13 @@ VMMouseSwitchMode(ClientPtr client, DeviceIntPtr dev, int mode) * * VMMouseConvertProc -- * This function was called by Xserver to convert valuators to X and Y - * + * * Results: * TRUE - * + * * Side effects: * X and Y was converted according to current Screen dimension - * + * *---------------------------------------------------------------------- */ @@ -1039,17 +1100,17 @@ VMMouseConvertProc(InputInfoPtr pInfo, int first, int num, int v0, int v1, int v if (first != 0 || num != 2) return FALSE; - + if(mPriv->relative) { *x = v0; *y = v1; } else { factorX = ((double) screenInfo.screens[mPriv->screenNum]->width) / (double) 65535; factorY = ((double) screenInfo.screens[mPriv->screenNum]->height) / (double) 65535; - + *x = v0 * factorX + 0.5; *y = v1 * factorY + 0.5; - + if (mPriv->screenNum != -1) { xf86XInputSetScreen(pInfo, mPriv->screenNum, *x, *y); } @@ -1073,13 +1134,13 @@ ModuleInfoRec VMMouseInfo = { * * VMMouseUnplug -- * This function was called by Xserver when unplug - * + * * Results: * None - * + * * Side effects: * None - * + * *---------------------------------------------------------------------- */ @@ -1095,16 +1156,16 @@ VMMouseUnplug(pointer p) * * VMMousePlug -- * This function was called when Xserver load vmmouse module. It will - * integrate the module infto the XFree86 loader architecutre. - * + * integrate the module infto the XFree86 loader architecutre. + * * Results: * TRUE - * + * * Side effects: - * Regular mouse module was loaded as a submodule. In case + * Regular mouse module was loaded as a submodule. In case * absolute pointing device is not available, we can always fall back * to the regular mouse module - * + * *---------------------------------------------------------------------- */ @@ -1118,7 +1179,7 @@ VMMousePlug(pointer module, char *name; xf86LoaderReqSymLists(reqSymbols, NULL); - + if (!Initialised) { Initialised = TRUE; #ifndef REMOVE_LOADER_CHECK_MODULE_INFO @@ -1145,7 +1206,7 @@ VMMousePlug(pointer module, LoaderErrorMsg(NULL, name, *errmaj, *errmin); } xfree(name); - + return module; } diff --git a/driver/xf86-input-vmmouse/src/vmmouse_client.c b/driver/xf86-input-vmmouse/src/vmmouse_client.c index 5f27e5416..f34c223b9 100644 --- a/driver/xf86-input-vmmouse/src/vmmouse_client.c +++ b/driver/xf86-input-vmmouse/src/vmmouse_client.c @@ -267,9 +267,11 @@ VMMouseClient_GetInput (PVMMOUSE_INPUT_DATA pvmmouseInput) { pvmmouseInput->Flags = (packetInfo & 0xffff0000) >> 16; pvmmouseInput->Buttons = (packetInfo & 0x0000ffff); - pvmmouseInput->X = vmpc.out.vEbx & 0xffff; - pvmmouseInput->Y = vmpc.out.vEcx & 0xffff; + /* Note that Z is always signed, and X/Y are signed in relative mode. */ + pvmmouseInput->X = (int)vmpc.out.vEbx; + pvmmouseInput->Y = (int)vmpc.out.vEcx; pvmmouseInput->Z = (int)vmpc.out.vEdx; + /* * Return number of packets (including this one) in queue. */ diff --git a/driver/xf86-input-vmmouse/src/vmmouse_proto.h b/driver/xf86-input-vmmouse/src/vmmouse_proto.h index 6a08e27e4..a2eb1e428 100644 --- a/driver/xf86-input-vmmouse/src/vmmouse_proto.h +++ b/driver/xf86-input-vmmouse/src/vmmouse_proto.h @@ -36,10 +36,20 @@ #ifndef _VMMOUSE_PROTO_H_ #define _VMMOUSE_PROTO_H_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include <stdint.h> + +#ifdef HAVE_XORG_SERVER_1_1_0 #include <unistd.h> +#else +#include "xf86_libc.h" +#endif -#if !defined __i386__ && !defined __x86_64__ +#if !defined __i386__ && !defined __x86_64__ #error The vmmouse protocol is only supported on x86 architectures. #endif |