Как отличить вход от различных клавиатур?

В прошлый раз я попробовал его, GNOME-Shell (т.е. Метагород важен здесь, я предполагаю), было управляемо с wmctrl очень хорошо. Таким образом, можно добавить вызов ярлыков wmctrl переключить рабочую область.

Знайте, что это только знает о рабочей области 1, 2... - таким образом, могла бы быть некоторая работа, включенная, прежде чем она будет вести себя, как Вы хотели бы ее к.

(Вы могли быть более обеспечены с дайвингом в источники GNOME-Shell; соответствующие части здесь записаны в JavaScript, и могло быть довольно легко получить Ваши ключи путем, Вы хотели бы их. Я попробовал что-то похожее с привязками клавиш переключателя окна Alt+Tab штука, я не на самом деле уверен, доступно ли переключение рабочей области похожим способом; тем не менее это могло бы быть достойное внимания.)

Никакая идея о Единице, все же.

14
01.07.2014, 02:06
2 ответа

При использовании Linux лучший способ различать устройства ввода данных состоит в том, чтобы использовать Интерфейс События Linux. После того, как определенный для аппаратных средств вход устройства декодируется, он преобразован в промежуточную структуру определенного события Linux и сделан доступный путем чтения одного или нескольких устройств посимвольного ввода-вывода под /dev/input/. Это абсолютно независимо от языка программирования, который Вы используете, между прочим.

Каждое устройство получает свое собственное /dev/input/eventX устройство, и существует, также агрегируется (например. /dev/input/mice который представляет движение всех мышей в системе). Ваша система может также иметь /dev/input/by-path и /dev/input/by-id.

Существует ioctl названный EVIOCGNAME который возвращает название устройства как по-человечески читаемая строка, или можно использовать что-то как /dev/input/by-id/usb-Logitech_USB_Gaming_Mouse-mouse.

Вы открываете устройство, и каждый раз, когда событие прибывает от входных аппаратных средств, Вы получите пакет данных. Если можно считать C, можно изучить файл /usr/include/linux/input.h который показывает точно, как этот материал работает. Если Вы не делаете, Вы могли бы считать этот вопрос, который предоставляет всю информацию, в которой Вы нуждаетесь.

Хорошая вещь об интерфейсе события состоит в том, что Вы просто узнаете, в каком устройстве Вы нуждаетесь, и можно считать вход из того устройства ввода данных только, игнорируя всех других. Вы также получите уведомления о ключах, кнопках и управляете Вами, обычно не был бы, просто читая 'приготовленный' символьный поток из терминала: даже мертвые клавиши как Сдвиг, и т.д.

Плохая вещь состоит в том, что интерфейс события не возвращает 'приготовленные' символы, он просто использует цифровые коды для ключей (коды, соответствующие каждому ключу, найдены в вышеупомянутом заголовочном файле — но также и в источнике Python event.py. Если Ваше устройство ввода данных имеет необычные ключи/кнопки, Вы, возможно, должны экспериментировать немного, пока Вы не получаете правильные числа.

12
27.01.2020, 19:51

Альтернативный подход (если на вашей «клавиатуре» не так много клавиш - многие устройства притворяются клавиатурами) заключается в применении раскладки клавиатуры отдельно для каждой клавиатуры. и убедитесь, что ключи различаются.

Это описано здесь: https://superuser.com/questions/760602/how-to-remap-keys-under-linux-for-a-specific-keyboard-only . Суть в том, что setxkbmap принимает аргумент устройства.

Если вы используете необработанный ввод, lsinput найдет ваше необработанное устройство за вас.

2
27.01.2020, 19:51

Теги

Похожие вопросы