Я пытаюсь использовать 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
Ответы:
Между вашей клавиатурой и процессом, который, наконец, обрабатывает событие клавиатуры, много игроков. Среди основных составляющих ландшафта - тот факт, что система X имеет свой собственный уровень обработки клавиатуры, и X ассоциирует разные «коды клавиш» с клавишами, чем ваша базовая система Linux. Команда
showkey
показывает вам коды клавиш в языке Linux-base-system. Дляxmodmap
вас нужны коды клавиш X, которыеxev
отображаются. Пока вы планируете работать в X и выполнять привязку ключей с помощьюxmodmap
, тогда игнорируйтеshowkeys
и просто слушайте то, чтоxev
говорит.То, что вы хотите найти в своем
xev
выводе, это блоки вроде этого:xev
имеет тенденцию генерировать много выходных данных, особенно когда вы двигаете мышью. Возможно, вам придется прокрутить некоторое время назад, чтобы найти результат, который вы ищете. В предыдущем выходе, мы видим , чтоkeysym Alt_L
связано с Х клавиатурным64
.источник
xev -event keyboard
будет достаточно, чтобы избавиться от большей части шума.Xev должен работать
Странно, мой xev дает событие KeyPress и KeyRelease для alt (и для ключа Windows, здесь называемого «super»):
И правый:
Я вижу две возможности:
xinit -- :1
, что даст вам X-сервер только с xterm - даже не будет запущен оконный менеджер. Выход из xterm закроет сеанс).Простой способ, если вы знаете имя ключа
Другая возможность: просто получить коды клавиш из xmodmap:
Здесь снова 64 и 108.
xmodmap -pm
покажет вам только карту-модификатор, которая также даст вам числа (правда, на этот раз в шестнадцатеричном виде).источник
Я "обнаружил" три вопроса в вашем вопросе:
xev
иshowkey
сообщать разные коды клавиш для ключа?xev
не показывает, Altчто нажата правильно?Что касается первого вопроса: в наши дни, когда «драйвер» клавиатуры в X на самом деле не управляет аппаратным обеспечением, он может просто передавать коды клавиш из ядра в ядро X, но это не так. Он добавляет 8 к коду ключа перед его передачей.
Второе: что-то в вашей сессии X захватывает Altсобытие. Другие ответы уже охватывают это. (Т.е.
xev
не получается событие, которое вы хотели бы увидеть). Виновник может быть связан с вашим оконным менеджером. Попробуйте более голую сессию X.Третье: не используйте
xmodmap
. Это было устаревшим в течение десятилетия. Новые парни - XKB и его инструментsetxkbmap
.Для обмена Altи Winесть уже подготовленный вариант в XKB. Просто добавьте это:
источник
setxkbmap
изменение постоянным?~/.xinitrc
.От имени пользователя root запустите:
... чтобы узнать, что такое скан-код вашего тайного ключа. Я получил что-то вроде этого:
Не уверен, почему кажется, что один ключ генерирует два сканкода. Насколько я могу судить по шаблону, это не относится к keydown / keyup. Обратите внимание на предупреждение, поэтому вы можете запустить его в однопользовательском режиме.
Я догадался, что 0x46 был мой скан-код.
Затем найдите неиспользуемый код ключа с помощью:
Здесь вы можете видеть, что код 97 ключа не используется в моей системе:
Код клавиши X и код ядра, который используется ядром, имеют значение OFF BY 8 по «историческим причинам». Итак, возьмите 97 - 8 = 89 и используйте 89 с командой setkeycodes (снова как root):
И вы должны быть установлены. С помощью xev подтвердите, что вы получаете событие нажатия клавиш с кодом клавиши 97. (хотя, как только я сказал файлу ключей Fluxbox использовать этот код ключа, я больше не получал события KeyPress - может быть, потому что Fluxbox глотает их, когда использует их?)
Обратите внимание, что «setkeycodes» не выдержит перезагрузки, поэтому вам придется добавить его в свои сценарии инициализации (например, в /etc/rc.local)
источник
Я пытался решить это для себя, и я просто понял это.
Основная проблема в том, что вы не получаете событие для нажатия клавиши. Глядя на журнал, который вы разместили, причина очевидна.
Вы можете увидеть
Focus{In,Out}
события имеютmode
офNotify{Grab,Ungrab}
. Это указывает на то, что ключ был обработан другим процессом (вероятно, приложением ярлыка / связывания клавиш).В моем случае это были xbindkeys, но если вы используете настольную среду, они, вероятно, имеют систему привязки клавиш. Чтобы увидеть эти события xev, вам нужно остановить / отключить другую программу.
Если вы не можете определить, какая программа ворует ключевые события, лучшим решением будет запустить еще один сеанс X без его запуска. Выполните следующую команду, чтобы начать другой сеанс X на дисплее
:1
, если это уже сделано, просто увеличьте число в конце. Вы, конечно, можете изменить терминал на тот, который вы предпочитаете или установили в своей системе.Тогда беги
xev
снова. Это должно дать вам результат без его захвата другими программами. Обратите внимание, что диспетчер окон, который запускается, находится при наведении курсора, поэтому вам нужно будет поместить курсор над окном xev, чтобы ключи были захвачены.Как сказал в этом превосходном ответе dubiousjim , код ключа отличается, потому что между xev и ядром много слоев.
источник
У меня была такая же проблема с
Alt_L
исчезновением в XUbuntu 14.04 (Alt_R
было хорошо). После долгих игр, я заметил, чтоshowkey
записал нажатие клавиши, ноxev
не ... это должно было быть что-то в оконной системе. Я просмотрел все настройки «Window Manager» и «Window Manager Tweaks» и ничего не нашел. Наконец, я обнаружил отклонениеAlt_L
в списке сочетаний клавиш (xfce4-keyboard-shortcuts
) в «Редакторе настроек». Я «сбрасываю» это, и у меня естьAlt_L
спина! СлучайныйAlt_L
ярлык не появлялся нигде, кроме как в «Редакторе настроек».источник