xmodmap의 키 코드를 얻는 방법은 무엇입니까?

xmodmap의 키 코드를 얻는 방법은 무엇입니까?

Dell L100 키보드에서 xmodmap재매핑 Alt/ 키를 사용하려고 하는데 Super키코드를 가져오는 데 문제가 있습니다.

예를 들어 를 사용하면 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각각 .showkey134126

이 키코드는 어떻게 되나요?

에서 키코드를 가져오고 아래 파일을 showkey -k사용해 보았지만 이로 인해 키가 다시 매핑되는 이상한 매핑이 발생했습니다.xmodmapb

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

답변1

키보드와 궁극적으로 키보드 이벤트를 처리하는 프로세스 사이에는 많은 액터가 있습니다. 이것의 가장 중요한 부분은 X 시스템에 자체 키보드 처리 계층이 있고 X가 기본 Linux 시스템과 달리 키 입력과 다른 "키코드"를 연결한다는 것입니다. 이 showkey명령은 Linux 기본 시스템 용어의 키코드를 보여줍니다. xmodmapX 키코드가 필요 하므로 이것이 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.

답변2

xev가 작동해야합니다

이상하게도 내 xev는 alt에 대한 KeyPress 및 KeyRelease 이벤트를 제공합니다(여기서는 Windows 키의 경우 "super"라고 함).

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를 누를 때 창의 초점이 흐려지는 것도 있습니다. 빈 X 서버에서 xev를 실행해 보십시오(예를 들어, 실행하면 xinit -- :1창 관리자도 실행되지 않고 xterm만 있는 X 서버가 제공됩니다. 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수정자 맵만 표시되며 숫자도 제공됩니다(이번에는 16진수임).

답변3

귀하의 질문에서 세 가지 문제를 "발견"했습니다.

  1. 키에 대해 서로 다른 키코드가 보고되는 이유는 무엇입니까 xev?showkey
  2. 올바르게 눌려졌다고 xev표시되지 않는 이유 는 무엇입니까?Alt
  3. Alt교환하는 방법 Win?

~에 대한첫 번째 질문:요즘에는 X의 키보드 "드라이버"가 실제로 하드웨어를 구동하지 않고 단지 커널에서 X 코어로 키코드를 전달할 수도 있지만 사실은 그렇지 않습니다. 키 코드를 전달하기 전에 8을 추가합니다.

두번째:X 세션의 어떤 항목이 Alt이벤트를 받고 있습니다. 다른 답변에서는 이미 이에 대해 다루고 있습니다. (즉, xev보고 싶은 이벤트가 표시되지 않음) 범인은 창 관리자와 관련이 있을 수 있습니다. 좀 더 노출된 X 세션을 시도해 보세요.

제삼:사용하지 마세요 xmodmap. 10년이 지났습니다. 새로운 사람은 XKB와 그 도구입니다 setxkbmap.

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

Alt교환 을 위해 WinXKB에 옵션이 준비되어 있습니다. 그냥 추가하세요:

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

답변4

나는 이것을 스스로 알아 내려고 노력했고 그것을 알아 냈습니다.

주요 문제는 키 누르기 이벤트를 수신하지 못한다는 것입니다. 올려주신 로그를 보면 그 이유는 분명합니다.

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}있는 것을 볼 수 있습니다 . 이는 키가 이미 다른 프로세스(아마도 바로가기/키바인딩 애플리케이션)에 의해 처리되었음을 나타냅니다.modeNotify{Grab,Ungrab}

내 경우에는 xbindkeys였지만 데스크톱 환경을 사용하는 경우에는 키 바인딩 시스템이 있을 수 있습니다. 이러한 이벤트를 보려면 다른 프로그램을 중지/비활성화해야 합니다.

어떤 프로그램이 주요 이벤트를 훔치고 있는지 확인할 수 없는 경우 가장 좋은 해결책은 실행하지 않고 다른 X 세션을 시작하는 것입니다. 다음 명령을 실행하여 디스플레이에서 다른 X 세션을 시작하십시오 :1. 이미 세션이 있는 경우 끝에 숫자를 늘리십시오. 물론 터미널을 원하는 터미널이나 시스템에 설치한 터미널로 변경할 수 있습니다.

xinit /usr/bin/xterm -- :1

그런 다음 다시 실행하십시오 xev. 이렇게 하면 다른 프로그램에서 캡처하지 않고도 결과를 얻을 수 있습니다. 시작된 창 관리자에는 호버 포커스가 있으므로 키 누르기를 캡처하려면 xev 창 위에 커서를 놓아야 합니다.


에서 말했듯이dubiousjim의 훌륭한 답변, xev와 커널 사이에 많은 레이어가 있기 때문에 키 코드가 다릅니다.

관련 정보