grab

Направляет события, исходящие из клавиатуры и указателя "Мыши" в модальное окно и его поддерево.

СИНТАКСИС

      grab ?-global? окно
      grab параметр ?арг арг...?
    

ОПИСАНИЕ

Команда реализует простые перехватчики событий ввода с клавиатуры и "Мыши". Перехватчики Tk отличаются от перехватчиков, описанных в документации Xlib. Когда для некоторого окна задан перехватчик, Tk ограничивает все события, исходящие от курсора, границами модального окна и его потомков в иерархии окон Tk. Если курсор находится в пределах поддерева модального окна, то курсор будет вести себя так, будто нет никакого перехватчика вообще. Если курсор находится вне поддерева модального окна, то события нажатия и освобождения кнопок "Мыши" будут передаваться в окно, а события входа в окно и выхода из окна будут игнорироваться. Поддерево окон перехватчика "владеет" курсором: прочие окна будут видны на экране, но будут нечувствительны к нажатиям кнопок "Мыши" до тех пор, пока не будет прекращен перехват. В поддерево модального окна могут входить окна верхнего уровня; в этом случае все эти окна верхнего уровня и их потомки обрабатывают события курсора "Мыши" при перехвате обычным образом.

С помощью команды grab можно запустить или прекратить перехват для указанного окна и получить сведения об установленном для указанного окна перехватчике.

Есть два типа перехватчиков: локальные и глобальные. Локальный перехватчик влияет только на перехватывающее приложение, остальные приложения ведут себя таким образом, как если бы никакого перехвата не было. По умолчанию перехватчики локальные. Глобальный перехватчик блокирует все приложения на экране; чувствительность к событиям указателя (нажатия и отпускания клавиши "Мыши", движения указателя, входы в окно и выходы из него) сохраняют только окна поддерева модального окна. При действии глобального перехватчика менеджер окон также нечувствителен к событиям указателя.

При действии локальных перехватчиков события клавиатуры (нажатие и отпускание клавиш) передаются обычным образом: менеджер окон следит за тем, какое из приложений получает событие клавиатуры, и всякое такое событие, относящееся к перехватывающему приложению, перенаправляется в окно в фокусе. При действии глобального перехватчика Tk перенаправляет все события клавиатуры в перехватывающее приложение. Какое окно приложения получает событие клавиатуры, по-прежнему определяется командой focus. Перехват событий клавиатуры отменяется при прекращении действия перехватчика.

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

Команда grab может иметь одну из следующих форм:

grab ?-global? окно
Совпадает с описанной ниже командой grab set.
grab current window
Если задан параметр window, то команда возвращает имя текущего модального окна в данном приложении; если такого окна нет, то команда возвращает пустую строку. Если параметр window опущен, то команда возвращает список, элементами которого являются все окна, захваченные данным приложением на всех дисплеях; если таких окон нет, то команда возвращает пустую строку.
grab release окно
Отменяет перехватчика на указанном окне; если в окне нет перехватчика, то команда не выполняет никаких действий. Команда возвращает пустую строку.
grab set -global окно
Устанавливает перехватчик на окно. Если задан параметр -global, то перехватчик будет глобальным; в противном случае он будет локальным. Если на дисплее окна у приложения уже был перехватчик, то он автоматически отменяется. Если на данном окне уже установлен перехватчик того же вида (глобальный или локальный), что и запрошенный, то команда не выполняет никаких действий. Команда возвращает пустую строку.
grab status окно
Возвращает none, если в окне нет перехватчика, local, если в окне установлен глобальный перехватчик, global, если в окне установлен глобальный перехватчик.

ОШИБКИ

Реализация описанного выше эффекта простого перехватчика оказалась чрезвычайно сложной и громоздкой. В текущей реализации прямое использование приложениями перехватчиков Xlib небезопасно; это нужно делать через процедуры Tk.

Если несколько приложений Tk управляются одним процессом, то на данном дисплее только одно из этих приложений может иметь локального перехватчика в каждый конкретный момент. Этого ограничения нет для приложений, управляемых различными процессами.