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_LXキーコードが関連付けられていることを確認しました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

2つの可能性があります。

  1. キーを完全につかんだり、Altを押すとウィンドウの焦点がぼやけることもあります。空のXサーバーでxevを実行してみてください(たとえば、実行するとウィンドウマネージャも実行されず、xtermのみを持つxinit -- :1Xサーバーが提供されます。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

あなたの質問で3つの問題を「発見」しました。

  1. キーに対して異なるキーコードが報告されるのはなぜですかxevshowkey
  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   

イベントに1つFocus{In,Out}あることがわかります。これは、キーがすでに別のプロセス(おそらくショートカット/キーバインディングアプリケーション)によって処理されていることを示します。modeNotify{Grab,Ungrab}

私の場合はxbindkeysでしたが、デスクトップ環境を使用している場合はキーバインディングシステムがあるかもしれません。これらのイベントを表示するには、他のプログラムを停止/無効にする必要があります。

どのプログラムが主要なイベントを盗んでいるかを判断できない場合、最善の解決策は実行せずに別のXセッションを開始することです。次のコマンドを実行して、ディスプレイから別のXセッションを開始します:1。すでにセッションがある場合は、最後に数字を増やしてください。もちろん、端末を希望の端末またはシステムにインストールした端末に変更することもできます。

xinit /usr/bin/xterm -- :1

その後、もう一度実行してくださいxev。これにより、他のプログラムでキャプチャすることなく結果を得ることができます。起動したウィンドウマネージャにはホバーフォーカスがあるため、キーを押すのをキャプチャするには、xevウィンドウの上にカーソルを置く必要があります。


で述べたようにdubiousjimの素晴らしい答え、xevとカーネルの間に多くのレイヤがあるので、キーコードは異なります。

関連情報