GtkGesture
GtkGesture — Базовый класс для жестов
Функции
| GdkDevice * | gtk_gesture_get_device () |
| gboolean | gtk_gesture_is_active () |
| gboolean | gtk_gesture_is_recognized () |
| GtkEventSequenceState | gtk_gesture_get_sequence_state () |
| gboolean | gtk_gesture_set_sequence_state () |
| gboolean | gtk_gesture_set_state () |
| GList * | gtk_gesture_get_sequences () |
| gboolean | gtk_gesture_handles_sequence () |
| GdkEventSequence * | gtk_gesture_get_last_updated_sequence () |
| GdkEvent * | gtk_gesture_get_last_event () |
| gboolean | gtk_gesture_get_point () |
| gboolean | gtk_gesture_get_bounding-box () |
| gboolean | gtk_gesture_get_bounding_box_center () |
| void | gtk_gesture_group () |
| void | gtk_gesture_ungroup () |
| GList * | gtk_gesture_get_group () |
| gboolean | gtk_gesture_is_grouped_with () |
Свойства
| guint | n-points | Чтение / Запись / Только для создания |
Сигналы
| void | begin | Выполнить последним |
| void | cancel | Выполнить последним |
| void | end | Выполнить последним |
| void | sequence-state-changed | Выполнить последним |
| void | update | Выполнить последним |
Типы и значения
| GtkGesture | |
| перечисление | GtkEventSequenceState |
Иерархия объектов
GObject
╰── GtkEventController
╰── GtkGesture
├── GtkGestureSingle
├── GtkGestureRotate
╰── GtkGestureZoom
Включенные файлы
#include <gtk/gtk.h>
Описание
GtkGesture — базовый объект для распознавания жестов, хотя этот объект довольно обобщён для работы с многотач-жестами, он подходит для реализации жестов с одним касанием и на основе указателя (используя специальное значение NULL GdkEventSequence для этих случаев).
Количество касаний, необходимое для распознавания жеста GtkGesture, контролируется свойством «n-points». Если жест отслеживает меньше или больше этого числа последовательностей, он не проверяет, распознан ли жест.
Как только жест имеет ожидаемое количество касаний, он регулярно проверяет, распознан ли он. Критерии для определения жеста как «распознанного» определяются подклассами GtkGesture.
Распознанный жест затем будет генерировать следующие сигналы:
Распространение событий
Для получения событий жест должен установить фазу распространения с помощью gtk_event_controller_set_propagation_phase().
На фазе захвата события распространяются сверху вниз от корневого виджета к целевому виджету, и жесты, прикреплённые к контейнерам над виджетом, получают возможность взаимодействовать с событием, прежде чем оно достигнет цели.
На фазе всплытия события распространяются снизу вверх от целевого виджета к корневому виджету, и жесты, прикреплённые к контейнерам над виджетом, получают возможность взаимодействовать с событиями, которые ещё не были обработаны.
Состояния последовательности
Всякий раз, когда происходит взаимодействие с вводом, одно событие может вызвать каскад GtkGesture как между родителями виджета, получающего событие, так и параллельно внутри отдельного виджета. Ответственность виджетов, использующих эти жесты, заключается в соответствующем установлении состояния последовательностей касаний для обеспечения взаимодействия жестов вокруг GdkEventSequences, которые их запускают.
Внутри виджета жесты могут быть сгруппированы с помощью 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(), чтобы узнать о возможных сроках существования GdkEventSequence.
Жесты тачпада
На платформах, которые это поддерживают, GtkGesture прозрачно обработает события жестов тачпада. Единственные меры предосторожности, которые должны принять пользователи GtkGesture для включения этой поддержки, заключаются в следующем:
Включение
GDK_TOUCHPAD_GESTURE_MASKдля их GdkSurfacesЕсли у жеста установлено
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 |
gtk_gesture_is_active ()
gboolean
gtk_gesture_is_active (GtkGesture *gesture); Возвращает TRUE , если жести активно в данный момент. Жест активен, пока с ним взаимодействуют последовательности касаний.
Параметры
gesture |
Возвращаемое значение
TRUE если жести активна
gtk_gesture_is_recognized ()
gboolean
gtk_gesture_is_recognized (GtkGesture *gesture); Возвращает TRUE , если жести распознана в данный момент. Жест распознан, если с ним взаимодействует столько последовательностей касаний, сколько требуется gesture.
Параметры
gesture |
Возвращаемое значение
TRUE если жести распознана
gtk_gesture_get_sequence_state ()
GtkEventSequenceState gtk_gesture_get_sequence_state (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает состояние sequence, как видно gesture.
Параметры
gesture | ||
sequence |
Возвращаемое значение
Состояние последовательности в gesture
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”, так как обратный вызов может быть выполнен до того, как другая жести узнает о последовательности. Безопасный способ сделать это может быть следующим:
static void
first_gesture_begin_cb (GtkGesture *first_gesture,
GdkEventSequence *sequence,
gpointer user_data)
{
gtk_gesture_set_sequence_state (first_gesture, sequence, GTK_EVENT_SEQUENCE_CLAIMED);
gtk_gesture_set_sequence_state (second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
}
static void
second_gesture_begin_cb (GtkGesture *second_gesture,
GdkEventSequence *sequence,
gpointer user_data)
{
if (gtk_gesture_get_sequence_state (first_gesture, sequence) == GTK_EVENT_SEQUENCE_CLAIMED)
gtk_gesture_set_sequence_state (second_gesture, sequence, GTK_EVENT_SEQUENCE_DENIED);
}Если обе жести находятся в одной группе, просто установите состояние на жести, которая испускает событие, так как последовательность уже будет инициализирована к глобальному состоянию группы, когда вторая жести обрабатывает событие.
Параметры
gesture | ||
sequence | ||
state | состояние последовательности |
Возвращаемое значение
TRUE , если sequence обрабатывается gesture и состояние изменено успешно
gtk_gesture_set_state ()
gboolean gtk_gesture_set_state (GtkGesture *gesture,GtkEventSequenceState state);
Устанавливает состояние всех последовательностей, с которыми gesture в данный момент взаимодействует. См. gtk_gesture_set_sequence_state() для получения дополнительной информации о состояниях последовательности.
Параметры
gesture | ||
state | состояние последовательности |
Возвращаемое значение
TRUE , если состояние хотя бы одной последовательности было изменено успешно
gtk_gesture_get_sequences ()
GList *
gtk_gesture_get_sequences (GtkGesture *gesture); Возвращает список GdkEventSequences, которые в настоящее время интерпретируются gesture.
Параметры
gesture |
Возвращаемое значение
Список GdkEventSequences, элементы списка принадлежат GTK и не должны освобождаться или изменяться, сам список должен быть удален через g_list_free().
[transfer container][element-type GdkEventSequence]
gtk_gesture_handles_sequence ()
gboolean gtk_gesture_handles_sequence (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает TRUE , если gesture в данный момент обрабатывает события, соответствующие sequence.
Параметры
gesture | ||
sequence | a GdkEventSequence или | [nullable] |
Возвращаемое значение
TRUE если gesture обрабатывает sequence, FALSE иначе
gtk_gesture_get_last_updated_sequence ()
GdkEventSequence *
gtk_gesture_get_last_updated_sequence (GtkGesture *gesture); Возвращает GdkEventSequence, который был последним обновлён gesture.
Параметры
gesture |
Возвращаемое значение
Последняя обновлённая последовательность.
[transfer none][nullable]
gtk_gesture_get_last_event ()
GdkEvent * gtk_gesture_get_last_event (GtkGesture *gesture,GdkEventSequence *sequence);
Возвращает последний обработанный событие для sequence .
Обратите внимание, что возвращаемый указатель действителен только до тех пор, пока sequence все еще интерпретируется gesture . В случае сомнений, вы должны сделать копию события.
Параметры
gesture | ||
sequence | [nullable] |
Возвращает
Последнее событие из sequence .
[transfer none][nullable]
gtk_gesture_get_point ()
gboolean gtk_gesture_get_point (GtkGesture *gesture,GdkEventSequence *sequence,double *x,double *y);
Если sequence в настоящее время интерпретируется gesture , эта функция возвращает TRUE и заполняет x и y последними сохраненными координатами для этой последовательности событий. Координаты всегда относительны к выделению виджета.
Параметры
gesture | ||
sequence | a GdkEventSequence, или | [allow-none] |
x | место возврата для оси X координат последовательности. | [out][allow-none] |
y | место возврата для оси Y координат последовательности. | [out][allow-none] |
Возвращает
TRUE если sequence в настоящее время интерпретируется
gtk_gesture_get_bounding_box ()
gboolean gtk_gesture_get_bounding_box (GtkGesture *gesture,GdkRectangle *rect);
Если есть последовательности касаний, которые в настоящее время обрабатываются gesture , эта функция возвращает TRUE и заполняет rect прямоугольником, содержащим все активные касания. В противном случае возвращается FALSE.
Примечание: Эта функция даст неожиданные результаты при работе с жестами трекпада. Так как нет корреляции между физическим и пиксельным расстоянием, эти жесты будут выглядеть, как будто ограничены бесконечно малой областью, поэтому ширина и высота rect будут равны 0 независимо от количества точек касания.
Параметры
gesture | ||
rect | прямоугольник, содержащий все активные касания. | [out] |
Возвращает
TRUE если есть активные касания, FALSE в противном случае
gtk_gesture_get_bounding_box_center ()
gboolean gtk_gesture_get_bounding_box_center (GtkGesture *gesture,double *x,double *y);
Если есть последовательности касаний, которые в настоящее время обрабатываются gesture , эта функция возвращает TRUE и заполняет x и y координатами центра прямоугольника, содержащего все активные касания. В противном случае возвращается FALSE.
Параметры
gesture | ||
x | Координата X центра прямоугольника. | [out] |
y | Координата Y центра прямоугольника. | [out] |
Возвращает
FALSE если активных касаний нет, TRUE в противном случае
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 для группирования |
gtk_gesture_ungroup ()
void
gtk_gesture_ungroup (GtkGesture *gesture); Отделяет gesture в изолированную группу.
Параметры
gesture |
gtk_gesture_get_group ()
GList *
gtk_gesture_get_group (GtkGesture *gesture); Возвращает все жесты в группе gesture
Параметры
gesture |
Возвращает
Список GtkGestures, освобождается с помощью g_list_free().
[element-type GtkGesture][transfer container]
gtk_gesture_is_grouped_with ()
gboolean gtk_gesture_is_grouped_with (GtkGesture *gesture,GtkGesture *other);
Возвращает TRUE, если оба жеста относятся к одной группе.
Параметры
жест | объект GtkGesture | |
другой | ещё один объект GtkGesture |
Возвращаемое значение
являются ли жесты сгруппированными
Типы и значения
GtkGesture
typedef struct _GtkGesture GtkGesture;
перечисление GtkEventSequenceState
Описывает состояние GdkEventSequence в объекте GtkGesture.
Элементы
GTK_EVENT_SEQUENCE_NONE | Последовательность обработана, но не захвачена. | |
GTK_EVENT_SEQUENCE_CLAIMED | Последовательность обработана и захвачена. | |
GTK_EVENT_SEQUENCE_DENIED | Последовательность отклонена. |
Подробности свойств
Свойство “n-points”
“n-points” guint
Количество точек касания, которые вызывают распознавание этого жеста,
Владелец: GtkGesture
Флаги: Чтение / Запись / Только для построения
Допустимые значения: >= 1
Значение по умолчанию: 1
Подробности сигналов
Сигнал “begin”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда жест распознан. Это означает, что количество последовательностей касаний соответствует “n-points”.
Примечание: Эти условия также могут возникнуть, когда дополнительная точка касания (например, третья точка касания в жесте из двух касаний) поднята, в этой ситуации sequence не будет относиться к текущему набору активных касаний, поэтому не полагайтесь на это.
Параметры
жест | объект, получивший сигнал | |
последовательность | объект GdkEventSequence, по которому был распознан жест. | [nullable] |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Выполнять последним
Сигнал “cancel”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется всякий раз, когда последовательность отменяется. Это обычно происходит с активными касаниями, когда gtk_event_controller_reset() вызывается на gesture (вручную, из-за захвата...) или отдельный sequence был захвачен контроллерами родительских виджетов (см. gtk_gesture_set_sequence_state()).
gesture должен забыть все о sequence в ответ на этот сигнал.
Параметры
жест | объект, получивший сигнал | |
последовательность | объект GdkEventSequence, который был отменён. | [nullable] |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Выполнять последним
Сигнал “end”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда gesture либо перестал распознавать последовательности событий как требующие обработки, либо количество последовательностей касаний стало больше или меньше, чем “n-points”.
Примечание: sequence может не относиться к группе последовательностей, которые ранее вызывали распознавание gesture (например, только что нажатая последовательность касаний, которая превышает “n-points”). Эта ситуация может быть обнаружена, проверив gtk_gesture_handles_sequence().
Параметры
жест | объект, получивший сигнал | |
последовательность | объект GdkEventSequence, завершивший распознавание жеста. | [nullable] |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Выполнять последним
Сигнал “sequence-state-changed”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, GtkEventSequenceState state, gpointer user_data)
Этот сигнал генерируется всякий раз, когда меняется состояние последовательности. См. gtk_gesture_set_sequence_state(), чтобы узнать больше о жизненном цикле последовательностей.
Параметры
жест | объект, получивший сигнал | |
последовательность | объект GdkEventSequence, который был отменён. | [nullable] |
состояние | новое состояние последовательности | |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Выполнять последним
Сигнал “update”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется всякий раз, когда событие обрабатывается, пока жест распознаётся. sequence гарантированно относится к набору активных касаний.
Параметры
жест | объект, получивший сигнал | |
последовательность | объект GdkEventSequence, который был обновлён. | [nullable] |
user_data | данные пользователя, установленные при подключении обработчика сигнала. |
Флаги: Выполнять последним
См. также
© 2005–2020 The GNOME Project
Licensed under the GNU Lesser General Public License version 2.1 or later.
https://developer-old.gnome.org/gtk4/4.0/GtkGesture.html