mirror of
https://github.com/X11Libre/xf86-input-vmmouse.git
synced 2026-03-24 01:34:05 +00:00
Initial release of the vmmouse driver for VMware virtual machines.
This commit is contained in:
19
.cvsignore
Normal file
19
.cvsignore
Normal file
@@ -0,0 +1,19 @@
|
||||
Makefile
|
||||
Makefile.in
|
||||
*.la
|
||||
*.lo
|
||||
aclocal.m4
|
||||
autom4te.cache
|
||||
config.guess
|
||||
config.h
|
||||
config.h.in
|
||||
config.log
|
||||
config.status
|
||||
config.sub
|
||||
configure
|
||||
depcomp
|
||||
install-sh
|
||||
libtool
|
||||
ltmain.sh
|
||||
missing
|
||||
stamp-h1
|
||||
23
COPYING
Normal file
23
COPYING
Normal file
@@ -0,0 +1,23 @@
|
||||
Copyright (c) 2006 VMware, Inc.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||
software and associated documentation files (the "Software"), to deal in the Software
|
||||
without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or
|
||||
substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
||||
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
|
||||
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
|
||||
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Except as contained in this notice, the name of the copyright holder(s) and author(s)
|
||||
shall not be used in advertising or otherwise to promote the sale, use or other dealings
|
||||
in this Software without prior written authorization from the copyright holder(s) and
|
||||
author(s).
|
||||
|
||||
3
ChangeLog
Normal file
3
ChangeLog
Normal file
@@ -0,0 +1,3 @@
|
||||
2006-01-06 Philip Langdale <plangdale@vmware.com>
|
||||
|
||||
* Initial release.
|
||||
231
INSTALL
Normal file
231
INSTALL
Normal file
@@ -0,0 +1,231 @@
|
||||
Copyright 1994, 1995, 1996, 1999, 2000, 2001 Free Software Foundation,
|
||||
Inc.
|
||||
|
||||
This file is free documentation; the Free Software Foundation gives
|
||||
unlimited permission to copy, distribute and modify it.
|
||||
|
||||
Basic Installation
|
||||
==================
|
||||
|
||||
These are generic installation instructions.
|
||||
|
||||
The `configure' shell script attempts to guess correct values for
|
||||
various system-dependent variables used during compilation. It uses
|
||||
those values to create a `Makefile' in each directory of the package.
|
||||
It may also create one or more `.h' files containing system-dependent
|
||||
definitions. Finally, it creates a shell script `config.status' that
|
||||
you can run in the future to recreate the current configuration, and a
|
||||
file `config.log' containing compiler output (useful mainly for
|
||||
debugging `configure').
|
||||
|
||||
It can also use an optional file (typically called `config.cache'
|
||||
and enabled with `--cache-file=config.cache' or simply `-C') that saves
|
||||
the results of its tests to speed up reconfiguring. (Caching is
|
||||
disabled by default to prevent problems with accidental use of stale
|
||||
cache files.)
|
||||
|
||||
If you need to do unusual things to compile the package, please try
|
||||
to figure out how `configure' could check whether to do them, and mail
|
||||
diffs or instructions to the address given in the `README' so they can
|
||||
be considered for the next release. If you are using the cache, and at
|
||||
some point `config.cache' contains results you don't want to keep, you
|
||||
may remove or edit it.
|
||||
|
||||
The file `configure.ac' (or `configure.in') is used to create
|
||||
`configure' by a program called `autoconf'. You only need
|
||||
`configure.ac' if you want to change it or regenerate `configure' using
|
||||
a newer version of `autoconf'.
|
||||
|
||||
The simplest way to compile this package is:
|
||||
|
||||
1. `cd' to the directory containing the package's source code and type
|
||||
`./configure' to configure the package for your system. If you're
|
||||
using `csh' on an old version of System V, you might need to type
|
||||
`sh ./configure' instead to prevent `csh' from trying to execute
|
||||
`configure' itself.
|
||||
|
||||
Running `configure' takes awhile. While running, it prints some
|
||||
messages telling which features it is checking for.
|
||||
|
||||
2. Type `make' to compile the package.
|
||||
|
||||
3. Optionally, type `make check' to run any self-tests that come with
|
||||
the package.
|
||||
|
||||
4. Type `make install' to install the programs and any data files and
|
||||
documentation.
|
||||
|
||||
5. You can remove the program binaries and object files from the
|
||||
source code directory by typing `make clean'. To also remove the
|
||||
files that `configure' created (so you can compile the package for
|
||||
a different kind of computer), type `make distclean'. There is
|
||||
also a `make maintainer-clean' target, but that is intended mainly
|
||||
for the package's developers. If you use it, you may have to get
|
||||
all sorts of other programs in order to regenerate files that came
|
||||
with the distribution.
|
||||
|
||||
Compilers and Options
|
||||
=====================
|
||||
|
||||
Some systems require unusual options for compilation or linking that
|
||||
the `configure' script does not know about. Run `./configure --help'
|
||||
for details on some of the pertinent environment variables.
|
||||
|
||||
You can give `configure' initial values for variables by setting
|
||||
them in the environment. You can do that on the command line like this:
|
||||
|
||||
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
|
||||
|
||||
*Note Defining Variables::, for more details.
|
||||
|
||||
Compiling For Multiple Architectures
|
||||
====================================
|
||||
|
||||
You can compile the package for more than one kind of computer at the
|
||||
same time, by placing the object files for each architecture in their
|
||||
own directory. To do this, you must use a version of `make' that
|
||||
supports the `VPATH' variable, such as GNU `make'. `cd' to the
|
||||
directory where you want the object files and executables to go and run
|
||||
the `configure' script. `configure' automatically checks for the
|
||||
source code in the directory that `configure' is in and in `..'.
|
||||
|
||||
If you have to use a `make' that does not support the `VPATH'
|
||||
variable, you have to compile the package for one architecture at a
|
||||
time in the source code directory. After you have installed the
|
||||
package for one architecture, use `make distclean' before reconfiguring
|
||||
for another architecture.
|
||||
|
||||
Installation Names
|
||||
==================
|
||||
|
||||
By default, `make install' will install the package's files in
|
||||
`/usr/local/bin', `/usr/local/man', etc. You can specify an
|
||||
installation prefix other than `/usr/local' by giving `configure' the
|
||||
option `--prefix=PATH'.
|
||||
|
||||
You can specify separate installation prefixes for
|
||||
architecture-specific files and architecture-independent files. If you
|
||||
give `configure' the option `--exec-prefix=PATH', the package will use
|
||||
PATH as the prefix for installing programs and libraries.
|
||||
Documentation and other data files will still use the regular prefix.
|
||||
|
||||
In addition, if you use an unusual directory layout you can give
|
||||
options like `--bindir=PATH' to specify different values for particular
|
||||
kinds of files. Run `configure --help' for a list of the directories
|
||||
you can set and what kinds of files go in them.
|
||||
|
||||
If the package supports it, you can cause programs to be installed
|
||||
with an extra prefix or suffix on their names by giving `configure' the
|
||||
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
|
||||
|
||||
Optional Features
|
||||
=================
|
||||
|
||||
Some packages pay attention to `--enable-FEATURE' options to
|
||||
`configure', where FEATURE indicates an optional part of the package.
|
||||
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
|
||||
is something like `gnu-as' or `x' (for the X Window System). The
|
||||
`README' should mention any `--enable-' and `--with-' options that the
|
||||
package recognizes.
|
||||
|
||||
For packages that use the X Window System, `configure' can usually
|
||||
find the X include and library files automatically, but if it doesn't,
|
||||
you can use the `configure' options `--x-includes=DIR' and
|
||||
`--x-libraries=DIR' to specify their locations.
|
||||
|
||||
Specifying the System Type
|
||||
==========================
|
||||
|
||||
There may be some features `configure' cannot figure out
|
||||
automatically, but needs to determine by the type of host the package
|
||||
will run on. Usually `configure' can figure that out, but if it prints
|
||||
a message saying it cannot guess the host type, give it the
|
||||
`--build=TYPE' option. TYPE can either be a short name for the system
|
||||
type, such as `sun4', or a canonical name which has the form:
|
||||
|
||||
CPU-COMPANY-SYSTEM
|
||||
|
||||
where SYSTEM can have one of these forms:
|
||||
|
||||
OS KERNEL-OS
|
||||
|
||||
See the file `config.sub' for the possible values of each field. If
|
||||
`config.sub' isn't included in this package, then this package doesn't
|
||||
need to know the host type.
|
||||
|
||||
If you are _building_ compiler tools for cross-compiling, you should
|
||||
use the `--target=TYPE' option to select the type of system they will
|
||||
produce code for.
|
||||
|
||||
If you want to _use_ a cross compiler, that generates code for a
|
||||
platform different from the build platform, you should specify the host
|
||||
platform (i.e., that on which the generated programs will eventually be
|
||||
run) with `--host=TYPE'. In this case, you should also specify the
|
||||
build platform with `--build=TYPE', because, in this case, it may not
|
||||
be possible to guess the build platform (it sometimes involves
|
||||
compiling and running simple test programs, and this can't be done if
|
||||
the compiler is a cross compiler).
|
||||
|
||||
Sharing Defaults
|
||||
================
|
||||
|
||||
If you want to set default values for `configure' scripts to share,
|
||||
you can create a site shell script called `config.site' that gives
|
||||
default values for variables like `CC', `cache_file', and `prefix'.
|
||||
`configure' looks for `PREFIX/share/config.site' if it exists, then
|
||||
`PREFIX/etc/config.site' if it exists. Or, you can set the
|
||||
`CONFIG_SITE' environment variable to the location of the site script.
|
||||
A warning: not all `configure' scripts look for a site script.
|
||||
|
||||
Defining Variables
|
||||
==================
|
||||
|
||||
Variables not defined in a site shell script can be set in the
|
||||
environment passed to `configure'. However, some packages may run
|
||||
configure again during the build, and the customized values of these
|
||||
variables may be lost. In order to avoid this problem, you should set
|
||||
them in the `configure' command line, using `VAR=value'. For example:
|
||||
|
||||
./configure CC=/usr/local2/bin/gcc
|
||||
|
||||
will cause the specified gcc to be used as the C compiler (unless it is
|
||||
overridden in the site shell script).
|
||||
|
||||
`configure' Invocation
|
||||
======================
|
||||
|
||||
`configure' recognizes the following options to control how it
|
||||
operates.
|
||||
|
||||
`--help'
|
||||
`-h'
|
||||
Print a summary of the options to `configure', and exit.
|
||||
|
||||
`--version'
|
||||
`-V'
|
||||
Print the version of Autoconf used to generate the `configure'
|
||||
script, and exit.
|
||||
|
||||
`--cache-file=FILE'
|
||||
Enable the cache: use and save the results of the tests in FILE,
|
||||
traditionally `config.cache'. FILE defaults to `/dev/null' to
|
||||
disable caching.
|
||||
|
||||
`--config-cache'
|
||||
`-C'
|
||||
Alias for `--cache-file=config.cache'.
|
||||
|
||||
`--quiet'
|
||||
`--silent'
|
||||
`-q'
|
||||
Do not print messages saying which checks are being made. To
|
||||
suppress all normal output, redirect it to `/dev/null' (any error
|
||||
messages will still be shown).
|
||||
|
||||
`--srcdir=DIR'
|
||||
Look for the package's source code in directory DIR. Usually
|
||||
`configure' can determine that directory automatically.
|
||||
|
||||
`configure' also accepts some other, not widely useful, options. Run
|
||||
`configure --help' for more details.
|
||||
|
||||
22
Makefile.am
Normal file
22
Makefile.am
Normal file
@@ -0,0 +1,22 @@
|
||||
# Copyright 2005 Adam Jackson.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||
# the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice (including the next
|
||||
# paragraph) shall be included in all copies or substantial portions of the
|
||||
# Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
AUTOMAKE_OPTIONS = foreign
|
||||
SUBDIRS = src man
|
||||
53
README
Normal file
53
README
Normal file
@@ -0,0 +1,53 @@
|
||||
VMMouse
|
||||
-------
|
||||
|
||||
The VMMouse driver enables support for the special VMMouse protocol
|
||||
that is provided by VMware virtual machines to give absolute pointer
|
||||
positioning.
|
||||
|
||||
Installing the driver will improve the user experience when using the
|
||||
mouse to interact with the guest operating system. In particular, use of
|
||||
the driver improves mouse "lag", provides mouse speed and acceleration
|
||||
consistent with the user's host operating system, and enables the
|
||||
auto-grab/ungrab feature in VMware products without requiring the VMware
|
||||
toolbox application.
|
||||
|
||||
Using the driver
|
||||
----------------
|
||||
|
||||
Assuming you have built and installed the driver in the standard way
|
||||
for autotools based packages (see INSTALL), or the driver was already
|
||||
installed by your distro, using it is simply a matter of changing the
|
||||
driver used for the mouse input device from "mouse" to "vmmouse".
|
||||
|
||||
The vmmouse driver is capable of falling back to the standard "mouse"
|
||||
driver if a VMware virtual machine is not detected. This allows for
|
||||
dual-booting of an operating system from a virtual machine to real hardware
|
||||
without having to edit xorg.conf every time.
|
||||
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
The following is not necessary reading for anyone who wants to use the
|
||||
driver, but should help anyone who wants to understand how it works or
|
||||
who wants to write a driver for a different target, whether it's another
|
||||
operating system, a linux kernel input driver or even gpm.
|
||||
|
||||
The driver is composed of three different layers:
|
||||
|
||||
1) The vmmouse protocol layer (vmmouse_proto.[c|h])
|
||||
- This provides the call to read and write the port over which
|
||||
the vmmouse packets are transfered.
|
||||
|
||||
2) The vmmouse client layer (vmmouse_client.[c|h])
|
||||
- This builds on top of the protocol layer to provide higher
|
||||
level calls for enabling/disabling the vmmouse mechanism
|
||||
and for reading data.
|
||||
- A new driver for a different target would use this interface.
|
||||
|
||||
3) The Xorg vmmouse driver (vmmouse.c)
|
||||
- This is the actual Xorg specific part of the driver.
|
||||
- Note that interrupts indicating the presence of mouse data
|
||||
are still transmitted on the PS/2 port so it is necessary
|
||||
to be set up to receive those interrupts like a standard
|
||||
PS/2 driver, but the actual data on the PS/2 port is ignored.
|
||||
12
autogen.sh
Executable file
12
autogen.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#! /bin/sh
|
||||
|
||||
srcdir=`dirname $0`
|
||||
test -z "$srcdir" && srcdir=.
|
||||
|
||||
ORIGDIR=`pwd`
|
||||
cd $srcdir
|
||||
|
||||
autoreconf -v --install || exit 1
|
||||
cd $ORIGDIR || exit $?
|
||||
|
||||
$srcdir/configure --enable-maintainer-mode "$@"
|
||||
92
configure.ac
Normal file
92
configure.ac
Normal file
@@ -0,0 +1,92 @@
|
||||
# Copyright 2005 Adam Jackson.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||
# the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice (including the next
|
||||
# paragraph) shall be included in all copies or substantial portions of the
|
||||
# Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Process this file with autoconf to produce a configure script
|
||||
|
||||
AC_PREREQ(2.57)
|
||||
AC_INIT([xf86-input-vmmouse],
|
||||
12.3.0.0,
|
||||
[https://bugs.freedesktop.org/enter_bug.cgi?product=xorg],
|
||||
xf86-input-vmmouse)
|
||||
|
||||
AC_CONFIG_SRCDIR([Makefile.am])
|
||||
AC_CONFIG_AUX_DIR(.)
|
||||
AM_INIT_AUTOMAKE([dist-bzip2])
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
DRIVER_NAME=vmmouse
|
||||
AC_SUBST([DRIVER_NAME])
|
||||
|
||||
AM_CONFIG_HEADER([config.h])
|
||||
|
||||
# Checks for programs.
|
||||
AC_DISABLE_STATIC
|
||||
AC_PROG_LIBTOOL
|
||||
AC_PROG_CC
|
||||
|
||||
AH_TOP([#include "xorg-server.h"])
|
||||
|
||||
#AC_DEFINE(XFree86LOADER,1,[Stub define for loadable drivers])
|
||||
#
|
||||
#AC_ARG_ENABLE(XINPUT, AS_HELP_STRING([--enable-xinput],
|
||||
# [Build XInput support (default: yes)]),
|
||||
# [XINPUT=$enableval],[XINPUT=yes])
|
||||
#AM_CONDITIONAL(XINPUT, test "x$XINPUT" = "xyes")
|
||||
#if test "x$XINPUT" = "xyes" ; then
|
||||
# AC_DEFINE(XINPUT,1,[Enable XInput support])
|
||||
#fi
|
||||
#
|
||||
#AC_ARG_ENABLE(XKB, AS_HELP_STRING([--enable-xkb],
|
||||
# [Build XKB support (default: yes)]),
|
||||
# [XKB=$enableval],[XKB=yes])
|
||||
#AM_CONDITIONAL(XKB, test "x$XKB" = "xyes")
|
||||
#if test "x$XKB" = "xyes" ; then
|
||||
# AC_DEFINE(XKB,1,[Enable XKB support])
|
||||
#fi
|
||||
|
||||
AC_ARG_WITH(xorg-module-dir,
|
||||
AC_HELP_STRING([--with-xorg-module-dir=DIR],
|
||||
[Default xorg module directory [[default=$libdir/xorg/modules]]]),
|
||||
[moduledir="$withval"],
|
||||
[moduledir="$libdir/xorg/modules"])
|
||||
inputdir=${moduledir}/input
|
||||
AC_SUBST(inputdir)
|
||||
|
||||
# Checks for extensions
|
||||
XORG_DRIVER_CHECK_EXT(RANDR, randrproto)
|
||||
XORG_DRIVER_CHECK_EXT(XINPUT, inputproto)
|
||||
|
||||
# Checks for pkg-config packages
|
||||
PKG_CHECK_MODULES(XORG, xorg-server >= 0.99.3 xproto $REQUIRED_MODULES)
|
||||
sdkdir=$(pkg-config --variable=sdkdir xorg-server)
|
||||
|
||||
CFLAGS="$CFLAGS $XORG_CFLAGS "' -I$(top_srcdir)/src'
|
||||
AC_SUBST([CFLAGS])
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
# Checks for header files.
|
||||
AC_HEADER_STDC
|
||||
|
||||
XORG_MANPAGE_SECTIONS
|
||||
XORG_RELEASE_VERSION
|
||||
|
||||
AC_OUTPUT([Makefile src/Makefile man/Makefile])
|
||||
59
man/Makefile.am
Normal file
59
man/Makefile.am
Normal file
@@ -0,0 +1,59 @@
|
||||
# $Id$
|
||||
#
|
||||
# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
|
||||
#
|
||||
# Permission to use, copy, modify, distribute, and sell this software and its
|
||||
# documentation for any purpose is hereby granted without fee, provided that
|
||||
# the above copyright notice appear in all copies and that both that
|
||||
# copyright notice and this permission notice appear in supporting
|
||||
# documentation.
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included
|
||||
# in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
# IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
# OTHER DEALINGS IN THE SOFTWARE.
|
||||
#
|
||||
# Except as contained in this notice, the name of the copyright holders shall
|
||||
# not be used in advertising or otherwise to promote the sale, use or
|
||||
# other dealings in this Software without prior written authorization
|
||||
# from the copyright holders.
|
||||
#
|
||||
|
||||
drivermandir = $(DRIVER_MAN_DIR)
|
||||
|
||||
driverman_PRE = @DRIVER_NAME@.man
|
||||
|
||||
driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@)
|
||||
|
||||
EXTRA_DIST = @DRIVER_NAME@.man
|
||||
|
||||
CLEANFILES = $(driverman_DATA)
|
||||
|
||||
SED = sed
|
||||
|
||||
# Strings to replace in man pages
|
||||
XORGRELSTRING = @PACKAGE_STRING@
|
||||
XORGMANNAME = X Version 11
|
||||
|
||||
MAN_SUBSTS = \
|
||||
-e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
|
||||
-e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \
|
||||
-e 's|__xservername__|Xorg|g' \
|
||||
-e 's|__xconfigfile__|xorg.conf|g' \
|
||||
-e 's|__projectroot__|$(prefix)|g' \
|
||||
-e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \
|
||||
-e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \
|
||||
-e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \
|
||||
-e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \
|
||||
-e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g'
|
||||
|
||||
SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man
|
||||
|
||||
.man.$(DRIVER_MAN_SUFFIX):
|
||||
sed $(MAN_SUBSTS) < $< > $@
|
||||
228
man/vmmouse.man
Normal file
228
man/vmmouse.man
Normal file
@@ -0,0 +1,228 @@
|
||||
.\" $XFree86: xc/programs/Xserver/hw/xfree86/input/mouse/mouse.man,v 1.5 2002/12/17 20:55:21 dawes Exp $
|
||||
.\" shorthand for double quote that works everywhere.
|
||||
.ds q \N'34'
|
||||
.TH MOUSE __drivermansuffix__ __vendorversion__
|
||||
.SH NAME
|
||||
mouse \- Mouse input driver
|
||||
.SH SYNOPSIS
|
||||
.nf
|
||||
.B "Section \*qInputDevice\*q"
|
||||
.BI " Identifier \*q" idevname \*q
|
||||
.B " Driver \*qmouse\*q"
|
||||
.BI " Option \*qProtocol\*q \*q" protoname \*q
|
||||
.BI " Option \*qDevice\*q \*q" devpath \*q
|
||||
\ \ ...
|
||||
.B EndSection
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.B mouse
|
||||
is an XFree86 input driver for mice. The driver supports most available
|
||||
mouse types and interfaces. USB mice are only supported on some OSs,
|
||||
and the level of support for PS/2 mice depends on the OS.
|
||||
.PP
|
||||
The
|
||||
.B mouse
|
||||
driver functions as a pointer input device, and may be used as the
|
||||
X server's core pointer. Multiple mice are supported by multiple
|
||||
instances of this driver.
|
||||
.SH SUPPORTED HARDWARE
|
||||
There is a detailed list of hardware that the
|
||||
.B mouse
|
||||
driver supports in the
|
||||
.I README.mouse
|
||||
document. This can be found
|
||||
in __projectroot__/lib/X11/doc/, or online at
|
||||
http://www.xfree86.org/current/mouse.html.
|
||||
.SH CONFIGURATION DETAILS
|
||||
Please refer to XF86Config(__filemansuffix__) for general configuration
|
||||
details and for options that can be used with all input drivers. This
|
||||
section only covers configuration details specific to this driver.
|
||||
.PP
|
||||
The driver can auto-detect the mouse type on some platforms On some
|
||||
platforms this is limited to plug and play serial mice, and on some the
|
||||
auto-detection works for any mouse that the OS's kernel driver supports.
|
||||
On others, it is always necessary to specify the mouse protocol in the
|
||||
config file. The
|
||||
.I README.mouse
|
||||
document contains some detailed information about this.
|
||||
.PP
|
||||
The following driver
|
||||
.B Options
|
||||
are supported:
|
||||
.TP 7
|
||||
.BI "Option \*qProtocol\*q \*q" string \*q
|
||||
Specify the mouse protocol. Valid protocol types include:
|
||||
.PP
|
||||
.RS 12
|
||||
Auto, Microsoft, MouseSystems, MMSeries, Logitech, MouseMan, MMHitTab,
|
||||
GlidePoint, IntelliMouse, ThinkingMouse, AceCad, PS/2, ImPS/2,
|
||||
ExplorerPS/2, ThinkingMousePS/2, MouseManPlusPS/2, GlidePointPS/2,
|
||||
NetMousePS/2, NetScrollPS/2, BusMouse, SysMouse, WSMouse, USB, Xqueue.
|
||||
.RE
|
||||
.PP
|
||||
.RS 7
|
||||
Not all protocols are supported on all platforms. The "Auto" platform
|
||||
specifies that protocol auto-detection should be attempted. There is no
|
||||
default protocol setting, and specifying this option is mandatory.
|
||||
.RE
|
||||
.TP 7
|
||||
.BI "Option \*qDevice\*q \*q" string \*q
|
||||
Specifies the device through which the mouse can be accessed. A common
|
||||
setting is "/dev/mouse", which is often a symbolic link to the real
|
||||
device. This option is mandatory, and there is no default setting.
|
||||
.TP 7
|
||||
.BI "Option \*qButtons\*q \*q" integer \*q
|
||||
Specifies the number of mouse buttons. In cases where the number of buttons
|
||||
cannot be auto-detected, the default value is 3.
|
||||
.TP 7
|
||||
.BI "Option \*qEmulate3Buttons\*q \*q" boolean \*q
|
||||
Enable/disable the emulation of the third (middle) mouse button for mice
|
||||
which only have two physical buttons. The third button is emulated by
|
||||
pressing both buttons simultaneously. Default: off
|
||||
.TP 7
|
||||
.BI "Option \*qEmulate3Timeout\*q \*q" integer \*q
|
||||
Sets the timeout (in milliseconds) that the driver waits before deciding
|
||||
if two buttons where pressed "simultaneously" when 3 button emulation is
|
||||
enabled. Default: 50.
|
||||
.TP 7
|
||||
.BI "Option \*qChordMiddle\*q \*q" boolean \*q
|
||||
Enable/disable handling of mice that send left+right events when the middle
|
||||
button is used. Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qEmulateWheel\*q \*q" boolean \*q
|
||||
Enable/disable "wheel" emulation. Wheel emulation means emulating button
|
||||
press/release events when the mouse is moved while a specific real button
|
||||
is pressed. Wheel button events (typically buttons 4 and 5) are
|
||||
usually used for scrolling. Wheel emulation is useful for getting wheel-like
|
||||
behaviour with trackballs. It can also be useful for mice with 4 or
|
||||
more buttons but no wheel. See the description of the
|
||||
.BR EmulateWheelButton ,
|
||||
.BR EmulateWheelInertia ,
|
||||
.BR XAxisMapping ,
|
||||
and
|
||||
.B YAxisMapping
|
||||
options below. Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qEmulateWheelButton\*q \*q" integer \*q
|
||||
Specifies which button must be held down to enable wheel emulation mode.
|
||||
While this button is down, X and/or Y pointer movement will generate button
|
||||
press/release events as specified for the
|
||||
.B XAxisMapping
|
||||
and
|
||||
.B YAxisMapping
|
||||
settings. Default: 4.
|
||||
.TP 7
|
||||
.BI "Option \*qEmulateWheelInertia\*q \*q" integer \*q
|
||||
Specifies how far (in pixels) the pointer must move to generate button
|
||||
press/release events in wheel emulation mode. Default: 50.
|
||||
.TP 7
|
||||
.BI "Option \*qXAxisMapping\*q \*q" "N1 N2" \*q
|
||||
Specifies which buttons are mapped to motion in the X direction in wheel
|
||||
emulation mode. Button number
|
||||
.I N1
|
||||
is mapped to the negative X axis motion and button number
|
||||
.I N2
|
||||
is mapped to the positive X axis motion. Default: no mapping.
|
||||
.TP 7
|
||||
.BI "Option \*qYAxisMapping\*q \*q" "N1 N2" \*q
|
||||
Specifies which buttons are mapped to motion in the Y direction in wheel
|
||||
emulation mode. Button number
|
||||
.I N1
|
||||
is mapped to the negative Y axis motion and button number
|
||||
.I N2
|
||||
is mapped to the positive Y axis motion. Default: "4 5".
|
||||
.TP 7
|
||||
.BI "Option \*qZAxisMapping\*q \*qX\*q"
|
||||
.TP 7
|
||||
.BI "Option \*qZAxisMapping\*q \*qY\*q"
|
||||
.TP 7
|
||||
.BI "Option \*qZAxisMapping\*q \*q" "N1 N2" \*q
|
||||
.TP 7
|
||||
.BI "Option \*qZAxisMapping\*q \*q" "N1 N2 N3 N4" \*q
|
||||
Set the mapping for the Z axis (wheel) motion to buttons or another axis
|
||||
.RB ( X
|
||||
or
|
||||
.BR Y ).
|
||||
Button number
|
||||
.I N1
|
||||
is mapped to the negative Z axis motion and button number
|
||||
.I N2
|
||||
is mapped to the positive Z axis motion. For mice with two wheels,
|
||||
four button numbers can be specified, with the negative and positive motion
|
||||
of the second wheel mapped respectively to buttons number
|
||||
.I N3
|
||||
and
|
||||
.IR N4 .
|
||||
Default: no mapping.
|
||||
.TP 7
|
||||
.BI "Option \*qFlipXY\*q \*q" boolean \*q
|
||||
Enable/disable swapping the X and Y axes. This transformation is applied
|
||||
after the
|
||||
.BR InvX ,
|
||||
.B InvY
|
||||
and
|
||||
.BR AngleOffset
|
||||
transformations. Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qInvX\*q \*q" boolean \*q
|
||||
Invert the X axis. Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qInvY\*q \*q" boolean \*q
|
||||
Invert the Y axis. Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qAngleOffset\*q \*q" integer \*q
|
||||
Specify a clockwise angular offset (in degrees) to apply to the pointer
|
||||
motion. This transformation is applied before the
|
||||
.BR FlipXY ,
|
||||
.B InvX
|
||||
and
|
||||
.B InvY
|
||||
transformations. Default: 0.
|
||||
.TP 7
|
||||
.BI "Option \*qSampleRate\*q \*q" integer \*q
|
||||
Sets the number of motion/button events the mouse sends per second. Setting
|
||||
this is only supported for some mice, including some Logitech mice and
|
||||
some PS/2 mice on some platforms. Default: whatever the mouse is
|
||||
already set to.
|
||||
.TP 7
|
||||
.BI "Option \*qResolution\*q \*q" integer \*q
|
||||
Sets the resolution of the device in counts per inch. Setting this is
|
||||
only supported for some mice, including some PS/2 mice on some platforms.
|
||||
Default: whatever the mouse is already set to.
|
||||
.TP 7
|
||||
.BI "Option \*qDragLockButtons\*q \*q" "L1 B2 L3 B4" \*q
|
||||
Sets \*qdrag lock buttons\*q that simulate holding a button down, so
|
||||
that low dexterity people do not have to hold a buttton down at the
|
||||
same time they move a mouse cursor. Button numbers occur in pairs,
|
||||
with the lock button number occurring first, followed by the button
|
||||
number that is the target of the lock button.
|
||||
.TP 7
|
||||
.BI "Option \*qDragLockButtons\*q \*q" "M1" \*q
|
||||
Sets a \*qmaster drag lock button\*q that acts as a \*qMeta Key\*q
|
||||
indicating that the next button pressed is to be
|
||||
\*qdrag locked\*q.
|
||||
.TP 7
|
||||
.BI "Option \*qClearDTR\*q \*q" boolean \*q
|
||||
Enable/disable clearing the DTR line on the serial port used by the mouse.
|
||||
Some dual-protocol mice require the DTR line to be cleared to operate
|
||||
in the non-default protocol. This option is for serial mice only.
|
||||
Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qClearRTS\*q \*q" boolean \*q
|
||||
Enable/disable clearing the RTS line on the serial port used by the mouse.
|
||||
Some dual-protocol mice require the RTS line to be cleared to operate
|
||||
in the non-default protocol. This option is for serial mice only.
|
||||
Default: off.
|
||||
.TP 7
|
||||
.BI "Option \*qBaudRate\*q \*q" integer \*q
|
||||
Set the baud rate to use for communicating with a serial mouse. This
|
||||
option should rarely be required because the default is correct for almost
|
||||
all situations. Valid values include: 300, 1200, 2400, 4800, 9600, 19200.
|
||||
Default: 1200.
|
||||
.PP
|
||||
There are some other options that may be used to control various parameters
|
||||
for serial port communication, but they are not documented here because
|
||||
the driver sets them correctly for each mouse protocol type.
|
||||
.SH "SEE ALSO"
|
||||
XFree86(1), XF86Config(__filemansuffix__), xf86config(1), Xserver(1), X(__miscmansuffix__),
|
||||
README.mouse.
|
||||
36
src/Makefile.am
Normal file
36
src/Makefile.am
Normal file
@@ -0,0 +1,36 @@
|
||||
# Copyright 2005 Adam Jackson.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a
|
||||
# copy of this software and associated documentation files (the "Software"),
|
||||
# to deal in the Software without restriction, including without limitation
|
||||
# on the rights to use, copy, modify, merge, publish, distribute, sub
|
||||
# license, and/or sell copies of the Software, and to permit persons to whom
|
||||
# the Software is furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice (including the next
|
||||
# paragraph) shall be included in all copies or substantial portions of the
|
||||
# Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
|
||||
# ADAM JACKSON BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
# this is obnoxious:
|
||||
# -module lets us name the module exactly how we want
|
||||
# -avoid-version prevents gratuitous .0.0.0 version numbers on the end
|
||||
# _ladir passes a dummy rpath to libtool so the thing will actually link
|
||||
# TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc.
|
||||
@DRIVER_NAME@_drv_la_LTLIBRARIES = @DRIVER_NAME@_drv.la
|
||||
@DRIVER_NAME@_drv_la_LDFLAGS = -module -avoid-version
|
||||
@DRIVER_NAME@_drv_ladir = @inputdir@
|
||||
|
||||
INCLUDES = -I$(srcdir)
|
||||
|
||||
@DRIVER_NAME@_drv_la_SOURCES = @DRIVER_NAME@.c @DRIVER_NAME@_defs.h \
|
||||
@DRIVER_NAME@_client.c @DRIVER_NAME@_client.h \
|
||||
@DRIVER_NAME@_proto.c @DRIVER_NAME@_proto.h
|
||||
|
||||
1173
src/vmmouse.c
Normal file
1173
src/vmmouse.c
Normal file
File diff suppressed because it is too large
Load Diff
337
src/vmmouse_client.c
Normal file
337
src/vmmouse_client.c
Normal file
@@ -0,0 +1,337 @@
|
||||
/*
|
||||
* Copyright 2002-2006 by VMware, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
* vmmouse_client.c --
|
||||
*
|
||||
* VMware Virtual Mouse Client
|
||||
*
|
||||
* This module provides functions to enable, operate and process
|
||||
* packets via the VMMouse module hosted in the VMX.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "vmmouse_client.h"
|
||||
#include "vmmouse_proto.h"
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClientVMCheck --
|
||||
*
|
||||
* Checks if we're running in a VM by sending the GETVERSION command.
|
||||
*
|
||||
* Returns:
|
||||
* 0 if we're running natively/the version command failed,
|
||||
* 1 if we're in a VM.
|
||||
*
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static Bool
|
||||
VMMouseClientVMCheck(void)
|
||||
{
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
vmpc.in.vEbx = ~VMMOUSE_PROTO_MAGIC;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_GETVERSION;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
|
||||
/*
|
||||
* ebx should contain VMMOUSE_PROTO_MAGIC
|
||||
* eax should contain version
|
||||
*/
|
||||
if (vmpc.out.vEbx != VMMOUSE_PROTO_MAGIC || vmpc.out.vEax == 0xffffffff) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClient_Disable --
|
||||
*
|
||||
* Tries to disable VMMouse communication mode on the host.
|
||||
* The caller is responsible for maintaining state (we don't check
|
||||
* if we're enabled before attempting to disable the VMMouse).
|
||||
*
|
||||
* Results:
|
||||
* TRUE if we successfully disable the VMMouse communication mode,
|
||||
* FALSE if something went wrong.
|
||||
*
|
||||
* Side effects:
|
||||
* Disables the absolute positioning mode.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
VMMouseClient_Disable(void)
|
||||
{
|
||||
uint32_t status;
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
VMwareLog(("VMMouseClient_Disable: writing disable command to port\n"));
|
||||
vmpc.in.vEbx = VMMOUSE_CMD_DISABLE;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
/*
|
||||
* We should get 0xffff in the flags now.
|
||||
*/
|
||||
vmpc.in.vEbx = 0;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
status = vmpc.out.vEax;
|
||||
if ((status & VMMOUSE_ERROR) != VMMOUSE_ERROR) {
|
||||
VMwareLog(("VMMouseClient_Disable: wrong status returned\n"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClient_Enable --
|
||||
*
|
||||
* Public Enable entry point. The driver calls this once it feels
|
||||
* ready to deal with VMMouse stuff. For now, we just try to enable
|
||||
* and return the result, but conceivably we could do more.
|
||||
*
|
||||
* Results:
|
||||
* TRUE if the enable succeeds, FALSE otherwise.
|
||||
*
|
||||
* Side effects:
|
||||
* Causes host-side state change.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Bool
|
||||
VMMouseClient_Enable(void) {
|
||||
|
||||
uint32_t status;
|
||||
uint32_t data;
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
/*
|
||||
* First, make sure we're in a VM; i.e. in dualboot configurations we might
|
||||
* find ourselves running on real hardware.
|
||||
*/
|
||||
|
||||
if (!VMMouseClientVMCheck()) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
VMwareLog(("VMMouseClientVMCheck succeeded, checking VMMOUSE version\n"));
|
||||
VMwareLog(("VMMouseClient_Enable: READ_ID 0x%08x, VERSION_ID 0x%08x\n",
|
||||
VMMOUSE_CMD_READ_ID, VMMOUSE_VERSION_ID));
|
||||
|
||||
/*
|
||||
* We probe for the VMMouse backend by sending the ENABLE
|
||||
* command to the mouse. We should get back the VERSION_ID on
|
||||
* the data port.
|
||||
*/
|
||||
vmpc.in.vEbx = VMMOUSE_CMD_READ_ID;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
|
||||
/*
|
||||
* Check whether the VMMOUSE_VERSION_ID is available to read
|
||||
*/
|
||||
vmpc.in.vEbx = 0;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
status = vmpc.out.vEax;
|
||||
if ((status & 0x0000ffff) == 0) {
|
||||
VMwareLog(("VMMouseClient_Enable: no data on port."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the VMMOUSE_VERSION_ID then
|
||||
*/
|
||||
/* Get just one item */
|
||||
vmpc.in.vEbx = 1;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_DATA;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
data = vmpc.out.vEax;
|
||||
if (data!= VMMOUSE_VERSION_ID) {
|
||||
VMwareLog(("VMMouseClient_Enable: data was not VERSION_ID"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
* To quote Jeremy, "Go Go Go!"
|
||||
*/
|
||||
|
||||
VMwareLog(("VMMouseClient_Enable: go go go!\n"));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClient_GetInput --
|
||||
*
|
||||
* Retrieves a 4-word input packet from the VMMouse data port and
|
||||
* stores it in the specified input structure.
|
||||
*
|
||||
* Results:
|
||||
* The number of packets in the queue, including the retrieved
|
||||
* packet.
|
||||
*
|
||||
* Side effects:
|
||||
* Could cause host state change.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
unsigned int
|
||||
VMMouseClient_GetInput (PVMMOUSE_INPUT_DATA pvmmouseInput) {
|
||||
|
||||
uint32_t status;
|
||||
uint16_t numWords;
|
||||
uint32_t packetInfo;
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
/*
|
||||
* The status dword has two parts: the high 16 bits are
|
||||
* for flags, the low 16-bits are the number of DWORDs
|
||||
* waiting in the data queue. VMMOUSE_ERROR is a special
|
||||
* case that indicates there's something wrong on the
|
||||
* host end, e.g. the VMMouse was disabled on the host-side.
|
||||
*/
|
||||
vmpc.in.vEbx = 0;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
status = vmpc.out.vEax;
|
||||
if ((status & VMMOUSE_ERROR) == VMMOUSE_ERROR) {
|
||||
VMwareLog(("VMMouseClient_GetInput: VMMOUSE_ERROR status, abort!\n"));
|
||||
return VMMOUSE_ERROR;
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't use the status flags, just get the words
|
||||
*/
|
||||
numWords = status & 0x0000ffff;
|
||||
|
||||
if ((numWords % 4) != 0) {
|
||||
VMwareLog(("VMMouseClient_GetInput: invalid status numWords, abort!\n"));
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (numWords == 0) {
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* The VMMouse uses a 4-dword packet protocol:
|
||||
* DWORD 0: Button State and per-packet flags
|
||||
* DWORD 1: X position (absolute or relative)
|
||||
* DWORD 2: Y position (absolute or relative)
|
||||
* DWORD 3: Z position (relative)
|
||||
*/
|
||||
/* Get 4 items at once */
|
||||
vmpc.in.vEbx = 4;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_DATA;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
packetInfo = vmpc.out.vEax;
|
||||
pvmmouseInput->Flags = (packetInfo & 0xffff0000) >> 16;
|
||||
pvmmouseInput->Buttons = (packetInfo & 0x0000ffff);
|
||||
|
||||
pvmmouseInput->X = vmpc.out.vEbx & 0xffff;
|
||||
pvmmouseInput->Y = vmpc.out.vEcx & 0xffff;
|
||||
pvmmouseInput->Z = (int)vmpc.out.vEdx;
|
||||
/*
|
||||
* Return number of packets (including this one) in queue.
|
||||
*/
|
||||
return (numWords >> 2);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClient_RequestRelative --
|
||||
*
|
||||
* Request that the host switch to posting relative packets. It's just
|
||||
* advisory, so we make no guarantees about if/when the switch will
|
||||
* happen.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Host may start posting relative packets in the near future.
|
||||
*
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
VMMouseClient_RequestRelative(void)
|
||||
{
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
VMwareLog(("VMMouseClient: requesting relative mode\n"));
|
||||
vmpc.in.vEbx = VMMOUSE_CMD_REQUEST_RELATIVE;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseClient_RequestAbsolute --
|
||||
*
|
||||
* Request that the host switch to posting absolute packets. It's just
|
||||
* advisory, so we make no guarantees about if/when the switch will
|
||||
* happen.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
*
|
||||
* Side effects:
|
||||
* Host may start posting absolute packets in the near future.
|
||||
*
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
VMMouseClient_RequestAbsolute(void)
|
||||
{
|
||||
VMMouseProtoCmd vmpc;
|
||||
|
||||
VMwareLog(("VMMouseClient: requesting absolute mode\n"));
|
||||
vmpc.in.vEbx = VMMOUSE_CMD_REQUEST_ABSOLUTE;
|
||||
vmpc.in.command = VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND;
|
||||
VMMouseProto_SendCmd(&vmpc);
|
||||
}
|
||||
73
src/vmmouse_client.h
Normal file
73
src/vmmouse_client.h
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright 2002-2006 by VMware, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
* vmmouse_client.h --
|
||||
*
|
||||
* VMware Virtual Mouse Client
|
||||
*
|
||||
* This module provides functions to enable/disable, operate and
|
||||
* process packets via the VMMouse absolute positioning module
|
||||
* hosted in the VMX.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _VMMOUSE_CLIENT_H_
|
||||
#define _VMMOUSE_CLIENT_H_
|
||||
|
||||
#include "xf86_OSproc.h"
|
||||
|
||||
/*
|
||||
* VMMouse Input packet data structure
|
||||
*/
|
||||
typedef struct _VMMOUSE_INPUT_DATA {
|
||||
unsigned short Flags;
|
||||
unsigned short Buttons;
|
||||
int X;
|
||||
int Y;
|
||||
int Z;
|
||||
} VMMOUSE_INPUT_DATA, *PVMMOUSE_INPUT_DATA;
|
||||
|
||||
/*
|
||||
* Public Functions
|
||||
*/
|
||||
Bool VMMouseClient_Enable(void);
|
||||
void VMMouseClient_Disable(void);
|
||||
unsigned int VMMouseClient_GetInput(PVMMOUSE_INPUT_DATA pvmmouseInput);
|
||||
void VMMouseClient_RequestRelative(void);
|
||||
void VMMouseClient_RequestAbsolute(void);
|
||||
|
||||
#ifdef VMX86_DEVEL
|
||||
#define VMwareLog(args) ErrorF args
|
||||
#else
|
||||
#define VMwareLog(args)
|
||||
#endif
|
||||
|
||||
#include "vmmouse_defs.h"
|
||||
|
||||
#endif /* _VMMOUSE_CLIENT_H_ */
|
||||
|
||||
66
src/vmmouse_defs.h
Normal file
66
src/vmmouse_defs.h
Normal file
@@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright 2002-2006 by VMware, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
* vmmouse_defs.h --
|
||||
*
|
||||
* VMware Virtual Mouse Protocol definitions. These constants
|
||||
* are shared by the host-side VMMouse module and
|
||||
* the guest tools/drivers.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _VMMOUSE_DEFS_H_
|
||||
#define _VMMOUSE_DEFS_H_
|
||||
|
||||
/*
|
||||
* Command related defines
|
||||
*/
|
||||
#define VMMOUSE_CMD_READ_ID 0x45414552
|
||||
#define VMMOUSE_CMD_DISABLE 0x000000f5
|
||||
#define VMMOUSE_CMD_REQUEST_RELATIVE 0x4c455252
|
||||
#define VMMOUSE_CMD_REQUEST_ABSOLUTE 0x53424152
|
||||
|
||||
/*
|
||||
* Data related defines
|
||||
*/
|
||||
#define VMMOUSE_VERSION_ID_STR "JUB4"
|
||||
#define VMMOUSE_VERSION_ID 0x3442554a
|
||||
|
||||
/*
|
||||
* Device related defines
|
||||
*/
|
||||
#define VMMOUSE_ERROR 0xffff0000
|
||||
|
||||
/*
|
||||
* VMMouse Input button flags
|
||||
*/
|
||||
#define VMMOUSE_LEFT_BUTTON 0x20
|
||||
#define VMMOUSE_RIGHT_BUTTON 0x10
|
||||
#define VMMOUSE_MIDDLE_BUTTON 0x08
|
||||
|
||||
#endif
|
||||
145
src/vmmouse_proto.c
Normal file
145
src/vmmouse_proto.c
Normal file
@@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Copyright 1999-2006 by VMware, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
* vmmouse_proto.c --
|
||||
*
|
||||
* The communication protocol between the guest and the vmmouse
|
||||
* virtual device.
|
||||
*/
|
||||
|
||||
|
||||
#include "vmmouse_proto.h"
|
||||
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseProtoInOut --
|
||||
*
|
||||
* Send a low-bandwidth basic request (16 bytes) to vmware, and return its
|
||||
* reply (24 bytes).
|
||||
*
|
||||
* Results:
|
||||
* Host-side response returned in cmd IN/OUT parameter.
|
||||
*
|
||||
* Side effects:
|
||||
* Pokes the communication port.
|
||||
*
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static void
|
||||
VMMouseProtoInOut(VMMouseProtoCmd *cmd) // IN/OUT
|
||||
{
|
||||
#ifdef __x86_64__
|
||||
uint64_t dummy;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"pushq %%rax" "\n\t"
|
||||
"movq 40(%%rax), %%rdi" "\n\t"
|
||||
"movq 32(%%rax), %%rsi" "\n\t"
|
||||
"movq 24(%%rax), %%rdx" "\n\t"
|
||||
"movq 16(%%rax), %%rcx" "\n\t"
|
||||
"movq 8(%%rax), %%rbx" "\n\t"
|
||||
"movq (%%rax), %%rax" "\n\t"
|
||||
"inl %%dx, %%eax" "\n\t" /* NB: There is no inq instruction */
|
||||
"xchgq %%rax, (%%rsp)" "\n\t"
|
||||
"movq %%rdi, 40(%%rax)" "\n\t"
|
||||
"movq %%rsi, 32(%%rax)" "\n\t"
|
||||
"movq %%rdx, 24(%%rax)" "\n\t"
|
||||
"movq %%rcx, 16(%%rax)" "\n\t"
|
||||
"movq %%rbx, 8(%%rax)" "\n\t"
|
||||
"popq (%%rax)"
|
||||
: "=a" (dummy)
|
||||
: "0" (cmd)
|
||||
/*
|
||||
* vmware can modify the whole VM state without the compiler knowing
|
||||
* it. So far it does not modify EFLAGS. --hpreg
|
||||
*/
|
||||
: "rbx", "rcx", "rdx", "rsi", "rdi", "memory"
|
||||
);
|
||||
#else
|
||||
#ifdef __i386__
|
||||
uint32_t dummy;
|
||||
|
||||
__asm__ __volatile__(
|
||||
"pushl %%eax" "\n\t"
|
||||
"movl 20(%%eax), %%edi" "\n\t"
|
||||
"movl 16(%%eax), %%esi" "\n\t"
|
||||
"movl 12(%%eax), %%edx" "\n\t"
|
||||
"movl 8(%%eax), %%ecx" "\n\t"
|
||||
"movl 4(%%eax), %%ebx" "\n\t"
|
||||
"movl (%%eax), %%eax" "\n\t"
|
||||
"inl %%dx, %%eax" "\n\t"
|
||||
"xchgl %%eax, (%%esp)" "\n\t"
|
||||
"movl %%edi, 20(%%eax)" "\n\t"
|
||||
"movl %%esi, 16(%%eax)" "\n\t"
|
||||
"movl %%edx, 12(%%eax)" "\n\t"
|
||||
"movl %%ecx, 8(%%eax)" "\n\t"
|
||||
"movl %%ebx, 4(%%eax)" "\n\t"
|
||||
"popl (%%eax)"
|
||||
: "=a" (dummy)
|
||||
: "0" (cmd)
|
||||
/*
|
||||
* vmware can modify the whole VM state without the compiler knowing
|
||||
* it. So far it does not modify EFLAGS. --hpreg
|
||||
*/
|
||||
: "ebx", "ecx", "edx", "esi", "edi", "memory"
|
||||
);
|
||||
#else
|
||||
#error "VMMouse is only supported on x86 and x86-64."
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
*-----------------------------------------------------------------------------
|
||||
*
|
||||
* VMMouseProto_SendCmd --
|
||||
*
|
||||
* Send a request (16 bytes) to vmware, and synchronously return its
|
||||
* reply (24 bytes).
|
||||
*
|
||||
* Result:
|
||||
* None
|
||||
*
|
||||
* Side-effects:
|
||||
* None
|
||||
*
|
||||
*-----------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
void
|
||||
VMMouseProto_SendCmd(VMMouseProtoCmd *cmd) // IN/OUT
|
||||
{
|
||||
cmd->in.magic = VMMOUSE_PROTO_MAGIC;
|
||||
cmd->in.port = VMMOUSE_PROTO_PORT;
|
||||
|
||||
VMMouseProtoInOut(cmd);
|
||||
}
|
||||
121
src/vmmouse_proto.h
Normal file
121
src/vmmouse_proto.h
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* Copyright 1999-2006 by VMware, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
* OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of the copyright holder(s)
|
||||
* and author(s) shall not be used in advertising or otherwise to promote
|
||||
* the sale, use or other dealings in this Software without prior written
|
||||
* authorization from the copyright holder(s) and author(s).
|
||||
*/
|
||||
|
||||
/*
|
||||
* vmmouse_proto.h --
|
||||
*
|
||||
* The communication protocol between the guest and the vmmouse
|
||||
* virtual device.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _VMMOUSE_PROTO_H_
|
||||
#define _VMMOUSE_PROTO_H_
|
||||
|
||||
#include <stdint.h>
|
||||
#include "xf86_libc.h"
|
||||
|
||||
#if !defined __i386__ && !defined __x86_64__
|
||||
#error The vmmouse protocol is only supported on x86 architectures.
|
||||
#endif
|
||||
|
||||
#define VMMOUSE_PROTO_MAGIC 0x564D5868
|
||||
#define VMMOUSE_PROTO_PORT 0x5658
|
||||
|
||||
#define VMMOUSE_PROTO_CMD_GETVERSION 10
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_DATA 39
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_STATUS 40
|
||||
#define VMMOUSE_PROTO_CMD_ABSPOINTER_COMMAND 41
|
||||
|
||||
#define DECLARE_REG32_STRUCT(_r) \
|
||||
union { \
|
||||
struct { \
|
||||
uint16_t low; \
|
||||
uint16_t high; \
|
||||
} vE##_r##_; \
|
||||
uint32_t vE##_r; \
|
||||
}
|
||||
|
||||
#ifdef VM_X86_64
|
||||
|
||||
#define DECLARE_REG64_STRUCT(_r) \
|
||||
union { \
|
||||
DECLARE_REG32_STRUCT(_r); \
|
||||
struct { \
|
||||
uint32_t low; \
|
||||
uint32_t high; \
|
||||
} vR##_r##_; \
|
||||
uint64_t vR##_r; \
|
||||
}
|
||||
|
||||
#define DECLARE_REG_STRUCT(x) DECLARE_REG64_STRUCT(x)
|
||||
|
||||
#else
|
||||
|
||||
#define DECLARE_REG_STRUCT(x) DECLARE_REG32_STRUCT(x)
|
||||
|
||||
#endif
|
||||
|
||||
typedef union {
|
||||
struct {
|
||||
union {
|
||||
uint32_t magic;
|
||||
DECLARE_REG_STRUCT(ax);
|
||||
};
|
||||
union {
|
||||
size_t size;
|
||||
DECLARE_REG_STRUCT(bx);
|
||||
};
|
||||
union {
|
||||
uint16_t command;
|
||||
DECLARE_REG_STRUCT(cx);
|
||||
};
|
||||
union {
|
||||
uint16_t port;
|
||||
DECLARE_REG_STRUCT(dx);
|
||||
};
|
||||
DECLARE_REG_STRUCT(si);
|
||||
DECLARE_REG_STRUCT(di);
|
||||
} in;
|
||||
struct {
|
||||
DECLARE_REG_STRUCT(ax);
|
||||
DECLARE_REG_STRUCT(bx);
|
||||
DECLARE_REG_STRUCT(cx);
|
||||
DECLARE_REG_STRUCT(dx);
|
||||
DECLARE_REG_STRUCT(si);
|
||||
DECLARE_REG_STRUCT(di);
|
||||
} out;
|
||||
} VMMouseProtoCmd;
|
||||
|
||||
|
||||
void
|
||||
VMMouseProto_SendCmd(VMMouseProtoCmd *cmd); // IN/OUT
|
||||
|
||||
|
||||
#undef DECLARE_REG_STRUCT
|
||||
|
||||
#endif /* _VMMOUSE_PROTO_H_ */
|
||||
Reference in New Issue
Block a user