Як змусити звільнити модифікатори клавіатури


18

Іноді, коли я використовую синергію між моїми машинами, коли хтось використовує повноекранний гість VirtualBox, я застрягаю з увімкненими дивними модифікаторами клавіш. Якщо вони існують на моїй клавіатурі (наприклад, Shift_L), я можу просто натиснути її, і їх стан буде скинутий, і я можу продовжувати друкувати малими літерами. Але деякі з них зовсім не відображаються на моїй клавіатурі (наприклад, ISO_Level3_Shift), тому у мене немає можливості їх вимкнути взагалі!

Як їх скинути? Зараз все, що я можу зробити, це перезавантажити комп’ютер, але це досить незручне рішення.

Все, що я хочу, - це якась програма, яка може штучно "натиснути" на всі можливі модифікатори клавіатури, тому їх статус буде скинутий. Чи можна це зробити?

Я використовую м'яту 14 (клон Ubuntu 12.10 Quantal).

Відповіді:


22

Якщо ви xdotoolвстановили, ви можете просто використовувати

xdotool keyup ISO_Level3_Shift

Який надсилає ключовий випуск (звичайно, для ISO_Level3_Shift) події на X-сервер.

Але ви хотіли, щоб програма випустила всі модифікаційні ключі. Можна було б скористатися xdotool, щоб досягти цього легко, як не для цього, я не маю уявлення про те, які визначаються ключі модифікаторів. Один з можливих методів їх пошуку - це розбір 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

1
Чудово! Я також виявив, що непризначені ключі можуть бути відклеєні за допомогою коду клавіш, наприклад xdotool keyup 204.
Адам Шпієр

1
@Adam Spiers втягнув мене. Код клавіатури для мого випадку був кодом xmodmap, наприклад, 204, і використання keysymdef.h не допомогло. Щоб побачити коди ключів Xmodmap, спробуйте: DISAPLAY=:1 xmodmap -pk | grep -iP 'alt|meta|super|hyper'. Вам потрібно буде змінити номер дисплея на розбитий номер дисплея VNC.
шкурка

Думаю, ви мали DISPLAY=:1на увазі у коментарі, що був вище.
Адам Шпіерс

1
xdotoolпідтримує --clearmodifiersваріант для key/ keydown/ keyup- можливо, це не було, коли ця відповідь була написана? Я очікую, що xdotool keyup --clearmodifiers spaceце спрацює. ( xdotool keyupвимагає вказати ключ; "пробіл" - довільний.)
Рорі О'Кайн

6

Я виявив, що для моєї системи розміщене рішення, яке xdotoolчасто включало , не охоплювало ключ, що застряг, а запущений setxkbmapначебто нічого не досягає в моїй системі.

Я знайшов рішення, яке до цього часу працювало невдало, - використовувати x11vnc. Зокрема, я використовую таку команду:

x11vnc -deny_all -clear_keys -timeout 1

-clear_keysтут ключова частина. Він інструктує x11vncочистити всі натиснуті клавіші при виході. -timeout 1говорить x11vncвийти через 1 секунду без з'єднань і -deny_allпереконайтесь, що під час цього вікна ніхто не може підключитися.

Іноді ключ, який застрягає, перешкоджає будь-якій значущій взаємодії з робочим столом, і в такому випадку я виконую наступне через ssh:

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

4

Я використовую "setxkbmap" без аргументів. Здається, скидання клавіатури. У мене на панелі "ярлик", який я можу використовувати за допомогою миші, коли клавіатура повністю не працює.


0

x11vncВідповідь геніальний, але при установці x11vncтільки для очищення модифікаторів здається зайвим, ось рішення Bash , який використовує xmodmap -pmвихід «и видати KeyUp всім відомих модифікаторів. Перетворення з шістнадцяткового в десятковий ключовий код покладається на арифметичне розширення Баша.

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на початку (щоб дати час для звільнення фізичних клавіш) було б доцільно. Звичайно, echoце не потрібно; Мені просто подобається, щоб я міг перевірити свій ~/.xsession-errorsфайл на такий вихід.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.