Three independent backend agents (raylib #246, iOS #251, engine FIFO #610) made the same slip: advancing the per-slot 'previously seen' state even when the out-buffer was full, losing the transition forever. Document on the GamepadEvent/pollGamepadEvents/Source.pollEvents contract that an implementation must only advance/ack a connect/disconnect edge once it has actually written the event to out, so an undelivered edge re-fires on the next drain. Part of the controller-support epic labelle-toolkit/labelle-engine#609.
Three independent backend agents (raylib #246, iOS #251, engine FIFO #610) made the same slip: advancing the per-slot 'previously seen' state even when the out-buffer was full, losing the transition forever. Document on the
GamepadEvent/pollGamepadEvents/Source.pollEventscontract that an implementation must only advance/ack a connect/disconnect edge once it has actually written the event toout, so an undelivered edge re-fires on the next drain. Part of the controller-support epic labelle-toolkit/labelle-engine#609.