Как заставить релиз модификаторов клавиатуры


18

Иногда, когда я использую синергию между моими машинами, когда один использует полноэкранный гость VirtualBox, я застреваю с некоторыми странными включенными модификаторами клавиш. Если они существуют на моей клавиатуре (например, Shift_L), я могу просто нажать на нее, и их статус сбрасывается, и я могу продолжать печатать маленькими буквами. Но некоторые из них вообще не отображаются на моей клавиатуре (например, ISO_Level3_Shift), поэтому у меня нет возможности их вообще отключить!

Как их сбросить? Прямо сейчас все, что я могу сделать, это перезагрузить компьютер, но это довольно неловкое решение.

Все, что мне нужно, - это какая-нибудь программа, которая может искусственно «нажать» на все возможные модификаторы клавиатуры, поэтому их статус будет сброшен. Это можно сделать?

Я использую Mint 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 всем известных модификаторов. Преобразование из шестнадцатеричного в десятичный код ключа основывается на арифметическом расширении 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было бы целесообразно добавить в начале (чтобы дать время для освобождения физических клавиш). echoК STDERR не нужно, конечно; Мне просто нравится иметь возможность проверить мой ~/.xsession-errorsфайл для вывода, как это.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.