2.3.3. "Захват" клавиатуры и/или мыши.

    Обычно фокус ввода может свободно переходить от окна к окну. Но иногда программе необходимо запретить передачу фокуса. Это называется "захватом" клавиатуры. Для того, чтобы его реализовать, используется процедура XGrabKeyboard( ).

    Функция XGrabKey( ) запрещает передачу фокуса после нажатия определенной комбинации клавиш. Освободить клавиатуру можно, обратившись к процедуре XUngrabKeyboard( ) (XGrabKey( )).

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

int XGrabPointer (Display* prDisplay, Window nGrabWnd,
    Bool nOwnerEvents, unsigned int nEventMask,
    int nPointerMode, int nKeyboardMode, Window nConfineTo,
    Cursor nCursor, Time nTime);

то положение меняется. Теперь все события будут направляться окну с дескриптором nGrabWnd. "Освобождается" мышь вызовом XUngrabPointer( ). Процедура XGrabButton( ) указывает, что курсор должен быть "захвачен" после нажатия определенной кнопки. Обратной к ней является процедура XUngrabButton( ).

    Процедуры, "захватывающие" устройство, - мышь или клавиатуру - имеют ряд аргументов, влияющих на поведение системы.

    Так параметр nConfineTo есть идентификатор окна, за пределы которого не должен выходить курсор мыши, если он "захвачен".

    Если аргумент nOwnerEvents равен Тrue, то события мыши будут передаваться окнам программы. Если nOwnerEvents - False, или курсор находится в окне, не принадлежащем программе, то события мыши передаются окну nGrabWnd.

    Если nOwnerEvents равен False, то параметр nEventMask указывает, какие события следует передавать окну nGrabWnd.

    Обработка событий от клавиатуры или ныши может быть приостановлена, если nPointerMode или nKeyboardMode равен GrabModeSync. В этом случае события буферизуются сервером, пока устройство не будет освобождено с помощью XUngrabKeyboard( ), XUngrabKey( ), XUngrabPointer( ) или XUngrabButton( ).

    Параметр nCursor задает форму курсора во время того, как мышь "захвачена". Аргумент nTime указывает, когда система должна активизировать режим "захвата".