projman/hlp/ru/tk/grab.html
2015-10-19 14:27:31 +04:00

138 lines
5.9 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>grab</title>
</head>
<body>
<h1>grab</h1>
<p>Направляет события, исходящие из клавиатуры и указателя
&quot;Мыши&quot; в модальное окно и его поддерево.</p>
<h2><a name="СИНТАКСИС"></a>СИНТАКСИС</h2>
<pre>
<strong>grab ?-global?</strong> <em>окно</em>
<strong>grab</strong> <em>параметр</em> ?<em>арг арг</em>...?
</pre>
<h2><a name="ОПИСАНИЕ"></a>ОПИСАНИЕ</h2>
<p>Команда реализует простые перехватчики событий ввода с
клавиатуры и &quot;Мыши&quot;. Перехватчики Tk отличаются от
перехватчиков, описанных в документации Xlib. Когда для
некоторого окна задан перехватчик, Tk ограничивает все события,
исходящие от курсора, границами модального окна и его потомков в
иерархии окон Tk. Если курсор находится в пределах поддерева
модального окна, то курсор будет вести себя так, будто нет
никакого перехватчика вообще. Если курсор находится вне
поддерева модального окна, то события нажатия и освобождения
кнопок &quot;Мыши&quot; будут передаваться в <em> окно</em>, а
события входа в окно и выхода из окна будут
игнорироваться. Поддерево окон перехватчика &quot;владеет&quot;
курсором: прочие окна будут видны на экране, но будут
нечувствительны к нажатиям кнопок &quot;Мыши&quot; до тех пор,
пока не будет прекращен перехват. В поддерево модального окна
могут входить окна верхнего уровня; в этом случае все эти окна
верхнего уровня и их потомки обрабатывают события курсора
&quot;Мыши&quot; при перехвате обычным образом.</p>
<p>С помощью команды <strong>grab</strong> можно запустить или
прекратить перехват для указанного окна и получить сведения об
установленном для указанного окна перехватчике.</p>
<p>Есть два типа перехватчиков: локальные и глобальные. Локальный
перехватчик влияет только на перехватывающее приложение, остальные
приложения ведут себя таким образом, как если бы никакого перехвата
не было. По умолчанию перехватчики локальные. Глобальный
перехватчик блокирует все приложения на экране; чувствительность к
событиям указателя (нажатия и отпускания клавиши &quot;Мыши&quot;,
движения указателя, входы в окно и выходы из него) сохраняют только
окна поддерева модального окна. При действии глобального
перехватчика менеджер окон также нечувствителен к событиям
указателя.</p>
<p>При действии локальных перехватчиков события клавиатуры
(нажатие и отпускание клавиш) передаются обычным образом:
менеджер окон следит за тем, какое из приложений получает
событие клавиатуры, и всякое такое событие, относящееся к
перехватывающему приложению, перенаправляется в окно в
фокусе. При действии глобального перехватчика Tk перенаправляет
все события клавиатуры в перехватывающее приложение. Какое окно
приложения получает событие клавиатуры, по-прежнему определяется
командой <a href=
"tk.html#focus"><strong>focus</strong></a>. Перехват событий
клавиатуры отменяется при прекращении действия перехватчика.</p>
<p>Перехватчики применяются к конкретным дисплеям. Если у
приложения есть окна на различных дисплеях, то оно может запустить
отдельный перехватчик на каждом дисплее. Перехватчик на конкретном
дисплее воздействует только на окно на этом дисплее. Несколько
приложений могут запустить на одном дисплее локальные перехватчики,
но глобальный перехватчик на дисплее может быть только один.</p>
<p>Команда <strong>grab</strong> может иметь одну из следующих
форм:</p>
<dl>
<dt><strong>grab ?-global?</strong> <em>окно</em></dt>
<dd>Совпадает с описанной ниже командой <strong>grab
set</strong>.</dd>
<dt><strong>grab current</strong> <em>window</em></dt>
<dd>Если задан параметр <em>window</em>, то команда возвращает
имя текущего модального окна в данном приложении; если такого
окна нет, то команда возвращает пустую строку. Если параметр
<em>window</em> опущен, то команда возвращает список,
элементами которого являются все окна, захваченные данным
приложением на всех дисплеях; если таких окон нет, то команда
возвращает пустую строку.</dd>
<dt><strong>grab release</strong> <em>окно</em></dt>
<dd>Отменяет перехватчика на указанном окне; если в окне нет
перехватчика, то команда не выполняет никаких
действий. Команда возвращает пустую строку.</dd>
<dt><strong>grab set -global</strong> <em>окно</em></dt>
<dd>Устанавливает перехватчик на окно. Если задан параметр
<strong>-global</strong>, то перехватчик будет глобальным; в
противном случае он будет локальным. Если на дисплее окна у
приложения уже был перехватчик, то он автоматически
отменяется. Если на данном окне уже установлен перехватчик
того же вида (глобальный или локальный), что и запрошенный, то
команда не выполняет никаких действий. Команда возвращает
пустую строку.</dd>
<dt><strong>grab status</strong> <em>окно</em></dt>
<dd>Возвращает <strong>none</strong>, если в <em>окне</em> нет
перехватчика, <strong>local</strong>, если в <em>окне</em>
установлен глобальный перехватчик, <strong>global</strong>,
если в <em>окне</em> установлен глобальный перехватчик.</dd>
</dl>
<h2><a name="ОШИБКИ"></a>ОШИБКИ</h2>
<p>Реализация описанного выше эффекта простого перехватчика
оказалась чрезвычайно сложной и громоздкой. В текущей реализации
прямое использование приложениями перехватчиков Xlib небезопасно;
это нужно делать через процедуры Tk.</p>
<p>Если несколько приложений Tk управляются одним процессом, то на
данном дисплее только одно из этих приложений может иметь
локального перехватчика в каждый конкретный момент. Этого
ограничения нет для приложений, управляемых различными
процессами.</p>
</body>
</html>