void UIMouseHandler::releaseMouse() { /* Do not try to release mouse if its released already: */ if (!uisession()->isMouseCaptured()) return; /* If such viewport exists: */ if (m_viewports.contains(m_iMouseCaptureViewIndex)) { /* Store mouse-capturing state value: */ uisession()->setMouseCaptured(false); /* Return the cursor to where it was when we captured it: */ QCursor::setPos(m_capturedMousePos); #ifdef Q_WS_WIN /* Update mouse clipping: */ updateMouseCursorClipping(); #elif defined(Q_WS_MAC) /* Releasing grabbed mouse from that view: */ ::darwinMouseRelease(m_viewports[m_iMouseCaptureViewIndex]); #else /* Q_WS_MAC */ /* Releasing grabbed mouse from that view: */ m_viewports[m_iMouseCaptureViewIndex]->releaseMouse(); #endif /* !Q_WS_MAC */ /* Reset mouse-capture index: */ m_iMouseCaptureViewIndex = -1; /* Emit signal if required: */ emit mouseStateChanged(mouseState()); } }
/* Machine state-change handler: */ void UIMouseHandler::sltMachineStateChanged() { /* Get machine state: */ KMachineState state = uisession()->machineState(); /* Handle particular machine states: */ switch (state) { case KMachineState_Paused: case KMachineState_TeleportingPausedVM: case KMachineState_Stuck: { /* Release the mouse: */ releaseMouse(); break; } default: break; } /* Recall reminder about paused VM input * if we are not in paused VM state already: */ if (machineLogic()->activeMachineWindow() && state != KMachineState_Paused && state != KMachineState_TeleportingPausedVM) popupCenter().forgetAboutPausedVMInput(machineLogic()->activeMachineWindow()); // TODO: Is it really required? /* Notify all listeners: */ emit mouseStateChanged(mouseState()); }
void UIMouseHandler::captureMouse(ulong uScreenId) { /* Do not try to capture mouse if its captured already: */ if (uisession()->isMouseCaptured()) return; /* If such viewport exists: */ if (m_viewports.contains(uScreenId)) { /* Store mouse-capturing state value: */ uisession()->setMouseCaptured(true); /* Memorize the index of machine-view-viewport captured mouse: */ m_iMouseCaptureViewIndex = uScreenId; /* Memorize the host position where the cursor was captured: */ m_capturedMousePos = QCursor::pos(); /* Acquiring visible viewport rectangle in global coodrinates: */ QRect visibleRectangle = m_viewports[m_iMouseCaptureViewIndex]->visibleRegion().boundingRect(); QPoint visibleRectanglePos = m_views[m_iMouseCaptureViewIndex]->mapToGlobal(m_viewports[m_iMouseCaptureViewIndex]->pos()); visibleRectangle.translate(visibleRectanglePos); visibleRectangle = visibleRectangle.intersected(QApplication::desktop()->availableGeometry()); #ifdef Q_WS_WIN /* Move the mouse to the center of the visible area: */ m_lastMousePos = visibleRectangle.center(); QCursor::setPos(m_lastMousePos); /* Update mouse clipping: */ updateMouseCursorClipping(); #elif defined (Q_WS_MAC) /* Grab all mouse events: */ ::darwinMouseGrab(m_viewports[m_iMouseCaptureViewIndex]); #else /* Q_WS_MAC */ /* Remember current mouse position: */ m_lastMousePos = QCursor::pos(); /* Grab all mouse events: */ m_viewports[m_iMouseCaptureViewIndex]->grabMouse(); #endif /* !Q_WS_MAC */ /* Switch guest mouse to the relative mode: */ CMouse mouse = session().GetConsole().GetMouse(); mouse.PutMouseEvent(0, 0, 0, 0, 0); /* Emit signal if required: */ emit mouseStateChanged(mouseState()); } }
/* Machine state-change handler: */ void UIMouseHandler::sltMachineStateChanged() { /* Get machine state: */ KMachineState state = uisession()->machineState(); /* Handle particular machine states: */ switch (state) { case KMachineState_Paused: case KMachineState_TeleportingPausedVM: case KMachineState_Stuck: { /* Release the mouse: */ releaseMouse(); break; } default: break; } /* Notify all listeners: */ emit mouseStateChanged(mouseState()); }