События сенсорного экрана
Некоторые оконные системы поддерживают устройства ввода, реагирующие на прикосновения пользователя к экрану и перемещение пальцев по экрану. Эти устройства ввода называются сенсорными экранами, а Emacs сообщает о генерируемых ими событиях как о событиях сенсорного экрана.
Большинство отдельных событий, генерируемых сенсорным экраном, имеют значение только как часть более длинной последовательности других событий: например, простое касание сенсорного экрана предполагает, что пользователь касается экрана пальцем и убирает его, а пролистывание экрана для прокрутки предполагает, что пользователь касается экрана пальцем, несколько раз перемещает его вверх или вниз, а затем убирает палец.
Хотя упрощённой модели с одним пальцем достаточно для касаний и прокрутки, для более сложных жестов требуется отслеживать несколько пальцев, положение каждого из которых представлено точкой касания. Например, жест «сведения пальцев для масштабирования» может состоять в том, что пользователь касается экрана двумя пальцами и перемещает их в противоположных направлениях; расстояние между положениями отдельных точек определяет степень масштабирования экрана, а центр воображаемой линии между этими положениями — место, куда следует переместить экран после масштабирования.
Описанные ниже низкоуровневые события сенсорного экрана можно использовать для реализации всех перечисленных выше последовательностей касаний. В этих событиях каждая точка представлена парой cons, состоящей из произвольного идентификатора точки и списка позиции мыши (см. События щелчка), указывающего положение пальца в момент возникновения события.
-
(touchscreen-begin point) -
Это событие отправляется, когда пользователь создаёт точку point, прижимая палец к сенсорному экрану.
К этим событиям также добавляются воображаемые префиксные клавиши
read-key-sequence, если они возникают над специальной частью кадра или окна. См. раздел Ввод последовательности клавиш. -
(touchscreen-update points) -
Это событие отправляется, когда точка на сенсорном экране меняет положение. points — это список точек касания, содержащий актуальные положения всех точек касания, находящихся в данный момент на сенсорном экране.
-
(touchscreen-end point canceled) -
Это событие отправляется, когда точка point больше не присутствует на экране, поскольку захват был перехвачен другой программой или пользователь убрал палец с сенсорного экрана.
canceled имеет значение, отличное от
nil, если последовательность касаний была перехвачена другой программой (например, оконным менеджером); в этом случае Emacs должен отменить или предотвратить выполнение любых команд редактирования, которые иначе могли бы быть вызваны этой последовательностью касаний.К этим событиям также добавляются воображаемые префиксные клавиши
read-key-sequence, если они возникают над специальной частью кадра или окна.
Если пользователь касается пальцем панели меню, Emacs не генерирует соответствующие события touchscreen-begin или touchscreen-end; вместо этого панель меню может отобразиться в момент, когда при иных обстоятельствах было бы доставлено событие touchscreen-end.
Если ни одна команда не привязана к touchscreen-begin, touchscreen-end или touchscreen-update, Emacs вызывает «функцию преобразования клавиш» (см. раздел Клавиатурные карты для преобразования последовательностей событий), чтобы преобразовать последовательности клавиш, содержащие события сенсорного экрана, в обычные события мыши (см. раздел События мыши). Поскольку Emacs не поддерживает различение событий, поступающих от разных устройств мыши, он предполагает, что во время преобразования активно не более двух точек касания, и не гарантирует результатов преобразования событий при превышении этого ограничения.
Emacs использует две разные стратегии преобразования событий касания в события мыши в зависимости от таких факторов, как команды, привязанные к клавиатурным картам, активным в месте возникновения события touchscreen-begin. Если в этом месте к down-mouse-1 привязана команда, начальное преобразование состоит из одного события down-mouse-1; последующие события touchscreen-update преобразуются в события перемещения мыши (см. раздел События перемещения), а последнее событие touchscreen-end преобразуется в событие mouse-1 или drag-mouse-1 (если только событие touchscreen-end не указывает, что последовательность касаний была перехвачена другой программой). Это называется «простым преобразованием» и обеспечивает прямое соответствие между перемещением точки касания и перемещением мыши.
Однако некоторые команды, привязанные, например, к down-mouse-1–mouse-drag-region, конфликтуют с определёнными жестами сенсорного экрана (например, «долгое нажатие для перетаскивания») или с ожиданиями пользователей при сенсорном вводе, поэтому к последовательности касаний не следует применять простое преобразование. Если обнаружена команда, имя которой содержит свойство (см. раздел Свойства символов) ignored-mouse-command, либо к down-mouse-1 не привязана команда, применяется более сложный вариант преобразования: сначала Emacs обрабатывает жесты сенсорного экрана (см. раздел Сенсорные экраны в Руководстве GNU Emacs), а затем пытается преобразовать события сенсорного экрана в события мыши, если до завершающего события touchscreen-end не был обнаружен жест (его параметр canceled должен иметь значение nil, как и при простом преобразовании) и к mouse-1 в месте возникновения этого события привязана команда. Перед генерацией события mouse-1 точка также устанавливается в положение события touchscreen-end, а выбирается окно, содержащее это положение. Это сделано в качестве компромисса для пакетов, предполагающих, что событие mouse-drag-region уже установило точку в месте щелчка мышью и выбрало окно, в котором он произошёл.
Чтобы предотвратить появление нежелательных событий mouse-1 после закрытия меню мыши (см. раздел Меню и мышь), Emacs также отключает простое преобразование, если down-mouse-1 привязана к клавиатурной карте и поэтому является префиксной клавишей. Вместо простого преобразования завершающее событие touchscreen-end преобразуется в событие down-mouse-1 с начальным положением последовательности касаний, в результате чего отображается меню мыши.
Простое преобразование включается независимо от наличия привязок команд или меню, если переменная touch-screen-simple-mouse-conversion привязана или установлена в значение, отличное от nil, как это может, например, сделать вызывающая сторона read-key, ожидающая получить события mouse-movement и drag-mouse-1.
Поскольку некоторые команды также привязаны к down-mouse-1 для отображения всплывающих меню, Emacs дополнительно ведёт себя так, как описано в последнем абзаце, если down-mouse-1 привязана к команде, имя которой имеет свойство mouse-1-menu-command.
Если в ходе преобразования уже обрабатываемой точки касания регистрируется вторая точка касания, преобразование жеста прекращается и измеряется расстояние от второй точки касания ( вспомогательного инструмента) до первой. Последующие перемещения любой из этих точек приводят к событиям touchscreen-pinch, содержащим отношение расстояния между их новыми положениями к расстоянию, измеренному в начале, как показано в следующей таблице.
Если при преобразовании обнаруживаются жесты касания, могут быть сгенерированы следующие события ввода:
-
(touchscreen-scroll window dx dy) -
Если в процессе преобразования обнаружен жест «прокрутки», каждое последующее событие
touchscreen-updateпреобразуется в событиеtouchscreen-scroll, где dx и dy задают в пикселях относительное перемещение точки касания от положения событияtouchscreen-begin, начавшего последовательность, или последнего событияtouchscreen-scroll— в зависимости от того, какое из них произошло позже. -
(touchscreen-hold posn) -
Если единственная активная точка касания остаётся неподвижной более
touch-screen-delayсекунд после генерации событияtouchscreen-begin, в процессе преобразования обнаруживается жест «долгого нажатия» и отправляется событиеtouchscreen-hold; значение posn задаётся списком позиции мыши, содержащим положение событияtouchscreen-begin. -
(touchscreen-drag posn) -
Если при преобразовании текущей последовательности касаний обнаружен жест «долгого нажатия» или возобновляется жест «перетаскивания для выделения» в результате действия пользовательского параметра
touch-screen-extend-selection, при каждом последующем событииtouchscreen-updateотправляется событиеtouchscreen-drag; значение posn задаётся новым положением точки касания. -
(touchscreen-restart-drag posn) -
Это событие отправляется в начале последовательности касаний, приводящей к продолжению жеста «перетаскивания для выделения» (с учётом упомянутого выше пользовательского параметра); значение posn задаётся списком позиции начального события
touchscreen-beginв этой последовательности касаний. -
(touchscreen-pinch posn ratio pan-x pan-y ratio-diff) -
Это событие доставляется при значительных изменениях положения любой из двух активных точек касания, когда активен вспомогательный инструмент.
posn — это список позиции мыши для середины линии, проведённой от вспомогательного инструмента до другой отслеживаемой точки касания.
ratio — это расстояние между двумя отслеживаемыми точками касания, делённое на расстояние между ними в момент первоначальной регистрации вспомогательной точки; иными словами, это масштаб жеста «сведения пальцев».
pan-x и pan-y — это разница между пиксельным положением posn и его положением в последнем доставленном событии этой серии событий касания; если такого события не было, используется центр между двумя точками касания в момент первоначальной регистрации вспомогательного инструмента.
ratio-diff — это разница между коэффициентом ratio этого события и коэффициентом ratio последнего доставленного события; если такого события не было, используется значение ratio.
Такие события отправляются, когда величина представляемых ими изменений приводит к тому, что значение ratio отличается от значения в предыдущем событии более чем на
0.2, либо сумма pan-x и pan-y превышает половину ширины кадра в символах, выраженную в пикселях (см. раздел Шрифт кадра).
Для Lisp-программ, обрабатывающих события сенсорного экрана, предусмотрено несколько функций. Первые две описанные ниже функции предназначены для вызова из команд, непосредственно привязанных к событиям touchscreen-begin; они позволяют отдельно обрабатывать часто используемые жесты сенсорного экрана, не полагаясь на преобразование событий мыши.
- Функция: touch-screen-track-tap event &optional update data threshold
-
Эта функция отслеживает отдельный жест «касания», начавшийся с события
touchscreen-beginevent; такое касание часто используется для установки точки или активации кнопки. Функция ожидает поступления событияtouchscreen-endс тем же идентификатором касания, после чего возвращаетt, обозначая завершение жеста.Если за это время поступает событие
touchscreen-update, содержащее хотя бы одну точку касания с тем же идентификатором, что и в event, функция update вызывается с двумя аргументами: списком точек касания из этого событияtouchscreen-updateи значением data.Если threshold отличается от
nilи такое событие указывает, что точка касания, представленная event, сместилась из положения event больше чем на заданный порог threshold (или на 10 пикселей, если это значение не является числом), возвращаетсяnilи для этой точки возобновляется преобразование событий мыши, чтобы не препятствовать распознаванию последующих жестов сенсорного экрана, возникающих в этой последовательности.Если за это время поступает любое другое событие, возвращается
nil. В этом случае вызывающая сторона не должна выполнять никаких действий.
- Функция: touch-screen-track-drag event update &optional data
-
Эта функция отслеживает отдельный жест «перетаскивания», начавшийся с события
touchscreen-beginevent.Она работает так же, как
touch-screen-track-tap, за исключением того, что возвращаетno-dragи не вызывает update, если точка касания вeventне переместилась на достаточное расстояние (по умолчанию — на 5 пикселей от положения вevent), чтобы считаться настоящим перетаскиванием.
Помимо этих двух функций, предусмотрена функция для команд, привязанных к некоторым типам событий, генерируемых при преобразовании событий мыши; она предотвращает генерацию нежелательных событий после вызова.
- Функция: touch-screen-inhibit-drag
-
Эта функция запрещает генерацию событий
touchscreen-dragпри преобразовании событий мыши до завершения обрабатываемой последовательности касаний. Её необходимо вызывать из команды, привязанной к событиюtouchscreen-holdилиtouchscreen-drag; в противном случае функция сигнализирует об ошибке.Поскольку эту функцию можно вызвать только после распознавания жеста при преобразовании событий мыши, после её вызова из событий, составляющих упомянутую выше последовательность касаний, больше не будут генерироваться события мыши.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Touchscreen-Events.html