GtkGesture
GtkGesture — Базовый класс для жестов
Функции
Сигналы
Типы и значения
Иерархия объектов
GObject ╰── GtkEventController ╰── GtkGesture ├── GtkGestureSingle ├── GtkGestureRotate ╰── GtkGestureZoom
Включенные файлы
#include <gtk/gtk.h>
Описание
GtkGesture — это базовый объект для распознавания жестов, хотя этот объект достаточно обобщён, чтобы служить основой для жестов с несколькими касаниями, он подходит для реализации жестов с одним касанием и основанных на указателе (используя специальное значение NULL последовательности событий Gdk для этих целей).
Количество касаний, которое необходимо для распознавания GtkGesture, контролируется свойством «n-points». Если жесту отслеживается меньше или больше этого количества последовательностей, он не проверяет, распознаётся ли жест.
Как только жесту будет отслеживаться ожидаемое количество касаний, жест будет регулярно запускать сигнал «check» на событиях ввода, пока жест не будет распознан. Критерии для определения жеста как «распознанного» оставляются подклассам GtkGesture.
Распознанный жест затем выпустит следующие сигналы:
Распространение событий
Для получения событий жесту необходимо либо установить фазу распространения с помощью gtk_event_controller_set_propagation_phase(), либо вручную подать их с помощью gtk_event_controller_handle_event().
В фазе захвата события распространяются сверху вниз до целевого виджета, и жесты, прикрепленные к контейнерам над виджетом, получают возможность взаимодействовать с событием, прежде чем оно достигнет цели.
После фазы захвата GTK+ испускает традиционные сигналы «button-press-event», «button-release-event», «touch-event» и т. д. Жесты с фазой GTK_PHASE_TARGET получают события от стандартных обработчиков «event».
В фазе пузырька события распространяются снизу вверх от целевого виджета до верхнего уровня, и жесты, прикреплённые к контейнерам над виджетом, получают возможность взаимодействовать с событиями, которые ещё не были обработаны.
Состояния последовательности
Всякий раз, когда происходит взаимодействие с вводом, одно событие может вызвать каскад GtkGesture как между родителями виджета, получившего событие, так и параллельно внутри отдельного виджета. Ответственность виджетов, использующих эти жесты, заключается в соответствующем установлении состояния последовательностей касаний, чтобы обеспечить сотрудничество жестов вокруг последовательностей событий Gdk, вызывающих эти жесты.
Внутри виджета жесты могут быть сгруппированы с помощью gtk_gesture_group(). Сгруппированные жесты синхронизируют состояние последовательностей, поэтому вызов gtk_gesture_set_sequence_state() для одного из них фактически распространит состояние по всей группе.
По умолчанию все последовательности начинаются в состоянии GTK_EVENT_SEQUENCE_NONE. Последовательности в этом состоянии запускают обработчик событий жеста, но распространение событий будет продолжаться без остановки жестами.
Если последовательность переходит в состояние GTK_EVENT_SEQUENCE_DENIED, группа жестов фактически проигнорирует последовательность, позволяя событиям проходить через жест без остановки, но «слот» по-прежнему будет занят, пока касание активное.
Если последовательность переходит в состояние GTK_EVENT_SEQUENCE_CLAIMED, группа жестов захватит все взаимодействия с последовательностью, выполнив:
Установка той же последовательности в состояние GTK_EVENT_SEQUENCE_DENIED для каждой другой группы жестов внутри виджета и каждого жеста в родительских виджетах в цепочке распространения.
Вызов «cancel» для каждого жеста в виджетах под цепочкой распространения.
Остановка распространения событий после обработки события группой жестов.
Примечание: если последовательность устанавливается в GTK_EVENT_SEQUENCE_CLAIMED рано на GDK_TOUCH_BEGIN/GDK_BUTTON_PRESS (так что эти события захватываются до достижения виджета события, это подразумевает GTK_PHASE_CAPTURE), при изменении последовательности на GTK_EVENT_SEQUENCE_DENIED будет эмулировано подобное событие. Таким образом, сохраняется согласованность событий до повторной остановки распространения событий.
Состояния последовательности нельзя изменять произвольно. См. gtk_gesture_set_sequence_state(), чтобы узнать о возможных сроках существования последовательности событий Gdk.
Жесты трекпада
На платформах, которые это поддерживают, GtkGesture будет прозрачно обрабатывать события жестов трекпада. Единственные предосторожности, которые пользователи GtkGesture должны принять для включения этой поддержки:
Включение
GDK_TOUCHPAD_GESTURE_MASKв своих окнах GdkЕсли жесту задана фаза
GTK_PHASE_NONE, обеспечение обработки событий типаGDK_TOUCHPAD_SWIPEиGDK_TOUCHPAD_PINCHв GtkGesture
Функции
gtk_gesture_get_device ()
GdkDevice *
gtk_gesture_get_device (GtkGesture *gesture); Возвращает ведущее GdkDevice, которое в данный момент управляет gesture, или NULL, если с жестом не происходит взаимодействия.
Параметры
gesture |
С версии: 3.14
gtk_gesture_get_window ()
GdkWindow *
gtk_gesture_get_window (GtkGesture *gesture); Возвращает определяемое пользователем окно, которое получает события, обрабатываемые gesture. См. gtk_gesture_set_window() для получения дополнительной информации.
Параметры
gesture |
Возвращаемое значение
определяемое пользователем окно, или NULL, если такового нет.
[nullable][transfer none]
С версии: 3.14
gtk_gesture_set_window ()
void gtk_gesture_set_window (GtkGesture *gesture,GdkWindow *window);
Устанавливает определённое окно для получения событий, таким образом gesture будет эффективно обрабатывать только события, предназначенные для window или его потомка. window должно относиться к gtk_event_controller_get_widget().
Параметры
gesture | ||
window | [allow-none] |
С версии: 3.14
gtk_gesture_is_active ()
gboolean
gtk_gesture_is_active (GtkGesture *gesture); Возвращает TRUE, если жест в данный момент активен. Жест активен, пока с ним взаимодействуют последовательности касаний.
Параметры
gesture |
Возвращаемое значение
TRUE, если жест активен
С версии: 3.14
gtk_gesture_is_recognized ()
gboolean
gtk_gesture_is_recognized (GtkGesture *gesture); Возвращает TRUE, если жест в данный момент распознан. Жест распознаётся, если существует столько же взаимодействующих последовательностей касаний, сколько требуется gesture, и “check” вернул TRUE для последовательностей, которые в данный момент интерпретируются.
Параметры
gesture |
Возвращаемое значение
TRUE, если жест распознан
С версии: 3.14
gtk_gesture_get_sequence_state ()
GtkEventSequenceState gtk_gesture_get_sequence_state (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает состояние sequence, как видно из gesture.
Параметры
gesture | ||
sequence |
Возвращаемое значение
Состояние последовательности в gesture
С версии: 3.14
gtk_gesture_set_sequence_state ()
gboolean gtk_gesture_set_sequence_state (GtkGesture *gesture,GdkEventSequence *sequence,GtkEventSequenceState state);
Устанавливает состояние sequence в gesture. Последовательности начинаются в состоянии GTK_EVENT_SEQUENCE_NONE, и когда они меняют состояние, они никогда не могут вернуться к этому состоянию. Аналогично, последовательности в состоянии GTK_EVENT_SEQUENCE_DENIED не могут вернуться к состоянию, не являющемуся запрещённым. С учётом этих правил, время жизни последовательности событий ограничивается следующими четырьмя:
None
None → Denied
None → Claimed
None → Claimed → Denied
Примечание: Из-за порядка обработки событий, установка состояния на другом жесте внутри обработчика сигнала “begin” может быть небезопасной, поскольку обратный вызов может быть выполнен до того, как другой жест узнает о последовательности. Безопасный способ выполнить это может быть:
staticvoid first_gesture_begin_cb(GtkGesture*first_gesture, GdkEventSequence*sequence, gpointer user_data) { gtk_gesture_set_sequence_state(first_gesture, sequence, GTK_EVENT_SEQUENCE_ACCEPTED); gtk_gesture_set_sequence_state(second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED); } staticvoid second_gesture_begin_cb(GtkGesture*second_gesture, GdkEventSequence*sequence, gpointer user_data) { if(gtk_gesture_get_sequence_state(first_gesture, sequence)== GTK_EVENT_SEQUENCE_ACCEPTED) gtk_gesture_set_sequence_state(second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED); }
Если оба жеста находятся в одной группе, просто установите состояние на жесте, генерирующем событие, последовательность уже будет инициализирована в глобальное состояние группы, когда второй жест обработает событие.
Параметры
gesture | ||
sequence | ||
state | состояние последовательности |
Возвращаемое значение
TRUE, если sequence обрабатывается gesture, и состояние успешно изменено
С версии: 3.14
gtk_gesture_set_state ()
gboolean gtk_gesture_set_state (GtkGesture *gesture,GtkEventSequenceState state);
Устанавливает состояние всех последовательностей, с которыми gesture в данный момент взаимодействует. См. gtk_gesture_set_sequence_state() для получения более подробной информации о состояниях последовательностей.
Параметры
gesture | объект GtkGesture | |
state | состояние последовательности |
Возвращаемое значение
TRUE, если состояние хотя бы одной последовательности было успешно изменено
С: 3.14
gtk_gesture_get_sequences ()
GList *
gtk_gesture_get_sequences (GtkGesture *gesture); Возвращает список GdkEventSequences, которые в данный момент интерпретируются gesture.
Параметры
gesture | объект GtkGesture |
Возвращаемое значение
Список GdkEventSequences. Элементы списка принадлежат GTK+ и не должны освобождаться или изменяться. Список необходимо удалить с помощью g_list_free().
[transfer container][element-type GdkEventSequence]
С: 3.14
gtk_gesture_handles_sequence ()
gboolean gtk_gesture_handles_sequence (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает TRUE, если gesture в данный момент обрабатывает события, соответствующие sequence.
Параметры
gesture | объект GtkGesture | |
sequence | объект GdkEventSequence |
Возвращаемое значение
TRUE, если gesture обрабатывает sequence
С: 3.14
gtk_gesture_get_last_updated_sequence ()
GdkEventSequence *
gtk_gesture_get_last_updated_sequence (GtkGesture *gesture); Возвращает GdkEventSequence, который был последним обновлён в gesture.
Параметры
gesture | объект GtkGesture |
Возвращаемое значение
Последняя обновлённая последовательность.
[transfer none][nullable]
С: 3.14
gtk_gesture_get_last_event ()
const GdkEvent * gtk_gesture_get_last_event (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает последнее обработанное событие для sequence.
Параметры
gesture | объект GtkGesture | |
sequence | объект GdkEventSequence |
Возвращаемое значение
Последнее событие из sequence.
[transfer none][nullable]
gtk_gesture_get_point ()
gboolean gtk_gesture_get_point (GtkGesture *gesture,GdkEventSequence *sequence,gdouble *x,gdouble *y);
Если sequence в данный момент интерпретируется gesture, эта функция возвращает TRUE и заполняет x и y последними сохранёнными координатами для этой последовательности событий. Координаты всегда относительны к выделению виджета.
Параметры
gesture | объект GtkGesture | |
sequence | объект GdkEventSequence или | [allow-none] |
x | место для возвращаемой координаты X. | [out][allow-none] |
y | место для возвращаемой координаты Y. | [out][allow-none] |
Возвращаемое значение
TRUE, если sequence в данный момент интерпретируется
С: 3.14
gtk_gesture_get_bounding-box ()
gboolean gtk_gesture_get_bounding_box (GtkGesture *gesture,GdkRectangle *rect);
Если в настоящее время обрабатываются последовательности касаний с помощью gesture, эта функция возвращает TRUE и заполняет rect прямоугольником, содержащим все активные касания. В противном случае будет возвращено FALSE.
Примечание: Эта функция может давать непредсказуемые результаты при работе с жестами на сенсорной панели. Поскольку нет корреляции между физическими и пиксельными расстояниями, эти жесты будут выглядеть как ограниченные бесконечно малой областью, поэтому ширина и высота rect будут равны 0 независимо от количества точек касания.
Параметры
gesture | ||
rect | прямоугольник, содержащий все активные касания. | [out] |
С: 3.14
gtk_gesture_get_bounding-box_center ()
gboolean gtk_gesture_get_bounding_box_center (GtkGesture *gesture,gdouble *x,gdouble *y);
Если в настоящее время обрабатываются последовательности касаний с помощью gesture, эта функция возвращает TRUE и заполняет x и y координатами центра прямоугольника, содержащего все активные касания. В противном случае будет возвращено FALSE.
Параметры
gesture | ||
x | координата X центра прямоугольника. | [out] |
y | координата Y центра прямоугольника. | [out] |
С: 3.14
gtk_gesture_group ()
void gtk_gesture_group (GtkGesture *group_gesture,GtkGesture *gesture);
Добавляет gesture в ту же группу, что и group_gesture. По умолчанию жесты изолированы в своих группах.
При группировании жестов состояние GdkEventSequences сохраняется синхронизированным для всех из них, поэтому вызов gtk_gesture_set_sequence_state() для одного из них передаст то же значение другим.
Группы также выполняют «неявный захват» последовательностей, если состояние GdkEventSequence устанавливается в GTK_EVENT_SEQUENCE_CLAIMED для одной группы, все остальные группы жестов, прикрепленные к одному GtkWidget, изменят состояние для этой последовательности на GTK_EVENT_SEQUENCE_DENIED.
Параметры
gesture | ||
group_gesture | GtkGesture для группирования |
С: 3.14
gtk_gesture_ungroup ()
void
gtk_gesture_ungroup (GtkGesture *gesture); Разделяет gesture в изолированную группу.
Параметры
gesture |
С: 3.14
gtk_gesture_get_group ()
GList *
gtk_gesture_get_group (GtkGesture *gesture); Возвращает список всех жестов в группе gesture.
Параметры
gesture |
Возвращаемое значение
Список GtkGestures, освобождаемый с помощью g_list_free().
[element-type GtkGesture][transfer container]
С: 3.14
gtk_gesture_is_grouped_with ()
gboolean gtk_gesture_is_grouped_with (GtkGesture *gesture,GtkGesture *other);
Возвращает TRUE, если оба жеста относятся к одной группе.
Параметры
gesture | ||
other | another GtkGesture |
Возвращаемое значение
Принадлежат ли жесты одной группе
С: 3.14
Типы и Значения
GtkGesture
typedef struct _GtkGesture GtkGesture;
enum GtkEventSequenceState
Описывает состояние GdkEventSequence в GtkGesture.
Элементы
GTK_EVENT_SEQUENCE_NONE | Последовательность обрабатывается, но не захвачена. | |
GTK_EVENT_SEQUENCE_CLAIMED | Последовательность обрабатывается и захвачена. | |
GTK_EVENT_SEQUENCE_DENIED | Последовательность отклонена. |
С: 3.14
Подробное описание свойств
Свойство “n-points”
“n-points” guint
Количество точек касания, которые вызывают распознавание этого жеста.
Флаги: Чтение / Запись / Только для создания
Допустимые значения: >= 1
Значение по умолчанию: 1
С момента: 3.14
Свойство “window”
“window” GdkWindow *
Если не NULL, жест будет следить только за событиями, происходящими на этом окне GdkWindow или его дочернем элементе.
Флаги: Чтение / Запись
С момента: 3.14
Подробное описание сигналов
Сигнал “begin”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда жест распознается. Это означает, что количество последовательностей касаний соответствует «n-points», и обработчик(и) «check» возвращают TRUE.
Примечание: Эти условия также могут выполняться, когда дополнительное касание (например, третье касание при жесте с 2 касаниями) снимается, в этом случае sequence не будет относиться к текущему набору активных касаний, поэтому не полагайтесь на то, что это будет истинно.
Параметры
gesture | объект, получивший сигнал | |
sequence | GdkEventSequence, вызвавший распознавание жеста | |
user_data | пользовательские данные, установленные при подключении обработчика сигнала. |
Флаги: Выполнить в последнюю очередь
С момента: 3.14
Сигнал “cancel”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется всякий раз, когда последовательность отменяется. Это обычно происходит с активными касаниями, когда gtk_event_controller_reset() вызывается у gesture (вручную, из-за захватов...) или когда отдельный sequence затребован контроллерами родительских виджетов (см. gtk_gesture_set_sequence_state()).
gesture должен забыть все о sequence в ответ на этот сигнал.
Параметры
Флаги: Выполнить в последнюю очередь
С момента: 3.14
Сигнал “end”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда gesture либо перестает распознавать последовательности событий как обрабатываемые (обработчик «check» возвратил FALSE), либо количество последовательностей касаний стало больше или меньше, чем «n-points».
Примечание: sequence может не относиться к группе последовательностей, которые ранее вызывали распознавание gesture (например, только что нажатая последовательность касаний, превышающая «n-points»). Эта ситуация может быть обнаружена с помощью проверки через gtk_gesture_handles_sequence().
Параметры
Флаги: Выполнить в последнюю очередь
С момента: 3.14
Сигнал “sequence-state-changed”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, GtkEventSequenceState state, gpointer user_data)
Этот сигнал генерируется всякий раз, когда состояние последовательности изменяется. См. gtk_gesture_set_sequence_state(), чтобы узнать больше об ожидаемой продолжительности жизни последовательностей.
Параметры
Флаги: Выполнить в последнюю очередь
С момента: 3.14
Сигнал “update”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется всякий раз, когда событие обрабатывается во время распознавания жеста. sequence гарантированно относится к набору активных касаний.
Параметры
Флаги: Выполнить в последнюю очередь
С момента: 3.14
См. также
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer.gnome.org/gtk3/3.20/GtkGesture.html