Клавиатура Usb используется отдельно в X

У меня есть USB-сканер штрих-кода, который эмулирует клавиатуру. Когда он подключен, X получает управление и обрабатывает его как обычную клавиатуру и отправляет события клавиатуры в текущее сфокусированное окно.

Это не то, что я хочу сделать. У меня есть программа, которая считывает штрих-коды из потока ввода ascii и обрабатывает их. Эта программа работает в фоновом режиме и не имеет интерфейса пользователя вообще.

Как настроить Linux, чтобы не использовать эту клавиатуру usb в X, но нарисуйте ее как устройство потока ascii. Таким образом, я смогу перенаправить его как устройство ввода для своей программы и обеспечить чтение штрих-кодов независимо от изменений фокуса ввода. И штрих-коды не должны быть переданы в текущее фокусное окно.

Кроме того, лучше не запускать программу обработки штрих-кода в качестве корня, поэтому клавиатурное устройство должно иметь разрешения на чтение для всех.

1) Как настроить X, чтобы игнорировать клавиатуру

Используйте lsusb чтобы найти идентификатор вашего сканера штрих-кода (в формате 0123:4567 ). Создайте или измените файл xorg.conf (обычно в /etc/X11/ ). Добавьте раздел InputClass с идентификатором, который вы только что нашли:

 Section "InputClass" Identifier "barcode" MatchUSBID "0123:4567" Option "Ignore" "true" EndSection 

Перезапустите X, проверьте в Xorg.log что ваше устройство распознано в этом разделе и проигнорировано.

2) Преобразование от клавишных кодов к кодам ASCII (или другим) довольно привлекательно, чтобы использовать разные раскладки клавиатуры, мертвые ключи, настройки и т. Д. Теперь, когда вы отключили уровень преобразования X, вы можете получать события нажатия клавиш и keyrelease из соответствующего /dev/input/eventX . Число может измениться; для вашего считывателя штрих-кода будет символьная ссылка в /dev/input/by-id/ которая не изменяется. Поэтому используйте символическую ссылку.

Вы можете запустить evtest в этом файле, чтобы узнать, какие события он генерирует. Их сопоставление для вашего читателя штрих-кода будет простым, так что поиск таблицы с keyym на ASCII-код будет делать. Вы можете обрабатывать эти события в своей собственной программе, см. Источник evtest или, например, здесь . Вы также можете написать небольшую программу на C, которая просто считывает это устройство и создает ASCII на stdout, а затем интегрирует его в ваше приложение, используя канал и т. Д.

«Сопоставление его как устройства ASCII-потока» невозможно, такие устройства не существуют в ядре Linux.

3) Настройка разрешений

Вам нужно написать собственное правило udev для установки разрешений для вашего устройства ввода. SUBSYSTEM должен соответствовать input , ACTION должен соответствовать ADD , среда ENV должна содержать информацию для соответствия устройству (используйте udevadm для определения деталей), и вы можете установить OWNER , GROUP и MODE для вновь созданного устройства /dev/input/eventX . Вот несколько общее руководство , я не мог найти более конкретного. Google для лучших учебных пособий.