Spec-Zone.ru › GTK 3.24

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 ()

Свойства

guint n-points Чтение / Запись / Только для создания
GdkWindow * window Чтение / Запись

Сигналы

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.

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

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

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

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

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

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

a GtkGesture

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

a GdkDevice, или NULL.

[nullable][transfer none]

С версии: 3.14

gtk_gesture_get_window ()

GdkWindow *
gtk_gesture_get_window (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

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

определяемое пользователем окно, или 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

a GtkGesture

window

a GdkWindow, или NULL.

[allow-none]

С версии: 3.14

gtk_gesture_is_active ()

gboolean
gtk_gesture_is_active (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

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

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

С версии: 3.14

gtk_gesture_is_recognized ()

gboolean
gtk_gesture_is_recognized (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

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

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

С версии: 3.14

gtk_gesture_get_sequence_state ()

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

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

Параметры

gesture

a GtkGesture

sequence

a GdkEventSequence

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

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

a GtkGesture

sequence

a GdkEventSequence

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

a GtkGesture

state

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

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

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

С версии: 3.14

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]

С момента: 3.14

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 в противном случае.

С момента: 3.14

gtk_gesture_get_last_updated_sequence ()

GdkEventSequence *
gtk_gesture_get_last_updated_sequence (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

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

Последний обновленный последовательность.

[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

a GtkGesture

sequence

a GdkEventSequence.

[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

a GtkGesture

sequence

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

[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

a GtkGesture

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 для группирования с gesture

С: 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

Свойство “window”

  “window”                   GdkWindow *

Если не NULL, жест будет реагировать только на события, происходящие на этом окне GdkWindow или на его дочерних окнах.

Владелец: GtkGesture

Флаги: Чтение / Запись

С: 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

См. также

GtkEventController, GtkGestureSingle

© 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

Spec-Zone.ru

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