A device that's both a pointer and a keyboard device confuses the server with its strict pointer/keyboard separation, see Bug 49950 amongst others.
The only viable solution appears to be to split the devices at the driver level into a keyboard and a pointer component, then send the events accordingly.
giving this a wontfix, it's unlikely to get fixed for the evdev driver. however, the libinput driver provides this functionality since this commit:
Author: Peter Hutterer <email@example.com>
Date: Wed Nov 11 10:10:58 2015 +1000
Split mixed pointer/keyboard devices into two separate X devices