Маніпулювання клавішею 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. Перевірте інформацію "Активний захоплення ..." у журналі X сервера (часто /var/log/Xorg.0.log).

2
Тестуючи тепер на Debian wheezy за допомогою Xorg 1.12.4, xdotool key XF86LogGrabInfoзапускає лише два записи в журналі X: "Друк усіх поточних активних пристроїв:", одразу після цього "Кінцевий список активних захоплень пристрою". Але мій менеджер вікон захоплює купу ключів. Ви бачили цю роботу за схопленими ключами?
Жил 'SO- перестань бути злим'

4
@Gilles - ні, ви не отримаєте жодного результату, якщо запустити його так ... спробуйте запустити його sleep 2; xdotool key "XF86LogGrabInfo"та негайно почніть дуже швидко натискати клавішу (наприклад, клавішу "Win"), тоді ви побачите деякий вихід у Xorg.log. Або використовуйте xdotoolдля XF86LogGrabInfoодночасного натискання клавіш + , як тут
don_crissti

@don_crissti Ах, бачу, XF86LogGrabInfoдрукує лише інформацію про клавішу, яка зараз натискається? Це обмежує його корисність. Я хочу перерахувати всі захоплення - всі пасивні схопи, якщо я правильно розумію термінологію.
Жил 'SO- перестань бути злим'

Мабуть, є якийсь розумний спосіб поєднати це із сценарієм вичерпного пошуку комбінацій клавіш, сподіваємось, без віртуальної клавіатури. Звичайно, поза моїми знаннями.
Адам Кац

Спасибі! Це допомогло мені виявити, що xfsettingsdвкрав мій ярлик Win+ L.
Мікель

8

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

  1. На всіх платформах, але тільки з Xorg 1.11 і пізнішою версією (або старішою версією із застосованим патчем), картографуйте гарячі клавіші для скидання даних захоплення до журналу, як описано в цих нотах патчу .
  2. У Solaris 11 (або Solaris 11 Експрес 2010,11 або фактичний випуск Solaris 11), використовувати відладчик сценаріїв , таких як /usr/demo/Xserver/mdb/list_Xserver_devicegrab_client, як описано в захоплюючи інформації з X Server . Тут також є одне захоплення серверів, яке гарячі клавіші Xorg 1.11 наразі не охоплюють.

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


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