/** * Send an absolute mouse event to the VM. This requires either VirtualBox- * specific drivers installed in the guest or absolute pointing device * emulation. * @note the VMMDev capability change is so that the guest knows we are sending * dummy events over the PS/2 device to signal the arrival of new * absolute pointer data, and not pointer real movement data * @note all calls out of this object are made with no locks held! * * @returns COM status code * @param x X position (pixel), starting from 1 * @param y Y position (pixel), starting from 1 * @param dz Z movement * @param fButtons The mouse button state */ STDMETHODIMP Mouse::PutMouseEventAbsolute(LONG x, LONG y, LONG dz, LONG dw, LONG fButtons) { AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); LogRel3(("%s: x=%d, y=%d, dz=%d, dw=%d, fButtons=0x%x\n", __PRETTY_FUNCTION__, x, y, dz, dw, fButtons)); int32_t xAdj, yAdj; uint32_t fButtonsAdj; bool fValid; /** @todo the front end should do this conversion to avoid races */ /** @note Or maybe not... races are pretty inherent in everything done in * this object and not really bad as far as I can see. */ HRESULT rc = convertDisplayRes(x, y, &xAdj, &yAdj, &fValid); if (FAILED(rc)) return rc; fButtonsAdj = mouseButtonsToPDM(fButtons); /* If we are doing old-style (IRQ-less) absolute reporting to the VMM * device then make sure the guest is aware of it, so that it knows to * ignore relative movement on the PS/2 device. */ updateVMMDevMouseCaps(VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE, 0); if (fValid) { rc = reportAbsEvent(xAdj, yAdj, dz, dw, fButtonsAdj, RT_BOOL( mfVMMDevGuestCaps & VMMDEV_MOUSE_NEW_PROTOCOL)); fireMouseEvent(true, x, y, dz, dw, 0, fButtons); } return rc; }
/** * Send a relative mouse event to the guest. * @note the VMMDev capability change is so that the guest knows we are sending * real events over the PS/2 device and not dummy events to signal the * arrival of new absolute pointer data * * @returns COM status code * @param dx X movement * @param dy Y movement * @param dz Z movement * @param buttonState The mouse button state */ STDMETHODIMP Mouse::PutMouseEvent(LONG dx, LONG dy, LONG dz, LONG dw, LONG buttonState) { HRESULT rc; uint32_t fButtons; AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); LogRel3(("%s: dx=%d, dy=%d, dz=%d, dw=%d\n", __PRETTY_FUNCTION__, dx, dy, dz, dw)); fButtons = mouseButtonsToPDM(buttonState); /* Make sure that the guest knows that we are sending real movement * events to the PS/2 device and not just dummy wake-up ones. */ updateVMMDevMouseCaps(0, VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE); rc = reportRelEventToMouseDev(dx, dy, dz, dw, fButtons); fireMouseEvent(false, dx, dy, dz, dw, buttonState); return rc; }
bool OisInputListener::mouseMoved(const OIS::MouseEvent& arg) { fireMouseEvent(MouseEvent::MOUSE_MOVE, arg); return true; }
void InputHandler::fireMouseEvent(Event::ConstType type, int x, int y, int z) { fireMouseEvent(type, x, y, z, MouseEvent::None); }
bool OisInputListener::mouseReleased(const OIS::MouseEvent& arg, OIS::MouseButtonID id) { fireMouseEvent(MouseEvent::MOUSE_UP, arg, mapButtonType(id)); return true; }