Я не знаю о такой библиотеке или демоне.
Тем не менее, написание демона для выполнения именно этого не так сложно, как вы думаете.По моему мнению / опыту, если вам не нужно реализовывать автоповтор (то есть, делать автоповтор только если устройство, похожее на клавиатуру, посылает автоповторные нажатия клавиш), демон на удивление прост.
В частности, основной циклэто просто блокирующее чтение, за которым следует ноль или более блокирующих записей с поиском массива в середине.
Вы можете использовать либо именованный канал (в этом случае вы открываете канал перед открытием устройства, потому чтооткрытие завершается успешно только после того, как другой процесс открывает именованный канал или FIFO для чтения) или сокет;либо сокет Unix Domain, либо сокет TCP или UDP (на интерфейсе обратной связи).Я бы, вероятно, использовал именованный канал, /var/run/barcode-scanner
.
. Я бы использовал отдельный файл конфигурации для отображения ввода и поддерживал бы имена макросов препроцессора (KEY_
) из /usr/include/linux/input-event-codes.h
,проанализировал массив с помощью вспомогательного сценария awk.Файл сопоставления клавиш, вероятно, будет находиться в /etc/barcode-scanner/keymap
и содержать определения, подобные
KEY_1 = 1
KEY_NUMERIC_1 = 1
KEY_E = e
shift KEY_E = E
ctrl KEY_E = \5
altgr KEY_E = €
KEY_UP = \033[A
и т. Д.События, не перечисленные в файле определения, будут игнорироваться или необязательно регистрироваться.
Вы можете использовать массив, поскольку существует до 768 (от 0 до KEY_MAX включительно; хотя 0 - KEY_RESERVED) различных событий клавиатуры;в качестве двумерного массива вам, вероятно, понадобится что-то вроде 16 массивов для поддержки всех комбинаций Shift , Ctrl , Alt и AltGr (или правая клавиша alt), когда нажата каждая клавиша.Внутренне вам просто нужно обработать KEY_LEFTSHIFT
, KEY_RIGHTSHIFT
, KEY_CAPSLOCK
(для управления состоянием сдвига);KEY_LEFTALT
(для управления состоянием alt);KEY_RIGHTALT
(для управления состоянием altgr);и KEY_LEFTCTRL
и KEY_RIGHTCTRL
(для управления состоянием ctrl).Если вы используете битовую маску для обозначения текущих состояний, вы можете использовать ее как индекс для внешнего измерения массива поиска.Это действительно очень просто.
Обратите внимание, что каждый элемент массива представляет собой строку, которая генерируется при нажатии клавиши этого состояния (ev.value == 1
для нажатия клавиши, ev.value == 2
для автоповтора).Помимо вышеупомянутых специальных ключей, вам вообще не нужно обрабатывать нажатия клавиш.
Хм.Интересно, есть ли другие, кому нужен такой демон?Вы бы использовали лицензию под GPL3, если бы источники были на GitHub?