Маніпулювання клавішею 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.