status_t VBoxMouse::_ServiceThread() { Log(("VBoxMouse::%s()\n", __FUNCTION__)); fDriverFD = open(VBOXGUEST_DEVICE_NAME, O_RDWR); if (fDriverFD < 0) return ENXIO; /* The thread waits for incoming messages from the host. */ while (!fExiting) { uint32_t cx, cy, fFeatures; int rc; fd_set readSet, writeSet, errorSet; FD_ZERO(&readSet); FD_ZERO(&writeSet); FD_ZERO(&errorSet); FD_SET(fDriverFD, &readSet); if (fDriverFD < 0) break; rc = select(fDriverFD + 1, &readSet, &writeSet, &errorSet, NULL); if (rc < 0) { if (errno == EINTR || errno == EAGAIN) continue; break; } rc = VbglR3GetMouseStatus(&fFeatures, &cx, &cy); if ( RT_SUCCESS(rc) && (fFeatures & VMMDEV_MOUSE_HOST_WANTS_ABSOLUTE)) { float x = cx * 1.0 / 65535; float y = cy * 1.0 / 65535; _debugPrintf("VBoxMouse: at %d,%d %f,%f\n", cx, cy, x, y); /* Send absolute movement */ bigtime_t now = system_time(); BMessage *event = new BMessage(B_MOUSE_MOVED); event->AddInt64("when", now); event->AddFloat("x", x); event->AddFloat("y", y); event->AddFloat("be:tablet_x", x); event->AddFloat("be:tablet_y", y); //event->PrintToStream(); EnqueueMessage(event); //LogRelFlow(("processed host event rc = %d\n", rc)); } } return 0; }
void cleanupDisplay(void) { uint32_t fMouseFeatures = 0; LogRelFlowFunc(("\n")); VbglR3CtlFilterMask(0, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST | VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED); int rc = VbglR3GetMouseStatus(&fMouseFeatures, NULL, NULL); if (RT_SUCCESS(rc)) VbglR3SetMouseStatus( fMouseFeatures | VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); LogRelFlowFunc(("returning\n")); }
static inline int vboxMouseRelease() { uint32_t fFeatures = 0; int rc = VbglR3GetMouseStatus(&fFeatures, NULL, NULL); if (RT_SUCCESS(rc)) { rc = VbglR3SetMouseStatus(fFeatures & ~VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE & ~VMMDEV_MOUSE_NEW_PROTOCOL); if (RT_FAILURE(rc)) LogRel(("VbglR3SetMouseStatus failed. rc=%d\n", rc)); } else LogRel(("VbglR3GetMouseStatus failed. rc=%d\n", rc)); return rc; }
static int initDisplay(Display *pDisplay) { int rc = VINF_SUCCESS; uint32_t fMouseFeatures = 0; LogRelFlowFunc(("testing dynamic resizing\n")); int iDummy; if (!XRRQueryExtension(pDisplay, &iDummy, &iDummy)) rc = VERR_NOT_SUPPORTED; if (RT_SUCCESS(rc)) rc = VbglR3CtlFilterMask(VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST, 0); else VbglR3CtlFilterMask(0, VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST); /* Log and ignore the return value, as there is not much we can do with * it. */ LogRelFlowFunc(("dynamic resizing: result %Rrc\n", rc)); /* Enable support for switching between hardware and software cursors */ LogRelFlowFunc(("enabling relative mouse re-capturing support\n")); rc = VbglR3GetMouseStatus(&fMouseFeatures, NULL, NULL); if (RT_SUCCESS(rc)) { rc = VbglR3CtlFilterMask(VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED, 0); if (RT_SUCCESS(rc)) rc = VbglR3SetMouseStatus ( fMouseFeatures & ~VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); } if (RT_FAILURE(rc)) { VbglR3CtlFilterMask(0, VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED); VbglR3SetMouseStatus( fMouseFeatures | VMMDEV_MOUSE_GUEST_NEEDS_HOST_CURSOR); } LogRelFlowFunc(("mouse re-capturing support: result %Rrc\n", rc)); return VINF_SUCCESS; }
status_t VBoxMouse::Start(const char *device, void *cookie) { #if 0 status_t err; int rc; uint32_t fFeatures = 0; Log(("VBoxMouse::%s()\n", __FUNCTION__)); rc = VbglR3GetMouseStatus(&fFeatures, NULL, NULL); if (RT_SUCCESS(rc)) rc = VbglR3SetMouseStatus(fFeatures | VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE | VMMDEV_MOUSE_NEW_PROTOCOL); if (!RT_SUCCESS(rc)) { LogRel(("VBoxMouse: Error switching guest mouse into absolute mode: %d\n", rc)); return B_DEVICE_NOT_FOUND; } err = fServiceThreadID = spawn_thread(_ServiceThreadNub, "VBoxMouse", B_NORMAL_PRIORITY, this); if (err >= B_OK) { resume_thread(fServiceThreadID); return B_OK; } else LogRel(("VBoxMouse: Error starting service thread: 0x%08lx\n", err)); // release the mouse rc = VbglR3GetMouseStatus(&fFeatures, NULL, NULL); if (RT_SUCCESS(rc)) rc = VbglR3SetMouseStatus(fFeatures & ~VMMDEV_MOUSE_GUEST_CAN_ABSOLUTE & ~VMMDEV_MOUSE_NEW_PROTOCOL); return B_ERROR; #endif status_t err = B_OK; int rc; uint32_t fFeatures = 0; LogFlowFunc(("device=%s cookie=%p\n", device, cookie)); rc = vboxMouseAcquire(); if (RT_SUCCESS(rc)) { err = fServiceThreadID = spawn_thread(_ServiceThreadNub, "VBoxMouse", B_NORMAL_PRIORITY, this); if (err >= B_OK) { resume_thread(fServiceThreadID); return B_OK; } else LogRel(("VBoxMouse::Start Error starting service thread: 0x%08lx\n", err)); vboxMouseRelease(); err = B_ERROR; } else { LogRel(("VBoxMouse::Start vboxMouseAcquire failed. rc=%d\n", rc)); err = B_DEVICE_NOT_FOUND; } return err; }