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
キーボードと、最終的にキーボードイベントを処理するプロセスの間には、多くのプレーヤーがいます。 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
に関連付けられていることがわかります。
奇妙なことに、私の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つの可能性を見ることができます:
xinit -- :1
を使用すると、xtermのみを備えたXサーバーが得られます。ウィンドウマネージャーも実行されません。 xtermを終了すると、セッションが終了します)。別の可能性: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つの問題を「検出」します。
xev
とshowkey
がキーの異なるキーコードを報告する理由xev
が表示されない理由 Alt 正しく押されていますか?最初の質問:について、最近の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
私はこれを自分で解決しようとしていましたが、私はそれを理解しました。
主な問題は、キープレスのイベントを取得できないことです。投稿したログを見ると理由がわかります。
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とカーネルの間に多くのレイヤーがあるため、キーコードは異なります。
ルートとして、次を実行:
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内)
XUbuntu 14.04でAlt_L
が消えるという同じ問題がありました(Alt_R
で問題ありませんでした)。何度も遊んだ後、showkey
がキーストロークを記録したことを確認しましたが、xev
は記録しませんでした---ウィンドウシステムにあるものでなければなりませんでした。 「ウィンドウマネージャー」と「ウィンドウマネージャーの微調整」の設定をすべて調べたところ、何も見つかりませんでした。最後に、「設定エディタ」のキーボードショートカット(Alt_L
)のリストで、迷惑なxfce4-keyboard-shortcuts
を見つけました。これを「リセット」すると、Alt_L
が戻ってきます。迷惑なAlt_L
ショートカットは、「設定エディター」以外では表示されませんでした。