Вопрос или проблема
У меня есть внешняя клавиатура, подключенная по USB к моему ноутбуку. Я хотел бы перенастроить коды клавиш внешней клавиатуры, не изменяя коды клавиш клавиатуры ноутбука.
Если быть более конкретным, я хочу, чтобы функциональные клавиши (F1-F12) работали так, как и должны, а не выполняли функции, такие как увеличение/уменьшение громкости/яркости.
Давайте возьмем F12 в качестве примера. Когда я сосредоточен на Chrome,
Ноутбучная клавиатура: F12 -> открыть консоль
FN+F12 -> увеличить громкость
Внешняя клавиатура: F12 -> увеличить громкость
FN+F12 -> открыть консоль
Это полностью запутано. Когда я использую xev
, вот вывод:
Внешняя клавиатура (xev)
----------------------------------------
[F11] (уменьшить громкость)
Событие FocusOut, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
режим NotifyGrab, деталь NotifyAncestor
Событие FocusIn, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
режим NotifyUngrab, деталь NotifyAncestor
Событие KeymapNotify, серийный номер 33, синтетическое НЕТ, окно 0x0,
клавиши: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
----------------------------------------
[F12] (увеличить громкость)
Событие FocusOut, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
режим NotifyGrab, деталь NotifyAncestor
Событие FocusIn, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
режим NotifyUngrab, деталь NotifyAncestor
Событие KeymapNotify, серийный номер 33, синтетическое НЕТ, окно 0x0,
клавиши: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
----------------------------------------
[FN+F12]
Событие KeyPress, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
корень 0x5d1, субв 0x0, время 16400865, (-850,446), корень:(706,511),
состояние 0x0, код клавиши 96 (keysym 0xffc9, F12), тот же экран ДА,
XLookupString дает 0 байт:
XFilterEvent возвращает: Ложь
Событие KeyRelease, серийный номер 33, синтетическое НЕТ, окно 0x4000001,
корень 0x5d1, субв 0x0, время 16400985, (-850,446), корень:(706,511),
состояние 0x0, код клавиши 96 (keysym 0xffc9, F12), тот же экран ДА,
XLookupString дает 0 байт:
XFilterEvent возвращает: Ложь
Как видите, F11 (уменьшить громкость) и F12 (увеличить громкость) не имеют различий в xev
. Но в acpi_listen
у меня есть
Внешняя клавиатура (acpi_listen)
----------------------------------------
[F11]
button/volumedown VOLDN 00000080 00000000 K
----------------------------------------
[F12]
button/volumeup VOLUP 00000080 00000000 K
xinput -list
внешней клавиатуры (не уверен, почему две записи)
⎣ Виртуальная основная клавиатура id=3 [основная клавиатура (2)]
↳ ...
↳ Устройство USB SONiX id=13 [дополнительная клавиатура (3)]
↳ Устройство USB SONiX id=23 [дополнительная клавиатура (3)]
Как я могу изменить раскладку клавиш внешней клавиатуры, не вмешиваясь в клавиатуру ноутбука? Внешняя клавиатура не имеет ‘FN-lock’ или чего-то подобного.
PS: На самом деле, клавиша Windows и левая клавиша Alt поменялись местами, но я предполагаю, что если проблема выше будет решена, это тоже решится.
PS 2: Я читал это, но это только меняет раскладку клавиатуры на другую предустановленную раскладку, что не решает мою проблему.
Я на Ubuntu 20.04 и ядре 5.4.0-33-generic. Мой ноутбук – Asus UX550.
Ответ или решение
Чтобы вручную перенастроить раскладку клавиатуры внешней клавиатуры, подключенной к вашему ноутбуку на Ubuntu 20.04, вам нужно будет воспользоваться несколькими инструментами и подходами, которые помогут вам решить проблему с неправильным поведением функциональных клавиш и другими конфликтами между клавиатурами. Ниже приведены детальные шаги для выполнения этой задачи.
Понимание проблемы
Судя по предоставленным данным, ваша внешняя клавиатура функционирует неправильно, в то время как встроенная клавиатура ноутбука работает как ожидается. Например, F12 на внешней клавиатуре вызывает увеличение громкости, тогда как на встроенной клавиатуре работает как вызов консоли в Chrome. Это происходит из-за различий в обработке ключевых кодов для каждого устройства.
Решение проблемы
Для исправления ситуации можно использовать следующие способы:
1. Использование xmodmap
xmodmap
— это утилита для изменения раскладок клавиатуры в X-системах. Можно создать файл, который будет использоваться для перенастройки конкретной клавиши.
Шаги:
-
Откройте терминал.
-
Сначала усмотрим текущие маппинги:
xmodmap -pke > ~/.Xmodmap
-
Отредактируйте файл
~/.Xmodmap
:gedit ~/.Xmodmap
-
Найдите строки, соответствующие F12 и F11, и измените их так, чтобы они соответствовали нужным вам действиям. Например:
keycode 96 = F12 keycode 95 = F11
Замените
keycode
на соответствующие значения для вашей клавиатуры. Вы можете получитьkeycode
с помощьюxev
. -
Если вы хотите, чтобы изменения применялись автоматически при каждом запуске, добавьте в ваш
~/.bashrc
или~/.profile
:xmodmap ~/.Xmodmap
2. Использование setxkbmap
Другим способом будет использование setxkbmap
, который может изменять настройки клавиатуры в рамках X-систем.
-
Откройте терминал.
-
Чтобы установить конкретный макет клавиатуры, используйте:
setxkbmap -device <идентификатор_вашей_клавиатуры> -layout us
Замените
<идентификатор_вашей_клавиатуры>
на идентификатор вашей внешней клавиатуры, который можно получить с помощью командыxinput list
.
3. Использование xinput
для отключения ненужных функций
Вы также можете в некоторых случаях отключить функции FN
сочетаний клавиш.
-
Сначала получите список устройств с помощью:
xinput list
-
Найдите идентификатор вашей внешней клавиатуры и отключите конкретные функции:
xinput set-prop <идентификатор> <имя свойства> 0
4. Правки в системном файле конфигурации
Если вышеуказанные методы не сработали, вы можете попробовать изменить системные файлы конфигурации.
-
Создайте резервную копию файла
/usr/share/X11/xorg.conf.d/00-keyboard.conf
. -
Откройте файл и занесите настройки, позволяющие отличать ваши клавиатуры.
Заключение
Более того, для решения проблемы с раскладкой клавиш Windows и Alt также может потребоваться редактирование макетов в xkb
. Все изменения требуют некоторого времени и могут потребовать перезагрузки для применения. Попробуйте указанные методы и настройте клавиатуру таким образом, чтобы вам было удобно работать с обоими устройствами.
Если варианты не привели к желаемому результату, может потребоваться обратиться к документации по конкретной модели вашей внешней клавиатуры или проверить наличие обновлений драйверов.