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


76

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およびshowkey-異なるキーコードを与える134126、それぞれ。

これらのキーコードはどうなっていますか?

からキーコードを取得してshowkey -kxmodmap以下のファイルを使用してみましたが、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は問題ありません)。どのシステムを使用していますか?
ポール価格14年

回答:


54

キーボードとキーボードイベントを最終的に処理するプロセスの間には、多くのプレーヤーがいます。ランドスケープの主要部分には、Xシステムに独自のキーボード処理レイヤーがあり、XがLinuxベースシステムとは異なる「キーコード」をキーに関連付けるという事実があります。このshowkeyコマンドは、Linux-base-system lingoのキーコードを表示しています。xmodmapあなたは何をしているXキーコード、必要なxev表示されます。Xで作業し、でキーの再バインドを行うことを計画している場合はxmodmap、無視してshowkeysxev言うことだけを聞いてください。

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ます。


3
問題は、WindowsキーでKeyPressイベントを取得できないことです。3つの異なるキーボードと同じ結果を試しました。上記のように、xevからFocusOut、FocusIn、およびKeymapNotifyのみを取得します。しかし、私が行くと、セットアップのショートカットGnomeのマネージャを介して、それが「MOD4」として、Windowsキーを見てすることができます
ヤロスラフBulatov

右WindowsキーはMod4としてレポートし、左WindowsキーはAlt ...としてレポートします。これは、xmodmapに「Alt」カテゴリすら持っていないため、紛らわしいです。
ヤロスラフブラトフ

AltにMod1を試してください。
-dubiousjim

2
@YaroslavBulatovは、デスクトップ環境がキーを食べているようです(おそらくメインメニューを表示しますか?)
derobert

3
xevが提供するイベントをフィルタリングできます。この場合xev -event keyboard、ほとんどのノイズを取り除くのに十分でしょう。
フレドリックウェント

24

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を実行してみてください(たとえば、単にrunを実行する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進数)。


15

私はあなたの質問の3つの問題を「検出」します:

  1. キーに対して異なるキーコードを使用しxevshowkey報告するのはなぜですか?
  2. なぜxev表示されませAlt適切に押されていますか?
  3. どのようにスワップAltWinますか?

最初の質問:これらの日、Xでキーボード「ドライバ」は、本当にハードウェアを駆動しない、それだけでXコアにカーネルからキーコードスルー渡すことができますが、それはしていません。渡す前にキーコードに8を追加します。

2番目: Xセッションの何かがAltイベントを取得しています。他の答えはすでにこれをカバーしています。(xevつまり、見たいイベントを取得できません)。犯人は、ウィンドウマネージャーに関連している可能性があります。もっと裸のXセッションを試してください。

3番目:を使用しないでください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変更を永続的にするにはどうしますか?
スティーブケレット

に変更を追加し~/.xinitrcます。
マティアスブラウン

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 

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オフです。したがって、97-8 = 89を取得し、setkeycodesコマンドで89を使用します(再びルートとして)。

# setkeycodes 46 89

そして、設定する必要があります。97のキーコードでKeypressイベントを取得していることをxevで確認します(Fluxboxキーファイルにそのキーコードを使用するように指示した後、KeyPressイベントを取得しませんでした。

「setkeycodes」は再起動後も存続しないため、initスクリプトに追加する必要があります(例:/etc/rc.local)


1
「歴史的な理由で8オフ」に関する指針はありますか?
ロバートシーマー

あなたの答えを使って、caps-lockをファンクションキー(特にF9)にマッピングしました。これにより、tmuxのプレフィックスキーとしてF9を使用できます。ありがとう。
レイモンドクローカー

@RobertSiemer tldp.org/HOWTO/Keyboard-and-Console-HOWTO-15.html「多くの場合、X番号はLinux番号より8大きくなります。」「歴史的」という言葉は、別のマンページからのものであるに違いありません。
グレッグベル

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セッションを開始することです。次のコマンドを実行して、ディスプレイ上で別のXセ​​ッションを開始します:1(すでに取得されている場合は、最後に数を増やすだけです)。もちろん、端末を好みのシステムに変更したり、システムにインストールしたりできます。

xinit /usr/bin/xterm -- :1

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


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


4

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.