web-dev-qa-db-ja.com

xmodmapのキーコードを取得する方法は?

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 key、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
83

キーボードと、最終的にキーボードイベントを処理するプロセスの間には、多くのプレーヤーがいます。 Xシステムには独自のキーボード処理レイヤーがあり、XはLinuxベースシステムとは異なる「キーコード」をキーに関連付けているという事実は、ランドスケープの主要な要素の1つです。 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に関連付けられていることがわかります。

59
dubiousjim

xevは動作するはずです

奇妙なことに、私のxevは、alt(およびここでは「スーパー」と呼ばれる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

私は2つの可能性を見ることができます:

  1. 他の何かが完全にキープレスを食べているか、Altキーを押したときにウィンドウの焦点をぼかしています。それ以外の場合は空のXサーバーでxevを実行してみてください(例:xinit -- :1を使用すると、xtermのみを備えたXサーバーが得られます。ウィンドウマネージャーも実行されません。 xtermを終了すると、セッションが終了します)。
  2. Xevが吐き出す大量の2つのイベントを見逃しました。

簡単な方法、キーの名前がわかっている場合

別の可能性: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進数です)。

26
derobert

あなたの質問で3つの問題を「検出」します。

  1. xevshowkeyがキーの異なるキーコードを報告する理由
  2. xevが表示されない理由 Alt 正しく押されていますか?
  3. 交換方法 Alt そして Win

最初の質問:について、最近のXのキーボード「ドライバー」は実際にはハードウェアを駆動せず、カーネルからXコアにキーコードをパススルーするだけですが、そうではありません。 t。渡す前にキーコードに8を追加します。

2番目: Xセッションの何かが Alt イベント。他の回答はすでにこれをカバーしています。 (つまり、xevは、表示したいイベントを取得しません)。原因はウィンドウマネージャーに関連している可能性があります。よりネイキッドなXセッションを試してください。

番目:xmodmapを使用しないでください。それは10年間古くなっています。新しい人たちは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
17
Robert Siemer

私はこれを自分で解決しようとしていましたが、私はそれを理解しました。

主な問題は、キープレスのイベントを取得できないことです。投稿したログを見ると理由がわかります。

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でしたが、デスクトップ環境を使用している場合は、おそらくキーバインドシステムがあります。これらのイベントを表示するためにxevは、他のプログラムを停止/無効にする必要があります。

重要なイベントを盗んでいるプログラムを特定できない場合、最善の解決策は、プログラムを実行せずに別のXセッションを開始することです。次のコマンドを実行して、ディスプレイ上で別のXセ​​ッションを開始します:1、それがすでに行われている場合は、最後に数を増やしてください。もちろん、ターミナルを好きなように変更したり、システムにインストールしたものに変更したりできます。

xinit /usr/bin/xterm -- :1

次に、xevを再度実行します。他のプログラムに取り込まれることなく結果が得られるはずです。開始されるウィンドウマネージャーはホバーフォーカスであるため、キーをキャプチャするには、カーソルをxevウィンドウの上に置く必要があることに注意してください。


dubiousjimによるこの優れた回答 で述べたように、xevとカーネルの間に多くのレイヤーがあるため、キーコードは異なります。

12
Kevin Cox

ルートとして、次を実行:

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 

1つのキーが2つのスキャンコードを生成するように見える理由がわかりません。パターンからわかるように、キーダウン/キーアップではありません。警告に注意してください。これをシングルユーザーモードで実行したい場合があります。

私は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 BY BYです。したがって、97-8 = 89を取得し、setkeycodesコマンドで89を使用します(ここでもrootとして)。

# setkeycodes 46 89

そして、あなたは設定する必要があります。 xevで、97のキーコードのKeypressイベントを取得していることを確認します(Fluxboxのキーファイルでそのキーコードを使用するように指示したら、もうKeyPressイベントを取得しませんでした-Fluxboxがそれらを使用するときにそれらを飲み込むためでしょうか?)

「setkeycodes」は再起動後は存続しないことに注意してください。そのため、それをinitスクリプトに追加する必要があります(例:/etc/rc.local内)

11
Greg

XUbuntu 14.04でAlt_Lが消えるという同じ問題がありました(Alt_Rで問題ありませんでした)。何度も遊んだ後、showkeyがキーストロークを記録したことを確認しましたが、xevは記録しませんでした---ウィンドウシステムにあるものでなければなりませんでした。 「ウィンドウマネージャー」と「ウィンドウマネージャーの微調整」の設定をすべて調べたところ、何も見つかりませんでした。最後に、「設定エディタ」のキーボードショートカット(Alt_L)のリストで、迷惑なxfce4-keyboard-shortcutsを見つけました。これを「リセット」すると、Alt_Lが戻ってきます。迷惑なAlt_Lショートカットは、「設定エディター」以外では表示されませんでした。

4
Paul Price