void Mouse::fireMultiTouchEvent(uint8_t cContacts, const LONG64 *paContacts, uint32_t u32ScanTime) { com::SafeArray<SHORT> xPositions(cContacts); com::SafeArray<SHORT> yPositions(cContacts); com::SafeArray<USHORT> contactIds(cContacts); com::SafeArray<USHORT> contactFlags(cContacts); uint8_t i; for (i = 0; i < cContacts; i++) { uint32_t u32Lo = RT_LO_U32(paContacts[i]); uint32_t u32Hi = RT_HI_U32(paContacts[i]); xPositions[i] = (int16_t)u32Lo; yPositions[i] = (int16_t)(u32Lo >> 16); contactIds[i] = RT_BYTE1(u32Hi); contactFlags[i] = RT_BYTE2(u32Hi); } VBoxEventDesc evDesc; evDesc.init(mEventSource, VBoxEventType_OnGuestMultiTouch, cContacts, ComSafeArrayAsInParam(xPositions), ComSafeArrayAsInParam(yPositions), ComSafeArrayAsInParam(contactIds), ComSafeArrayAsInParam(contactFlags), u32ScanTime); evDesc.fire(0); }
STDMETHODIMP EventSource::UnregisterListener(IEventListener * aListener) { CheckComArgNotNull(aListener); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); HRESULT rc; { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); Listeners::iterator it = m->mListeners.find(aListener); if (it != m->mListeners.end()) { m->mListeners.erase(it); // destructor removes refs from the event map rc = S_OK; } else { rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Listener was never registered")); } } if (SUCCEEDED(rc)) { VBoxEventDesc evDesc; evDesc.init(this, VBoxEventType_OnEventSourceChanged, aListener, FALSE); evDesc.fire(0); } return rc; }
void Mouse::fireMouseEvent(bool fAbsolute, LONG x, LONG y, LONG dz, LONG dw, LONG fButtons) { /* If mouse button is pressed, we generate new event, to avoid reusable events coalescing and thus dropping key press events */ GuestMouseEventMode_T mode; if (fAbsolute) mode = GuestMouseEventMode_Absolute; else mode = GuestMouseEventMode_Relative; if (fButtons != 0) { VBoxEventDesc evDesc; evDesc.init(mEventSource, VBoxEventType_OnGuestMouse, mode, x, y, dz, dw, fButtons); evDesc.fire(0); } else { mMouseEvent.reinit(VBoxEventType_OnGuestMouse, mode, x, y, dz, dw, fButtons); mMouseEvent.fire(0); } }
STDMETHODIMP EventSource::RegisterListener(IEventListener * aListener, ComSafeArrayIn(VBoxEventType_T, aInterested), BOOL aActive) { CheckComArgNotNull(aListener); CheckComArgSafeArrayNotNull(aInterested); AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); Listeners::const_iterator it = m->mListeners.find(aListener); if (it != m->mListeners.end()) return setError(E_INVALIDARG, tr("This listener already registered")); com::SafeArray<VBoxEventType_T> interested(ComSafeArrayInArg (aInterested)); RecordHolder<ListenerRecord> lrh(new ListenerRecord(aListener, interested, aActive, this)); m->mListeners.insert(Listeners::value_type(aListener, lrh)); } VBoxEventDesc evDesc; evDesc.init(this, VBoxEventType_OnEventSourceChanged, aListener, TRUE); evDesc.fire(0); return S_OK; }
HRESULT EventSource::unregisterListener(const ComPtr<IEventListener> &aListener) { HRESULT rc = S_OK;; AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); Listeners::iterator it = m->mListeners.find(aListener); if (it != m->mListeners.end()) { it->second.obj()->shutdown(); m->mListeners.erase(it); // destructor removes refs from the event map rc = S_OK; } else { rc = setError(VBOX_E_OBJECT_NOT_FOUND, tr("Listener was never registered")); } if (SUCCEEDED(rc)) { VBoxEventDesc evDesc; evDesc.init(this, VBoxEventType_OnEventSourceChanged, (IEventListener *)aListener, FALSE); evDesc.fire(0); } return rc; }
HRESULT EventSource::registerListener(const ComPtr<IEventListener> &aListener, const std::vector<VBoxEventType_T> &aInteresting, BOOL aActive) { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); if (m->fShutdown) return setError(VBOX_E_INVALID_OBJECT_STATE, tr("This event source is already shut down")); Listeners::const_iterator it = m->mListeners.find(aListener); if (it != m->mListeners.end()) return setError(E_INVALIDARG, tr("This listener already registered")); com::SafeArray<VBoxEventType_T> interested(aInteresting); RecordHolder<ListenerRecord> lrh(new ListenerRecord(aListener, interested, aActive, this)); m->mListeners.insert(Listeners::value_type((IEventListener *)aListener, lrh)); VBoxEventDesc evDesc; evDesc.init(this, VBoxEventType_OnEventSourceChanged, (IEventListener *)aListener, TRUE); evDesc.fire(0); return S_OK; }
/** * Sends a list of scancodes to the keyboard. * * @returns COM status code * @param scancodes Pointer to the first scancode * @param count Number of scancodes * @param codesStored Address of variable to store the number * of scancodes that were sent to the keyboard. This value can be NULL. */ STDMETHODIMP Keyboard::PutScancodes(ComSafeArrayIn(LONG, scancodes), ULONG *codesStored) { if (ComSafeArrayInIsNull(scancodes)) return E_INVALIDARG; AutoCaller autoCaller(this); if (FAILED(autoCaller.rc())) return autoCaller.rc(); com::SafeArray<LONG> keys(ComSafeArrayInArg(scancodes)); AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); CHECK_CONSOLE_DRV(mpDrv[0]); /* Send input to the last enabled device. Relies on the fact that * the USB keyboard is always initialized after the PS/2 keyboard. */ PPDMIKEYBOARDPORT pUpPort = NULL; for (int i = KEYBOARD_MAX_DEVICES - 1; i >= 0 ; --i) { if (mpDrv[i] && (mpDrv[i]->u32DevCaps & KEYBOARD_DEVCAP_ENABLED)) { pUpPort = mpDrv[i]->pUpPort; break; } } /* No enabled keyboard - throw the input away. */ if (!pUpPort) { if (codesStored) *codesStored = (uint32_t)keys.size(); return S_OK; } int vrc = VINF_SUCCESS; uint32_t sent; for (sent = 0; (sent < keys.size()) && RT_SUCCESS(vrc); sent++) vrc = pUpPort->pfnPutEvent(pUpPort, (uint8_t)keys[sent]); if (codesStored) *codesStored = sent; /* Only signal the keys in the event which have been actually sent. */ com::SafeArray<LONG> keysSent(sent); memcpy(keysSent.raw(), keys.raw(), sent*sizeof(LONG)); VBoxEventDesc evDesc; evDesc.init(mEventSource, VBoxEventType_OnGuestKeyboard, ComSafeArrayAsInParam(keys)); evDesc.fire(0); if (RT_FAILURE(vrc)) return setError(VBOX_E_IPRT_ERROR, tr("Could not send all scan codes to the virtual keyboard (%Rrc)"), vrc); return S_OK; }
/** * Sends a list of scancodes to the keyboard. * * @returns COM status code * @param aScancodes Pointer to the first scancode * @param aCodesStored Address of variable to store the number * of scancodes that were sent to the keyboard. This value can be NULL. */ HRESULT Keyboard::putScancodes(const std::vector<LONG> &aScancodes, ULONG *aCodesStored) { AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS); CHECK_CONSOLE_DRV(mpDrv[0]); /* Send input to the last enabled device. Relies on the fact that * the USB keyboard is always initialized after the PS/2 keyboard. */ PPDMIKEYBOARDPORT pUpPort = NULL; for (int i = KEYBOARD_MAX_DEVICES - 1; i >= 0 ; --i) { if (mpDrv[i] && (mpDrv[i]->u32DevCaps & KEYBOARD_DEVCAP_ENABLED)) { pUpPort = mpDrv[i]->pUpPort; break; } } /* No enabled keyboard - throw the input away. */ if (!pUpPort) { if (aCodesStored) *aCodesStored = (uint32_t)aScancodes.size(); return S_OK; } int vrc = VINF_SUCCESS; uint32_t sent; for (sent = 0; (sent < aScancodes.size()) && RT_SUCCESS(vrc); ++sent) vrc = pUpPort->pfnPutEventScan(pUpPort, (uint8_t)aScancodes[sent]); if (aCodesStored) *aCodesStored = sent; com::SafeArray<LONG> keys(aScancodes.size()); for (size_t i = 0; i < aScancodes.size(); ++i) keys[i] = aScancodes[i]; VBoxEventDesc evDesc; evDesc.init(mEventSource, VBoxEventType_OnGuestKeyboard, ComSafeArrayAsInParam(keys)); evDesc.fire(0); if (RT_FAILURE(vrc)) return setError(VBOX_E_IPRT_ERROR, tr("Could not send all scan codes to the virtual keyboard (%Rrc)"), vrc); return S_OK; }