Управление X-ключом и захватом указателя в командной строке

20

Какие инструменты командной строки существуют для просмотра и управления захватами X-сервера? (Это захват, как при захвате клавиш и указателей, т. Е. Ограничение использования определенной клавиши или кнопки мыши определенным приложением или ограничение указателя мыши, чтобы оно оставалось в определенной области экрана.) Я ищу гипотетическую xgrabутилиту, которая бы показать такие вещи, как

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

это означает , что имеет место вызова XGrabKey(display, 0x123, 0, 0x00f00ba5, ...)и так далее с XGrabButton, XGrabPointer, XGrabKeyboard, XGrabServer(если это возможно). Формат отображения не имеет значения, мне нужен какой-то способ узнать, кто что захватывает, и, возможно, какой-то способ отозвать эти захваты (если это возможно, я не уверен, позволяет ли это API X11).

Жиль "ТАК - перестань быть злым"
источник

Ответы:

21

Последние версии X (сервер X.org ≥1.11) поддерживают несколько ключей отладки, представленных в этом коммите . При срабатывании они выполняют действия, связанные с захватами.

По умолчанию ( по крайней мере, в последних версиях ) они отключены (отсутствуют в таблице ключей по умолчанию).

Однако, если вы xdotoolустановили, что это можно назвать их, выполнив в командной строке:

xdotool key NameOfKey

где NameOfKeyнаходится ключ, который вы хотите активировать. Например, чтобы распечатать список активных захватов в журнал X-сервера, используйте xdotool key XF86LogGrabInfo.

Соответствующие ключевые слова:

Обратите внимание, что XF86LogGrabInfoперечислены только активные захваты, а не пассивные захваты, такие как захват на клавише, которая в данный момент не нажата. Если вы хотите получить информацию о пассивном захвате, вам нужно активировать захват: запустить, xdotool key XF86LogGrabInfoпока нажата интересующая вас комбинация клавиш или аккорда мыши. Сделать что-то вроде:

  1. Бегать sleep 1; xdotool key XF86LogGrabInfo
  2. В течение 1 секунды нажмите комбинацию клавиш или кнопку мыши.
  3. Через 1 секунду отпустите кнопку / кнопку.
  4. Проверьте информацию «Active grab…» в журнале X-сервера (часто /var/log/Xorg.0.log).
Механическая улитка
источник
2
В настоящее время тестирование Debian wheezy с Xorg 1.12.4 xdotool key XF86LogGrabInfoвызывает только две записи в журнале X: «Печать всех текущих активных захватов устройств:», сразу после которых следует «Завершить список активных захватов устройств». Тем не менее, мой оконный менеджер захватывает кучу ключей. Вы видели эту работу для захваченных ключей?
Жиль "ТАК - перестань быть злым"
4
@ Жиль - нет, вы не получите никакого вывода, если вы запустите его таким образом ... попробуйте запустить его с помощью sleep 2; xdotool key "XF86LogGrabInfo"и сразу же начните нажимать клавишу (например, клавишу "Win") очень быстро, тогда вы увидите некоторые результаты в Xorg.log. Или используйте xdotoolнажимать клавиши + XF86LogGrabInfoв то же время, как здесь
don_crissti
@don_crissti А, я вижу, XF86LogGrabInfoпечатает только информацию о клавише, которая нажата в данный момент? Это ограничивает его полезность. Я хочу перечислить все захваты - все пассивные захваты, если я правильно понимаю терминологию.
Жиль "ТАК - перестань быть злым"
Вероятно, есть какой-то умный способ объединить это с исчерпывающим поиском комбинаций клавиш по сценарию, возможно, без виртуальной клавиатуры. Конечно, вне моих знаний.
Адам Кац
Благодарность! Это помогло мне обнаружить, что xfsettingsdукрал мой ярлык Win+ L.
Микель
8

Я не знаю ничего от руки для пассивных захватов 1 единственной клавиши или кнопки, которая может присутствовать, но есть несколько способов составить список активных захватов всего устройства клавиатуры или мыши.

  1. На всех платформах, но только с Xorg 1.11 и более поздними версиями (или более старой версией с примененным исправлением), назначьте горячие клавиши для выгрузки данных захвата в журнал, как описано в этих примечаниях к исправлению .
  2. В Solaris 11 (Solaris 11 Express 2010.11 или выпуске Solaris 11) используйте сценарии отладчика, например /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, как описано в разделе «Получение информации с X-сервера» . Здесь также есть один для серверных захватов, которые горячие клавиши Xorg 1.11 в настоящее время не охватывают.

1 См. Http://tronche.com/gui/x/xlib/input/pointer-grabbing.html для определения активных и пассивных захватов.

alanc
источник
4

Это дополнение к ответу Механической улитки -

Записи в журнале Xorg могут быть довольно непонятными. Я написал программу, которая анализирует их и представляет их в удобной для человека форме:

https://gist.github.com/CyberShadow/6412d11aea64144f8905cc0b8196f38e

Чтобы использовать, сначала запустите xdotool key XF86LogGrabInfo, как описано в ответе Механической улитки. Затем запустите программу, указанную выше. Если ваш файл журнала Xorg не находится по адресу /var/log/Xorg.0.log, вы можете указать его местоположение, используя --xorg-logопцию. Смотрите --helpподробности.

Владимир Пантелеев
источник
1
Упомянутая здесь суть запрограммирована на языке D. Чтобы получить исполняемый файл, можно установить пакеты gdc(компилятор GNU D), а libx11-devзатем запустить gdc -o xorg-show-grabs xorg-show-grabs.d -lX11.
Стефан Гурихон