Как отправить Ctrl+Alt+F1 (и другие специальные нажатия клавиш) в окно X?
Когда я нажимаю Ctrl + Alt + F {1..12}, он переключает меня на другой виртуальный терминал.
Четное xte "keydown Control_L" "keydown Alt_L" "key F1" "keyup Alt_L" "keyup Control_L"
приводит к переключению на vt вместо того, чтобы посылать эти ключи в сфокусированное окно.
Варианты использования этого включают (но не ограничиваются) отправку специальных нажатий клавиш VNC или клиентам виртуализации, которые будут обрабатываться системой Clinet/ Guest вместо хост-системы. Иногда (как в VirtualBox) приложения явно отображают некоторые специальные альтернативные нажатия клавиш на эти специальные (например, Ctrl + Alt + Del или Ctrl + Alt + Backspace в VirtualBox), но я хочу чистое и универсальное решение.
3 ответа
Давайте назовем Ctrl + Alt + Fx (где Fx - одна из функциональных кнопок: F1, F2, F3...) srvr.
Есть способ отключить / включить ключи srvr на лету. Под отключением я подразумеваю, что X11 не глотает их, а передает оконному менеджеру (kwin в kde).
Для набора ключей srvr вы запускаете setxkbmap -option srvrkeys:none
Для включения ключей srvr вы запускаете setxkbmap -option
Чтобы проверить, включен ли флаг srvr_ctrl(no_srvr_keys), запустите setxkbmap -print | grep xkb_symbols
В kde есть возможность выполнять действия с окном (например, выполнить некоторую команду, когда окно получает или теряет фокус). Таким образом, вы можете автоматически отключать ключи srvr, когда окно вашего специального приложения сфокусировано, и автоматически возвращать их обратно, когда оно теряет фокус. Это универсальное решение. Полезно для таких приложений, как TeamViewer, VirtualBox, Chrome Remote Desktop, ipkvm viewer, krdc и так далее.
Если вам интересно, вот мой сценарий, который я использую для этого: https://github.com/Ashark/aten-ip8000/blob/master/srvrkeys
Для VirtualBox попробуйте комбинацию клавиш REL + F1. Здесь REL - это клавиша, используемая для отпускания мыши в окне VirtualBox, обычно это клавиша Ctrl или Alt.
Невозможно отправить Ctrl+Alt+F[1..12], потому что виртуальные терминалы отделены от рабочего стола, к которому подключен VNC.