MouseImpl.cpp revision 9fb5c93ff4449e19077128c07c080acbed35ceea
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/** @file
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * VBox frontends: Basic Frontend (BFE):
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Implementation of Mouse class
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
be41e59f051a3abb5cd05e7fe270ab2fea791f5avboxsync/*
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * additional information or have any questions.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
cd6f71bc352f550074f1ba2c830a2cf2f0b3dd46vboxsync#ifdef VBOXBFE_WITHOUT_COM
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync# include "COMDefs.h"
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync#else
43747b1f0bc8302a238fb35e55857a5e9aa1933dvboxsync# include <VBox/com/defs.h>
16a9adc14900ca18e6909679a579f6833425e030vboxsync#endif
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/pdm.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/cfgm.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/err.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <iprt/assert.h>
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/log.h>
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync#include <iprt/asm.h>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <VBox/VMMDev.h>
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync#include "MouseImpl.h"
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#include "DisplayImpl.h"
cc15c3fa4bb2d3fb91e4d0cd15a73133963f86b0vboxsync#include "VMMDevInterface.h"
b0b15690f00527424b2d5fb88456d747252322f7vboxsync
47579c4cc64e7dff9b4de48841a2c4df3b96ab38vboxsync/**
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync * Mouse driver instance data.
efff36b306e370346025647a158689021df2e1d1vboxsync */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsynctypedef struct DRVMAINMOUSE
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync{
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync /** Pointer to the associated mouse driver. */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync Mouse *mpDrv;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync /** Pointer to the driver instance structure. */
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync PPDMDRVINS pDrvIns;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync /** Pointer to the mouse port interface of the driver/device above us. */
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync PPDMIMOUSEPORT pUpPort;
30c39307775310ba50de9d9b74f1ea9e12524102vboxsync /** Our mouse connector interface. */
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync PDMIMOUSECONNECTOR Connector;
efff36b306e370346025647a158689021df2e1d1vboxsync} DRVMAINMOUSE, *PDRVMAINMOUSE;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
f5e53763b0a581b0299e98028c6c52192eb06785vboxsync/** Converts PDMIMOUSECONNECTOR pointer to a DRVMAINMOUSE pointer. */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#define PDMIMOUSECONNECTOR_2_MAINMOUSE(pInterface) ( (PDRVMAINMOUSE) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINMOUSE, Connector)) )
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync// IMouse methods
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync/////////////////////////////////////////////////////////////////////////////
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsyncint Mouse::setAbsoluteCoordinates(bool fAbsolute)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync this->fAbsolute = fAbsolute;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync return S_OK;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync}
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsyncint Mouse::setNeedsHostCursor(bool fNeedsHostCursor)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync this->fNeedsHostCursor = fNeedsHostCursor;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync return S_OK;
9496f2d398b49813176939d7a339ae513d5175efvboxsync}
9496f2d398b49813176939d7a339ae513d5175efvboxsync
9496f2d398b49813176939d7a339ae513d5175efvboxsyncint Mouse::setHostCursor(bool enable)
9496f2d398b49813176939d7a339ae513d5175efvboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uHostCaps = enable ? 0 : VMMDEV_MOUSEHOSTCANNOTHWPOINTER;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync gVMMDev->SetMouseCapabilities(uHostCaps);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return S_OK;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/**
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Send a mouse event.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @returns COM status code
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @param dx X movement
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param dy Y movement
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param dz Z movement
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param buttonState The mouse button state
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsyncint Mouse::PutMouseEvent(LONG dx, LONG dy, LONG dz, LONG buttonState)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t mouseCaps;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync gVMMDev->QueryMouseCapabilities(&mouseCaps);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync /*
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * This method being called implies that the host no
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * longer wants to use absolute coordinates. If the VMM
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync * device isn't aware of that yet, tell it.
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync */
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (mouseCaps & VMMDEV_MOUSEHOSTWANTSABS)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync {
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync gVMMDev->SetMouseCapabilities(uHostCaps);
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync uint32_t fButtons = 0;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_LEFT)
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync fButtons |= PDMIMOUSEPORT_BUTTON_LEFT;
7766bf675357fd940d8c49e69a5d72dc6eaa6be4vboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_RIGHT)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync fButtons |= PDMIMOUSEPORT_BUTTON_RIGHT;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_MIDDLE)
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync fButtons |= PDMIMOUSEPORT_BUTTON_MIDDLE;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync int vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, dx, dy, dz, fButtons);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync if (RT_FAILURE (vrc))
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync return E_FAIL;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync return S_OK;
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync}
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync/**
ee4d840f54fd2dcea8a73b1b86d5ec0db370b05dvboxsync * Send an absolute mouse event to the VM. This only works
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * when the required guest support has been installed.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @returns COM status code
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @param x X position (pixel)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param y Y position (pixel)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @param dz Z movement
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param buttonState The mouse button state
cab115cfa31c584def7069312a1e23c3fc88533bvboxsync */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsyncint Mouse::PutMouseEventAbsolute(LONG x, LONG y, LONG dz, LONG buttonState)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync{
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync uint32_t mouseCaps;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync gVMMDev->QueryMouseCapabilities(&mouseCaps);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
21029597fc4b76d0db0c9542daee201447281781vboxsync /*
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * This method being called implies that the host no
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * longer wants to use absolute coordinates. If the VMM
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * device isn't aware of that yet, tell it.
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync */
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (!(mouseCaps & VMMDEV_MOUSEHOSTWANTSABS))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync gVMMDev->SetMouseCapabilities(uHostCaps | VMMDEV_MOUSEHOSTWANTSABS);
c0a370e600bb60153a269fb32b5f709347c35768vboxsync }
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync ULONG displayWidth;
9496f2d398b49813176939d7a339ae513d5175efvboxsync ULONG displayHeight;
9496f2d398b49813176939d7a339ae513d5175efvboxsync displayHeight = gDisplay->getHeight();
9496f2d398b49813176939d7a339ae513d5175efvboxsync displayWidth = gDisplay->getWidth();
9496f2d398b49813176939d7a339ae513d5175efvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t mouseXAbs = (x * 0xFFFF) / displayWidth;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync uint32_t mouseYAbs = (y * 0xFFFF) / displayHeight;
61d064a54f03596920c3918f58ecc7764074a5d8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync /*
16a9adc14900ca18e6909679a579f6833425e030vboxsync * Send the absolute mouse position to the VMM device
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync int vrc = gVMMDev->SetAbsoluteMouse(mouseXAbs, mouseYAbs);
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync AssertRC(vrc);
16a9adc14900ca18e6909679a579f6833425e030vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync // check if the guest actually wants absolute mouse positions
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (mouseCaps & VMMDEV_MOUSEGUESTWANTSABS)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync uint32_t fButtons = 0;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_LEFT)
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync fButtons |= PDMIMOUSEPORT_BUTTON_LEFT;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_RIGHT)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync fButtons |= PDMIMOUSEPORT_BUTTON_RIGHT;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync if (buttonState & PDMIMOUSEPORT_BUTTON_MIDDLE)
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync fButtons |= PDMIMOUSEPORT_BUTTON_MIDDLE;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, 1, 1, dz, fButtons);
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync if (RT_FAILURE (vrc))
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync return E_FAIL;
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync }
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync return S_OK;
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync}
63c12491acc2b8b95c8ac454f1c48b98eec8f7d8vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync/////////////////////////////////////////////////////////////////////////////
b5ad839a3757b305d4e98d7264da2b53c9cd27f0vboxsync
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync/**
61b5982fad4660d0fe3dd6ceba9eda85eb32f7e8vboxsync * Queries an interface to the driver.
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync *
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync * @returns Pointer to interface.
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync * @returns NULL if the interface was not supported by the driver.
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync * @param pInterface Pointer to this interface structure.
681fd85cc7cd49e9cf66a917d6ae9ff36eb7d9e9vboxsync * @param enmInterface The requested interface identification.
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync */
009d45aa55691312278d41edb20154dc208d9cd8vboxsyncDECLCALLBACK(void *) Mouse::drvQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface)
009d45aa55691312278d41edb20154dc208d9cd8vboxsync{
e4f367251aede667a6de69baa54ef9eb5f150871vboxsync PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync PDRVMAINMOUSE pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync switch (enmInterface)
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync {
203cad92999b4792bf61b4b65e1e2abfe08f5664vboxsync case PDMINTERFACE_BASE:
203cad92999b4792bf61b4b65e1e2abfe08f5664vboxsync return &pDrvIns->IBase;
203cad92999b4792bf61b4b65e1e2abfe08f5664vboxsync case PDMINTERFACE_MOUSE_CONNECTOR:
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync return &pDrv->Connector;
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync default:
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync return NULL;
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync }
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync}
c5abe3ea9c7ac6dec34f42af30612534bea951ffvboxsync
1741b757f7a570a7e6d48db46c3f4cd50f2ee296vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/**
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Destruct a mouse driver instance.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * @returns VBox status.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * @param pDrvIns The driver instance data.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncDECLCALLBACK(void) Mouse::drvDestruct(PPDMDRVINS pDrvIns)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync //PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync LogFlow(("Mouse::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync}
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync/**
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Construct a mouse driver instance.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync *
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @returns VBox status.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @param pDrvIns The driver instance data.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * If the registration structure is needed, pDrvIns->pDrvReg points to it.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * @param pCfgHandle Configuration node handle for the driver. Use this to obtain the configuration
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * of the driver instance. It's also found in pDrvIns->pCfgHandle, but like
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * iInstance it's expected to be used a bit in this function.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsyncDECLCALLBACK(int) Mouse::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync{
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync LogFlow(("drvMainMouse_Construct: iInstance=%d\n", pDrvIns->iInstance));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync /*
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync * Validate configuration.
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync */
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync PPDMIBASE pBaseIgnore;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync int rc = pDrvIns->pDrvHlp->pfnAttach(pDrvIns, &pBaseIgnore);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (rc != VERR_PDM_NO_ATTACHED_DRIVER)
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync AssertMsgFailed(("Configuration error: Not possible to attach anything to this driver!\n"));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return VERR_PDM_DRVINS_NO_ATTACH;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync /*
16a9adc14900ca18e6909679a579f6833425e030vboxsync * IBase.
16a9adc14900ca18e6909679a579f6833425e030vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync pDrvIns->IBase.pfnQueryInterface = Mouse::drvQueryInterface;
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync /*
16a9adc14900ca18e6909679a579f6833425e030vboxsync * Get the IMousePort interface of the above driver/device.
16a9adc14900ca18e6909679a579f6833425e030vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync pData->pUpPort = (PPDMIMOUSEPORT)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_MOUSE_PORT);
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (!pData->pUpPort)
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
16a9adc14900ca18e6909679a579f6833425e030vboxsync AssertMsgFailed(("Configuration error: No mouse port interface above!\n"));
16a9adc14900ca18e6909679a579f6833425e030vboxsync return VERR_PDM_MISSING_INTERFACE_ABOVE;
16a9adc14900ca18e6909679a579f6833425e030vboxsync }
16a9adc14900ca18e6909679a579f6833425e030vboxsync
16a9adc14900ca18e6909679a579f6833425e030vboxsync /*
16a9adc14900ca18e6909679a579f6833425e030vboxsync * Get the Mouse object pointer and update the mpDrv member.
16a9adc14900ca18e6909679a579f6833425e030vboxsync */
16a9adc14900ca18e6909679a579f6833425e030vboxsync void *pv;
16a9adc14900ca18e6909679a579f6833425e030vboxsync rc = CFGMR3QueryPtr(pCfgHandle, "Object", &pv);
16a9adc14900ca18e6909679a579f6833425e030vboxsync if (RT_FAILURE(rc))
16a9adc14900ca18e6909679a579f6833425e030vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync AssertMsgFailed(("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc));
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync return rc;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync }
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync pData->mpDrv = (Mouse*)pv; /** @todo Check this cast! */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync pData->mpDrv->mpDrv = pData;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync return VINF_SUCCESS;
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync}
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync/**
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync * Main mouse driver registration record.
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsyncconst PDMDRVREG Mouse::DrvReg =
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync{
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* u32Version */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync PDM_DRVREG_VERSION,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* szDriverName */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync "MainMouse",
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pszDescription */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync "Main mouse driver (Main as in the API).",
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* fFlags */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* fClass. */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync PDM_DRVREG_CLASS_MOUSE,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* cMaxInstances */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync ~0,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* cbInstance */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync sizeof(DRVMAINMOUSE),
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnConstruct */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Mouse::drvConstruct,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnDestruct */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync Mouse::drvDestruct,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnIOCtl */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync NULL,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnPowerOn */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync NULL,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnReset */
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync NULL,
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync /* pfnSuspend */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync NULL,
a9d49c8f2b28a72e6a4db86eee91e4569290157bvboxsync /* pfnResume */
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync NULL,
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync /* pfnDetach */
9496f2d398b49813176939d7a339ae513d5175efvboxsync NULL
9496f2d398b49813176939d7a339ae513d5175efvboxsync};
9496f2d398b49813176939d7a339ae513d5175efvboxsync