Проблема привязки ярлыка к функциональной / мультимедийной клавише

Я хочу подключить пакетный скрипт к ярлыку. Когда я связываю его в " Системные настройки"> "Клавиатура"> "Ярлыки", он работает с каждой клавишей, кроме клавиш яркости от внешней клавиатуры 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.

  1. Создайте пользовательскую карту ключей:
    Создайте файл раскладки в каталоге /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
    
  2. Создайте собственный файл релиза ключа. Только если вы меняете клавиатуру ноутбука:
    Иногда событие отпускания ключа отправляется неправильно, что приводит к зависанию компьютера. Чтобы избежать этого, мы также напишем специальный файл релиза ключа

    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) и отправьте свои результаты на адреса электронной почты, упомянутые там, затем изменения могут быть включены в следующий выпуск. Многие пользователи выиграют!

  • Большое спасибо за этот полезный пост Вайдаса Яблонскиса.

Другие вопросы по тегам