Rémi Bernon (@rbernon) commented about server/queue.c:
if ((device = current->process->rawinput_kbd) && (device->flags & RIDEV_NOLEGACY)) {
update_input_key_state( desktop, desktop->keystate, message_code, vkey );
if (!unicode) update_input_key_state( desktop, desktop->keystate, message_code, vkey );
```suggestion:-0+0 update_input_key_state( desktop, desktop->keystate, message_code, vkey ); ```
As far as I can see the VK_PACKET is still reflected in the *async* keystate[^1] even when RIDEV_NOLEGACY is used. However, for the raw_nolegacy test, 'F' vkey seems to be missing from the async key state somehow.
Yet we don't check the async key state in the tests. This could be added but it would need more changes to the tests as it's not exactly the same as the thread keystate[^2], and it apparently uses a different vkey fixup method.
In the meantime I would suggest to keep this like this. The reason why thread keystate isn't updated when RIDEV_NOLEGACY is used is simply because there's no keyboard messages.
[^1]: The async keystate is the desktop keystate, and can only be queried for each vkey with `GetAsyncKeyState`. It reflects the immediate hardware state.
[^2]: The therad keystate is the state of the keyboard, which we read with `GetKeyboardState` or `GetKeyState`, and is updated when keyboard window messages are received. It's often desync from the desktop keystate when input messages are being processed.