Проблема привязки ярлыка к функциональной / мультимедийной клавише
Я хочу подключить пакетный скрипт к ярлыку. Когда я связываю его в " Системные настройки"> "Клавиатура"> "Ярлыки", он работает с каждой клавишей, кроме клавиш яркости от внешней клавиатуры Apple.
Клавиши яркости распознаются в showkey с помощью кодов клавиш 224 и 225.
xev вывод:
FocusOut event, serial 41, synthetic NO, window 0x4000001,
mode NotifyGrab, detail NotifyAncestor
FocusIn event, serial 41, synthetic NO, window 0x4000001,
mode NotifyUngrab, detail NotifyAncestor
KeymapNotify event, serial 41, synthetic NO, window 0x0,
keys: 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 0
Любые предложения, что я могу сделать?
2 ответа
Решение с использованием halevt
Согласно справочным страницам halevt
универсальный обработчик событий HAL Это устарело и заменено udev
, но так как я не знаю достаточно о udev
Я дам halevt
решение.
РЕДАКТИРОВАТЬ: после некоторого серьезного пота, мне удалось сделать это в udev
, Смотрите мой другой ответ.
я использую vim
редактировать файлы, но если вы не знаете, vim
Вы можете заменить его на nano
или же gedit
,
Установка подъема
sudo apt-get update && sudo apt-get install halevt
Определение того, какие события вы хотите связать со скриптом
Остановить halevt
демон, который уже запущен:
sudo /etc/init.d/halevt stop
Теперь посмотрим, если halevt
может распознать события клавиш, которые вы хотите использовать, запустите слушатель:
sudo -u halevt halevt -fig:plugdev
Теперь нажмите функциональную клавишу на клавиатуре, к которой вы хотите привязать скрипт. Я знаю, что ОП хочет, чтобы его клавиши яркости работали, так что давайте продолжим. Вывод для клавиш яркости должен выглядеть примерно так:
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-down)
Condition: /org/freedesktop/Hal/devices/platform_i8042_i8042_KBD_port_logicaldev_input,ButtonPressed (brightness-up)
Вы можете видеть, что brightness-down
а также brightness-up
события передаются.
Привязать событие к сценарию
Теперь отредактируйте файл /etc/halevt/halevt.xml
:
sudo vim /etc/halevt/halevt.xml
и добавьте следующие строки (я сделал это внизу, прямо перед </halevt:Configuration>
):
<halevt:Device match="hal.info.category = input">
<halevt:Condition name="ButtonPressed" value="brightness-up" exec="sudo /home/user/brightness-script.sh up"/>
<halevt:Condition name="ButtonPressed" value="brightness-down" exec="sudo /home/user/brightness-script.sh down"/>
</halevt:Device>
где, конечно, вы должны изменить value
на событие, которое вы получили от слушателя, и exec
по команде, которую вы хотите выполнить.
Дайте halevt пользователю разрешение на выполнение команды или сценария
Поскольку halevt
демон запускается как halevt
Пользователь, вы должны дать ему разрешение делать то, что вы указали в exec
,
Запустить (не забудьте заменить vim
по вашему выбору редактора)
sudo EDITOR=vim visudo
и добавьте следующие строки внизу
halevt ALL=(root) NOPASSWD: /home/user/brightness-script.sh
и сохранить и выйти.
Убедитесь, что ваш скрипт исполняемый
sudo chmod +x /home/user/brightness-script.sh
Запустите halevt daemon снова
sudo /etc/init.d/halevt start
И это должно работать!
Решение с использованием 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
) и отправьте свои результаты на адреса электронной почты, упомянутые там, затем изменения могут быть включены в следующий выпуск. Многие пользователи выиграют!Большое спасибо за этот полезный пост Вайдаса Яблонскиса.