Я пойду с вопросом в обратном порядке:
- Почему их так много?
Это устройства, которые соответствуют большинству входов, присутствующих в машине (есть другие, например, микрофон не будет управляться /dev/input
). Вопреки предположению, что одна клавиатура плюс одна мышь дадут 2 устройства, даже самая простая клавиатура и самая простая мышь все равно дадут 6 из них.
Почему 6? Потому что Xorg создаст тестовую клавиатуру ввода и тестовую мышь ввода (обе виртуальные) во время своего запуска. Кроме того, он объединит тестовую клавиатуру с реальной клавиатурой в основное виртуальное устройство. т.е. он будет выполнять муксинг ввода. То же самое произойдет с тестовой и реальной мышью.
Кроме того, на типичном компьютере (настольном компьютере или ноутбуке) помимо клавиатуры имеются другие кнопки: кнопка питания, кнопка сна.
Эти eventN
устройства в есть устройства для вещей , которые Xorg создает и для того, что компьютер есть. N
Приходит из последовательных идентификаторов и аналогично идентификаторы в xinput
. Например на моей машине у меня есть:
[~]# 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
И xinput
дает мне аналогичные идентификаторы:
[~]$ 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)]
(Смотри что eventN
соответствует id=N
)
Без Xorg
1.1 Какова цель этого файла?
Обратите внимание, что все случайные входы (включая мою USB-камеру!) Рассматриваются Xorg как часть виртуальной клавиатуры. Это позволяет мультиплексировать и демультиплексировать ввод. Например, я могу перемещать мышь через USB-мышь или трекпад, и приложение не должно знать разницу.
(Тот факт, что USB-камера является частью виртуальной клавиатуры, объясняется тем, что она имеет кнопку для включения и выключения. А поскольку она является кнопкой, она становится частью подсистемы клавиатуры. Фактический видеовход обрабатывается /sys/class/video4linux
. )
Другими словами, для приложения действительно есть только одна клавиатура и только одна мышь. Но и Xorg, и ядро должны знать различия. И это приводит к последней части:
1.2 Почему бы просто не отправить его прямо из ядра на X-сервер?
Потому что Xorg должен знать разницу.
И есть ситуации, в которых это полезно. Вы можете переназначить ключи в Xorg на каждое ведомое устройство ввода по-разному. Например, у меня есть игровой набор с педалью, когда используются в гоночной игре выдает a, bи cдля каждого из его педалей. Тем не менее, при программировании я переназначаю эти клавиши Esc, Ctrlи Alt, без переназначения клавиш на самой клавиатуре.
Кроме того, не обязательно, чтобы на машине работал Xorg. Например, на безголовом сервере я могу получить следующий вывод:
[~]$ 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
Где устройства ввода соответствуют последовательным портам (особенно в этом случае они делают) вместо клавиатуры или мыши.