Gamepad in WPEWebKit
This is the brief story of the Gamepad implementation in WPEWebKit.It started with an early development done by Eugene Mutavchi (kudos!). Later, by the end of 2021, I retook those patches and discussed them with my fellow igalian Adrián, and we decided to come with a slightly different approach.
Before going into the details, let’s quickly review the WPE architecture:
- cog library — it’s a shell library that simplifies the task of writing a WPE browser from the scratch, by providing common functionality and helper APIs.
- WebKit library — that’s the web engine that, given an URI and other following inputs, returns, among other outputs, graphic buffers with the page rendered.
- WPE library — it’s the API that bridges cog (1) (or whatever other browser application) and WebKit (2).
- WPE backend — it’s main duty is to provide graphic buffers to WebKit, buffers supported by the hardware, the operating system, windowing system, etc.
Eugene’s implementation has code in WebKit (implementing the gamepad support for WPE port); code in WPE library with an API to communicate WebKit’s gamepad and WPE backend, which provided a custom implementation of gamepad, reading directly the event in the Linux device. Almost everything was there, but there were some issues:
- WPE backend is mainly designed as a set of protocols, similar to Wayland, to deal with graphic buffers or audio buffers, but not for input events. Cog library is the place where input events are handled and injected to WebKit, such as keyboard.
- The gamepad handling in a WPE backend was ad-hoc and low level, reading directly the events from Linux devices. This approach is problematic since there are plenty gamepads in the market and each has its own axis and buttons, so remapping them to the standard map is required. To overcome this issue and many others, there’s a GNOME library: libmanette, which is already used by WebKitGTK port.
Today’s status of the gamepad support is that it works but it’s not yet fully upstreamed.
- merged libwpe pull request.
- cog pull request – there are two implementations: none and libmanette. None is just a dummy implementation which will ignore any request for a gamepad provider; it’s provided if libmanette is not available or if available libwpe hasn’t gamepad support.
- WebKit pull request.
To prove you all that it works my exhibit A is this video, where I play asteroids in a RasberryPi 4 64 bits:
The image was done with Buildroot, using its master branch (from a week ago) with a bunch of modifications, such as adding libmanette, a kernel patch for my gamepad device, kernel 5.15.55 and its corresponding firmware, etc.