/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
gfx::VRDisplayClient* displayClient = aSession->GetDisplayClient(); if (!displayClient) { return;
}
XRInputSourcesChangeEventInit addInit;
nsTArray<RefPtr<XRInputSource>> removedInputs; if (NS_WARN_IF(!addInit.mAdded.SetCapacity(gfx::kVRControllerMaxCount,
mozilla::fallible))) {
MOZ_ASSERT(false, "'add' sequence in XRInputSourcesChangeEventInit SetCapacity() " "failed."); return;
}
for (int32_t i = 0; i < gfx::kVRControllerMaxCount; ++i) { const gfx::VRControllerState& controllerState =
displayClient->GetDisplayInfo().mControllerState[i]; if (controllerState.controllerName[0] == '\0') { // Checking if exising controllers need to be removed. for (auto& input : mInputSources) { if (input->GetIndex() == i) {
removedInputs.AppendElement(input); break;
}
} continue;
}
bool found = false;
RefPtr<XRInputSource> inputSource = nullptr; for (auto& input : mInputSources) { if (input->GetIndex() == i) {
found = true;
inputSource = input; break;
}
} // Checking if it is added before. if (!found &&
(controllerState.numButtons > 0 || controllerState.numAxes > 0)) {
inputSource = new XRInputSource(mParent);
inputSource->Setup(aSession, i);
mInputSources.AppendElement(inputSource);
addInit.mBubbles = false;
addInit.mCancelable = false;
addInit.mSession = aSession; if (!addInit.mAdded.AppendElement(*inputSource, mozilla::fallible)) {
MOZ_ASSERT(false, "'add' sequence in XRInputSourcesChangeEventInit " "AppendElement() failed, it might be due to the" "wrong size when SetCapacity().");
}
} // If added, updating the current controller states. if (inputSource) {
inputSource->Update(aSession);
}
}
// Send `inputsourceschange` for new controllers. if (addInit.mAdded.Length()) {
RefPtr<XRInputSourcesChangeEvent> event =
XRInputSourcesChangeEvent::Constructor(
aSession, u"inputsourceschange"_ns, addInit);
// If there's a controller is removed, dispatch `inputsourceschange`. if (removedInputs.Length()) {
DispatchInputSourceRemovedEvent(removedInputs, aSession);
} for (auto& input : removedInputs) {
mInputSources.RemoveElement(input);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.