ときどき、フルスクリーンのVirtualBoxゲストを使用しているときにマシン間で相乗効果を使用すると、奇妙なキー修飾子がオンになって動かなくなることがあります。キーボードにそれらが存在する場合(Shift_Lなど)、それをタップするだけでステータスがリセットされ、引き続き小文字で入力できます。しかし、それらの一部は(ISO_Level3_Shiftのように)キーボードにまったくマッピングされていないため、それらをまったくオフにする方法がありません!
それらをリセットするには?現在、私ができることはコンピュータを再起動することだけですが、それはかなり恥ずかしい解決策です。
私が欲しいのは、可能なすべてのキーボード修飾子を人為的に「タップ」できるプログラムです。そのため、それらのステータスはリセットされます。できますか?
私はMint 14(Ubuntu 12.10 Quantalのクローン)を使用しています。
xdotool
がインストールされている場合は、単に
xdotool keyup ISO_Level3_Shift
これは、Xサーバーにキーリリース(もちろんISO_Level3_Shiftの場合)イベントを送信します。
しかし、プログラムですべての修飾キーを解放する必要がありました。 xdotoolを使用して簡単にそれを実現できますが、そうでない場合、どの修飾子キーシムが定義されているのかわかりません。それらを見つける1つの可能な方法は、keysymdef.h
を解析することです。
grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'
これは確かに修飾子であるいくつかのキーシムを返します。残念ながら、現時点では修飾キーの正確な定義を見つけることができないため、完全なリストであるかどうかはわかりません。
上記のパイプラインに| xargs xdotool keyup
を追加すると、これらのキーがすべて解放されます。私のシステムでは、次のコマンドを実行します。
xdotool keyup Shift_L Shift_R Control_L Control_R Meta_L Meta_R Alt_L Alt_R Super_L Super_R Hyper_L Hyper_R ISO_Level2_Latch ISO_Level3_Shift ISO_Level3_Latch ISO_Level3_Lock ISO_Level5_Shift ISO_Level5_Latch ISO_Level5_Lock
私のシステムでは、投稿されたxdotool
を含むソリューションは、スタックされたキーをカバーしないことが多く、setxkbmap
を実行してもシステムで何も実行されないようでした。
私が発見した解決策は、これまで確実に機能しており、x11vnc
を使用することです。具体的には、次のコマンドを使用します。
x11vnc -deny_all -clear_keys -timeout 1
-clear_keys
は、ここで重要な部分です。終了時に、押されたすべてのキーをクリアするようにx11vnc
に指示します。 -timeout 1
は、接続なしで1秒後に終了するようx11vnc
に指示し、-deny_all
は、そのウィンドウの間に誰も接続できないようにします。
スタックしたキーによって、デスクトップとの意味のある対話が妨げられる場合があります。その場合、sshを使用して次のコマンドを実行します。
env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1
引数なしで「setxkbmap」を使用しています。キーボードをリセットしたようです。パネルに「ショートカット」があり、キーボードが完全に操作できないときにマウスで使用できます。
x11vnc
の回答は巧妙ですが、モディファイアをクリアするためだけにx11vnc
をインストールするのがやり過ぎに思われる場合は、xmodmap -pm
の出力を使用して既知のすべてのモディファイアにキーアップを発行するBashソリューションを次に示します。 16進数から10進数のキーコードへの変換は、Bashの算術展開に依存しています。
for KEYCODE in $(xmodmap -pm | grep -Pio '(?<=\b0x)[0-9a-f]+\b'); do
echo -e "xdotool keyup $((16#$KEYCODE))\n" >&2
xdotool keyup $((16#$KEYCODE))
done
キーボードショートカットから実行している場合は、最初にsleep 1
を追加して(物理的なキーが解放されるまでの時間を確保するため)、適切な方法をお勧めします。もちろん、stderrへのecho
は必要ありません。このような出力について~/.xsession-errors
ファイルを確認できるようにしたいだけです。