Как получить коды клавиши для xmodmap?

Цель способности записать в файл и разрешить группу пользовательского доступа только для чтения может быть достигнута принадлежностью файла и полномочиями. Скажем, все пользователи, которым нужен такой доступ, находятся в 'пользовательской' группе, и у Вас один есть доступ к корневой учетной записи в той системе. Затем сделайте (как корень):

touch /var/log/AccessLog
chown root:users /var/log/AccessLog
chmod 640 /var/log/AccessLog

С этого времени только корень сможет изменить файл, но все пользователи смогут считать его.

Если вместо этого Вы хотите позволить пользователям писать в файл, но должны отслеживать то, кто (и когда) изменил его, Вы могли бы использовать FAM (Монитор Изменения Файла). Выше этого, для ведения учет учета всех предыдущих версий файла можно поместить Систему управления версиями (как МЕРЗАВЕЦ, например)) - можно заставить его сотрудничать с FAM так, чтобы каждая модификация файла инициировала фиксацию к локальному репозиторию. Вероятно, могут быть более легкие способы сделать это, но ничто не прибывает по моему мнению (по крайней мере ничто, что работало бы сверху файловой системы).

77
25.12.2013, 11:40
6 ответов

Существует много плееров между Вашей клавиатурой и процессом, который наконец обрабатывает событие клавиатуры. Среди главных частей среды то, что 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 связан с X кодами клавиши 64.

55
27.01.2020, 19:31
  • 1
    Проблема состоит в том, что я не получаю событие KeyPress на ключе Windows. Я попробовал 3 различных клавиатуры и тот же результат. От xev я только получаю FocusOut, FocusIn и KeymapNotify, как замечено выше. Однако я могу пойти и установить ярлыки через менеджера Gnome, и это рассматривает ключ Windows как большое спасибо "Mod4" –  Yaroslav Bulatov 02.10.2012, 08:43
  • 2
    Правильный ключ Windows сообщает как Mod4, оставленный отчеты о ключе Windows как Высокий звук..., который сбивает с толку, потому что у меня даже нет категории "Alt" в моем xmodmap. –  Yaroslav Bulatov 02.10.2012, 08:59
  • 3
    Попробуйте Mod1 за Высокий звук. –  dubiousjim 02.10.2012, 13:24
  • 4
    @YaroslavBulatov кажется, что Ваша настольная среда ест ключ (возможно для перевода в рабочее состояние его главного меню?) –  derobert 26.10.2012, 19:18
  • 5
    Можно отфильтровать события, которые xev дает Вам. В этом случае xev -event keyboard был бы достаточно для избавления большей части шума. –  Fredrik Wendt 26.08.2017, 09:04

Как корень, выполненный:

showkey -s

... видеть то, что scancode для Вашего таинственного ключа. Я получил что-то вроде этого:

# 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 

Не уверенный, почему кажется, что один ключ генерирует два scancodes. Это не keydown/keyup вещь, почти я мог сказать от шаблона. Отметьте предупреждение, таким образом, можно хотеть выполнить это в однопользовательском режиме.

Я предположил, что 0x46 был моим scancode.

Затем, найдите неиспользованный код клавиши с:

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, что Вы получаете Событие Нажатия клавиши с кодом клавиши 97. (хотя, после того как я сказал файлу ключей Fluxbox использовать тот код клавиши, что я больше не получал события KeyPress - возможно, потому что Fluxbox глотает их, когда он использует их?)

Обратите внимание, что 'setkeycodes' не переживет перезагрузку, таким образом, необходимо будет добавить его к init сценариям (например, в/etc/rc.local)

11
27.01.2020, 19:31
  • 1
    У Вас есть указатель относительно "прочь 8 по историческим причинам"? –  Robert Siemer 14.11.2014, 13:09

xev должен работать

Нечетный, мой xev дает событие KeyPress и KeyRelease для высокого звука (и для ключа 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. Что-то еще полностью ест нажатие клавиши или дефокусирует окно на Вас нажимающий высокий звук. Попытайтесь выполнить 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 покажет Вам просто карту модификатора, которая также дает Вам числа (хотя, на этот раз, в шестнадцатеричном числе).

25
27.01.2020, 19:31

Я пытался решить это для меня, и я просто понял это.

Основная проблема состоит в том, что Вы не получаете событие для нажатия клавиши. Рассмотрение журнала, Вы отправили причину, очевидно.

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} события имеют a mode из Notify{Grab,Ungrab}. Это указывает, что ключ был обработан другим процессом (вероятно, приложение ярлыка/привязки клавиш).

В моем случае это был xbindkeys, но если Вы используете настольную среду, у них, вероятно, есть система привязки клавиш. Чтобы видеть, что эти события являются xev, необходимо будет остановиться/запретить другую программу.

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

xinit /usr/bin/xterm -- :1

Затем выполненный xev снова. Это должно дать Вам результат без него получаемый другими программами. Обратите внимание, что менеджер окон, который начинает, является фокусом при наведении курсора, таким образом, необходимо будет установить курсор выше xev окна для ключей, которые будут получены.


Как был сказан в этом превосходном ответе dubiousjim, код клавиши отличается, потому что существует много слоев между xev и ядром.

11
27.01.2020, 19:31

У меня была такая же проблема с исчезновением Alt_L в XUbuntu 14.04 (Alt_R было нормально). После долгой игры я заметил, что showkey записала нажатие клавиши, но xev не --- это должно было быть что-то в оконной системе. Я пролистал все настройки "Window Manager" и "Window Manager Tweaks" и ничего не нашел. Наконец, я нашёл бродячую Alt_L в списке клавиатурных комбинаций (xfce4-клавиатурных комбинаций ) в "Редакторе настроек". Я "обнуляю" это и возвращаю свой Alt_L обратно! Блуждающий ярлык Alt_L нигде больше не появлялся, кроме как в "Редакторе настроек".

4
27.01.2020, 19:31

Я «обнаруживаю» три вопроса в вашем вопросе:

  1. Почему XEV и ShowKee Сообщите об различных ключевых кодах для ключа?
  2. Почему не показывать ALT , нажав правильно?
  3. Как поменяться ALT и Win ?

В связи с первым вопросом : в наши дни, где клавиатура «драйвер» в X не на самом деле не водит аппаратное обеспечение, он мог бы просто пройти клавишные коды из ядра до X Core, но это не так. Он добавляет 8 к ключевому коду, прежде чем передавать его.

Второе: Что-то в вашей X сеансе захватывает событие ALT . Другие ответы охватывают это уже. (I.e. 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
16
27.01.2020, 19:31

Теги

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