Spec-Zone.ru › GTK 3.22

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_ACCEPTED);
  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_ACCEPTED)
    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, если состояние хотя бы одной последовательности было успешно изменено

Since: 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]

Since: 3.14

gtk_gesture_handles_sequence ()

gboolean
gtk_gesture_handles_sequence (GtkGesture *gesture,
                              GdkEventSequence *sequence);

Возвращает TRUE, если gesture в настоящее время обрабатывает события, соответствующие sequence.

Параметры

gesture

a GtkGesture

sequence

a GdkEventSequence

Возвращает

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

Since: 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]

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

Возвращает

Последнее событие из 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 в настоящее время интерпретируется

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

a 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

a GtkGesture

group_gesture

GtkGesture, с которым нужно сгруппировать gesture

С: 3.14

gtk_gesture_ungroup ()

void
gtk_gesture_ungroup (GtkGesture *gesture);

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

Параметры

gesture

a GtkGesture

С: 3.14

gtk_gesture_get_group ()

GList *
gtk_gesture_get_group (GtkGesture *gesture);

Возвращает список всех жестов в группе gesture.

Параметры

gesture

a 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

a 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

Количество точек касания, необходимое для срабатывания жеста.

Флаги: Чтение / Запись / Только для создания

Допустимые значения: >= 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 не будет относиться к текущему набору активных касаний, поэтому не полагайтесь на то, что это будет истинно.

Параметры

жест

объект, получивший сигнал

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

GdkEventSequence, которая вызвала распознавание жеста

данные пользователя

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

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

С версии: 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, которая была отменена

данные пользователя

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

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

С версии: 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().

Параметры

жест

объект, получивший сигнал

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

GdkEventSequence, которая завершила распознавание жеста

данные пользователя

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

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

С версии: 3.14

Сигнал “sequence-state-changed”

void
user_function (GtkGesture           *gesture,
               GdkEventSequence     *sequence,
               GtkEventSequenceState state,
               gpointer              user_data)

Этот сигнал генерируется всякий раз, когда изменяется состояние последовательности. См. gtk_gesture_set_sequence_state(), чтобы узнать больше о ожидаемом жизненном цикле последовательностей.

Параметры

жест

объект, получивший сигнал

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

GdkEventSequence, которая была отменена

состояние

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

данные пользователя

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

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

С версии: 3.14

Сигнал “update”

void
user_function (GtkGesture       *gesture,
               GdkEventSequence *sequence,
               gpointer          user_data)

Этот сигнал генерируется всякий раз, когда событие обрабатывается во время распознавания жеста. sequence гарантированно относится к набору активных касаний.

Параметры

жест

объект, получивший сигнал

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

GdkEventSequence, которая была обновлена

данные пользователя

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

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

С версии: 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.22/GtkGesture.html

Spec-Zone.ru

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