Cara memaksa pelepasan pengubah keyboard

18

Kadang-kadang, ketika saya menggunakan sinergi antara mesin saya ketika seseorang menggunakan tamu VirtualBox layar penuh saya terjebak dengan beberapa pengubah kunci aneh dihidupkan. Jika ada di keyboard saya (seperti Shift_L) saya bisa mengetuknya dan statusnya diatur ulang dan saya bisa terus mengetik huruf kecil. Tetapi beberapa dari mereka tidak dipetakan ke keyboard saya sama sekali (seperti ISO_Level3_Shift), jadi saya tidak punya cara untuk mematikannya sama sekali!

Bagaimana cara meresetnya? Saat ini, yang bisa saya lakukan adalah me-reboot komputer, tetapi itu solusi yang agak memalukan.

Yang saya inginkan adalah beberapa program yang secara artifisial dapat "mengetuk" semua pengubah keyboard yang mungkin, sehingga statusnya akan diatur ulang. Bisakah itu dilakukan?

Saya menggunakan Mint 14 (tiruan dari Ubuntu 12.10 Quantal).

Adam Ryczkowski
sumber

Jawaban:

22

Jika sudah xdotoolmenginstal, Anda cukup menggunakan saja

xdotool keyup ISO_Level3_Shift

Yang mengirim rilis kunci (untuk ISO_Level3_Shift, tentu saja) acara ke server X.

Tetapi Anda menginginkan sebuah program untuk melepaskan semua kunci pengubah. Orang bisa menggunakan xdotool untuk mencapai itu dengan mudah, jika bukan karena itu saya tidak tahu apa keyyms pengubah didefinisikan. Salah satu metode yang mungkin untuk menemukan mereka adalah mengurai keysymdef.h:

grep '^#define' /usr/include/X11/keysymdef.h | sed -r 's/^#define XK_(\S*?).*$/\1/;' | grep -E '_(L|R|Level.*)$'

Yang mengembalikan beberapa keyyms yang pasti pengubah. Sayangnya, saya tidak dapat menemukan definisi yang tepat dari kunci pengubah sekarang, jadi saya tidak tahu apakah itu daftar lengkap.

Menambah | xargs xdotool keyuppipa di atas akan melepaskan semua kunci itu. Di sistem saya, ia menjalankan perintah berikut:

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
Mewp
sumber
1
Bagus! Saya juga menemukan bahwa kunci yang belum ditetapkan dapat dilepaskan melalui kode kunci, misalnya xdotool keyup 204.
Adam Spires
1
@ Adam Spires memberi petunjuk kepada saya. Kode keyup untuk kasus saya adalah kode xmodmap, misalnya 204, dan menggunakan keysymdef.h tidak membantu. Untuk melihat kode kunci xmodmap, coba: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Anda harus mengubah nomor tampilan menjadi nomor tampilan VNC Anda yang rusak.
srking
Saya pikir Anda maksud DISPLAY=:1dalam komentar di atas.
Adam Spires
1
xdotoolmendukung --clearmodifiersopsi untuk key/ keydown/ keyup- mungkin tidak ketika jawaban ini ditulis? Saya berharap itu xdotool keyup --clearmodifiers spaceakan berhasil. ( xdotool keyupmemerlukan kunci yang harus ditentukan; "spasi" adalah arbitrer.)
Rory O'Kane
6

Saya menemukan bahwa untuk sistem saya, solusi yang diposting xdotoolsering melibatkan tidak mencakup kunci yang macet, dan menjalankan setxkbmaptampaknya tidak mencapai apa pun pada sistem saya.

Solusi yang saya temukan, yang sejauh ini bekerja tanpa gagal, adalah menggunakan x11vnc. Secara khusus, saya menggunakan perintah berikut:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysadalah bagian kuncinya, di sini. Ini memerintahkan x11vncuntuk menghapus semua tombol yang ditekan saat keluar. -timeout 1memberitahu x11vncuntuk berhenti setelah 1 detik tanpa koneksi, dan -deny_allmemastikan tidak ada yang dapat terhubung selama jendela itu.

Terkadang kunci yang macet mencegah interaksi yang berarti dengan desktop, dalam hal ini saya akan menjalankan yang berikut melalui ssh:

env DISPLAY=:0 XAUTHORITY=/home/[username]/.Xauthority x11vnc -deny_all -clear_keys -timeout 1
rkjnsn
sumber
4

Saya menggunakan "setxkbmap" tanpa argumen. Tampaknya untuk mereset keyboard. Saya memiliki "pintasan" di panel saya yang dapat saya gunakan dengan mouse ketika keyboard benar-benar tidak bisa dioperasikan.

mikevdg
sumber
0

The x11vncJawabannya adalah cerdik, tetapi jika menginstal x11vnchanya untuk pengubah kliring sepertinya berlebihan, inilah solusi Bash yang menggunakan xmodmap -pmkeluaran 's untuk mengeluarkan keyup untuk semua pengubah dikenal. Konversi dari hex keycode desimal bergantung pada ekspansi aritmatika 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

Jika Anda menjalankannya dari pintasan keyboard, menambahkan sleep 1di awal (untuk memberikan waktu agar tombol fisik dilepaskan) akan disarankan. The echoke stderr tidak diperlukan, tentu saja; Saya hanya ingin dapat memeriksa ~/.xsession-errorsfile saya untuk output seperti ini.

lkrms
sumber