-
Notifications
You must be signed in to change notification settings - Fork 401
Description
I wanted to separate this discussion out from the rest of the gamepad-as-the-input-solution work, because it's a reasonably complex topic on it's own.
To recap a bit of the prior discussion here, first off there's some guidelines that we've already set that should be considered (taken from #499):
- The
id
MAY be'unknown'
if the type of input source cannot be reliably identified or the UA determines that the input source type must be masked for any reason. Applications should render a generic input device in this case. - Inline sessions MUST only expose
id
s of'unknown'
. - Otherwise the
id
must be a lower-case string that describes the physical input source. - It must not include an indication of the handedness of the input source (such as
oculus-touch-left
), as that can be determined from thehandedness
attribute.
Beyond that, I had previously had text that said "For most devices this SHOULD be of the format <vendor>-<product-id>
. For example: oculus-touch
." But this is an unfortunately loose guideline and could result in manual work being done by the UA to expose every device. Ideally we would want a system that surfaces a name provided by the underlying platform with minimal modification.
To that end @thetuvix had previously suggested we use something like the hex representation of USB vendor and product IDs, resulting in strings such as 045e-065d
. That's not human readable, but at least it's automated and consistent. My primary concern with it, however, is that not all platforms will surface their input devices in a way that provides access to USB metadata like this (and depending on the OS/device it may not have said metadata at all.)
Some of the native APIs have built-in methods for exposing device identifiers of various forms. For example, in OpenVR you can query a "Prop_RenderModelName_String", "Prop_ModelNumber_String", and "Prop_ManufacturerName_String". Given that we expect to have multiple different devices exposing themselves through such and interface it would make sense to use those. However, that could run into some issues if, for example, the strings they use for an Oculus Touch are different than what's reported when using the Oculus API directly. Also, if the strings reported from the API have the device handedness baked in it would be difficult to scrub that out in a consistent and safe way.
Finally, some APIs may not report a device identifier at all, since there's assumed to only be a single type of controller that they'll be used with. In that case we don't have to report unknown
since we would know what the device is, but it'll be up to the UA to make up a value.
I don't have any great suggestions for this aside from suggesting we just do <manufacturer>-<model>
, pull those values from the API whenever possible, and if the best way to consume them is USB IDs then so be it. This is effectively the approach that Nell has been taking to the names in the Gamepad Mappings repo thus far, if you want an idea of what that would look like.
Any suggestions to allow this to be more automated/consistent are appreciated!