Eu vou com a pergunta na ordem inversa:
- Why are there so many?
Esses são dispositivos que representam a maioria das entradas presentes em uma máquina (há outras, um microfone, por exemplo, não será gerenciado em /dev/input
). Ao contrário do pressuposto de que um teclado mais um mouse daria 2 dispositivos, até 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 agrega o teclado de teste com o teclado real em um dispositivo virtual principal. isto é, irá executar o muxing da entrada. O mesmo acontecerá com o mouse test e real.
Além disso, um computador típico (desktop ou laptop) tem outros botões além do teclado: botão de energia, botão de suspensão.
Os dispositivos eventN
são dispositivos para as coisas que o Xorg cria e para o que o computador possui. O N
vem de IDs sequenciais e é análogo aos IDs em xinput
. Por exemplo, na minha máquina eu 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 dá IDs análogas:
[~]$ 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 What is the purpose of this file?
Note 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 demuxing. Por exemplo, posso mover meu 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 tem um botão para ligar e desligar. E como ela é um botão, ela se torna parte do subsistema do teclado. A entrada de vídeo real é manipulado em /sys/class/video4linux
.)
Em outras palavras, para um aplicativo, existe apenas um teclado e apenas um mouse. Mas tanto o Xorg quanto o kernel precisam conhecer as diferenças. E isso leva à última parte:
1.2 Why not just send it directly from the kernel to the X server?
Porque o Xorg precisa saber a diferença.
E há situações em que é útil. Você pode remapear chaves no Xorg para cada dispositivo de entrada escravo de forma diferente. Por exemplo, eu tenho um conjunto de jogos com pedais, quando usado em um jogo de corrida ele gera a , b e c para cada um de seus pedais . No entanto, quando estou programando, eu faço o remapeamento dessas teclas para Esc , Ctrl e Alt , sem remapear as teclas 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çalho, 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 a portas seriais (notavelmente neste caso eles fazem) em vez de teclado ou mouse.