Решение с использованием Udev
Поскольку HAL устарел и udev
используется в настоящее время, этот подход предпочтительнее моего другого ответа (хотя я думаю, что решение с использованием HAL проще).
Однако для многих функциональных клавиш вы можете просто использовать Системные настройки> Клавиатура> Сочетания клавиш, чтобы связать скрипт, попробуйте сначала! Это спасает вас от многих проблем. Например, для клавиш яркости это не работает (я понятия не имею, почему нет), поэтому, если вы хотите узнать, как изменить поведение, например, клавиш яркости, читайте дальше.
ПРИМЕЧАНИЕ . Если вы используете ноутбук Samsung, вы можете исправить все (в зависимости от модели) функциональные клавиши, установив samsung-tools
пакет с http://www.voria.org/forum/.
Это руководство предполагает, что вы знаете, как использовать терминал, и использует vim
редактор. Если вы не знаете, vim
пожалуйста, замените его в командах на gedit
или nano
.
Определение вашей клавиатуры
/lib/udev/findkeyboards
должен печатать клавиатуры, которые подключены к компьютеру, в моем случае
USB keyboard: input/event9
USB keyboard: input/event7
AT keyboard: input/event4
Теперь есть два варианта:
Клавиатуры USB :
если вы хотите переназначить клавиатуру USB, проверьте их, запустив
udevadm info --export-db | awk '/event9/' RS="" | grep -P 'ID_(VENDOR|MODEL)(?!_ENC)'
где вы должны заменить 9 в выражении awk на правильный номер. Вывод должен быть похож на
E: ID_MODEL=USB_Receiver
E: ID_MODEL_ID=c52b
E: ID_VENDOR=Logitech
E: ID_VENDOR_ID=046d
это правильно указывает на то, что моя клавиатура обрабатывается через мой USB-приемник Logitech (input / event7 оказалась моей мышью Logitech G9, у которой есть несколько программируемых кнопок).
Клавиатура ноутбука :
если вы хотите переназначить клавиатуру ноутбука, вы должны запомнить номер для AT keyboard
4 в моем случае. Также получите информацию dmi для вашего ноутбука:
cat /sys/class/dmi/id/sys_vendor
что в моем случае
SAMSUNG ELECTRONICS CO., LTD.
а также
cat /sys/class/dmi/id/product_name
что в моем случае
305U1A
Определите текущее отображение ваших функциональных клавиш
Теперь мы можем определить наше текущее сопоставление клавиш, прослушивая клавиатуру (введите правильное число)
sudo /lib/udev/keymap -i input/event4
Вы можете выйти из этой команды, используя Escна клавиатуре, или Ctrl+ cна другой клавиатуре.
Если ваш экран начинает очень сильно прокручиваться, нажмите Escи Ctrl+ cнесколько раз и попробуйте снова
sudo /lib/udev/keymap -i input/event4 2> /dev/null
или, если у вас все еще есть проблема с прокруткой
sudo /lib/udev/keymap -i input/event4 > ~/keymap.log
В последнем случае у вас все еще будет прокрутка, но если вы нажмете функциональные клавиши, они должны перейти туда, ~/keymap.log
где вы сможете прочитать их позже.
Теперь мы можем проверить текущее отображение ваших функциональных клавиш, нажав их, что должно дать вам список вроде (это мой Fn+ F1через Fn+ F12):
scan code: 0xCE key code: kpplusminus
scan code: 0x89 key code: brightnessdown
scan code: 0x88 key code: brightnessup
scan code: 0x82 key code: switchvideomode
scan code: 0xF9 key code: f23
scan code: 0xA0 key code: mute
scan code: 0xAE key code: volumedown
scan code: 0xB0 key code: volumeup
scan code: 0x43 key code: f9
scan code: 0x44 key code: f10
scan code: 0xB3 key code: prog3
scan code: 0x86 key code: wlan
Теперь запишите коды сканирования, для которых вы хотите изменить поведение.
Изменение кодов клавиш для кодов сканирования
Если вы видите код ключа явно не покрывает то , что вы ожидаете , что ключ сделать вы можете посмотреть в /usr/include/linux/input.h
соответствии с клавишами и кнопками , чтобы увидеть , если есть ключевой код , который лучше соответствует тому , что вы на самом деле хотите , чтобы это произошло. Коды ключей представлены в формате, KEY_KEYCODE
и вы должны записать деталь после этого KEY_
в нижнем регистре. Иногда изменения этого достаточно, чтобы решить проблему.
Однако клавиши яркости часто имеют правильный код, связанный с ними, и это то, что не позволяет им переназначаться. Поэтому нам нужно изменить их на другие коды клавиш. Мы будем использовать prog1
и prog2
для этого примера, потому что они не используются на моем компьютере, однако вы также можете использовать f13
через f24
, или f20
через, f24
если у вас есть клавиатура Apple, которая имеет F1сквозные F19клавиши.
Создайте пользовательскую раскладку :
Создайте файл раскладки в каталоге /lib/udev/keymaps
с подходящим именем, взгляните на вывод, ls /lib/udev/keymaps
чтобы найти подходящие имена. Я собираюсь с custom-brightness
целью этого вопроса.
sudo vim /lib/udev/keymaps/custom-brightness
и введите коды сканирования клавиш, которые вы хотите изменить, а затем коды сканирования, которые вы хотите, чтобы они были. Моя custom-brightness
выглядит так:
# /lib/udev/keymaps/custom-brightness
0x89 prog1
0x88 prog2
Создайте собственный файл релиза ключа. Только в том случае, если вы меняете клавиатуру ноутбука :
иногда событие отпускания ключа отправляется неправильно, что приводит к зависанию компьютера. Чтобы избежать этого, мы также напишем специальный файл релиза ключа
sudo vim /lib/udev/keymaps/force-release/custom-brightness
этот файл должен содержать те же коды сканирования, мой выглядит
# /lib/udev/keymaps/force-release/custom-brightness
0x89
0x88
Убедитесь, что новые сопоставления загружены в файлы правил.
Теперь нам нужно убедиться, что загружены ваши сопоставления. Мы можем сделать это путем редактирования /lib/udev/rules.d/95-keymap.rules
, поэтому лучше сделать резервную копию
Опять же у нас есть два варианта:
Клавиатуры USB :
поскольку у вас есть клавиатура USB, вы должны добавить свою запись под LABEL="keyboard_usbcheck"
ней, и она должна быть позади других записей вашего производителя клавиатуры. Это потому, что моя клавиатура с
E: ID_MODEL=USB_Receiver
E: ID_MODEL_ID=c52b
E: ID_VENDOR=Logitech
E: ID_VENDOR_ID=046d
уже соответствует одному из правил, а в противном случае оно перезаписывается.
Добавьте следующее правило, где вы должны соответствующим образом изменить ID_VENDOR_ID
и ID_MODEL_ID
и имя вашей раскладки клавиатуры.
ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="c52b", RUN+="keymap $name custom-brightness"
Клавиатура ноутбука :
если вы /lib/udev/findkeyboards
заявили, что клавиатура ноутбука AT keyboard
должна быть нарушена LABEL="keyboard_vendorcheck"
, в противном случае поместите ее под LABEL="keyboard_modulecheck"
. Снова поместите это под другими записями для вашего производителя ноутбуков. Добавьте следующее правило ( SAMSUNG ELECTRONICS CO., LTD.
оно длинное, поэтому я использовал подстановочный знак)
ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keymap $name custom_brightness"
Теперь также добавьте правило /lib/udev/rules.d/95-keyboard-force-release.rules
после резервного копирования
sudo cp /lib/udev/rules.d/95-keyboard-force-release.rules /lib/udev/rules.d/95-keyboard-force-release.rules.bak
sudo vim /lib/udev/rules.d/95-keyboard-force-release.rules
Снова под другими записями вашего производителя добавить
ENV{DMI_VENDOR}=="SAMSUNG*", ATTR{[dmi/id]product_name}=="305U1A", RUN+="keyboard-force-release.sh $devpath custom_test"
Убедитесь, что udev загружает новые правила.
Чтобы загрузить новые правила, запустите
sudo adevadm trigger
ПРИМЕЧАНИЕ: udevadm control --reload-rules
(все еще в инструкциях на многих сайтах) не работает.
Теперь проверьте, были ли правила успешно применены
sudo /lib/udev/keymap -i input/event4
который теперь должен сообщать о яркости клавиш
scan code: 0x89 key code: prog1
scan code: 0x88 key code: prog2
Переопределите ключи в Системных настройках.
Если на последнем шаге сообщалось о правильных кодах клавиш, автоматически запускаются клавиши (если они сначала имели неправильные коды клавиш).
Для яркости вам все равно нужно привязать клавиши к скрипту, что теперь возможно с помощью Системные настройки> Клавиатура> Сочетания клавиш .
наслаждаться
Примечания :
Если ваши ключи имели неправильный код ключа и были исправлены с помощью этого подхода, пожалуйста, следуйте инструкциям в /usr/share/doc/udev/README.keymap.txt.gz
(вы можете открыть это, не распаковывая, используя zless
) и отправьте свои результаты на адреса электронной почты, упомянутые там, тогда изменения могут быть включены в следующий выпуск. Многие пользователи выиграют!
Большое спасибо за этот полезный пост Vaidas Jablonskis.