HOWTO Мультимедийные кнопки (клавиши)

Материал из Gentoo Linux Wiki

Перейти к: навигация, поиск
Вернуться в раздел руководства

Содержание

[править] Вступление

Большинство современных клавиатур оснащено мультимедийными клавишами (кнопками). Это руководство обьясняет, что и как нужно сделать, чтобы использовать эти клавиши.

[править] Определить коды клавиш

Какую бы клавишу вы не нажали на вашей клавиатуре ядро выдает скан-код клавиши, который может быть привязан к коду клавиши. В тоже время, это происходит на уровне ядра, а X использует собственный способ привязки клавиш. При загрузке читается таблица кодов клавиш ядра, затем код клавиши привязывается к собственной таблице кодов. Каждый код клавиши может быть привязан к символу клавиши, строке, которая представляет эту клавишу.

Определить коды для ваших мультимедийных клавиш очень просто. Нужно лишь ввести команду в X терминале (xterm/konsole/eterm):

xev

Note: если вы используете модульный (т.е. распространяющийся по частям) X сервер версии >=7.0.0, то возможно вам для начала понадобится поставить (emerge) и раскрыть (unmask) x11-apps/xev, примерно так:

echo x11-apps/xev | tee -a /etc/portage/package.keywords /etc/portage/package.unmask 
# -a ВАЖНО, это точно заставляет tee не перезаписывать файл

Теперь нажмите каждую мультмедийную клавишу на вашей клавиатуре и запомните сгенерированные коды, которые будут выводиться в окне терминала и выглядеть так:

Code: Вывод xev
KeyRelease event, serial 31, synthetic NO, window 0x2800001,
root 0x7d, subw 0x0, time 2792224, (-22,86), root:(565,101),
state 0x10, keycode 160, same_screen YES,
XLookupString gives 0 bytes:

Значение "keycode" - это то, что нам нужно. В этом пример это 160. Запомните значение для каждой дополнительной клавиши.

Если после нажатия все клавиши выдают информацию, тогда вы можете перейти к настройке xmodmap или создать свою модель клавиатуры, что считается более эстетичным=) Если нажатие какой-то клавиши не дает ничего, введите в X терминал:

dmesg

Вы можете увидеть строки вроде этих:

Code: Вывод 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
... и так далее ...

Где первое число - это то, которое вы видели в выводе dmesg, и второе (136) - неиспользуемый код клавиши вашего ядра. В общем случае, вы можете дать хороший код для клавиши взяв последние 2 знака первого числа, преобразовав их из шестнадцатиричного представления в десятичное и прибавив 128.

Кроме того, неиспользуемые коды клавиш вы можете посмотреть с помощью getkeycodes, только выполнять эту программу нужно не в x-терминале. Например, вы можете перейти в tty2, нажав кнопки [Ctrl]+[Alt]+[F2], залогиниться и выполнить getkeycodes. Вы увидите таблицу, где нули - клавиши с неиспользуемыми кодами. Результат может быть примерно такой:

Code: Вывод getkeycodes
<tt>
Собственно скан-коды xx (hex) и, соответственно, коды клавиш (десятичные)
for 1-83 (0x01-0x53) scancode equals keycode

 0x50:   80  81  82  83  99   0  86  87
 0x58:   88 117   0   0  95 183 184 185
 0x60:    0   0   0   0   0   0   0   0
 0x68:    0   0   0   0   0   0   0   0
 0x70:   93   0   0  89   0   0  85  91
 0x78:   90  92   0  94   0 124 121   0

Скан-коды с `Escape' e0 xx (hex)

e0 00:    0   0   0   0   0   0   0   0
e0 08:    0 204 167 170   0   0   0   0
e0 10:  165   0 237   0   0   0   0   0
e0 18:    0 163   0   0  96  97   0   0
e0 20:  113 140 164   0 166   0   0   0
e0 28:    0   0 255   0   0   0 114   0
e0 30:  115   0 150   0   0  98 255  99
e0 38:  100   0   0   0   0   0   0   0
e0 40:    0   0   0   0   0 119 119 102
e0 48:  103 104   0 105 112 106 118 107
e0 50:  108 109 110 111   0   0   0   0
e0 58:    0   0   0 125 126 127 116 142
e0 60:    0   0   0 143   0 217 156 173
e0 68:  128 159 158 157 155 226   0 112
e0 70:    0   0   0   0   0   0   0   0
e0 78:    0   0   0   0   0   0   0   0
</tt>

Посмотреть, используется ли код клавиши, который вы хотите установить с помощью setkeycodes, можно с помощью небольшого конвеера:

getkeycodes | grep <код клавиши>

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

/etc/init.d/local restart

После того, как правильные связи будут выставлены, перезапустите X и снова воспользуйтесь xev, чтобы узнать коды для каждой мультимедийной клавиши, которую вы хотите использовать

Note: с мультимедийными клавишами, действующими только при нажатой функциональной клавишей (Fn), проблемы, возможно, будут продолжаться.

[править] Настройка xmodmap

Теперь вам надо создать файл, содержащий связки "keycode <код клавиш> = <keysym>". Создайте файл .Xmodmap в вашей домашней ($HOME) директории.

Файл: Пример .Xmodmap
keycode 160 = XF86AudioMute
keycode 162 = XF86AudioPlay
keycode 178 = XF86WWW
keycode 230 = XF86Go
keycode 236 = XF86Mail
keycode 237 = XF86AudioMedia

Список возможных keysyms может быть найден в /usr/lib/X11/XKeysymDB или /usr/share/X11/XKeysymDB (расположение XKeysymDB зависит от дистрибутива и X-сервера). Это список наиболее часто используемых keysyms из XKeysymDB.

Файл: /usr/lib/X11/XKeysymDB
XF86ModeLock            :1008FF01
XF86Standby             :1008FF10
XF86AudioLowerVolume    :1008FF11
XF86AudioMute           :1008FF12
XF86AudioRaiseVolume    :1008FF13
XF86AudioPlay           :1008FF14
XF86AudioStop           :1008FF15
XF86AudioPrev           :1008FF16
XF86AudioNext           :1008FF17

...

XF86HomePage            :1008FF18
XF86Mail                :1008FF19
XF86Start               :1008FF1A
XF86SplitScreen         :1008FF7D
XF86Support             :1008FF7E
XF86Away                :1008FF8D
XF86Messenger           :1008FF8E
XF86WebCam              :1008FF8F
XF86MailForward         :1008FF90
XF86Pictures            :1008FF91
XF86Music               :1008FF92

Все что вам осталось сделать - настроить запуск xmodmap при каждом запуске X сессии. Обычно это делают через ваш $HOME/.xsession файл.

Файл: $HOME/.xsession
/usr/X11R6/bin/xmodmap $HOME/.Xmodmap

Не забудьте заменить $HOME на полный путь к вашей домашней директории.

Настройка GDM
Если вы используете GDM, вы можете использовать файл /etc/X11/Xmodmap как общий для системы Xmodmap. Вы также можете выбрать другой Xmodmap файл, если хотите. Просто измените sysmodmap=/etc/X11/Xmodmap в файле /etc/X11/gdm/Init/Default на тот, который нужен.

[править] Присвоение клавишам специальных функций

Теперь ваши мультимедийные клавиши связаны с keysym-записью, и их можно связать с нужной функцией, которую хотите вы или может предложить ваш оконный менеджер.

[править] Blackbox

Нужно: emerge bbkeys. Как только bbkeys будут поставлены, не забудьте запускать их при запуске X. Пример файла xinitrc:

Файл: ~/.xinitrc
bbkeys &
exec blackbox

Теперь вам нужно настроить bbkeys. Вы можете использовать общий файл настроек (обычно /usr/share/bbkeys/bbkeysrc) или скопировать его в ~/.bbkeysrc и редактировать свою копию. Вы можете начать новый файл, но рекомендую все-таки добавить свои настройки к уже существующим, и довольно-таки неплохим. Пример:

Файл: ~/.bbkeysrc
[begin] (bbkeys configuration file)
 # * CUT DEFAULTS *
 [keybindings] (begin keybindings)
 # * CUT DEFAULTS *
 [Execute]   (XF86Mail)      {thunderbird}
 [Execute]   (XF86AudioPlay) {xmms --play-pause}
 [Execute]   (XF86AudioStop) {xmms --stop}
 [Execute]   (XF86AudioNext) {xmms --fwd}
 [Execute]   (XF86AudioPrev) {xmms --rew}
 [Execute]   (XF86AudioLowerVolume)  {amixer -q set PCM 2- unmute}
 [Execute]   (XF86AudioRaiseVolume)  {amixer -q set PCM 2+ unmute}
 [end] (end keybindings)
[end] (end bbkeys configuration)


Так-то.

[править] Fluxbox

Откройте ~/.fluxbox/keys в вашем любимом редакторе. Для примера, это управление основными функциями xmms:

Файл: ~/.fluxbox/keys
None XF86AudioPlay :ExecCommand /usr/bin/xmms --play-pause
None XF86AudioStop :ExecCommand /usr/bin/xmms --stop
None XF86AudioPrev :ExecCommand /usr/bin/xmms --rew
None XF86AudioNext :ExecCommand /usr/bin/xmms --fwd
None XF86AudioLowerVolume :ExecCommand amixer -q set PCM 2- unmute
None XF86AudioMute :ExecCommand amixer -q set Master toggle
None XF86AudioRaiseVolume :ExecCommand amixer -q set PCM 2+ unmute

На некоторых звуковых картах для выключения звука нужно использовать PCM вместо Master. Это даст запланированный эффект (кнопка увеличения громкости включит звук).

Файл: ~/.fluxbox/keys
None XF86AudioMute :ExecCommand amixer -q set PCM toggle

[править] Openbox

Откройте ~/.config/openbox/rc.xml, найдите раздел keyboard и следуя примерам, добавьте в конец раздела:

Файл: ~/.config/openbox/rc.xml
<keybind key="XF86AudioPlay">
 <action name="Execute"><execute>/usr/bin/xmms --play-pause</execute></action>
</keybind>
<keybind key="XF86AudioStop">
 <action name="Execute"><execute>/usr/bin/xmms --stop</execute></action>
</keybind>

Для получения дополнительной информации смотрите раздел [in http://icculus.org/openbox/docs.php?page=details.html#keybindings. keybind документации openbox]. Список действий ищите там же.

[править] XFCE

Settings Manager -> "Window Manager" -> "Keyboard". Создайте новую тему, определите в ней свои горячие клавиши ("Command Shortcuts"). Keysym из вашего .Xmodmap идет после команды.

[править] KDE

1) Control Center -> Regional & Accessibility -> Keyboard Layout. Если ваша модель клавиатуры есть в списке - вам повезло. Используйте KHotKeys. Если не повезло, и вы используете kdm, то с учетом того, что kdm читает ~/.xprofile при каждом входе, просто создайте файл ~/.Xmodmap как упоминалось ранее, и добавьте в .xprofile запись про xmodmap:

Файл: ~/.xprofile
/usr/bin/xmodmap $HOME/.Xmodmap

2) Для того, чтобы сообщения о изменении громкости показывались на экране необходимо установить kmilo и запустить его через Control Center -> KDE Components -> Service Manager.

Note: мне понадобилось вручную установить Glogal Hotkeys в kmix, чтобы заработал регулятор громкости и mute.

[править] GNOME

Gnome-2.10:

Go to Desktop > Preferences > Keyboard Shortcuts, or run gnome-keyboard-bindings, whichever suits your fancy. Make sure the Sound category in the Actions column is expanded, then click on the desired action. The entry in the Shortcut column will change to "New accelerator...." Press the desired key for the binding, and the shortcut is made. A proper entry should look similar to

Action              Shortcut

Volume mute     XF86AudioMute


If you feel more comfortable with (or are just that more adventerous), open up Gnome's Configuration Editor, either through the menus, or through the command gconf-editor, then navigate to Apps > gnome_settings_daemon > keybindings. For the even-more-adventerous, use your favorite editor (such as vim), and open ~/.gconf/apps/gnome_settings_daemon/keybindings/%gconf.xml

A decent set to work with is:

Файл: ~/.gconf/apps/gnome_settings_daemon/keybindings/%gconf.xml
<?xml version="1.0"?>
<gconf>
        <entry name="www" mtime="1115511556" type="string">
                <stringvalue>XF86HomePage</stringvalue>
        </entry>
        <entry name="email" mtime="1115511554" type="string">
                <stringvalue>XF86Mail</stringvalue>
        </entry>
        <entry name="next" mtime="1115511504" type="string">
                <stringvalue>XF86AudioNext</stringvalue>
        </entry>
        <entry name="previous" mtime="1115511503" type="string">
                <stringvalue>XF86AudioPrev</stringvalue>
        </entry>
        <entry name="stop" mtime="1115511498" type="string">
                <stringvalue>XF86AudioStop</stringvalue>
        </entry>
        <entry name="play" mtime="1115511489" type="string">
                <stringvalue>XF86AudioPlay</stringvalue>
        </entry>
        <entry name="volume_up" mtime="1116696662" type="string">
                <stringvalue>XF86AudioRaiseVolume</stringvalue>
        </entry>
        <entry name="volume_down" mtime="1115511485" type="string">
                <stringvalue>XF86AudioLowerVolume</stringvalue>
        </entry>
        <entry name="volume_mute" mtime="1116697540" type="string">
                <stringvalue>XF86AudioMute</stringvalue>
        </entry>
</gconf>

[править] Window Maker

Adding shortcuts to Window Maker is simple using the Window Maker Preferences Utility: WPrefs. By default WPrefs is the third icon down in the dock. If WPrefs is no longer in the dock, you can access it on most distros by running the following command in an X terminal:

/usr/lib/GNUstep/Applications/WPrefs.app/WPrefs

You can go to the keyboard section of WPrefs to bind the extended keys to some predefined internal Window Maker commands.

Simply scroll right until the keyboard icon is visible and click on it.

You will see a list of internal commands that you can higlight. Select the command you want to bind and then click the "capture" button. Now simply hit the key and any modifiers (ctrl alt shift etc.) you want to bind to this function.

While binding internal Window Maker commands is useful, more useful is binding external commands to keystrokes. The only way to do this is to add them to the main Window Maker menu, the same menu you can access from right clicking on the root window or hitting F12 by default.

In WPrefs you can click on the menu icon: the one next to the keyboard icon to access the menu.
An editable version of the menu will pop up outside of the main WPref window. You can drag any of the sample elements from the main WPrefs window to the editable menu to create a new element of that type.
Double-click on an element in the editable menu to change its name. Be sure to press Enter after completing the name change or else it will revert.

 Adding a shortcut to a program entry will result in the shortcut keysym showing up in the menu; It will not show up in the editable version of the menu.  Because the keysyms are a bit ugly you can tidy the menu by sticking the programs in a submenu.

You can add a shortcut to a "Run Program" element by selecting it in the dummy menu and clicking the "Capture" button then pressing the key/keystroke you want to bind to that Program.

[править] Enlightenment DR16

Emerge the e16keyedit package. Then run 'e16keyedit' inside of enlightenment. Create a new keybinding, and press the 'Change' button to record a keystroke. Just press your new multimedia key and bind it to whatever action you'd like (use the 'Run' action to bind it to a command like aumix). Remember to press the 'Save' button when you're done.

[править] Альтернатива: lineakd или keyTouch или hotkeys

Если вы ищете более легкий способ настроить ваши мультимедийные клавиши, то может быть вам понравится:

[править] Пример: eMachines m68xx

Если вы владелец ноутбука eMachines m68xx и хотите поскорее приступить к использованию мультимедийных клавиш, вам необходимо выполнить несколько шагов по их настройке. Примечание: используются клавиши ноутбука модели m6809, но я полагаю что это будет работать для всех моделей m68xx, если у вас есть возможность протестировать и подтвердить/опровергнуть данное утверждение, внесите изменения в эту страницу.

Первым делом обновим символьные имена клавиш (keysyms). На системе x86_64 необходимый нам файл: /usr/lib64/X11/xkb/symbols/inet Вставьте в него следующий код:

Файл: /usr/lib64/X11/xkb/symbols/inet
 // eMachines

 partial alphanumeric_keys
 xkb_symbols "emachines" {
     name[Group1]= "Laptop/notebook eMachines m68xx";

     key <I2E> {       [ XF86AudioLowerVolume  ]       };
     key <I6D> {       [ XF86AudioMedia        ]       };
     key <I30> {       [ XF86AudioRaiseVolume  ]       };
     key <I20> {       [ XF86AudioMute ]       };
     key <I6C> {       [ XF86Mail      ]       };
     key <I32> {       [ XF86iTouch    ]       };
     key <I65> {       [ XF86Search    ]       };
     key <I5F> {       [ XF86Sleep     ]       };
     key <I22> {       [ XF86AudioPlay, XF86AudioPause ]       };
     key <I24> {       [ XF86AudioStop ]       };
     key <I10> {       [ XF86AudioPrev ]       };
     key <I19> {       [ XF86AudioNext ]       };
     key <KP0> {       [ KP_0  ]       };
     key <KP1> {       [ KP_1  ]       };
     key <KP2> {       [ KP_2  ]       };
     key <KP3> {       [ KP_3  ]       };
     key <KP4> {       [ KP_4  ]       };
     key <KP5> {       [ KP_5  ]       };
     key <KP6> {       [ KP_6  ]       };
     key <KP7> {       [ KP_7  ]       };
     key <KP8> {       [ KP_8  ]       };
     key <KP9> {       [ KP_9  ]       };
     key <KPDL>        {       [ KP_Decimal    ]       };
     key <KPAD>        {       [ KP_Add        ]       };
     key <KPSU>        {       [ KP_Subtract   ]       };
     key <KPMU>        {       [ KP_Multiply   ]       };
     key <KPDV>        {       [ KP_Divide     ]       };
 };
 

Теперь добавим необходимые настройки для этой раскладки клавиатуры в X11/kxb/rules/{xorg,xorg.lst,xorg.xml}

В файле xorg мы добавляем её в список $inetkbds примерно таким образом:

Файл: /usr/lib64/X11/xkb/rules/xorg
 ! $inetkbds = airkey acpi scorpius azonaRF2300 \
              brother \
              btc5113rf btc5126t btc9000 btc9000a btc9001ah btc5090\
              cherryblue cherrybluea cherryblueb \
              chicony chicony9885 \
              compaqeak8 compaqik7 compaqik13 compaqik18 armada presario ipaq \
              dell inspiron dtk2000 \
              dexxa diamond genius geniuscomfy2 \
              emachines 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
 

В xorg.lst добавляем строку к множеству присутствующих там моделей.

Файл: /usr/lib64/X11/xkb/rules/xorg.lst
 ...
 emachines     Laptop/notebook eMachines m68xx
 ...
 

И, наконец, в xorg.xml задаём локализуемое описание для этой клавиатуры.

Файл: /usr/lib64/X11/xkb/rules/xorg.xml
    ...
    <model>
      <configItem>
        <name>emachines</name>
        <description>Laptop/notebook eMachines m68xx</description>
      </configItem>
    </model>
    ...
 

Теперь, когда всё готово, перезапустите X-сервер и вам остаётся только выбрать свежедобавленную клавиатуру m68xx. В KDE это можно легко проделать при помощи апплета "Раскладки Клавиатуры" в центре управления KDE, выбрав там "Laptop/notebook eMachines m68xx" из списка моделей. Теперь любая из специальных клавиш может быть стандартным образом использована как горячая клавиша наравне с другими.

Так как добавление клавиатуры было произведено на уровне X-сервера и в общесистемных настройках она должна быть доступна для всех пользователей в любом оконном менеджере.

[править] Getting bizzare keyboards working

I have an HP keyboard that has a volume wheel. Unfortunately, this and half of the other buttons don't generate X keyboard events, so I wrote a perl script to take care of those keys. It's a bit of a pain to use, but it will get ANY keys or buttons that the keyboard sends working, by going to the low level evdev interface.

In the kernel, enable the "Event interface" driver (evdev module) to get kernel support.

Then, grab the photkeys script (Description: http://s130141769.onlinehome.us/modules/zmagazine/article.php?articleid=2 Download: http://s130141769.onlinehome.us/modules/wmpdownloads/), and follow the instructions there to set it up.

Code: You should run this script like this
gus alexg # photkeys /dev/input/event1
Unrecognized event: '4:4:28'. Define it in /usr/bin/photkeys
...
Unrecognized event: '4:4:139'. Define it in /usr/bin/photkeys

For me when I press buttons something appears in /dev/input/event1, may be in your system device file would be different.

[править] Управление другими популярными программами из командной строки

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

[править] xmms

У xmms есть несколько полезных опций, их можно увидеть так:

man xmms

Code: Опции командной строки xmms из "man xmms"
xmms --rew        # Предыдущая запись плейлиста
xmms --stop       # Остановить
xmms --play-pause # Если пауза - проигрывать, и наоборот.
xmms --fwd        # Следующая запись плейлиста

[править] amarok

Вообще-то, можно задать клавиши через меню Global Shortcuts, если на них определены keysym`ы (XF86AudioMute, XF86AudioPlay и т.п.).

Code: Опции командной строки amarok из "amarok --help"
 amarok --previous   # Предыдущая запись плейлиста
 amarok -p           # Начать проигрывать выбранную запись плейлиста
 amarok --play-pause # Если пауза - проигрывать, и наоборот.
 amarok --pause      # Пауза
 amarok --stop       # Остановка
 amarok --next       # Следующая запись плейлиста

[править] MPD/MPC

Если вы используете MPD, возможно, ваш клиент уже распознает некоторые keysyms. Например gmpc распознает XF86AudioNext, XF86AudioPrev, XF86AudioStop, и XF86AudioPlay.

Если вы не используете gmpc, или не хотите держать запущенный процесс gmpc, тогда вам стоит выполнить использовать MPD-клиент mpc, управляемый из командной строки. Установив mpc так:

emerge mpc

Имеем следующие опции:

Code: опции mpc из "mpc --help"
mpc next     # Следующая запись плейлиста
mpc prev     # Предыдущая запись плейлиста
mpc toggle   # Если пауза - проигрывать, и наоборот.
mpc stop     # Остановка

[править] ALSA

ALSA управляется через amixer. Следующие команды изменяют уровень громкости PCM вашей ALSA-звуковой карты.

Code: Управление уровнем PCM через amixer
amixer sset PCM 2+       # Увеличить громкость PCM на 2 Db
amixer sset PCM 2-       # Уменьшить громкость PCM на 2 Db
amixer sset PCM toggle   # Включить/выключить PCM
Личные инструменты
На других языках