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

Я хочу подключить пакетный скрипт к ярлыку. Когда я связываю его в Системные настройки> Клавиатура> Ярлыки , он работает с каждой клавишей, кроме клавиш яркости от моей внешней клавиатуры Apple.

Клавиши яркости распознаются в showkey с помощью кода клавиш 224 и 225 .

xev output:

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 

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

8
задан 16 January 2013 в 12:12

2 ответа

Решение с помощью 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
    

    то, которое правильно указывает, что моя клавиатура обрабатывается через мой Logitech USB Receiver (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
    

Определите свое текущее отображение Ваших функциональных клавиш

Теперь мы можем определить наш текущий keymapping путем слушания клавиатуры (вставьте корректное число),

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
    

    и введите скэн-коды ключей, которые Вы хотите изменить сопровождаемый scancodes, который Вы хотите, чтобы они имели. Мой 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 и название Вашей контурной карты appropiately

    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". Снова подвергните его другим записям для Вашего ноутбука manufactorer. Добавьте следующее правило (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.

11
ответ дан 16 January 2013 в 12:12

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

Согласно man-страницам halevt является универсальным обработчиком событий HAL. Он устарел и заменен на udev, но, поскольку я недостаточно знаю о udev, я дам решение halevt.

РЕДАКТИРОВАТЬ: после некоторого серьезного пота мне удалось сделать это в udev. См. мой другой ответ .

Я буду использовать vim для редактирования файлов, но если вы не знаете vim, вы можете заменить его на nano или gedit.

Установка halevt

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 снова

sudo /etc/init.d/halevt start

И он должен работать!

0
ответ дан 16 January 2013 в 12:12

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

Похожие вопросы: