xmodmap의 키 코드를 얻는 방법?


76

내가 사용하려고 해요 xmodmap다시 매핑 Alt/ Super델 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 Superxevshowkey- 다른 키 코드를 제공 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

XUbuntu 14.04에서 Alt_L이 실행되지 않는 것과 동일한 문제가 있습니다 (그러나 Alt_R은 괜찮습니다). 어떤 시스템을 사용하고 있습니까?
Paul Price

답변:


54

키보드와 프로세스 사이에 키보드 이벤트를 처리하는 많은 플레이어가 있습니다. X 시스템에는 자체 키보드 처리 계층이 있으며 X는 다른 "키 코드"를 Linux 기본 시스템과 다른 키와 연결합니다. 이 showkey명령은 Linux-base-system lingo의 키 코드를 보여줍니다. 들어 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_LX 키 코드와 연관되어 있음을 알 수 64있습니다.


3
문제는 Windows 키에서 KeyPress 이벤트를 얻지 못한다는 것입니다. 3 가지 키보드와 동일한 결과를 시도했습니다. xev에서 위에서 본 것처럼 FocusOut, FocusIn 및 KeymapNotify 만 얻습니다. 그러나, 나는 가서 그놈 관리자를 통해 설정 바로 가기, 그것은 "Mod4"로 Windows 키를 볼 수 있습니다
야로 슬라브 Bulatov

오른쪽 Windows 키 보고서는 Mod4로, 왼쪽 Windows 키 보고서는 Alt로 남겨 두었습니다. xmodmap에 "Alt"범주가 없기 때문에 혼란 스럽습니다.
Yaroslav Bulatov

Alt에 Mod1을 사용해보십시오.
dubiousjim

2
데스크탑 환경이 키 먹고처럼 @YaroslavBulatov 소리 (아마도 주요 메뉴를 불러옵니다을?)
derobert

3
xev가 제공하는 이벤트를 필터링 할 수 있습니다. 이 경우 xev -event keyboard대부분의 소음을 제거하기에 충분합니다.
프레드릭 웬트

24

xev는 작동해야한다

홀수, 내 xev는 alt (및 여기서 "super"라고하는 Windows 키)에 대한 KeyPress 및 KeyRelease 이벤트를 제공합니다.

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 진수).


15

귀하의 질문에서 세 가지 문제를 "감지"합니다.

  1. xevshowkey핵심에 대해 서로 다른 키 코드를보고?
  2. 제대로 눌러 지지 xev않은 이유는 무엇 Alt입니까?
  3. 바꾸는 방법 AltWin?

첫 번째 질문 과 관련하여 요즘 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

교환의 경우 AltWin이미 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변경 사항을 어떻게 영구적으로 유지합니까?
Steve Kehlet

에 변경 사항을 추가하십시오 ~/.xinitrc.
Matthias Braun

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가 사용하는 키 코드와 커널이 사용하는 키코 드는 "역사적인 이유"때문에 OFF BY 8입니다. 따라서 97-8 = 89를 취하고 setkeycodes 명령과 함께 89를 사용하십시오 (다시 루트로).

# setkeycodes 46 89

그리고 당신은 설정되어야합니다. 키 코드가 97 인 키 프레스 이벤트를 받고 있음을 xev에 확인하십시오. (Fluxbox 키 파일에 해당 키 코드를 사용하도록 명령했지만 KeyPress 이벤트는 더 이상 얻지 못했습니다.

'setkeycodes'는 재부팅 후에도 지속되지 않으므로 초기화 스크립트에 추가해야합니다 (예 : /etc/rc.local).


1
"역사적 이유로 8시에 벗어남"에 관한 정보가 있습니까?
Robert Siemer

나는 당신의 대답을 사용하여 Caps-Lock을 기능 키 (특히 F9)에 매핑했습니다. 이를 통해 tmux에서 F9를 접두사 키로 사용할 수 있습니다. 감사.
Raymond Kroeker

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html "종종 X 번호는 Linux 번호보다 8이 더 많습니다." "역사적"이라는 말은 다른 맨 페이지에서 나왔을 것입니다.
Greg Bell

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 세션을 시작하는 것입니다. 다음 명령을 실행하여 display :1에서 다른 X 세션을 시작하십시오. 이미 수행 된 경우 끝에 숫자를 늘리십시오. 물론 터미널을 시스템에 선호하거나 설치 한 것으로 변경할 수 있습니다.

xinit /usr/bin/xterm -- :1

그런 다음 xev다시 실행 하십시오. 그것은 다른 프로그램에 의해 포착되지 않고 결과를 제공해야합니다. 시작되는 창 관리자는 호버 포커스이므로 키를 캡처하려면 xev 창 위에 커서를 놓아야합니다.


에서 말한 것처럼 dubiousjim하여이 우수 대답 것으로 xev와 커널 사이에 층이 많이 있기 때문에, 키 코드가 다릅니다.


4

Alt_LXUbuntu 14.04에서 사라지는 것과 같은 문제가있었습니다 ( Alt_R괜찮 았습니다 ). 많은 연주를 한 후 showkey, 키 입력 을 기록했지만 xev윈도우 시스템에서 무언가가되어야하는 것을 관찰했습니다 . "Window Manager"및 "Window Manager Tweaks"설정을 모두 검색했지만 아무것도 찾지 못했습니다. 마지막으로, "Settings Editor" Alt_L의 키보드 단축키 목록 ( xfce4-keyboard-shortcuts)에서 길 을 찾았습니다 . 나는 그것을 "재설정"하고 내 Alt_L등을 가지고 있습니다 ! Alt_L"Settings Editor"를 제외하고는 빗나간 단축키가 표시되지 않았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.