Spec-Zone.ru › GTK 4.0

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.

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

  • «begin», когда жест распознан.

  • Несколько сигналов «update» всякий раз, когда обрабатывается событие ввода.

  • «end», когда жест больше не распознаётся.

Распространение событий

Для получения событий жест должен установить фазу распространения с помощью 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

a GtkGesture

Возвращаемое значение

a GdkDevice, или NULL.

[nullable][transfer none]

gtk_gesture_is_active ()

gboolean
gtk_gesture_is_active (GtkGesture *gesture);

Возвращает TRUE , если жести активно в данный момент. Жест активен, пока с ним взаимодействуют последовательности касаний.

Параметры

gesture

a GtkGesture

Возвращаемое значение

TRUE если жести активна

gtk_gesture_is_recognized ()

gboolean
gtk_gesture_is_recognized (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

Возвращаемое значение

TRUE если жести распознана

gtk_gesture_get_sequence_state ()

GtkEventSequenceState
gtk_gesture_get_sequence_state (GtkGesture *gesture,
                                GdkEventSequence *sequence);

Возвращает состояние sequence, как видно gesture.

Параметры

gesture

a GtkGesture

sequence

a GdkEventSequence

Возвращаемое значение

Состояние последовательности в 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

a GtkGesture

sequence

a GdkEventSequence

state

состояние последовательности

Возвращаемое значение

TRUE , если sequence обрабатывается gesture и состояние изменено успешно

gtk_gesture_set_state ()

gboolean
gtk_gesture_set_state (GtkGesture *gesture,
                       GtkEventSequenceState state);

Устанавливает состояние всех последовательностей, с которыми gesture в данный момент взаимодействует. См. gtk_gesture_set_sequence_state() для получения дополнительной информации о состояниях последовательности.

Параметры

gesture

a GtkGesture

state

состояние последовательности

Возвращаемое значение

TRUE , если состояние хотя бы одной последовательности было изменено успешно

gtk_gesture_get_sequences ()

GList *
gtk_gesture_get_sequences (GtkGesture *gesture);

Возвращает список GdkEventSequences, которые в настоящее время интерпретируются gesture.

Параметры

gesture

a GtkGesture

Возвращаемое значение

Список 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

a GtkGesture

sequence

a GdkEventSequence или NULL.

[nullable]

Возвращаемое значение

TRUE если gesture обрабатывает sequence, FALSE иначе

gtk_gesture_get_last_updated_sequence ()

GdkEventSequence *
gtk_gesture_get_last_updated_sequence (GtkGesture *gesture);

Возвращает GdkEventSequence, который был последним обновлён gesture.

Параметры

gesture

a GtkGesture

Возвращаемое значение

Последняя обновлённая последовательность.

[transfer none][nullable]

gtk_gesture_get_last_event ()

GdkEvent *
gtk_gesture_get_last_event (GtkGesture *gesture,
                            GdkEventSequence *sequence);

Возвращает последний обработанный событие для sequence .

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

Параметры

gesture

a GtkGesture

sequence

a GdkEventSequence.

[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

a GtkGesture

sequence

a GdkEventSequence, или NULL для событий указателя.

[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

a GtkGesture

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

a GtkGesture

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

a GtkGesture

group_gesture

GtkGesture для группирования gesture с

gtk_gesture_ungroup ()

void
gtk_gesture_ungroup (GtkGesture *gesture);

Отделяет gesture в изолированную группу.

Параметры

gesture

a GtkGesture

gtk_gesture_get_group ()

GList *
gtk_gesture_get_group (GtkGesture *gesture);

Возвращает все жесты в группе gesture

Параметры

gesture

a GtkGesture

Возвращает

Список 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

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

Флаги: Выполнять последним

См. также

GtkEventController, GtkGestureSingle

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API