Настройка мультимедийных клавиш на клавиатуре

Автор: Гурьянов Дмитрий
Зачечания и предложения пишите сюда с пометкой в теме '{node 97}'.

Итак, Вы наконец-то добрались до клавиатуры. Конечно, зря что-ли производители стараются, делают по 20-30 дополнительных клавиш. Хочется, чтобы они работали. Под windows они, конечно же выпускают драйвера, различные модные програмки, а под линукс - ничего. Но не надо расстраиваться, в линуксе с этим делом намного лучше, чем в windows, так, например для моих двух клав - sven slim internet 330 и mitsumi internet keyboard - под виндой не было нормального ПО. А в линуксе для всех клавиатур это настраивается абсолютно одинаково. А действия на эти клавиши можно повесить с помощью оболочки, которую используете (во всех по-разному настраивается).

Весь смысл настройки клавиатуры в следующем: чтобы оконная система могда нормально использовать клавишу, для нее (для клавиши ) должно быть установлено соответствие ее скэн-кода с кодом Х-сервера, а для кодов Х-сервера заданы символьные имена, в файле /usr/X11R6/include/X11/XF86keysym.h находится куча символьных обозначений для мультимедийных клавиш. Лучше выбрать будущие имена для клавиш оттуда, хотя можно также посмотреть файл /usr/X11R6/include/X11/keysymdef.h. Таким образом нам надо привязать наши клавиши к символьным именам.

Ладно, приступим к настройке.
Во-первых, надо определить скэн-коды всех мультимедийных клавиш и записать их куда-нибудь (ну, или запомнить :)). Сделать это можно с помощью прогрммы xev, которая отлавливает все сообщения от оконной сисемы и выводит информацию на терминал. При нажатии клавиш должно выводиться что-то вроде этого:

KeyPress event, serial 30, synthetic NO, window 0x2400001,
    root 0xb6, subw 0x0, time 16490621, (425,88), root:(475,114),
    state 0x0, keycode 232 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2400001,
    root 0xb6, subw 0x0, time 16490688, (425,88), root:(475,114),
    state 0x0, keycode 232 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes:
	
KeyPress event, serial 30, synthetic NO, window 0x3000001,
    root 0xb6, subw 0x0, time 17760217, (325,439), root:(375,465),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "
    XmbLookupString gives 1 bytes: (1b) "
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x3000001,
    root 0xb6, subw 0x0, time 17760346, (325,439), root:(375,465),
    state 0x0, keycode 9 (keysym 0xff1b, Escape), same_screen YES,
    XLookupString gives 1 bytes: (1b) "

Это я нажал сначала неизвестную X-серверу клавишу E-mail, а потом Escape. Нам нужен keycode. За ним в скобках идет сначала код клавиши для X-сервера, а затем символьное обозначение клавиши. Видно, что для Escape есть и код X-сервера и символьное обозначение.

Теперь,собственно, займемся настройкой привязки скэн-кодов. Сейчас нужно определить еще одну вещь - символьные имена скэн-кодов. Дело в том, что джля каждого скэн-кода задано имя, и в файле где мы будем описывать наши клавиши надо будет указывать именно эти имена, а не сами скэн-коды. Открываем файл /usr/X11R6/lib/X11/xkb/keycodes/xfree86, ищем там наши скэн-коды и узнаем их имена. Например для клавиши E-Mail на клаве Genius KB-0138 видим: <I6C> = 236.

Теперь займемся добавлением новой модели клавиатуры.
Редактируем файлы xorg, xorg.lst и xorg.xml, ну, или xfree86 и xfree86.lst, если у Вас xfree в /usr/X11R6/lib/xkb/rules. Добавим нашу клавиатуру к группе inet. В файле xorg добавим имя нашей клавиатуры в конец списка клавиатур группы inet :

! $inetkbds = airkey acpi scorpius azonaRF2300 \
              brother \
              btc5113rf btc5126t btc9000 btc9000a btc9001ah btc5090\
              cherryblue cherrybluea \
              chicony chicony9885 \
              compaqeak8 compaqik7 compaqik13 compaqik18 armada presario ipaq \
              dell inspiron dtk2000 \
              dexxa diamond genius geniuscomfy2 \
              ennyah_dkb1008 \
              hpi6 hp2501 hp2505 hp5181 hpxe3gc hpxe3gf hpxe4xxx hpzt11xx \
              hp500fa hp5xx hp5185 \
              honeywell_euroboard \
              rapidaccess rapidaccess2 rapidaccess2a \
              ltcd logiaccess logicdp logicdpa logicink logiciink \
              logiinkse logiinkseusb logiik itouch \
              mx1998 mx2500 mx2750 \
              microsoftinet microsoftpro microsoftprooem microsoftprose \
              microsoftoffice microsoftmult \
              oretec \
              propeller \
              qtronix \
              samsung4500 samsung4510 \
              sk1300 sk2500 sk6200 sk7100 \
              sven symplon toshiba_s3000 trust trustda yahoo genius138

В xorg.lst добавим имя и описание клавиатуры

...
  toshiba_s3000 Toshiba Satellite S3000
  trust         Trust Wireless Keyboard Classic
  trustda       Trust Direct Access Keyboard
  yahoo         Yahoo! Internet Keyboard
  genius138     Genius Internet Keyboard

// The entries here should be ordered as follows:
...

В xorg.xml тоже описание, на всякий случай (аналогично остальным моделям), хотя можно это и пропустить.

Теперь надо указать соответствия между именами скэн-кодов и именами клавих в иксах, это можно сделать в файле /usr/X11R6/lib/X11/xkb/symbols/inet, так как мы добавили клавиатуру в группу inet. Там в конце файла пишем что-то вроде этого:

partial alphanumeric_keys
xkb_symbols "genius138" {
    name[Group1]= "Genius Internet Keyboard";

    key <I6C>   {       [ XF86Mail      ]       };
    key <I68>   {       [ XF86Stop      ]       };
    key <I67>   {       [ XF86Refresh   ]       };
    key <I6A>   {       [ XF86Back      ]       };
    key <I32>   {       [ XF86WWW       ]       };
    key <I69>   {       [ XF86Forward   ]       };
    key <I65>   {       [ XF86Search    ]       };
    key <I66>   {       [ XF86Favorites ]       };
    key <I5F>   {       [ XF86Sleep     ]       };
New Action
};

Теперь нужно сказать Х-серверу, что клава у нас модели genius138 (для моего случая ). Открываем файл /etx/X11/xorg.conf или /etc/X11/XF86Config. Ищем место, где описывается клавиатура, и в качестве модели указываем нашу клавиатуру, вместо pc104 (или что там у Вас раньше стояло :)):

Section "InputDevice"
        Identifier  "Keyboard1"
        Driver      "keyboard"
        Option      "AutoRepeat" "250 30"
        Option      "XkbRules" "xfree86"
        Option      "XkbModel" "genius138"
        Option      "XkbLayout" "us,ru(winkeys)"
        Option      "XkbOptions" "grp:ctrl_shift_toggle,grp_led:scroll,altwin:menu"
EndSection

На этом настройка Х-сервера закончена. Осталось его перезапустить, например комбинацией клавивиш Alt-Ctrl-BackSpace ;). Запускаем опять утилиту xev, смотрим, что получилось:

KeyPress event, serial 30, synthetic NO, window 0x2a00001,
    root 0xb6, subw 0x0, time 521517, (92,-18), root:(142,8),
    state 0x0,keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2a00001,
    root 0xb6, subw 0x0, time 521647, (92,-18), root:(142,8),
    state 0x0, keycode 236 (keysym 0x1008ff19, XF86Mail), same_screen YES,
    XLookupString gives 0 bytes:

KeyPress event, serial 30, synthetic NO, window 0x2a00001,
    root 0xb6, subw 0x0, time 522087, (92,-18), root:(142,8),
    state 0x0, keycode 232 (keysym 0x1008ff28, XF86Stop), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 30, synthetic NO, window 0x2a00001,
    root 0xb6, subw 0x0, time 522155, (92,-18), root:(142,8),
    state 0x0, keycode 232 (keysym 0x1008ff28, XF86Stop), same_screen YES,
    XLookupString gives 0 bytes:

Если вместо имени клавиши опять стоит No_Symbol, то значит что-то тут не так. Если у Вас KDE, то можете запустить Control Center->Regional & Accessibility->Keyboard Layouts, найти свою клавиатуру в списке Keyboard Model и порадоваться своей работой :)

Теперь можно заняться настройкой оболочки. В KDE запускайте Control Center идите в раздел Regional & Accessibility->KHotKeys. Во fluxbox'е это можно сделать в файле ~/.fluxbox/keys.
На этом настройка закончена.

Есь

Есь простенький демон

*  app-misc/actkbd
      Latest version available: 0.2.7
      Latest version installed: 0.2.7
      Size of downloaded files: 65 kB
      Homepage:    http://www.softlab.ece.ntua.gr/~thkala/projects/actkbd/
      Description: A keyboard shortcut daemon
      License:     GPL-2

Как привязать

Как привязать скан коды к кей кодам ? у меня при нажатии на некоторые клавиши ничего не происходит и xev их не ловит.

HOWTO_Мультимедий

HOWTO_Мультимедийные_кнопки_(клавиши) на вики есть, там давно уже все расписано

вывод dmesg

atkbd.c: Unknown key released (translated set 2, code 0x96 on isa0060/serio0).
atkbd.c: Use 'setkeycodes e016 <keycode>' to make it known.

Это значит, что ядро не имеет кодов клавиш привязанных к сканкодам вашей клавиатуры. Вы должны добавить одну строку в /etc/conf.d/local.start для каждой отсутствующей клавиши, вот так:

Файл: /etc/conf.d/local.start

setkeycodes e008 136
setkeycodes e016 150
... и так далее ...

mandriva 2008 нотик

mandriva 2008
нотик asus g1s.
программой xev определяется только 4 клавиши,на остальные вообще ничего невыдает.
В мопсе,также определились 4 кнопки,но неработали кнопки функция (fn) и кнопка выключения. Как определить другие клавиши? Спасибо.

Советую

Советую сначала по'grep'ать xorg.lst на предмет вендора своей клавиатуры. У меня gtnius kb16-e scrool, вполне нормально заработала как geniuscomfy2, которая судя по камменту - Genius Comfy KB-21e-Scroll.

Просто добавил в xorg.conf
Option "XkbModel" "geniuscomfy2"

Gnome

А как в Гном переназначить комманды навешиваемые на эти клавиши?
т.е. как сделать, чтобы при нажатии на XF86AudioNext вызывался /usr/bin/xmms -f ?

так же как и для

так же как и для всех остальных "виэмов" -- читай выше

Re: так же как и для

iNDiAnFLy написал(а):
так же как и для всех остальных "виэмов" -- читай выше

т.е. использовать Sven или XBindKeys?
разве без этого нельзя обойтись? я привязал все кейкоды к символьным именам сответственно требованиям xorg, но как на них навешать свои события?
Я пытался настроить через metacity( Гном по умолчанию грузит его )
но что-то работает оччень глючно. у меня зацепило всего один раз...
после пары часов мучений интерес к metacity у меня пропал.
Кто-нибудь знает как и где это разруливет сам Гном?

Re: так же как и для

в гноме разве нет утилит для конфигурации клавиатуры?
посмотри повнимательнее, должна быть такая...

в ICEWM вот проще -- есть файлик keys

iNDiAnFLy написал(а):в гноме

iNDiAnFLy написал(а):
в гноме разве нет утилит для конфигурации клавиатуры?
посмотри повнимательнее, должна быть такая...

в ICEWM вот проще -- есть файлик keys

Есть нашел спасибо.

evadim: забанен за спам

да. в ICEWM

да. в ICEWM события на клавиши определяются в этом файлике /etc/X11/icewm/keys
в гноме есть утилита gnome-keybinding-properties, она позволяет назначить запуск заранее определенных приложений при нажатии определенных клавиш. на XF86AudioNext можно навесить событие следующий трек, но оно жестко нацелено на cdplay.
Как и где это можно переназначить?

В конкретном

В конкретном случае с xmms, использовать всякие привязки, запускающие xmms -f и прочая, есть изысканое извращение.
Правильнее будет сделать
emerge xmms-xf86audio
И жить счастливо :-)

Клава в гноме

Догло мучался с гномом но нашел линк:
http://www.linuxquestions.org/questions/showthread.php?s=&threadid=53834
Смотрите в ответах там очень хорошо расписанно про настройку...

а хелп к гному

а хелп к гному не помогает? может на их хоме есть подробная документация?

всё усложнили "донельзя"

зачем столько мучений?

можно же проще поступить: тем же xev выясняем кейкоды своей клавы, а затем юзаем xmodmap
тоесть пишем все эти кейкоды и их символьное обозначение в тот же ~/.xinitrc, ну или куда удобнее ;)
я к примеру поступил именно так:

xmodmap - << EOF
keycode 144 = XF86AudioPrev
keycode 153 = XF86AudioNext
keycode 160 = XF86AudioMute
keycode 161 = XF86Calculator
keycode 162 = XF86AudioPlay
keycode 164 = XF86AudioStop
keycode 174 = XF86AudioLowerVolume
keycode 176 = XF86AudioRaiseVolume
keycode 178 = XF86HomePage
keycode 223 = XF86Standby
keycode 229 = XF86Search
keycode 230 = XF86Favorites
keycode 231 = XF86Refresh
keycode 232 = XF86Stop
keycode 233 = XF86Forward
keycode 234 = XF86Back
keycode 235 = XF86MyComputer
keycode 236 = XF86Mail
keycode 237 = XF86AudioRecord
EOF

exec icewm-session

после уже можно как угодно играться с вашим любимым WM`ом
-- про WM это уже другая тема
УДАЧИ

ЗЫ.
приведённый выше пример с успехом используется для клавиатуры Genius KB-19e NB

А почему всё

А почему всё работает ок, но только небольшой пролмежуток времени? У меня через 2-10 минут клавиши опять не пашут...

видимо

видимо управление перехватывается виэмом или какой-либо софтиной

Re: всё усложнили "донельзя"

По моему тут вообще все просто: lineakd, проверено на Logitech Y-ST39
_________________
registered linux user 395622

{node 97}

Думаю, что xbindkeys проще и удобней. Что-то вреде грячих клавиш для запуска команд. http://hocwp.free.fr/xbindkeys/

Всем советую Sven - http://sven.linux.kiev.ua/
Оч хорошая программа, думаю, что она понравится многим.

Ну так это для Sven клавиатур, а если у меня Ligitech?
---
Компилируем всё, что движется, а что не движется - двигаем и компилируем.

sven

"Программа позволяет вам настроить на работу мультимедиа-клавиатуру любой модели" - на сайт то заходил?... ;-)

http://sven.linux.kiev.ua

http://sven.linux.kiev.ua очень красиво работает

А как насчет доп. клавиш на клавиатуре ноута? xev на них не реагирует

Если на них не

Если на них не реагирует клава, то их может поймать acpi. В любом случае dmesg - Ваш друг.

_________________
Вот такие пироги

Pasha написал(а):
А как насчет доп. клавиш на клавиатуре ноута? xev на них не реагирует

Можно проверить. Если при нажатии клавиши ядро выдает сообщение, типа:
atkbd.c: Unknown key released (translated set 2, code 0xa3 on isa0060/serio0).
atkbd.c: Use 'setkeycodes e023 ' to make it known.
то можно. (посмотреть сообщение ядра: dmesg | tail )
Если у Вас gentoo то в /etc/conf.d/local.start нужно добавить "setkeycodes e023 " ( - код клавиши, лучше выбрать незанятый, смотреть занятые командой getkeycodes).
Потом выполнить /etc/init.d/local restart, после чего xev будет опознавать заданные клавишы.
ЗЫ: getkeycodes/setkeycodes - нужно выполнять в "чистой" консоли.

А они случайно не только для функций ноута ? Может они в принципе к клавиатуре отношения нее имеют.
---
Gentoo / 2.6.12-rc1 / kde-3.4 (sometimes fluxfox)

Очень может быть, но в виндах (с дровами) они работают. Может есть способ их задействовать?

Попробуй как

Попробуй как тут написано: http://www.fedoralinux.ru/forum/viewtopic.php?id=601

Статья конечно интересная

Но использование lineakd существенно упростит задачу, и не придется редактировать раскладки в XFree/XOrg.
Впрочем оба способа хороши, т.к. lineakd может и не поддерживать вашу клавиатуру. Но если поддерживает - то лучше использовать его. Так что emerge likeakd ;)
---
With best regards, Albert R. Valiev
-----------------------------------
ALT Linux Team [www.altlinux.org]

emerge lineakd

emerge lineakd

Настройка мультимедийных клавиш н

Cтатья без доработок бесполезна на 2.6 ядре
потому что xev при нажатии мульимидийных клавиш ничего не покажет
и только ядро выведет что то типа
atkbd.c: Unknown key released (raw set 2, code 0xdb on isa0060/serio0).
atkbd.c: Use 'setkeycodes e05b ' to make it known.

Re: Настройка мультимедийных клавиш

gals написал(а):
Cтатья без доработок бесполезна на 2.6 ядре
потому что xev при нажатии мульимидийных клавиш ничего не покажет

Та же самая проблема. Как ее можно решить? Использовать ту ж lineakd не хотелось бы...

Я нас настраивал по ней, все работает и на ядрах 2.6.

а вы не могли бы сразу дополнить?

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".