web-dev-qa-db-ja.com

キーボード修飾子を強制的にリリースする方法

ときどき、フルスクリーンのVirtualBoxゲストを使用しているときにマシン間で相乗効果を使用すると、奇妙なキー修飾子がオンになって動かなくなることがあります。キーボードにそれらが存在する場合(Shift_Lなど)、それをタップするだけでステータスがリセットされ、引き続き小文字で入力できます。しかし、それらの一部は(ISO_Level3_Shiftのように)キーボードにまったくマッピングされていないため、それらをまったくオフにする方法がありません!

それらをリセットするには?現在、私ができることはコンピュータを再起動することだけですが、それはかなり恥ずかしい解決策です。

私が欲しいのは、可能なすべてのキーボード修飾子を人為的に「タップ」できるプログラムです。そのため、それらのステータスはリセットされます。できますか?

私はMint 14(Ubuntu 12.10 Quantalのクローン)を使用しています。

19
Adam Ryczkowski

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
23
Mewp

私のシステムでは、投稿された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
6
rkjnsn

引数なしで「setxkbmap」を使用しています。キーボードをリセットしたようです。パネルに「ショートカット」があり、キーボードが完全に操作できないときにマウスで使用できます。

4
mikevdg

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ファイルを確認できるようにしたいだけです。

0
lkrms