Направляет события, исходящие из клавиатуры и указателя "Мыши" в модальное окно и его поддерево.
grab ?-global? окно grab параметр ?арг арг...?
Команда реализует простые перехватчики событий ввода с клавиатуры и "Мыши". Перехватчики Tk отличаются от перехватчиков, описанных в документации Xlib. Когда для некоторого окна задан перехватчик, Tk ограничивает все события, исходящие от курсора, границами модального окна и его потомков в иерархии окон Tk. Если курсор находится в пределах поддерева модального окна, то курсор будет вести себя так, будто нет никакого перехватчика вообще. Если курсор находится вне поддерева модального окна, то события нажатия и освобождения кнопок "Мыши" будут передаваться в окно, а события входа в окно и выхода из окна будут игнорироваться. Поддерево окон перехватчика "владеет" курсором: прочие окна будут видны на экране, но будут нечувствительны к нажатиям кнопок "Мыши" до тех пор, пока не будет прекращен перехват. В поддерево модального окна могут входить окна верхнего уровня; в этом случае все эти окна верхнего уровня и их потомки обрабатывают события курсора "Мыши" при перехвате обычным образом.
С помощью команды grab можно запустить или прекратить перехват для указанного окна и получить сведения об установленном для указанного окна перехватчике.
Есть два типа перехватчиков: локальные и глобальные. Локальный перехватчик влияет только на перехватывающее приложение, остальные приложения ведут себя таким образом, как если бы никакого перехвата не было. По умолчанию перехватчики локальные. Глобальный перехватчик блокирует все приложения на экране; чувствительность к событиям указателя (нажатия и отпускания клавиши "Мыши", движения указателя, входы в окно и выходы из него) сохраняют только окна поддерева модального окна. При действии глобального перехватчика менеджер окон также нечувствителен к событиям указателя.
При действии локальных перехватчиков события клавиатуры (нажатие и отпускание клавиш) передаются обычным образом: менеджер окон следит за тем, какое из приложений получает событие клавиатуры, и всякое такое событие, относящееся к перехватывающему приложению, перенаправляется в окно в фокусе. При действии глобального перехватчика Tk перенаправляет все события клавиатуры в перехватывающее приложение. Какое окно приложения получает событие клавиатуры, по-прежнему определяется командой focus. Перехват событий клавиатуры отменяется при прекращении действия перехватчика.
Перехватчики применяются к конкретным дисплеям. Если у приложения есть окна на различных дисплеях, то оно может запустить отдельный перехватчик на каждом дисплее. Перехватчик на конкретном дисплее воздействует только на окно на этом дисплее. Несколько приложений могут запустить на одном дисплее локальные перехватчики, но глобальный перехватчик на дисплее может быть только один.
Команда grab может иметь одну из следующих форм:
Реализация описанного выше эффекта простого перехватчика оказалась чрезвычайно сложной и громоздкой. В текущей реализации прямое использование приложениями перехватчиков Xlib небезопасно; это нужно делать через процедуры Tk.
Если несколько приложений Tk управляются одним процессом, то на данном дисплее только одно из этих приложений может иметь локального перехватчика в каждый конкретный момент. Этого ограничения нет для приложений, управляемых различными процессами.