Предположим, я одновременно держу 3 клавиши E, R, F в указанном порядке.

Из-за дублирования клавиш клавиатура не может отличить эту комбинацию от других комбинаций (возможно, ERFG, ERG или EFG) и предполагает, что нажаты только 2 клавиши E и R.

Я понимаю, что это аппаратное ограничение. Однако возможно ли сопоставить это состояние клавиатуры с другой комбинацией, такой как ERF?

Другими словами, я хочу, чтобы всякий раз, когда я держал ERF или другие комбинации клавиш, неотличимые от ERF, системный регистр удерживал ERF.

Для справки, моя ОС - Arch Linux, а моя клавиатура - Fühlen L411.

2 ответа2

1

Если клавиатура работает без дополнительных (пользовательских или конкретных) драйверов, как клавиатура 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 были нажаты.
0

Лучше всего определить пользовательскую консольную раскладку клавиатуры.

Обратите внимание, что это будет работать только в том случае, если озвучивание клавиатуры еще не происходит на аппаратном уровне, т.е. Клавиатура не отправляет события для ваших клавиш E, F, R, а только для одной из трех клавиш при одновременном нажатии.

Вы можете проверить, какие коды клавиш / сканкоды (-ы) генерируются вашей клавиатурой при вызове 'sudo showkey' или 'sudo showkey -s'.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .