# event

Определение виртуальных событий и генерация событий

## СИНТАКСИС

          event параметр ?арг арг ...?

## ОПИСАНИЕ

Команда event обеспечивает различные возможности работы с событиями, включая определение виртуальных событий и синтезирование событий. У команды есть несколько различных форм, которые задаются первым аргументом. В настоящее время поддерживаются следующие формы команды:

event add <<виртуальное>> последовательность ?последовательность...?
  Связывает виртуальное событие с последовательностями физических событий, указываемыми аргументами последовательность; в результате выполнение одной из указанных последовательностей событий приводит к возникновению виртуального события. Аргумент виртуальное может быть произвольной строкой, а последовательность может принимать любое значение, допустимое для аргумента последовательность команды bind. Если виртуальное событие уже определено, то новая последовательность физических событий добавляется к списку уже имеющихся последовательностей.
event delete <<виртуальное>> ?последовательность последовательность ..?
  Удаляет все указанные последовательности из списка связанных с данным виртуальным событием. Аргумент виртуальное может быть произвольной строкой, а последовательность может принимать любое значение, допустимое для аргумента последовательность команды bind. Если последовательность не связана с данным виртуальным событием в текущий момент, то она игнорируется. Если аргумент последовательность отсутствует, то из списка удаляются все последовательности физических событий и данное виртуальное событие не может быть более осуществлено.
event generate окно событие ?параметр значение параметр значение ...?
  Генерирует событие в окне и обеспечивает его обработку таким образом, как если бы оно поступило из менеджера окон. Аргумент окно задает имя пути окна, в котором будет генерироваться событие; его значением может быть и идентификатор окна (такой же, какой служит результатом команды winfo id), если он относится к окну в текущем приложении. Аргумент событие задает описание события, например, в виде <Shift-Button-2> или <<Paste>>. Аргумент событие может принимать любое значение, допустимое для аргумента последовательность команды bind, за исключением того, что он должен состоять из одного, а не из нескольких событий. Пары параметр-значение можно использовать для установки значений дополнительных параметров события, например, координат курсора "Мыши" ниже (см. "ПОЛЯ СОБЫТИЯ"). Если параметр -when не задан, то событие обрабатывается немедленно; все программы обработки события будут выполнены до завершения команды event generate. В противном случае момент обработки определяется значением параметра -when.
event info ?<<виртуальное>>?
  Возвращает информацию о виртуальных событиях. Если аргумент <<виртуальное>> опущен, то возвращается список всех виртуальных событий, определенных в текущий момент. Если аргумент <<виртуальное>> задан, то возвращаемое значение представляет собой список, элементы которого являются последовательностями физических событий, связанными с данным виртуальным событием; если указанное виртуальное событие не определено, то команда возвращает пустую строку.

## ПОЛЯ СОБЫТИЯ

Команда event generate поддерживает следующие параметры, которые соответствуют расширению % в скриптах привязки для команды bind.

-above окно
  Аргумент окно задает поле above для события либо в виде имени пути окна либо в виде целочисленного идентификатора окна. Параметр имеет смысл для событий Configure. Параметр соответствует подстановке %a для скриптов привязки.
-borderwidth размер
  Параметр размер представляет собой расстояние на экране; задает значение поля border_width события. Параметр имеет смысл для событий Configure. Параметр соответствует подстановке %B для скриптов привязки.
-button число
  Значением параметра число должно быть целое число; задает значение поля detail для события ButtonPress или ButtonRelease, подавляя номер кнопки, задаваемый параметром события base. Параметр соответствует подстановке %b для скриптов привязки.
-count число
  Значением параметра число должно быть целое число; задает значение поля count для события. Параметр имеет смысл для событий Expose. Параметр соответствует подстановке %c для скриптов привязки.
-detail детальность

  Параметр задает значение поля detail для события и может принимать следующие значения:

  - NotifyAncestor
  - NotifyDetailNone
  - NotifyInferior
  - NotifyNonlinear
  - NotifyNonlinearVirtual
  - NotifyPointer
  - NotifyPointerRoot
  - NotifyVirtual

  Имеет смысл для событий Enter, Leave, FocusIn и FocusOut. Параметр соответствует подстановке %d для скриптов привязки.

-focus булевское
  Параметр булевское принимает булевские значения; он задает значение поля focus для события. Имеет смысл для событий Enter и Leave. Параметр соответствует подстановке %f для скриптов привязки.
-height размер
  Параметр размер представляет собой расстояние на экране; задает значение поля height события. Параметр имеет смысл для событий Configure. Параметр соответствует подстановке %h для скриптов привязки.
-keycode число
  Значением параметра число должно быть целое число; задает значение поля keycode для события. Параметр имеет смысл для событий KeyPress и KeyRelease. Параметр соответствует подстановке %k для скриптов привязки.
-keysym имя
  Значением параметра имя должно быть имя допустимого символа клавиатуры, например, g, пробел или Return; код этого символа используется в качестве значения поля keycode события, подавляя значение детальности, заданное аргументом base события. Имеет смысл для событий KeyPress и KeyRelease. Параметр соответствует подстановке %K для скриптов привязки.
-mode уведомление
  Параметр уведомление задает значение поля mode для события; он должен принимать одно из значений NotifyNormal, NotifyGrab, NotifyUngrab или NotifyWhileGrabbed. Имеет смысл для событий Enter, Leave, FocusIn и FocusOut. Параметр соответствует подстановке %m для скриптов привязки.
-override булевское
  Значение параметра булевское должно быть булевским; он задает значение поля override_redirect для события. Имеет смысл для событий Map, Reparent и Configure. Параметр соответствует подстановке %o для скриптов привязки.
-place где
  Параметр где задает значение поля place для события; может принимать значения PlaceOnTop или PlaceOnBottom. Имеет смысл для событий Circulate. Параметр соответствует подстановке %p для скриптов привязки.
-root окно
  Аргумент окно задает поле root для события либо в виде имени пути окна, либо в виде целочисленного идентификатора окна. Имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Параметр соответствует подстановке %R для скриптов привязки.
-rootx коорд
  Параметр коорд представляет собой расстояние на экране; задает значение поля x_root события. Параметр имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Параметр соответствует подстановке %X для скриптов привязки.
-rooty коорд
  Параметр коорд представляет собой расстояние на экране; задает значение поля y_root события. Параметр имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Параметр соответствует подстановке %Y для скриптов привязки.
-sendevent булевское
  Значение параметра булевское должно быть булевским; он задает значение поля send_event для события. Имеет смысл для всех событий. Параметр соответствует подстановке %E для скриптов привязки.
-serial число
  Значение параметра должно быть целым числом; задает значение поля serial для события. Имеет смысл для всех событий. Параметр соответствует подстановке %# для скриптов привязки.
-state состояние
  Параметр задает значение поля state для события. Для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion значение параметра должно быть целым. Для событий Visibility параметр может принимать одно из значений VisibilityUnobscured, VisibilityPartiallyObscured или VisibilityFullyObscured. Этот параметр подавляет любые модификаторы, например, Meta или Control, указанные в основном событии. Параметр соответствует подстановке %s для скриптов привязки.
-subwindow окно
  Аргумент окно задает поле subwindow для события либо в виде имени пути примитива event, либо в виде целочисленного идентификатора окна. Имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Аналогичен подстановке %S для скриптов привязки.
-time целое
  Параметр должен иметь целое значение; задает значение поля time для события. Имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave, Motion и Property. Параметр соответствует подстановке %t для скриптов привязки.
-width размер
  Параметр размер представляет собой расстояние на экране; задает значение поля width события. Параметр имеет смысл для событий Configure. Параметр соответствует подстановке %w для скриптов привязки.
-when когда

  Параметр когда задает момент обработки события; должен принимать одно из следующих значений:

  now
    Событие обрабатывается немедленно, до завершения выполнения команды. То же самое происходит и в случае, если параметр -when опущен.
  tail
    Устанавливает событие в очередь событий Tcl вслед за всеми стоящими в этой очереди событиями данного приложения.
  head
    Устанавливает событие в начало очереди событий Tcl; оно будет обработано перед остальными событиями, уже стоящими в очереди.
  mark
    Устанавливает событие в начало очереди событий Tcl, но вслед за всеми событиями, вставшими в очередь посредством указания параметра -when. Такая возможность полезна при генерации последовательности событий, которые должны быть обработаны одно за другим, но перед всеми событиями уже стоящими в очереди.
-x коорд
  Параметр коорд представляет собой расстояние на экране; задает значение поля x события. Параметр имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave, Motion, Expose, Configure, Gravity и Reparent. Параметр соответствует подстановке %x для скриптов привязки.
-y коорд
  Параметр коордпредставляет собой расстояние на экране; задает значение поля y события. Параметр имеет смысл для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave, Motion, Expose, Configure, Gravity и Reparent. Параметр соответствует подстановке %y для скриптов привязки.

Значением всякого параметра, не указанного при генерации события, становится 0, за исключением параметра serial, которому присваивается серийный номер очередного X события.

## ПРИМЕРЫ ВИРТУАЛЬНЫХ СОБЫТИЙ

Для обращения к привязке к виртуальному событию необходимо выполнение двух условий. Во-первых, это виртуальное событие должно быть определено командой event add. Во-вторых, к этому виртуальному событию должна быть создана привязка с помощью команды bind.

Рассмотрим следующие определения виртуальных событий:

          event add <<Paste>> <Control-y>
          event add <<Paste>><Button-2>
          event add <<Save>> <Control-X><Control-S>
          event add <<Save>> <Shift-F12>

В команде bind привязка к виртуальным событиям осуществляется так же, как и ко встроенным типам событий:

          bind Entry <<Paste>> {%W insert[selection get]}

Двойные угловые скобки показывают, что выполняется привязка к виртуальному событию. При нажатии клавиш Control-y или кнопки 2 .Мыши. или при синтезировании виртуального события <<Paste>> командой event generate будет выполнена привязка <<Paste>>.

Если последовательность в виртуальном событии в точности совпадает с последовательностью в другом физическом событии, то преимуществом пользуется физическое событие. Рассмотрим следующий пример:

event add <<Paste>> <Control-y> <Meta-Control-y> bind Entry <Control-y> {puts Control-y} bind Entry <<Paste>> {puts Paste}

При нажатии на клавиши Control-y будет выполнена привязка <Control-y>, так как физическое событие считается более конкретным, чем виртуальное, а в остальном все одинаково. Однако при нажатии клавиш Meta-Control-y будет выполнена привязка <<Paste>>, так как модификатор Meta в физическом образце, связанном с виртуальной привязкой, более конкретен, чем последовательность <Control-y> для физического события.

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

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

          bind <Entry> <Control-y> {}
          event add <<Paste>> <Key-F6>

то поведение события изменится в двух направлениях. Во-первых, всплывет подавленная привязка <<Paste>>. Нажатие на клавиши Control-y приведет теперь не к выполнению привязки <Control-y>, а к выполнению виртуального события <<Paste>>. Во-вторых, нажатие на клавишу F6 также приведет к выполнению привязки <<Paste>>.

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

          event generate окно событие параметр значение параметр значение ...

Генерирует событие в окне и обеспечивает его обработку таким образом, как если бы оно поступило из менеджера окон. Аргумент окно задает имя пути окна, в котором будет генерироваться событие; его значением может быть и идентификатор окна (такой же, какой служит результатом команды winfo id), если он относится к окну в текущем приложении. Аргумент событие задает описание события, например, в виде <Shift-Button-2> или <<Paste>>. Аргумент событие может принимать любое значение, допустимое для аргумента последовательность команды bind, за исключением того, что он должен состоять из одного, а не из нескольких событий. Пары параметр-значение можно использовать для установки значений дополнительных параметров события, например, координат курсора "Мыши" ниже (см. "ПОЛЯ СОБЫТИЯ"). Если параметр -when не задан, то событие обрабатывается немедленно; все программы обработки события будут выполнены до завершения команды event generate. В противном случае момент обработки определяется значением параметра -when.

          event info <<виртуальное>>

Возвращает информацию о виртуальных событиях. Если аргумент <<виртуальное>> опущен, то возвращается список всех виртуальных событий, определенных в текущий момент. Если аргумент <<виртуальное>> задан, то возвращаемое значение представляет собой список, элементы которого являются последовательностями физических событий, связанными с данным виртуальным событием; если указанное виртуальное событие не определено, то команда возвращает пустую строку.