grab
-
ИМЯ
- grab — Ограничить события указателя и клавиатуры поддеревом окна
- СИНТАКСИС
- ОПИСАНИЕ
-
grab ?-global? window
- grab current ?window?
- grab release window
- grab set ?-global? window
- grab status window
- grab current ?window?
Имя
grab — Ограничить события указателя и клавиатуры поддеревом окнаСинтаксис
grab ?-global? windowgrab option ?arg arg ...?
Описание
Эта команда реализует простые захват указателя и клавиатуры для Tk. Захваты Tk отличаются от описанных в документации Xlib. Когда захват установлен для определенного окна, Tk ограничивает все события указателя окном захвата и его потомками в иерархии окон Tk. Всякий раз, когда указатель находится внутри поддерева окна захвата, он будет вести себя точно так же, как если бы захвата не было, и все события будут сообщаться обычным образом. Когда указатель находится вне дерева window, события нажатия и отпускания кнопок и движения мыши сообщаются window, а события входа и выхода из окна игнорируются. Поддерево захвата «владеет» указателем: окна вне поддерева захвата будут видны на экране, но будут неактивны до тех пор, пока захват не будет отпущен. Дерево окон под окном захвата может включать окна верхнего уровня, в этом случае все эти окна верхнего уровня и их потомки будут продолжать получать события мыши во время захвата.Возможны два вида захвата: локальный и глобальный. Локальный захват затрагивает только приложение, производящее захват: события будут сообщаться другим приложениям так, как если бы захват никогда не происходил. По умолчанию захват является локальным. Глобальный захват блокирует все приложения на экране, поэтому только указанное поддерево приложения, производящего захват, будет чувствительно к событиям указателя (нажатия кнопок мыши, отпускания кнопок мыши, движения указателя, входа и выхода из окна). Во время глобальных захватов менеджер окон также не получает событий указателя.
Во время локальных захватов события клавиатуры (нажатия клавиш и отпускания клавиш) доставляются как обычно: менеджер окон управляет тем, какое приложение получает события клавиатуры, и если они отправляются в какое-либо окно приложения, производящего захват, то они перенаправляются в окно фокуса. Во время глобального захвата Tk захватывает клавиатуру, так что все события клавиатуры всегда отправляются приложению, производящему захват. Команда focus по-прежнему используется для определения того, какое окно в приложении получает события клавиатуры. Захват клавиатуры отпускается, когда отпускается захват.
Захваты применяются к определенным дисплеям. Если приложение имеет окна на нескольких дисплеях, оно может установить отдельный захват на каждом дисплее. Захват на определенном дисплее затрагивает только окна на этом дисплее. Возможно одновременное наличие различных приложений на одном дисплее, имеющих локальные захваты, но только одно приложение может иметь глобальный захват на данном дисплее одновременно.
Команда grab может иметь любой из следующих форм:
- grab ?-global? window
- То же самое, что и grab set, описано ниже.
- grab current ?window?
- Если window указано, возвращает имя текущего окна захвата в этом приложении для дисплея window или пустую строку, если такого окна нет. Если window опущено, команда возвращает список, элементы которого — все окна, захваченные этим приложением для всех дисплеев, или пустую строку, если приложение не имеет захватов.
- grab release window
- Отпускает захват на window, если он есть, в противном случае ничего не делает. Возвращает пустую строку.
- grab set ?-global? window
- Устанавливает захват на window. Если указан -global, захват является глобальным, в противном случае — локальным. Если захват уже действовал для этого приложения на дисплее window, он автоматически отпускается. Если на window уже установлен захват и он имеет ту же форму (глобальный/локальный), что и запрос, то команда ничего не делает. Возвращает пустую строку.
- grab status window
- Возвращает none, если захват на window не установлен, local, если установлен локальный захват на window, и global, если установлен глобальный захват.
Предупреждение
Очень легко использовать глобальные захваты для полной непригодности дисплея (например, установив захват на виджет, который не реагирует на события, и не предоставляя никакого механизма для освобождения захвата). Будьте крайне осторожны при их использовании!Ошибки
Для получения описанного выше простого эффекта захвата потребовалась невероятно сложная и грубая реализация. Учитывая текущую реализацию, приложениям не следует использовать механизмы захвата Xlib вообще, за исключением процедур захвата Tk. Если приложения попытаются манипулировать механизмами захвата X напрямую, возможно, произойдут сбои.Если один процесс управляет несколькими различными приложениями Tk, только одно из этих приложений может иметь локальный захват для данного дисплея в любой момент времени. Если приложения находятся в разных процессах, это ограничение не существует.
Пример
Установите захват, чтобы только одна кнопка могла быть нажата из группы. Другие кнопки не реагируют на мышь до тех пор, пока не будет нажата средняя кнопка.pack [button .b1 -text "Click me! #1" -command {destroy .b1}]
pack [button .b2 -text "Click me! #2" -command {destroy .b2}]
pack [button .b3 -text "Click me! #3" -command {destroy .b3}]
grab .b2 См. также
busy
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/grab.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/grab.htm