Если клавиатура работает без дополнительных (пользовательских или конкретных) драйверов, как клавиатура USB, то я думаю, что это ... частично возможно.
Существует документ « Определение класса устройства для устройств интерфейса пользователя (HID)» из библиотеки документов usb.org. Это соответствующие части:
Страница 62, Внедрение клавиатуры [выделено мной]:
Ниже приведены требования к дизайну USB-клавиатур:
Немодифицирующие ключи должны указываться в элементах Input (Array, Absolute). Отчеты должны содержать список клавиш, которые были нажаты в настоящее время, а не коды кодов / прерываний (относительные данные).
[...]
Клавиатура должна отправлять отчеты с данными со скоростью простоя или при получении запроса Get_Report, даже если нет новых событий клавиш.
Клавиатура должна сообщать об использовании индексации фантомного состояния (ErrorRollOver) во всех полях массива всякий раз, когда количество нажатых клавиш превышает количество отчетов. [...] Кроме того, клавиатура может сообщать о фантомном состоянии, когда нажата недопустимая или неузнаваемая комбинация клавиш.
[...]
Key Event Modifier Byte Array Array Array Comment
---------------------------------------------------------------------
None 00000000B 00H 00H 00H
RALT down 01000000 00 00 00
None 01000000 00 00 00 Report current key
state even when no
new key events.
A down 01000000 04 00 00
X down 01000000 04 1B 00
B down 01000000 04 05 1B Report order is
arbitrary and does
not reflect order of
events.
Q down 01000000 01 01 01 Phantom state.
Four Array keys
pressed. Modifiers
still reported.
A up 01000000 05 14 1B
B and Q up 01000000 1B 00 00 Multiple events in
one report. Event
order is
indeterminate.
None 01000000 1B 00 00
RALT up 00000000 1B 00 00
X up 00000000 00 00 00
П р и м е ч а н и е - В этом примере используется 4-байтовый отчет, чтобы фантомное состояние было легче продемонстрировать. У большинства клавиатур должно быть 8 или более байтов в их отчетах.
Обратите внимание, что хотя "большинство клавиатур должно иметь 8 или более байтов в своих отчетах", клавиатура "может сообщать о фантомном состоянии при нажатии недопустимой или неузнаваемой комбинации клавиш". Это означает, что если сама клавиатура не может распознать комбинацию (например, внутренняя проводка делает некоторые комбинации клавиш неразличимыми даже для электроники клавиатуры), она сообщает о фантомном состоянии во всех полях массива.
Более того, вы не можете отличить одно фантомное состояние от другого, даже если сама клавиатура может это сделать (например, все фантомные состояния, которые включают в себя E, могут отличаться от всех фантомных состояний, которые включают в себя M, тем не менее клавиатура должна сообщать о них одинаково, чтобы соответствовать спецификации), Единственная полезная информация, которую вы можете использовать - это последнее не фантомное состояние.
В целом ввод с клавиатуры обрабатывается как коды сканирования, а затем как коды клавиш (см. Эту статью о вводе с клавиатуры). Скан-коды - это события пресс-релизов, а не абсолютные данные. Поскольку отчеты с клавиатуры USB «должны содержать список клавиш, которые нажаты в настоящее время, а не создавать / прерывать коды», я полагаю, что именно драйвер преобразует отчеты в коды сканирования.
Я не знаю, отражается ли фантомное состояние сканкодами. Я ожидаю, что это не так, но я не могу проверить это прямо сейчас (ответ будет отредактирован). Я попытался проверить с помощью showkey -ask
(tty2 и X11) и xinput --test
(X11), если фантомное состояние отражается с помощью кодов сканирования, кодов клавиш. Я использовал и клавиатуру моего ноутбука (которая, вероятно, не использует USB, никаких следов в lsusb
) и внешнюю клавиатуру USB. Не было никаких признаков того, что фантомное состояние сообщается на этом уровне. Если я прав, все "нормальные" способы переназначения клавиш не будут работать для вас.
Но если вы написали свой собственный драйвер, который имеет доступ к отчетам, отправленным с клавиатуры, то вы определенно можете обнаружить фантомные состояния. Однако из-за ограничений, описанных выше, лучшее, что вы можете сделать, это:
- заставить любое фантомное состояние вести себя так, как будто нажата E+R+F ;
- создание любого фантомного состояния сразу после (не фантомного) E+R действует так, как если бы E+R+F были нажаты.