- 1. Синтаксис
- 2. Аргументи
- 3. Опис
- 4. Діагностика
Синтаксис
XGrabKey(display, keycode, modifiers, grab_window, owner_events, pointer_mode, keyboard_mode) Display * display; int keycode; unsigned int modifiers; Window grab_window; Bool owner_events; int pointer_mode, keyboard_mode;
Аргументи
display // Указывает соединение с X Сервером keycode // Указывает код клавиши (KeyCode) или любой код (AnyKey) modifiers // Указывает установку конкретных масок модификаторов // или использование любых модификаторов (AnyModifier). // Маска является поразрядным ИЛИ для проверки битов маски. grab_window // Указывает захватываемое окно owner_events // Указывает значение Boolean, которое указывает на события клавиатуры, // будут ли представлены как обычно. pointer_mode // Описывает дальнейший способ обработки событий указателя мыши. // Вы можете передавать GrabModeSync или GrabModeAsync. keyboard_mode // Описывает дальнейший способ обработки событий клавиатуры. // Вы можете передавать GrabModeSync or GrabModeAsync.
Опис
Функція XGrabKey() встановлює пасивне захоплення клавіатури. Надалі клавіатура може захоплюватися активно (за допомогою XGrabKeyboard() ), час останнього захоплення клавіатури встановлюється в момент, коли клавіша натиснута (тоді передається подія KeyPress ), а викликається подія KeyPress , якщо виконані всі умови (тобто є true):
- Клавіатура не захоплена, а вказана клавіша (яка може бути сама по собі модифікатором) є логічно натиснутою, коли також натиснуті інші цільові клавіші, і при цьому не натиснуті інші модифікатори, які не закладені в .
- Захоплюване вікно є предком або є вікном фокусування захоплюючого поєднання клавіш, або вікно фокусування є нащадком вікна фокусування і містить покажчик на предка
- Пасивне захоплення тієї ж комбінації клавіш не існує у будь-якого предка захоплюваного вікна.
Інтерпретація наступних аргументів для XGrabKeyboard() . Активне захоплення завершується автоматично, коли логічний стан клавіатури описується відпуск клавіші (незалежно від логічного стану клавіш модифікаторів).
Примітка. Логічний стан пристрою (як видно за клієнтськими програмами) може запізнюватися в порівнянні з фізичним станом, якщо обробка події пристрою заморозилася. Тобто може відбуватися налагодження програми або навіть заморожування сервера X11. Зокрема це може спостерігатися при запуску режиму захоплення як GrabModeSync , якщо не реалізовано коректне оброблення подій натискання клавіш.
Значення модифікатора AnyModifier для аргументу modifiers є еквівалентом дозволу обробки всіх можливих комбінацій клавіш модифікаторів (включаючи комбінації без модифікаторів).
Варто відзначити, що в X11 модифікаторами є не тільки клавіші Ctrl, Alt, Shift, Win(Meta), як у ОС Windows , а й клавіші ScrollLock, CapsLock, NumLock. Тому при реєстрації поєднань гарячих клавіш необхідно враховувати поєднання з цими клавішами. Тобто, фактично замість одного поєднання Сtrl+Alt+R, необхідно зареєструвати ще 7 сполучень із клавішами ScrollLock, CapsLock та NumLock, щоб поєднання коректно працювало, якщо, звичайно, Вам спеціально не потрібно іншої логіки поведінки програми у поєднанні з цим модифікаторами.
Значення AnyKey для аргументу keycode еквівалентне рішенню обробки всіх можливих клавіш (кодів клавіш). Однак, вказівка keycode має бути в межах між min_keycode та max_keycode. Інакше буде отримано помилку BadValues.
Якщо якась клієнтська програма вже використовує певне поєднання клавіш за допомогою XGrabKey() на певному цільовому вікні, буде повернена помилка BadAccess . При використанні модифікатора AnyModifier або AnyKey запит на деякі клавіші буде помилковим і в результаті BadAccess захоплення не виконуватиметься через конфлікт із комбінацією клавіш, захопленою іншою програмою.
Зокрема, через таку поведінку XGrabKey() можна деякий час дивуватися про те, чому не спрацьовує захоплення клавіші PrintScreen під тим самим дистрибутивом Ubuntu. А причина в тому, що дана клавіша вже захоплена програмою для створення скріншотів, яка йде в поставці Ubuntu за замовчуванням і вже захоплює цю клавішу.
XGrabKey() може генерувати наступні помилки BadAccess , BadValue та BadWindow .
Діагностика
BadAccess - клієнтська програма спробувала звільнити запис колірної карти, які вже звільнено.
BadAccess - клієнтська програма спробувала зберегти запис колірної карти, яка в режимі read-only.
BadValue - деякі числові значення виходять за межі діапазону запиту. Якщо певний діапазон не вказано для аргументу, повний спектр визначається типом аргументу, що приймається. Будь-який аргумент визначається як набір альтернатив який може викликати цю помилку.
BadWindow - Значення для аргументу Вікна (Window) немає імені певного Вікна (Window). Невірний ідентифікатор вікна.
див. також XUngrabKey()