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
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
答え1
キーボードと最終的にキーボードイベントを処理するプロセスの間には多くのアクターがあります。これの最も重要な部分は、Xシステムに独自のキーボード処理層があり、XがネイティブLinuxシステムとは異なり、キー入力とは異なる「キーコード」を接続することです。この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
。
答え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つの可能性があります。
- キーを完全につかんだり、Altを押すとウィンドウの焦点がぼやけることもあります。空のXサーバーでxevを実行してみてください(たとえば、実行するとウィンドウマネージャも実行されず、xtermのみを持つ
xinit -- :1
Xサーバーが提供されます。xtermを終了するとセッションが閉じます)。 - あなたは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つの問題を「発見」しました。
- キーに対して異なるキーコードが報告されるのはなぜですか
xev
?showkey
- 正しく押されたと
xev
表示されないのはなぜですか?Alt - 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}
あることがわかります。これは、キーがすでに別のプロセス(おそらくショートカット/キーバインディングアプリケーション)によって処理されていることを示します。mode
Notify{Grab,Ungrab}
私の場合はxbindkeysでしたが、デスクトップ環境を使用している場合はキーバインディングシステムがあるかもしれません。これらのイベントを表示するには、他のプログラムを停止/無効にする必要があります。
どのプログラムが主要なイベントを盗んでいるかを判断できない場合、最善の解決策は実行せずに別のXセッションを開始することです。次のコマンドを実行して、ディスプレイから別のXセッションを開始します:1
。すでにセッションがある場合は、最後に数字を増やしてください。もちろん、端末を希望の端末またはシステムにインストールした端末に変更することもできます。
xinit /usr/bin/xterm -- :1
その後、もう一度実行してくださいxev
。これにより、他のプログラムでキャプチャすることなく結果を得ることができます。起動したウィンドウマネージャにはホバーフォーカスがあるため、キーを押すのをキャプチャするには、xevウィンドウの上にカーソルを置く必要があります。
で述べたようにdubiousjimの素晴らしい答え、xevとカーネルの間に多くのレイヤがあるので、キーコードは異なります。