VirtualBox

source: vbox/trunk/src/VBox/Frontends/VBoxBFE/MouseImpl.cpp@ 14976

Last change on this file since 14976 was 13837, checked in by vboxsync, 16 years ago

s/%Vr\([acfs]\)/%Rr\1/g - since I'm upsetting everyone anyway, better make the most of it...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.0 KB
Line 
1/** @file
2 *
3 * VBox frontends: Basic Frontend (BFE):
4 * Implementation of Mouse class
5 */
6
7/*
8 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
9 *
10 * This file is part of VirtualBox Open Source Edition (OSE), as
11 * available from http://www.virtualbox.org. This file is free software;
12 * you can redistribute it and/or modify it under the terms of the GNU
13 * General Public License (GPL) as published by the Free Software
14 * Foundation, in version 2 as it comes in the "COPYING" file of the
15 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
16 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
17 *
18 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
19 * Clara, CA 95054 USA or visit http://www.sun.com if you need
20 * additional information or have any questions.
21 */
22
23#ifdef VBOXBFE_WITHOUT_COM
24# include "COMDefs.h"
25#else
26# include <VBox/com/defs.h>
27#endif
28#include <VBox/pdm.h>
29#include <VBox/cfgm.h>
30#include <VBox/err.h>
31#include <iprt/assert.h>
32#include <VBox/log.h>
33#include <iprt/asm.h>
34#include <VBox/VBoxDev.h>
35#include "MouseImpl.h"
36#include "DisplayImpl.h"
37#include "VMMDevInterface.h"
38
39/**
40 * Mouse driver instance data.
41 */
42typedef struct DRVMAINMOUSE
43{
44 /** Pointer to the associated mouse driver. */
45 Mouse *mpDrv;
46 /** Pointer to the driver instance structure. */
47 PPDMDRVINS pDrvIns;
48 /** Pointer to the mouse port interface of the driver/device above us. */
49 PPDMIMOUSEPORT pUpPort;
50 /** Our mouse connector interface. */
51 PDMIMOUSECONNECTOR Connector;
52} DRVMAINMOUSE, *PDRVMAINMOUSE;
53
54/** Converts PDMIMOUSECONNECTOR pointer to a DRVMAINMOUSE pointer. */
55#define PDMIMOUSECONNECTOR_2_MAINMOUSE(pInterface) ( (PDRVMAINMOUSE) ((uintptr_t)pInterface - RT_OFFSETOF(DRVMAINMOUSE, Connector)) )
56
57// IMouse methods
58/////////////////////////////////////////////////////////////////////////////
59
60int Mouse::setAbsoluteCoordinates(bool fAbsolute)
61{
62 this->fAbsolute = fAbsolute;
63 return S_OK;
64}
65
66int Mouse::setNeedsHostCursor(bool fNeedsHostCursor)
67{
68 this->fNeedsHostCursor = fNeedsHostCursor;
69 return S_OK;
70}
71
72int Mouse::setHostCursor(bool enable)
73{
74 uHostCaps = enable ? 0 : VMMDEV_MOUSEHOSTCANNOTHWPOINTER;
75 gVMMDev->SetMouseCapabilities(uHostCaps);
76 return S_OK;
77}
78
79/**
80 * Send a mouse event.
81 *
82 * @returns COM status code
83 * @param dx X movement
84 * @param dy Y movement
85 * @param dz Z movement
86 * @param buttonState The mouse button state
87 */
88int Mouse::PutMouseEvent(LONG dx, LONG dy, LONG dz, LONG buttonState)
89{
90 uint32_t mouseCaps;
91 gVMMDev->QueryMouseCapabilities(&mouseCaps);
92
93 /*
94 * This method being called implies that the host no
95 * longer wants to use absolute coordinates. If the VMM
96 * device isn't aware of that yet, tell it.
97 */
98 if (mouseCaps & VMMDEV_MOUSEHOSTWANTSABS)
99 {
100 gVMMDev->SetMouseCapabilities(uHostCaps);
101 }
102
103 uint32_t fButtons = 0;
104 if (buttonState & PDMIMOUSEPORT_BUTTON_LEFT)
105 fButtons |= PDMIMOUSEPORT_BUTTON_LEFT;
106 if (buttonState & PDMIMOUSEPORT_BUTTON_RIGHT)
107 fButtons |= PDMIMOUSEPORT_BUTTON_RIGHT;
108 if (buttonState & PDMIMOUSEPORT_BUTTON_MIDDLE)
109 fButtons |= PDMIMOUSEPORT_BUTTON_MIDDLE;
110
111 int vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, dx, dy, dz, fButtons);
112 if (RT_FAILURE (vrc))
113 return E_FAIL;
114
115 return S_OK;
116}
117
118/**
119 * Send an absolute mouse event to the VM. This only works
120 * when the required guest support has been installed.
121 *
122 * @returns COM status code
123 * @param x X position (pixel)
124 * @param y Y position (pixel)
125 * @param dz Z movement
126 * @param buttonState The mouse button state
127 */
128int Mouse::PutMouseEventAbsolute(LONG x, LONG y, LONG dz, LONG buttonState)
129{
130 uint32_t mouseCaps;
131 gVMMDev->QueryMouseCapabilities(&mouseCaps);
132
133 /*
134 * This method being called implies that the host no
135 * longer wants to use absolute coordinates. If the VMM
136 * device isn't aware of that yet, tell it.
137 */
138 if (!(mouseCaps & VMMDEV_MOUSEHOSTWANTSABS))
139 {
140 gVMMDev->SetMouseCapabilities(uHostCaps | VMMDEV_MOUSEHOSTWANTSABS);
141 }
142
143 ULONG displayWidth;
144 ULONG displayHeight;
145 displayHeight = gDisplay->getHeight();
146 displayWidth = gDisplay->getWidth();
147
148 uint32_t mouseXAbs = (x * 0xFFFF) / displayWidth;
149 uint32_t mouseYAbs = (y * 0xFFFF) / displayHeight;
150
151 /*
152 * Send the absolute mouse position to the VMM device
153 */
154 int vrc = gVMMDev->SetAbsoluteMouse(mouseXAbs, mouseYAbs);
155 AssertRC(vrc);
156
157 // check if the guest actually wants absolute mouse positions
158 if (mouseCaps & VMMDEV_MOUSEGUESTWANTSABS)
159 {
160 uint32_t fButtons = 0;
161 if (buttonState & PDMIMOUSEPORT_BUTTON_LEFT)
162 fButtons |= PDMIMOUSEPORT_BUTTON_LEFT;
163 if (buttonState & PDMIMOUSEPORT_BUTTON_RIGHT)
164 fButtons |= PDMIMOUSEPORT_BUTTON_RIGHT;
165 if (buttonState & PDMIMOUSEPORT_BUTTON_MIDDLE)
166 fButtons |= PDMIMOUSEPORT_BUTTON_MIDDLE;
167
168 vrc = mpDrv->pUpPort->pfnPutEvent(mpDrv->pUpPort, 1, 1, dz, fButtons);
169 if (RT_FAILURE (vrc))
170 return E_FAIL;
171 }
172
173 return S_OK;
174}
175
176/////////////////////////////////////////////////////////////////////////////
177
178/**
179 * Queries an interface to the driver.
180 *
181 * @returns Pointer to interface.
182 * @returns NULL if the interface was not supported by the driver.
183 * @param pInterface Pointer to this interface structure.
184 * @param enmInterface The requested interface identification.
185 */
186DECLCALLBACK(void *) Mouse::drvQueryInterface(PPDMIBASE pInterface, PDMINTERFACE enmInterface)
187{
188 PPDMDRVINS pDrvIns = PDMIBASE_2_PDMDRV(pInterface);
189 PDRVMAINMOUSE pDrv = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
190 switch (enmInterface)
191 {
192 case PDMINTERFACE_BASE:
193 return &pDrvIns->IBase;
194 case PDMINTERFACE_MOUSE_CONNECTOR:
195 return &pDrv->Connector;
196 default:
197 return NULL;
198 }
199}
200
201
202/**
203 * Destruct a mouse driver instance.
204 *
205 * @returns VBox status.
206 * @param pDrvIns The driver instance data.
207 */
208DECLCALLBACK(void) Mouse::drvDestruct(PPDMDRVINS pDrvIns)
209{
210 //PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
211 LogFlow(("Mouse::drvDestruct: iInstance=%d\n", pDrvIns->iInstance));
212}
213
214
215/**
216 * Construct a mouse driver instance.
217 *
218 * @returns VBox status.
219 * @param pDrvIns The driver instance data.
220 * If the registration structure is needed, pDrvIns->pDrvReg points to it.
221 * @param pCfgHandle Configuration node handle for the driver. Use this to obtain the configuration
222 * of the driver instance. It's also found in pDrvIns->pCfgHandle, but like
223 * iInstance it's expected to be used a bit in this function.
224 */
225DECLCALLBACK(int) Mouse::drvConstruct(PPDMDRVINS pDrvIns, PCFGMNODE pCfgHandle)
226{
227 PDRVMAINMOUSE pData = PDMINS_2_DATA(pDrvIns, PDRVMAINMOUSE);
228 LogFlow(("drvMainMouse_Construct: iInstance=%d\n", pDrvIns->iInstance));
229
230 /*
231 * Validate configuration.
232 */
233 if (!CFGMR3AreValuesValid(pCfgHandle, "Object\0"))
234 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES;
235
236 PPDMIBASE pBaseIgnore;
237 int rc = pDrvIns->pDrvHlp->pfnAttach(pDrvIns, &pBaseIgnore);
238 if (rc != VERR_PDM_NO_ATTACHED_DRIVER)
239 {
240 AssertMsgFailed(("Configuration error: Not possible to attach anything to this driver!\n"));
241 return VERR_PDM_DRVINS_NO_ATTACH;
242 }
243
244 /*
245 * IBase.
246 */
247 pDrvIns->IBase.pfnQueryInterface = Mouse::drvQueryInterface;
248
249 /*
250 * Get the IMousePort interface of the above driver/device.
251 */
252 pData->pUpPort = (PPDMIMOUSEPORT)pDrvIns->pUpBase->pfnQueryInterface(pDrvIns->pUpBase, PDMINTERFACE_MOUSE_PORT);
253 if (!pData->pUpPort)
254 {
255 AssertMsgFailed(("Configuration error: No mouse port interface above!\n"));
256 return VERR_PDM_MISSING_INTERFACE_ABOVE;
257 }
258
259 /*
260 * Get the Mouse object pointer and update the mpDrv member.
261 */
262 void *pv;
263 rc = CFGMR3QueryPtr(pCfgHandle, "Object", &pv);
264 if (RT_FAILURE(rc))
265 {
266 AssertMsgFailed(("Configuration error: No/bad \"Object\" value! rc=%Rrc\n", rc));
267 return rc;
268 }
269
270 pData->mpDrv = (Mouse*)pv; /** @todo Check this cast! */
271 pData->mpDrv->mpDrv = pData;
272
273 return VINF_SUCCESS;
274}
275
276
277/**
278 * Main mouse driver registration record.
279 */
280const PDMDRVREG Mouse::DrvReg =
281{
282 /* u32Version */
283 PDM_DRVREG_VERSION,
284 /* szDriverName */
285 "MainMouse",
286 /* pszDescription */
287 "Main mouse driver (Main as in the API).",
288 /* fFlags */
289 PDM_DRVREG_FLAGS_HOST_BITS_DEFAULT,
290 /* fClass. */
291 PDM_DRVREG_CLASS_MOUSE,
292 /* cMaxInstances */
293 ~0,
294 /* cbInstance */
295 sizeof(DRVMAINMOUSE),
296 /* pfnConstruct */
297 Mouse::drvConstruct,
298 /* pfnDestruct */
299 Mouse::drvDestruct,
300 /* pfnIOCtl */
301 NULL,
302 /* pfnPowerOn */
303 NULL,
304 /* pfnReset */
305 NULL,
306 /* pfnSuspend */
307 NULL,
308 /* pfnResume */
309 NULL,
310 /* pfnDetach */
311 NULL
312};
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette