diff --git a/plugins/openvr/src/OpenVrHelpers.cpp b/plugins/openvr/src/OpenVrHelpers.cpp index 820476191a..f5e36492bd 100644 --- a/plugins/openvr/src/OpenVrHelpers.cpp +++ b/plugins/openvr/src/OpenVrHelpers.cpp @@ -44,7 +44,7 @@ static const uint32_t RELEASE_OPENVR_HMD_DELAY_MS = 5000; bool isOculusPresent() { bool result = false; -#if defined(Q_OS_WIN32) +#if defined(Q_OS_WIN32) HANDLE oculusServiceEvent = ::OpenEventW(SYNCHRONIZE, FALSE, L"OculusHMDConnected"); // The existence of the service indicates a running Oculus runtime if (oculusServiceEvent) { @@ -54,7 +54,7 @@ bool isOculusPresent() { } ::CloseHandle(oculusServiceEvent); } -#endif +#endif return result; } @@ -123,65 +123,12 @@ static bool _keyboardShown { false }; static bool _overlayRevealed { false }; static const uint32_t SHOW_KEYBOARD_DELAY_MS = 400; -void showOpenVrKeyboard(bool show = true) { - if (!_overlay) { - return; - } - - if (show) { - // To avoid flickering the keyboard when a text element is only briefly selected, - // show the keyboard asynchrnously after a very short delay, but only after we check - // that the current focus object is still one that is text enabled - QTimer::singleShot(SHOW_KEYBOARD_DELAY_MS, [] { - auto offscreenUi = DependencyManager::get<OffscreenUi>(); - auto currentFocus = offscreenUi->getWindow()->focusObject(); - QInputMethodQueryEvent query(Qt::ImEnabled | Qt::ImQueryInput | Qt::ImHints); - qApp->sendEvent(currentFocus, &query); - // Current focus isn't text enabled, bail early. - if (!query.value(Qt::ImEnabled).toBool()) { - return; - } - // We're going to show the keyboard now... - _keyboardFocusObject = currentFocus; - _currentHints = Qt::InputMethodHints(query.value(Qt::ImHints).toUInt()); - vr::EGamepadTextInputMode inputMode = vr::k_EGamepadTextInputModeNormal; - if (_currentHints & Qt::ImhHiddenText) { - inputMode = vr::k_EGamepadTextInputModePassword; - } - vr::EGamepadTextInputLineMode lineMode = vr::k_EGamepadTextInputLineModeSingleLine; - if (_currentHints & Qt::ImhMultiLine) { - lineMode = vr::k_EGamepadTextInputLineModeMultipleLines; - } - _existingText = query.value(Qt::ImSurroundingText).toString(); - - auto showKeyboardResult = _overlay->ShowKeyboard(inputMode, lineMode, "Keyboard", 1024, - _existingText.toLocal8Bit().toStdString().c_str(), false, 0); - - if (vr::VROverlayError_None == showKeyboardResult) { - _keyboardShown = true; - // Try to position the keyboard slightly below where the user is looking. - mat4 headPose = cancelOutRollAndPitch(toGlm(_nextSimPoseData.vrPoses[0].mDeviceToAbsoluteTracking)); - mat4 keyboardTransform = glm::translate(headPose, vec3(0, -0.5, -1)); - keyboardTransform = keyboardTransform * glm::rotate(mat4(), 3.14159f / 4.0f, vec3(-1, 0, 0)); - auto keyboardTransformVr = toOpenVr(keyboardTransform); - _overlay->SetKeyboardTransformAbsolute(vr::ETrackingUniverseOrigin::TrackingUniverseStanding, &keyboardTransformVr); - } - }); - } else { - _keyboardFocusObject = nullptr; - if (_keyboardShown) { - _overlay->HideKeyboard(); - _keyboardShown = false; - } - } -} - void updateFromOpenVrKeyboardInput() { auto chars = _overlay->GetKeyboardText(textArray, 8192); auto newText = QString(QByteArray(textArray, chars)); _keyboardFocusObject->setProperty("text", newText); //// TODO modify the new text to match the possible input hints: - //// ImhDigitsOnly ImhFormattedNumbersOnly ImhUppercaseOnly ImhLowercaseOnly + //// ImhDigitsOnly ImhFormattedNumbersOnly ImhUppercaseOnly ImhLowercaseOnly //// ImhDialableCharactersOnly ImhEmailCharactersOnly ImhUrlCharactersOnly ImhLatinOnly //QInputMethodEvent event(_existingText, QList<QInputMethodEvent::Attribute>()); //event.setCommitString(newText, 0, _existingText.size()); @@ -208,11 +155,11 @@ void enableOpenVrKeyboard(PluginContainer* container) { auto offscreenUi = DependencyManager::get<OffscreenUi>(); _overlay = vr::VROverlay(); - + auto menu = container->getPrimaryMenu(); auto action = menu->getActionForOption(MenuOption::Overlays); - // When the overlays are revealed, suppress the keyboard from appearing on text focus for a tenth of a second. + // When the overlays are revealed, suppress the keyboard from appearing on text focus for a tenth of a second. _overlayMenuConnection = QObject::connect(action, &QAction::triggered, [action] { if (action->isChecked()) { _overlayRevealed = true; @@ -220,23 +167,6 @@ void enableOpenVrKeyboard(PluginContainer* container) { QTimer::singleShot(KEYBOARD_DELAY_MS, [&] { _overlayRevealed = false; }); } }); - - _focusConnection = QObject::connect(offscreenUi->getWindow(), &QQuickWindow::focusObjectChanged, [](QObject* object) { - if (object != _keyboardFocusObject) { - showOpenVrKeyboard(false); - } - }); - - _focusTextConnection = QObject::connect(offscreenUi.data(), &OffscreenUi::focusTextChanged, [](bool focusText) { - if (_openVrDisplayActive) { - if (_overlayRevealed) { - // suppress at most one text focus event - _overlayRevealed = false; - return; - } - showOpenVrKeyboard(focusText); - } - }); } @@ -276,7 +206,7 @@ void handleOpenVrEvents() { updateFromOpenVrKeyboardInput(); break; - case vr::VREvent_KeyboardDone: + case vr::VREvent_KeyboardDone: finishOpenVrKeyboardInput(); // FALL THROUGH