Eu vou com a pergunta na ordem inversa:
- Por que existem tantos?
Esses são os dispositivos que representam a maioria das entradas presentes em uma máquina (existem outros, um microfone, por exemplo, não será gerenciado /dev/input
). Ao contrário da suposição de que um teclado mais um mouse forneceria 2 dispositivos, mesmo o teclado mais simples e o mouse mais simples ainda forneceriam 6 deles.
Por que 6? Porque o Xorg criará um teclado de entrada de teste e um mouse de entrada de teste (ambos virtuais) durante sua inicialização. Além disso, ele agregará o teclado de teste com o teclado real em um dispositivo virtual principal. ou seja, ele executará o muxing da entrada. O mesmo acontecerá com o teste e o mouse real.
Além disso, um computador típico (desktop ou laptop) possui outros botões além do teclado: botão liga / desliga, botão de suspensão.
Os eventN
dispositivos lá são dispositivos para as coisas que o Xorg cria e para o que o computador possui. O N
vem de IDs seqüenciais e é análogo aos IDs em xinput
. Por exemplo, na minha máquina, tenho:
[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root 100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root 140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1
E xinput
me fornece IDs análogos:
[~]$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Optical Mouse id=10 [slave pointer (2)]
⎜ ↳ SynPS/2 Synaptics TouchPad id=14 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ USB 2.0 Camera id=11 [slave keyboard (3)]
↳ Asus Laptop extra buttons id=12 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=13 [slave keyboard (3)]
(Veja que eventN
corresponde a id=N
)
Sem o Xorg
1.1 Qual é o objetivo deste arquivo?
Observe que todas as entradas aleatórias (incluindo minha câmera USB!) São vistas pelo Xorg como parte do teclado virtual. Isso permite a entrada de muxing e desmuxing. Por exemplo, posso mover o mouse pelo mouse USB ou pelo trackpad e um aplicativo não precisa saber a diferença.
(O fato de a câmera USB fazer parte do teclado virtual é porque ela possui um botão para ligá-lo e desligá-lo. E como é um botão, ela se torna parte do subsistema do teclado. A entrada de vídeo real é manipulada /sys/class/video4linux
. )
Em outras palavras, para um aplicativo, existe realmente apenas um teclado e apenas um mouse. Mas o Xorg e o kernel precisam saber as diferenças. E isso leva à última parte:
1.2 Por que não apenas enviá-lo diretamente do kernel para o servidor X?
Porque o Xorg precisa saber a diferença.
E há situações em que é útil. Você pode remapear as chaves no Xorg para cada dispositivo de entrada escravo de maneira diferente. Por exemplo, eu tenho um conjunto de jogos com pedais, quando usados em um jogo de corrida ele produz a, be cpara cada um de seus pedais. No entanto, quando a programação I remapear essas chaves para Esc, Ctrle Alt, sem remapeamento as chaves no próprio teclado.
Além disso, não é necessário que uma máquina execute o Xorg. Por exemplo, em um servidor sem cabeça, posso obter a seguinte saída:
[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root 80 Nov 8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov 8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov 8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov 8 02:36 event2
Onde os dispositivos de entrada correspondem às portas seriais (principalmente nesse caso), em vez do teclado ou mouse.