A documentação da API do espaço de usuário do subsistema de entrada do Linux responde às suas perguntas. Em geral, todos os arquivos em /dev/input/
são fornecidos por manipuladores de eventos que distribuem eventos de dispositivo para o espaço do usuário.
O que são / dev / input / mouse0 e / dev / input / mice?
A partir da introdução (partes importantes destacadas por mim)
1.3.1.3. mousedev
mousedev is a hack to make legacy programs that use mouse input work. It takes events from either mice or digitizers/tablets and makes a PS/2-style (a la /dev/psaux) mouse device available to the userland.
Mousedev devices in /dev/input (as shown above) are:
crw-r--r-- 1 root root 13, 32 Mar 28 22:45 mouse0 crw-r--r-- 1 root root 13, 33 Mar 29 00:41 mouse1 crw-r--r-- 1 root root 13, 34 Mar 29 00:41 mouse2 crw-r--r-- 1 root root 13, 35 Apr 1 10:50 mouse3 ... ... crw-r--r-- 1 root root 13, 62 Apr 1 10:50 mouse30 crw-r--r-- 1 root root 13, 63 Apr 1 10:50 mice
Each mouse device is assigned to a single mouse or digitizer, except the last one - mice. This single character device is shared by all mice and digitizers, and even if none are connected, the device is present. This is useful for hotplugging USB mice, so that older programs that do not handle hotplug can open the device even when no mice are present. [...]
Mousedev will generate either PS/2, ImPS/2 (Microsoft IntelliMouse) or ExplorerPS/2 (IntelliMouse Explorer) protocols, depending on what the program reading the data wishes. You can set GPM and X to any of these. You’ll need ImPS/2 if you want to make use of a wheel on a USB mouse and ExplorerPS/2 if you want to use extra (up to 5) buttons.
... isso também pode ser o motivo pelo qual você não vê eventos de roda do mouse. Como é um "hack" para programas legados, você não deve usá-lo se não precisar.
Como posso ler todas as informações do mouse [...]?
Use o arquivo /dev/input/eventX
correspondente que é fornecido pelo evdev (o manipulador de eventos, para não ser confundido com o evdev do xorg-driver). Isso é o que seu segundo snippet de código obviamente faz.
... mas e o problema de prioridade?
Não há problema de prioridade. De acordo com 2.2. Códigos de eventos :
SYN_REPORT:
Used to synchronize and separate events into packets of input data changes occurring at the same moment in time. For example, motion of a mouse may set the REL_X and REL_Y values for one motion, then emit a SYN_REPORT. The next motion will emit more REL_X and REL_Y values and send another SYN_REPORT.
Como todos os eventos consecutivos até que um evento SYN_REPORT
possa ser considerado como ocorrido ao mesmo tempo, a ordem em que são informados não importa.
Por exemplo (usando este programa que encontrei no github):
time:1528290186.256449 type:EV_REL code:REL_X value:-1
time:1528290186.256449 type:EV_REL code:REL_Y value:1
time:1528290186.256449 type:EV_SYN code:SYN_REPORT value:0
time:1528290186.264460 type:EV_REL code:REL_Y value:1
time:1528290186.264460 type:EV_REL code:REL_WHEEL value:-1
time:1528290186.264460 type:EV_SYN code:SYN_REPORT value:0
Como você pode ver, não são apenas eventos simultâneos separados por SYN_REPORT
events, eles também têm o mesmo registro de data e hora.
A propósito, você também pode usar evtest
para ver os eventos gerados por um dispositivo. Você pode encontrar o código-fonte aqui se estiver interessado em saber como funciona.