Як отримати ключові коди для xmodmap?


76

Я намагаюся використовувати xmodmapдля перестановки Alt/ Superклавіш на клавіатурі Dell L100, і у мене виникли проблеми з отриманням клавішних кодів.

Наприклад, використання xevне дає мені код коду дляAlt

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 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   

Для Right Superключа xevі showkeyдайте різні ключові коди - 134і 126відповідно.

Що відбувається з цими кодами?

Я спробував отримати ключові коди showkey -kі скористатися xmodmapфайлом нижче, але це дало дивну карту, яка перезаписала bключ:

clear Mod1
clear Control
keycode 125 = Meta_L
keycode 126 = Meta_R
keycode 58 = Control_L
keycode 56 = Control_L
keycode 100 = Control_R
add Control = Control_L Control_R
add Mod1 = Meta_L Meta_R

У мене така ж проблема, що Alt_L не спрацьовує (але Alt_R добре), на XUbuntu 14.04. Яку систему ви використовуєте?
Пол Прайс

Відповіді:


54

Між вашою клавіатурою та процесом, який нарешті обробляє події на клавіатурі, існує багато гравців. Серед основних фрагментів ландшафту - той факт, що система X має власний шар керування клавіатурою, а X асоціює різні "клавіші" з клавішами, ніж це базова система Linux. showkeyКоманда показує вам коди клавіш в Linux-базової системи жаргоні. Для xmodmapвас потрібні коди X, які xevвідображаються. До тих пір, поки ви плануєте працювати в X і виконувати перезавантаження ваших ключів xmodmap, тоді ігноруйте showkeysі просто слухайте, що xevговорить.

Що ви хочете шукати у своєму xevвисновку - це такі блоки:

KeyPress event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417361, (340,373), root:(342,393),
    state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 27, synthetic NO, window 0x1200001,
    root 0x101, subw 0x0, time 6417474, (340,373), root:(342,393),
    state 0x8, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

xevмає тенденцію до отримання великої кількості результатів, особливо при переміщенні миші. Можливо, вам доведеться деякий час прокрутити назад, щоб знайти вихід, який ви шукаєте. У попередньому виході, ми бачимо , що keysym Alt_Lпов'язано з Х клавіатурним 64.


3
Проблема полягає в тому, що я не отримую KeyPress події на ключі Windows. Я спробував 3 різних клавіатури і однаковий результат. Від xev я отримую лише FocusOut, FocusIn та KeymapNotify, як видно вище. Однак я можу зайти і налаштувати ярлики через менеджер Gnome, і він бачить ключ Windows як "Mod4"
Ярослав Булатов

Права клавіша Windows звітує як Mod4, ліва Windows - як Alt ..., що заплутано, оскільки в моїй xmodmap навіть немає категорії "Alt".
Ярослав Булатов

Спробуйте Mod1 для Alt.
сумнівним

2
@YaroslavBulatov звучить так, що робоче середовище їсть ключ (можливо, щоб відкрити його головне меню?)
derobert

3
Ви можете фільтрувати події, які дає вам xev. У цьому випадку xev -event keyboardбуло б достатньо, щоб позбутися більшої частини шуму.
Фредрік Вендт

24

xev повинен працювати

Як не дивно, мій xev дає події KeyPress і KeyRelease для alt (і для ключа Windows, тут називається "супер"):

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467354, (98,77), root:(102,443),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595467453, (98,77), root:(102,443),
    state 0x18, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

А права:

KeyPress event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572876, (75,33), root:(79,399),
    state 0x10, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0xae00001,
    root 0x2ca, subw 0x0, time 595572972, (75,33), root:(79,399),
    state 0x18, keycode 108 (keysym 0xffea, Alt_R), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

Я бачу дві можливості:

  1. Щось інше - це повністю з'їсти натискання клавіші або розфокусувати вікно після натискання клавіші alt. Спробуйте запустити xev на інакше порожньому сервері X (наприклад, просто запустіть xinit -- :1, що має отримати X-сервер лише з xterm - навіть не буде запущений менеджер вікон. Вихід із xterm закриє сеанс).
  2. Ви щойно пропустили дві події, які продемонстрували xev.

Простий спосіб, якщо ви знаєте ключове ім’я

Ще одна можливість: просто отримайте ключові коди з xmodmap:

anthony@Zia:~$ xmodmap -pk | grep -i alt
     64         0xffe9 (Alt_L)  0xffe7 (Meta_L) 0xffe9 (Alt_L)  0xffe7 (Meta_L)
    108         0xffea (Alt_R)  0xffe8 (Meta_R) 0xffea (Alt_R)  0xffe8 (Meta_R)
    204         0x0000 (NoSymbol)       0xffe9 (Alt_L)  0x0000 (NoSymbol)       0xffe9 (Alt_L)
anthony@Zia:~$ xmodmap -pk | grep -i super
    133         0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)
    134         0xffec (Super_R)        0x0000 (NoSymbol)       0xffec (Super_R)
    206         0x0000 (NoSymbol)       0xffeb (Super_L)        0x0000 (NoSymbol)       0xffeb (Super_L)

Знову 64 і 108. xmodmap -pmпокаже вам лише карту модифікатора, яка також дає вам цифри (правда, цього разу в шістнадцять).


15

Я "виявляю" три питання у вашому запитанні:

  1. Чому xevі showkeyповідомляти про різні ключові коди для ключа?
  2. Чому xevне показується Altнатискання належним чином?
  3. Як проводити обмін Altі Win?

Що стосується першого питання: в ці дні, коли "драйвер" клавіатури в X не дуже керує обладнанням, він може просто пропустити клавіші від ядра до ядра X, але це не так. Він додає 8 до коду клавіш, перш ніж передавати його.

Друге: Щось у вашому сеансі X захоплює Altподію. Інші відповіді вже висвітлюють це. (Тобто xevне трапляється подія, яку ви хотіли б побачити). Винуватець може бути пов’язаний з вашим менеджером вікон. Спробуйте більш голий X сеанс.

Третє: не використовуйте xmodmap. Вона застаріла на десятиліття. Нові хлопці - XKB та її інструмент setxkbmap.

$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    caps:backspace

Для заміни Altі Winвже є варіант, підготовлений в XKB. Просто додайте його:

$ setxkbmap -option altwin:swap_alt_win
$ setxkbmap -query
rules:      evdev
model:      pc105
layout:     us
variant:    altgr-intl
options:    altwin:swap_alt_win,caps:backspace

Як зробити setxkbmapзміни постійними?
Стів Келет

Додайте зміни до ~/.xinitrc.
Маттіас Браун

11

Як корінь, запустіть:

showkey -s

... щоб побачити, який код сканування для вашого таємничого ключа. У мене щось таке:

# showkey -s
kb mode was RAW
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...

0xc6 
0x46 0xc6 
0xc6 
0x46 0xc6 
0x46 

Не впевнений, чому виявляється, що один ключ генерує два скан-коди. Це не клавіша / клавіша, настільки близько, як я міг сказати з шаблону. Зверніть увагу на попередження, тому, можливо, потрібно запустити це в режимі одного користувача.

Я здогадався, що 0x46 - це мій код сканування.

Далі знайдіть невикористаний код ключа за допомогою:

xmodmap -pke | less

Тут ви можете бачити, що клавішний код 97 не використовується в моїй системі:

keycode  94 = less greater less greater bar brokenbar
keycode  95 = F11 XF86Switch_VT_11 F11 XF86Switch_VT_11
keycode  96 = F12 XF86Switch_VT_12 F12 XF86Switch_VT_12
keycode  97 =
keycode  98 = Katakana NoSymbol Katakana
keycode  99 = Hiragana NoSymbol Hiragana

Ключовий код X використовує і код коду, який використовує ядро, ВИМКНЕНО 8, з "історичних причин". Тому візьміть 97 - 8 = 89 і використовуйте 89 з командою setkeycodes (знову ж таки як корінь):

# setkeycodes 46 89

І вам слід встановити. Підтвердьте з xev, що ви отримуєте Keypress Event з кодом 97. Хоча одного разу я сказав файлу ключів Fluxbox використовувати цей клавішний код, я більше не отримую події KeyPress - можливо, тому що Fluxbox проковтує їх, коли він їх використовує?)

Зауважте, що "setkeycodes" не переживе перезавантаження, тому вам доведеться додати його до своїх сценаріїв init (наприклад, у /etc/rc.local)


1
Чи є у вас покажчик щодо "вимкнено на 8 з історичних причин"?
Роберт Сімер

Я використав вашу відповідь, щоб накреслити шапки-блокування на функціональну клавішу (конкретно F9). Це дозволяє мені використовувати F9 як префіксальний ключ у tmux. Дякую.
Реймонд Крокер

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "Часто число X буде на 8 більше, ніж число Linux". Моє формулювання з "історичним" повинно бути з іншої сторінки.
Грег Белл

11

Я намагався вирішити це для себе, і я просто зрозумів це.

Основна проблема полягає в тому, що ви не отримуєте події для натискання клавіші. Дивлячись на журнал, який ви опублікували, причина очевидна.

FocusOut event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 36, synthetic NO, window 0x4a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 36, synthetic NO, window 0x0,
    keys:  122 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   

Ви можете побачити ці Focus{In,Out}події мають modeв Notify{Grab,Ungrab}. Це вказує на те, що з ключем оброблявся інший процес (можливо, додаток для швидкого доступу / прив'язки клавіш).

У моєму випадку це були xbindkeys, але якщо ви використовуєте робоче середовище, вони, ймовірно, мають систему прив'язки клавіш. Для того, щоб побачити ці події xev, вам потрібно буде зупинити / відключити іншу програму.

Якщо ви не можете визначити, яка програма краде ключові події, найкращим рішенням є почати ще один X сеанс без його запуску. Виконайте наступну команду, щоб почати ще один X сеанс на дисплеї :1, якщо це вже зроблено, просто збільште число в кінці. Звичайно, ви можете змінити термінал на все, що вам більше подобається або встановлено у вашій системі.

xinit /usr/bin/xterm -- :1

Потім xevзнову біжи . Це має дати вам результат, не захоплюючи його іншими програмами. Зауважте, що розпочнений менеджер вікон фокусується курсором, тому вам доведеться розмістити курсор над вікном xev, щоб ключі були захоплені.


Як було сказано в цій чудовій відповіді сумнівним , код клавіш відрізняється тим, що між xev і ядром є багато шарів.


4

У мене була така ж проблема зі Alt_Lзникненням у XUbuntu 14.04 ( Alt_Rбуло добре). Після багатьох ігор я помітив, що showkeyзаписав натискання клавіші, але xevне --- це повинно бути щось у віконній системі. Я переглянув всі налаштування "Менеджера вікон" та "Менеджер вікон", і нічого не знайшов. Нарешті, Alt_Lу списку комбінацій клавіш ( xfce4-keyboard-shortcuts) у «Редакторі налаштувань» я знайшов заблукав . Я "скидаю" це, і в мене Alt_Lспина! Близький Alt_Lярлик не з’являвся більше ніде, крім "Редактора налаштувань".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.