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

8

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

Любые предложения, что я могу сделать?

Remi
источник

Ответы:

6

Решение с использованием halevt

Согласно man-страницам 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. Но не стесняйтесь придерживаться другого решения, важно то, что оно работает;)
Герхард Бургер
E: Unable to locate package halevt14.04.
umpirsky
Начиная с Ubuntu 13.10 halevt больше не включается ( packages.ubuntu.com/search?keywords=halevt )
Герхард Бургер
11

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

  • Большое спасибо за этот полезный пост Vaidas Jablonskis.

Герхард Бургер
источник
1
$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directoryтакже$ /lib/udev/findkeyboards bash: /lib/udev/findkeyboards: No such file or directory
umpirsky
Спасибо за ваш комментарий, я изучил его, и похоже, что udev будет объединен с systemd, а настройки раскладки ключей будут управляться в hwdb. Согласно bbs.archlinux.org/viewtopic.php?id=168720, можно извлечь findkeyboards из более старой версии systemd, но я не уверен, что остальная часть ответа по-прежнему применима ...
Герхард Бургер