GtkGesture
GtkGesture — Базовый класс для жестов
Функции
| GdkDevice * | gtk_gesture_get_device () |
| GdkWindow * | gtk_gesture_get_window () |
| void | gtk_gesture_set_window () |
| 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 () |
| const 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 () |
Сигналы
| 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». Если жест отслеживает меньше или больше этого количества последовательностей, он не будет проверять, распознан ли жест.
Как только у жеста будет необходимое количество касаний, жест будет регулярно запускать сигнал «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».
В фазе всплытия события распространяются снизу вверх от целевого виджета к главному элементу, и жесты, прикрепленные к контейнерам выше виджета, получают возможность взаимодействовать с событиями, которые еще не были обработаны.
Состояния последовательности
Всякий раз, когда происходит взаимодействие с вводом, одно событие может вызвать цепную реакцию GtkGestures как между родителями виджета, получившего событие, так и параллельно внутри отдельного виджета. Ответственность виджетов, использующих эти жесты, заключается в соответствующей установке состояния последовательностей касаний для обеспечения сотрудничества жестов вокруг 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для их GdkWindowsЕсли у жеста есть
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 | a GdkWindow, или | [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” может быть небезопасной, поскольку обратный вызов может быть выполнен до того, как другой жест узнает о последовательности. Безопасный способ сделать это может быть следующим:
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, и состояние успешно изменено
С версии: 3.14
gtk_gesture_set_state ()
gboolean gtk_gesture_set_state (GtkGesture *gesture,GtkEventSequenceState state);
Устанавливает состояние всех последовательностей, с которыми gesture в данный момент взаимодействует. См. gtk_gesture_set_sequence_state() для получения дополнительной информации о состояниях последовательностей.
Параметры
gesture | ||
state | состояние последовательности |
Возвращаемое значение
TRUE если состояние хотя бы одной последовательности было успешно изменено
С версии: 3.14
gtk_gesture_get_sequences ()
GList *
gtk_gesture_get_sequences (GtkGesture *gesture); Возвращает список GdkEventSequences, в данный момент интерпретируемых gesture.
Параметры
gesture |
Возвращаемое значение
Список 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 | ||
sequence | a GdkEventSequence или | [nullable] |
Возвращаемое значение
TRUE, если gesture обрабатывает sequence, FALSE в противном случае.
С момента: 3.14
gtk_gesture_get_last_updated_sequence ()
GdkEventSequence *
gtk_gesture_get_last_updated_sequence (GtkGesture *gesture); Возвращает GdkEventSequence, который был последний обновлён в gesture.
Параметры
gesture |
Возвращаемое значение
Последний обновленный последовательность.
[transfer none][nullable]
С момента: 3.14
gtk_gesture_get_last_event ()
const 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,gdouble *x,gdouble *y);
Если sequence в данный момент интерпретируется gesture, эта функция возвращает TRUE и заполняет x и y последними сохранёнными координатами для этой последовательности событий. Координаты всегда относительны к размещению виджета.
Параметры
gesture | ||
sequence | a 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] |
Возвращаемое значение
TRUE если активны касания, FALSE в противном случае.
С момента: 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 | объект GtkGesture | |
x | Координата X центра ограничивающей рамки. | [out] |
y | Координата Y центра ограничивающей рамки. | [out] |
Возвращаемое значение
FALSE если активных касаний нет, TRUE в противном случае
С: 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 | объект GtkGesture | |
group_gesture | объект GtkGesture для группирования с |
С: 3.14
gtk_gesture_ungroup ()
void
gtk_gesture_ungroup (GtkGesture *gesture); Отделяет gesture в изолированную группу.
Параметры
gesture | объект GtkGesture |
С: 3.14
gtk_gesture_get_group ()
GList *
gtk_gesture_get_group (GtkGesture *gesture); Возвращает список всех жестов в группе gesture
Параметры
gesture | объект GtkGesture |
Возвращаемое значение
Список 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 | объект GtkGesture | |
other | другой объект GtkGesture |
Возвращаемое значение
Являются ли жесты сгруппированными
С: 3.14
Типы и значения
GtkGesture
typedef struct _GtkGesture GtkGesture;
перечисление GtkEventSequenceState
Описывает состояние GdkEventSequence в объекте GtkGesture.
Элементы
GTK_EVENT_SEQUENCE_NONE | Последовательность обрабатывается, но не захвачена. | |
GTK_EVENT_SEQUENCE_CLAIMED | Последовательность обрабатывается и захвачена. | |
GTK_EVENT_SEQUENCE_DENIED | Последовательность отклонена. |
С: 3.14
Подробности свойств
Свойство “n-points”
“n-points” guint
Количество точек касания, которые вызывают распознавание жеста.
Владелец: GtkGesture
Флаги: Чтение / Запись / Только для конструирования
Допустимые значения: >= 1
Значение по умолчанию: 1
С: 3.14
Подробности сигналов
Сигнал “begin”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда распознается жест. Это означает, что количество последовательностей касаний соответствует “n-точек”, и обработчик(и) “проверки” вернули TRUE.
Примечание: Эти условия также могут возникнуть, когда поднято дополнительное касание (например, третье касание при жесте с двумя касаниями). В этом случае sequence не будет относиться к текущему набору активных касаний, поэтому не полагайтесь на то, что это будет истинно.
Параметры
жест | объект, получивший сигнал | |
последовательность | событие GdkEventSequence, которое привело к распознаванию жеста. | [nullable] |
данные_пользователя | данные пользователя, заданные при подключении обработчика сигнала. |
Флаги: Выполнять последним
С: 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 в ответ на этот сигнал.
Параметры
жест | объект, получивший сигнал | |
последовательность | отменённая GdkEventSequence. | [nullable] |
данные_пользователя | данные пользователя, заданные при подключении обработчика сигнала. |
Флаги: Выполнять последним
С: 3.14
Сигнал “end”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется, когда gesture прекратило распознавание последовательностей событий как требующих обработки (обработчик “проверки” вернул FALSE) или количество последовательностей касаний стало больше или меньше, чем “n-точек”.
Примечание: sequence может не относиться к группе последовательностей, которые ранее вызывали распознавание gesture (например, только что нажатая последовательность касаний, которая превысила “n-точек”). Эту ситуацию можно определить, проверив gtk_gesture_handles_sequence().
Параметры
жест | объект, получивший сигнал | |
последовательность | событие GdkEventSequence, которое завершило распознавание жеста. | [nullable] |
данные_пользователя | данные пользователя, заданные при подключении обработчика сигнала. |
Флаги: Выполнять последним
С: 3.14
Сигнал “sequence-state-changed”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, GtkEventSequenceState state, gpointer user_data)
Этот сигнал генерируется всякий раз, когда состояние последовательности меняется. Смотрите gtk_gesture_set_sequence_state(), чтобы узнать больше о жизненном цикле последовательности.
Параметры
жест | объект, получивший сигнал | |
последовательность | отменённая GdkEventSequence. | [nullable] |
состояние | новое состояние последовательности | |
данные_пользователя | данные пользователя, заданные при подключении обработчика сигнала. |
Флаги: Выполнять последним
С: 3.14
Сигнал “update”
void user_function (GtkGesture *gesture, GdkEventSequence *sequence, gpointer user_data)
Этот сигнал генерируется всякий раз, когда событие обрабатывается во время распознавания жеста. sequence гарантированно относится к набору активных касаний.
Параметры
жест | объект, получивший сигнал | |
последовательность | обновлённая GdkEventSequence. | [nullable] |
данные_пользователя | данные пользователя, заданные при подключении обработчика сигнала. |
Флаги: Выполнять последним
С: 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.24/GtkGesture.html